ARM汇编指令的条件执行及其他相关细节

ARM指令在机器中的表示格式用32位的二进制数表示

例如 ADDEQS R0,R1,#8 表示为下表

 

31~28

 

27~25

 

24~21

 

20

 

19~16

 

15~12

 

11~0

 

0000

 

001

 

0100

 

1

 

0001

 

0000

 

000000001000

 

cond

 

opcode

 

Rn

 

Rd

 

Op2

ARM指令一般分为5个域:

第一个域就是跟条件执行相关的cond,即条件码域

第二个是指令代码域,即 opcode ,

第三个域是地址基址Rn,即第一个操作数,为寄存器

第四个域是目标或源寄存器Rd,

第五个域是地址偏移或操作寄存器、操作数区,即Op2

上述指令的5个域为 0000 0010 1001 0001 0000 0000 0000 1000

16进制代码为0291008H ,指令功能是将R1和8相加,结果放入R0中

用助记符表示的ARM指令一般格式如下

<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>}   其中{}里的是可以省略的

如上述的指令 ADDEQS R0,R1,#8

opcode是ADD ,cond是EQ,S代表的是第20位,{S}决定指令的执行结果是否影响CPSR的值,本例为1

Rd为R0,Rn为R1,op2为8

助记符中的{S}位,即32位机器码的第20位,在助记符中通常可以取S或!或空

取S的情况已经说了,加上S影响CPSR的值

加上!后缀,指令执行后,基址寄存器中的地址将发生如下变化:

基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量

如 LDR R3,[R0,#4]!   , 指令的结果将R0加4作为地址指针,把这个指针所指向的地址单元所存贮的数据读入R3,并且把R0+4的值送到R0中

使用!后缀必须注意以下事项:

1、 !后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量

2、!后缀不能用于R15(PC)的后面

3、!后缀当用在单个地址寄存器后面时,必须确保这个寄存器有隐性的偏移量,例如

STMDB R1!{R3,R5,R7}     此时的地址基址寄存器的隐性偏移量为4

好了 最后讲正题,条件的指令执行

前面提到cond有4位, [31:28],一共有16种组合 ,跟CPSR配合决定指令是否执行

 

 

如指令ADDEQ R4,R3,#1 ,带EQ标志位

只有当CPSR中的Z置位才执行该指令

又如前面的例子 ADDEQS R0,R1,#8 ,也是只有当CPSR中的Z置位才执行该指令

条件后缀和S后缀的关系如下

1、 如果既有条件后缀又有S后缀,则书写时S排在后面 如ADDEQS R1,R0,R2

该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位

2、条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位

3、条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值