ARM指令的立即数是必须是“8位立即数和一个4位的移位”能表示出来的才算合法,不能表示出来的不能用作立即数。
就是必须是 0~0xFF 的值循环移右偶数位 能表示出来的。否则汇编时会报错。
比如
0x11合法 0x11 移0位
0x121 不合法 无论怎么移都大于8位
0x330 合法 0x33移4位
0xAF000000 合法 0xAF移24位
0xD000000C 合法 0xCD移28位
0x102 不合法 0x81移1位(移奇数位,不是偶数位)
0x204 合法 0x81移2位
通常,会看到人写的ARM的汇编Code中很少有用大于0xFF的立即数,因为写code的人很难直接去判断一个很大的数是否满足这个要求,如果数值本身就小于255,那它一定满足以上要求。一般在写汇编时,大的数值会用伪指令 LDR Rx, =xxxxx这种格式,汇编器会去使用合适的方式来把一个数值加载到寄存器中。这个伪指令一般会转换成MOV Rx, [PC, #0xXXXX]指令。
如果用的是高级语言比如C写代码,编译器会自动处理,能用立即数就会生成用立即数的Code,不能当作立即数的,就换成MOV Code. |