关于ARM立即数的理解

时间:2021-10-24 14:58:43

转自:http://blog.sina.com.cn/s/blog_9bad4f090101e14d.html

一、立即数指令码的组成

ARM公司将32bit指令码分为如下两部分:

关于ARM立即数的理解

32bit立即数通过Imm8值循环右移ROR值*2bit得到。即:shifter_operand = immed_8 Rotate_Right (rotate_imm * 2)。

二、如何判断一个数是否是合法立即数?

  1. 首先将这个数转换为32bit16进制形式,例如218=0xDA=0x000000DA
  2. 除零外,仅有一位数为合法立即数。
  3. 除零外,仅有二位数,并且相邻(包括首尾相邻,如0x1000000A)的为合法立即数。
  4. 除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000,包括首尾相邻,如:0x14000003),这三位数中,最高位取值仅能为1、2、3,最低位取值仅能为4、8、C,中间位0x0~0xF。这种组合的为合法立即数。
  5. 除了以上三种,其他基本是非法立即数。

三、非法立即数如何输入?

利用LDR伪指令可将任意32bit的立即数赋给寄存器。

格式:LDR RD,=#Imm32

编译时,编译器会优先使用MOV或者MVN指令来加载立即数,以便提高代码运行效率,如不行,则一般编译成如下形式:

LDR RD,[PC,#offset]

....

PC+OFFSET:.word Imm32