ARM指令後綴與常用讀取指令

一:指令可選後綴

“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備份出來,便於在後面恢復上一個狀態。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章