一:指令可選后綴
“S”后綴:指令中使用“S”后綴,指令執(zhí)行后狀態(tài)寄存器的條件標(biāo)志位將被刷新;不使用“S”后綴時(shí),指令執(zhí)行后狀態(tài)寄存器的條件標(biāo)志位不會(huì)發(fā)生變化。此標(biāo)志經(jīng)常用于對(duì)條件進(jìn)行測(cè)試,例如:是否溢出,是否進(jìn)位等;根據(jù)這些變化,就可以進(jìn)行一些判斷,是否大于,是否相等,從而可能影響指令執(zhí)行順序。
“!”后綴
如果指令地址表達(dá)式中不含“!”后綴,則基址寄存器中的地址不會(huì)發(fā)生變化,指令中含有則變化,變化結(jié)果如下:
基址寄存器中的值(指令執(zhí)行后)=指令執(zhí)行前的值+地址偏移量
注意:
“!”后綴必須緊跟在地址表達(dá)式后面,而地址表達(dá)式要有明確的地址偏移量。
“!”后綴不能用于R15(PC)的后面
當(dāng)用于單個(gè)寄存器后面時(shí),必須確性這個(gè)寄存器有隱性的偏移量,eg:“STMDB SP!,{R3,R5,R7}”此時(shí)地址基址寄存器SP的隱性偏移量是4.
二:具體的指令
LDR/STR 字?jǐn)?shù)據(jù)加載/存儲(chǔ)指令
LDRB/STRB 字節(jié)數(shù)據(jù)加載/存儲(chǔ)指令
LDRH/STRH 半字?jǐn)?shù)據(jù)加載/存儲(chǔ)指令
Eg:LDR R4,START ;將存儲(chǔ)地址為START的字?jǐn)?shù)據(jù)讀入R4
LDR R0,[R1] ;將存儲(chǔ)地址為R1的字?jǐn)?shù)據(jù)讀入R0
LDR R0,[R1,R2] ;將存儲(chǔ)地址為R1+R2的字?jǐn)?shù)據(jù)讀入R0
LDR R0,[R1,#8] ;將存儲(chǔ)地址為R1+8的字?jǐn)?shù)據(jù)讀入R0
LDR R0,[R1,R2,LSL#2] ;將存儲(chǔ)地址為R1+R2<<2的字?jǐn)?shù)據(jù)讀入R0
STR R5,DATA1 ;將R5存入存儲(chǔ)地址為DATA1中
同理可以判斷出其他STR的形式所表達(dá)的意思。
數(shù)據(jù)加載與存儲(chǔ)(Load-store)指令用于存儲(chǔ)器和處理器的寄存器之間數(shù)據(jù)傳輸。
Load用于把內(nèi)存中的數(shù)據(jù)裝載到寄存器中去。
Store用于把寄存器的數(shù)據(jù)存儲(chǔ)到內(nèi)存中去。
注意:LDRR5,[R6,#0x04]! 是先把R6+4作為地址,把數(shù)據(jù)傳輸結(jié)束后,在把R6=R6+4.
LDR R5,[R6],#0x04 是先把R6作為地址,把數(shù)據(jù)傳輸結(jié)束后,把R6=R6+4
STMFDSP!,{R0-R4} 將R0-R4中的數(shù)據(jù)壓入堆棧,R13為堆棧指針。
LDMFDSP!,{R0-R4} 將數(shù)據(jù)出棧,恢復(fù)R0-R4的值。
DCD用于分配一段字內(nèi)存單元,并用偽指令中的expr初始化.DCD偽指令分配的內(nèi)存需要字對(duì)齊,一般可用來定義數(shù)據(jù)表格或其它常數(shù)。??
Eg:DATA DCD 4,5,6 DATA指向這塊內(nèi)存起始地址,內(nèi)存為3個(gè)單元,并且內(nèi)容為4,5,6.
注意,,標(biāo)號(hào)相當(dāng)與一個(gè)常數(shù),所以在 LDR R0,DATA,時(shí),R0中內(nèi)容就是DATA的值。
LR就是ARM中R14,子程序鏈接寄存器,SP就是ARM中R13棧指針寄存器,R15就是PC,程序計(jì)數(shù)器。
當(dāng)執(zhí)行BL子程序調(diào)用指令時(shí),R14中得到R15(程序計(jì)數(shù)器PC)的備份。
讀狀態(tài)寄存器指令.在 ARM 處理器中,只有 MRS 指令可以狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中.指令格式如下;
寫狀態(tài)寄存器指令.在 ARM 處理器中.只有 MSR 指令可以直接設(shè)置狀態(tài)寄存器 CPSR或 SPSR.指令格式如下
SPSR是用來備份CPSR的寄存器,當(dāng)異常發(fā)生時(shí),SPSR自動(dòng)將上一個(gè)狀態(tài)的CPSR備份出來,便于在后面恢復(fù)上一個(gè)狀態(tài)。