ir指令、立即数的作用_ARM指令中使用立即数详解

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

伪指令就可以了

,

例如

:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值