ARM指令编码格式中的opcode2--八位位图

arm指令中存在两个操作数,而第二个操作数(opcode2)的其中一种形式可以用一个常数(#immed_8)表示。

#immed_8是一个常数表达式,该常数必须对应8位位图,即常数是由一个八位的常数向右循环移位偶数位而得到的。


常数对应8位位图是指一个大于8位的常数必须经过经过2*n次循环右移而得到的数:

eg:一个合法常数:0xf0000001(即0b1111,0000,0000,0000,0000,0000,0000,0001) 是由一个8位的数——0b0001,1111 经过2*2次循环右移而得到的。

则0xa0000001(0b1010,0000,0000,0000,0000,0000,0000,0001)是一个非法常数,虽然它可以由0b0000,1101右移3次而得到,但是我们的要求是常数是经过右移偶次位而得到的,显然该常数不合法。


为什么常数要对应8位位图?

由于一个ARM指令的opcode2放在该指令的低12位,其中低8位是用来存放数据,而高4位是用来存放移位次数。如下图:

则如果要完全运用到一个32位的寄存器(最大可存一个值为2^32 的数),则要把一个8位的数做移位处理。

而至于为什么是移位偶次位,是因为rot的最大值为2^4,则最多只能移位16次,而32位的寄存器要求最大移位次数为32次,因此只能把rot*2去满足要求。


PS:以上纯属个人理解,如有错之处,欢迎指正



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值