ARM匯編指令的條件執(zhí)行及其他相關(guān)細節(jié)
例如 ADDEQS R0,R1,#8 表示為下表
本文引用地址:http://m.butianyuan.cn/article/201611/317773.htm31~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個域:
第一個域就是跟條件執(zhí)行相關(guān)的cond,即條件碼域
第二個是指令代碼域,即 opcode ,
第三個域是地址基址Rn,即第一個操作數(shù),為寄存器
第四個域是目標或源寄存器Rd,
第五個域是地址偏移或操作寄存器、操作數(shù)區(qū),即Op2
上述指令的5個域為 0000 0010 1001 0001 0000 0000 0000 1000
16進制代碼為0291008H ,指令功能是將R1和8相加,結(jié)果放入R0中
用助記符表示的ARM指令一般格式如下
如上述的指令 ADDEQS R0,R1,#8
opcode是ADD ,cond是EQ,S代表的是第20位,{S}決定指令的執(zhí)行結(jié)果是否影響CPSR的值,本例為1
Rd為R0,Rn為R1,op2為8
助記符中的{S}位,即32位機器碼的第20位,在助記符中通??梢匀或!或空
取S的情況已經(jīng)說了,加上S影響CPSR的值
加上!后綴,指令執(zhí)行后,基址寄存器中的地址將發(fā)生如下變化:
基址寄存器中的值(指令執(zhí)行后)=指令執(zhí)行前的值+地址偏移量
如 LDR R3,[R0,#4]! , 指令的結(jié)果將R0加4作為地址指針,把這個指針所指向的地址單元所存貯的數(shù)據(jù)讀入R3,并且把R0+4的值送到R0中
使用!后綴必須注意以下事項:
1、 !后綴必須緊跟在地址表達式后面,而地址表達式要有明確的地址偏移量
2、!后綴不能用于R15(PC)的后面
3、!后綴當用在單個地址寄存器后面時,必須確保這個寄存器有隱性的偏移量,例如
STMDB R1!{R3,R5,R7} 此時的地址基址寄存器的隱性偏移量為4
好了 最后講正題,條件的指令執(zhí)行
前面提到cond有4位, [31:28],一共有16種組合 ,跟CPSR配合決定指令是否執(zhí)行
如指令ADDEQ R4,R3,#1 ,帶EQ標志位
只有當CPSR中的Z置位才執(zhí)行該指令
又如前面的例子 ADDEQS R0,R1,#8 ,也是只有當CPSR中的Z置位才執(zhí)行該指令
條件后綴和S后綴的關(guān)系如下
1、 如果既有條件后綴又有S后綴,則書寫時S排在后面 如ADDEQS R1,R0,R2
該指令在Z=1時執(zhí)行,將R0+R2的值放入R1,同時刷新條件標志位
2、條件后綴是要測試條件標志位,而S后綴是要刷新條件標志位
3、條件后綴要測試的是執(zhí)行前的標志位,而S后綴是依據(jù)指令的結(jié)果改變條件標志。
評論