立即数寻址有效数的计算
(一)ARM立即数寻址的指令格式
(二)例1
汇编指令:mov R0, #0x00110000
转为机器码就是
机器码:0xe3a03811
,其中0x811
是ARM在机器码中用来表示立即数的部分
其中8
对应上图的rot
,11
对应上图的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