ARM 立即数范围以及立即数的编码规则

文章目录

  • ARM 立即数范围以及立即数的编码规则
  • 一,问题描述
  • 二,立即数范围
  • 三,立即数编码

一,问题描述

笔者在写汇编代码时曾遇到过立即数不合法的问题:

Immediate 0xXXX cannot be represented by 0-255 and a rotation

比如笔者代码中含有如下命令:

MOV R1, #888888 ; #888888 is 0xD9038

使用RVDS(RealView Development Suite)编译器进行编译,则会报出如下错误:

通过阅读ARM相关技术手册,笔者有如下发现:

  • 不同类型的指令,其支持的立即数长度不一样,比如有的是 imm12,有的是 imm8imm5,其中12和5分别代表立即数的比特位数,比如立即数长度为8bits时,其能表示的范围为:0b0 ~ 0b1111 1111,即为 0~255
  • 可以将立即数进行拆分,比如 imm12 = rotate4 + imm8,拆分成循环位移和立即数常数,通过将立即数常数imm8循环右移rotate4位,即可组成范围大于12bits组成的立即数(0b1111 1111 1111=4095)。

二,立即数范围

在ARM中,无论是Arch64还是Arch32,一条汇编指令的编码长度固定为32bits,在Thumb中为16bits,这就意味着不能将带有操作码(opcode)的汇编指令编译成任意的32bits的值。

在文档编号为DDI01001的ARMv5 Architecture reference Manual的文档中有如下表格:

从表格中可以看出,在ARM指令集中,一条汇编指令编码成32bits后,将不同的位数划分成不同的功能区间,比如条件码(condition codes)和操作码,还有比特位要留给指令本身和寄存器使用,通常情况下只有12-bits的长度可以用来表示立即数(immediate)。

12bits可以表示的无符号数范围为:0~4095,有符号数的范围为:-2048 ~ +2047,如果不在这12 bits的立即数上增加点创作性,而直接硬解码用来表示立即数是远远不够的。所以在ARM中将这12 bits分为 8-bit 常数(0~255)和 4-bit旋转位移值(0~15),8 bits 常数可以按照循环位移值的2倍(0~30)向右进行循环位移,位移的步进值是以2为单位,可以是:0、2 、4 、6 、… 、30

比如 0x23000000占32bits,远远超过了12 bits,如果直接硬解码是表示不了的,但是其可以由 0x23 ROR 8得到,ROR是以32bits的位宽为基础,向右循环位移,从右边旋转出来的比特位被插入到左边空出的位中。因此按此规则, 0x23000000的12-bit立即数表示应为:0b0100 0010 0011。关于其解释,见下文。

三,立即数编码

本章拿数据处理指令的编码举例,如下图所示为DI0406C_arm_architecture_reference_manual参考手册中关于数据处理指令编码的表格:

更进一步,本章详细地用 ARM cortex-A系列的MOV指令为例:

其中的条件码 cond在无条件下为 1110,详情参考下图:

本章拿立即数 0x23000000举例,如下的汇编指令:

MOV r4, #0x23000000

按照上述的编码规则将会被编码成:0xE3A04423

换算成二进制:

0x23000000的12-bit立即数表示为:0b0100 0010 0011。其中高4位为0100 = 4,可求得循环右移的位数为 4*2=8,低八位 0010 0011即为 0x23。将 0x23循环右移8位,也正是立即数 0x23000000

更多的编码示例可参考下图,图片来自ARM指令集中立即数寻址的范围

在ARMv7中管这种循环右移得到的立即数叫做 modified immediate constants,在参考手册DI0406C_arm_architecture_reference_manual中有其更详细的描述:

其中 abcdefgh8个数,分别代表不同的比特位,还有一点需要特别注意,rotation的数值乘以2,才表示真正的循环右移次数。

综上所述,我们可以得出以下结论:

  • 如果一个立即数小于 0xFF(255)那么直接用 immed_8 的8个比特位表示,此时不用移位,11~8 位的 Rotate_imm 等于 0。
  • 如果 immed_8 的数值大于 0xFF(255),那么就看这个数是否能有 immed_8 中的某个数移位 2*Rotate_imm 位形成的。如果能,那么就是合法立即数;否则非法。

关于立即数合不合法,可先参考这篇文章 ARM 立即寻址之立即数的形成 —— 如何判断有效立即数。

ARM 立即数范围以及合法立即数相关推荐

  1. ARM的合法立即数与非法立即数

    一.前言 首先从ARM指令系统的语法格式说起: 一条ARM指令语法格式分为如下几个部分: <opcode>{<cond>}{S} <Rd>,<Rn>{, ...

  2. 合法立即数与非法立即数

    ARM指令都是32位,除了指令标记和操作标记,本身只能附带很少位数的立即数.因此立即数有合法和非法之分. 合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数. ldr伪指令可以不用 ...

  3. ARM指令中如何判断一个立即数是有效立即数

    ARM指令中如何判断一个立即数是有效立数 在ARM处理器的汇编语言中,对指令语法格式中的<shifter_operand>的常数表达式有这样的规定:"该常数必须对应8位位图,即常 ...

  4. ARM指令中如何判断一个立即数是 有效立即数

    ARM指令中如何判断一个立即数是有效立数 在ARM处理器的汇编语言中,对指令语法格式中的<shifter_operand>的常数表达式有这样的规定:"该常数必须对应8位位图,即常 ...

  5. 用数学方法计算井字棋合法局面数——波利亚定理的简单应用

    用数学方法计算井字棋合法局面数--波利亚定理的简单应用 0.前言 记不得那天在B站发现一个互动下井字棋智商普查(BV1JE411G71J),想当年被小学同学评价为无敌破战士(显然到现在都不知道这称号是 ...

  6. ir指令、立即数的作用_立即数的判断方法一

    在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数.ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下 ...

  7. 【算法讲11:卡特兰数】默慈金数 | 那罗延数 | 施罗德数

    [算法讲11:卡特兰数]默慈金数 | 那罗延数 | 施罗德数 ⌈\lceil⌈卡特兰数⌋\rfloor⌋Catalan Number 引入 思考 ⌈\lceil⌈卡特兰数⌋\rfloor⌋的性质 ⌈\ ...

  8. C#读取excel的有效行数或者最大有效列数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...

  9. sum_series() 求一列数的指定个数的数和(5个数字的和)

    1 #include <stdio.h> 2 #include <stdarg.h> 3 /*用sum_series() 求一列数的指定个数的数和(5个数字的和)*/ 4 do ...

最新文章

  1. Golang gin框架:GET请求示例
  2. 使用coding进行项目代码管理(全程可视化操作!)
  3. 【转载】负数的二进制
  4. DataForm 中通过外面的按钮进行提交时,出错
  5. (王道408考研操作系统)第四章文件管理-第一节5:文件存储空间管理
  6. iTOP-4412开发板-QtE4.7-UVC 摄像头使用例程
  7. 学习PHP的必备开发工具
  8. django创建模板报错:TemplateDoesNotExist at
  9. ArcGIS及ENVI软件下载链接(持续更新...)
  10. 互联网日报 | 瑞幸咖啡内部调查基本完成;12306官方支付宝小程序上线;华为openGauss正式开源...
  11. BP(Back Propagation)神经网络——原理篇
  12. C语言结构体(Struct)——摘自C语言学习网
  13. 算法分析与设计实验报告——图的m着色问题
  14. Arduino引用第三方库ads1x15提示No such file or directory
  15. 北京市市场主体发展情况报告 (zz)
  16. 5年专业研究,这份云原生安全指南请查收
  17. OPA2376AIDGKR
  18. 立体匹配中的全局匹配——动态规划笔记
  19. PhysFormer: Facial Video-based Physiological Measurement with Temporal Difference Transformer
  20. python 人脸识别demo

热门文章

  1. 小i机器人在2018硬科技年会上夺双料大奖
  2. FPGA中亚稳态、异步信号处理、建立和保持时间违例及题目合集
  3. 聊聊身边的嵌入式,自拍神器自拍杆
  4. mac与linux服务器之间使用ssh互通有无
  5. 使用cephadm部署单节点ceph集群,后期可扩容(基于官方文档,靠谱,读起来舒服)
  6. 江西省高考计算机试题及答案,2016年江西省信息技术高考真题(附答案) - 图文...
  7. vue3中reactive赋值失败
  8. 0-1整数规划的LINGO求解
  9. 然而沼跃鱼早就看穿了一切
  10. python爬虫数据分析项目 双十一_基于Python爬取京东双十一商品价格曲线