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