arm
指令
立即数
(二)
在
ARM
数据处理指令中
,
当参与操作的第二操作数为立即数时
,
每个立即数都
是采用一个
8
位的常数循环右移偶数位而间接得到
,
其中循环右移的位数有一
个
4
位二进制的
2
倍表示
.
则有效立即数可表示为
: := immed_8;
循环右移(2×rotate_imm)
.
其中
:
代表立即数
, immed_8
代表
8
位常数
,
即所谓的
"8
位图
", rotate_imm
代表
4
位的循环右移值
.
这样一来出
现了一个问题
:
尽管表示的范围变大了
,
但是
12
位所能表现的数字的个数是一
定的
.
因此
, ARM
规定并不是所有的
32
位常数都是合法的立即数
,
只有通过上
面的构造方法得到的才是合法的立即数
,
编译的时候才不会报错
.
举个例子吧
.
0x3FC(0000 0000 0000 0000 0000 0011 1111 1100)
是由
0xff
循环右移
2
位
得到的
;
200(0000 0000 0000 0000 0000 0000 1100 1000)
是由
0xc8
循环右移
2
位得
到的
,
它们都是合法的
.
而
0x1FE(0000 0000 0000 0000 0000 0001 1111 1110)
和
511(0000 0000 0000 0000 0000 0001 1111 1111)
无法看成是
8
位的常数循环
右移
偶数
位而得到的
,
因此是非法的
.
指令操作数立即数时候,每个立即数由一个
8
位的常数循环右移偶数位得到。
= immed_8
循环右移
( 2*rotate_imm)
打个比如:
1.
立即数
0xF200
是由
0xCF2
间接表示的,
即是由
8
位的
0xF2
循环右移
24
(
2*12
)
得到的
immed_8 == 0xF2; rotate_imm == 0xC
0000 0000 0000 0000 1111 0010 0000 0000 = =
0000 0000 0000 0000 0000 0000 1111 0010 ->
循环右移
24
位。
2.
立即数
0x3F0
是由
0xE3F
间接表示的,
即是由
8
位的
0x3F
循环右移
28
(
2*14
)
得到的
immed_8 == 0x3F; rotate_imm == 0xE
或者
立即数
0x3F0
是由
0xFFC
间接表示的,即是由
8
位的
0xFC
循环右移
30
(
2*15
)
得到的
immed_8 == 0xFC; rotate_imm == 0xF
表示方法有好几种
PS
:其实你没必要一个一个的算,只要利用
LDR
伪指令就可以了
,
例如
: