ARM立即寻址中有效立即数的计算

前言

感觉这方面的计算参考书上也讲的比较模糊,在这里分享一下计算的方法

立即数寻址有效数的计算

(一)ARM立即数寻址的指令格式

在这里插入图片描述

(二)例1

汇编指令:mov R0, #0x00110000
转为机器码就是
机器码:0xe3a03811,其中0x811是ARM在机器码中用来表示立即数的部分
其中8对应上图的rot11对应上图的Immed_8

rot是循环右移位数的1/2,Immed_8是用于被右移的“基数”

一个有效的立即数 = immed_8 进行 循环右移(2 * rot)

比如本例中,0x00110000这个立即数,它等于0x11循环右移16位

我们将它转换成二进制来仔细看移位操作:
0x11转为二进制
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0001 | 0001
之后循环右移16位,
0000 | 0000 | 0001 | 0001 | 0000 | 0000 | 0000 | 0000
可以看到,循环右移后的结果,正好=0x00110000

(三)例2

给定立即数0x00012800,求立即寻址时,指令的低12位是什么?

可以看到,这个题目是例1的反向求解,已知立即数求指令

首先,将立即数转换为二进制0000 | 0000 | 0000 | 0001 | 0010 | 1000 | 0000 | 0000

第二步,将二进制中的关键8位提取出来,因为循环移位必定是移动偶数位的,所以我们提取的时候要保证我们找的关键8位在原二进制中是处于偶数位的

因此在这里我们提取的是01 | 0010 | 10,而不是1 | 0010 | 100(这里的|对应原二进制|的位置,便于读者观察),关键8位的16进制表示为0x4a

第三步,将提取出来的关键8位放到二进制的最右边,构成一个待移动二进制串
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0100 | 1010

第四步,对第三步的待移动二进制串进行循环右移操作,使得循环右移后的结果与原二进制串一致,记录移动的位数,即
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0100 | 1010 循环右移 => 0000 | 0000 | 0000 | 0001 | 0010 | 1000 | 0000 | 0000

得移动位数为22位,等于0xb * 2

第五步,合并第二步得到的关键8位和第四步的移动位数,为0xb4a

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值