打印

ARM指令之立即数的表示方式理解

[复制链接]
1167|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
chengchenz| | 2014-8-13 13:00 | 只看该作者
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.

使用特权

评论回复
板凳
ayb_ice| | 2014-8-13 14:46 | 只看该作者
8位数左移偶数位,
扩展成32位数

使用特权

评论回复
地板
戈卫东| | 2014-8-13 18:46 | 只看该作者
精度只有8BIT,但可以表达的范围可到32BIT
如果需要超过8BIT的精度就不能用这样的指令。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:你可能不知道今天所做的事情会对未来有多大的干预能力!

67

主题

310

帖子

12

粉丝