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