[ARM] ARM彙編指令

漫步雲端ly發表於2018-01-31

一、LDR 指令 和 MOV的區別

ARM是RISC結構,資料從記憶體到CPU之間的移動只能通過L/S指令來完成,也就是ldr/str指令。
比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr
比如:
ldr r0, 0x12345678
就是把0x12345678這個地址中的值存放到r0中。
而mov不能幹這個活,mov只能在暫存器之間移動資料,或者把立即數移動到暫存器中,這個和x86這種CISC架構的晶片區別最大的地方。
x86中沒有ldr這種指令,因為x86的mov指令可以將資料從記憶體中移動到暫存器中。

另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個地址寫到某暫存器中,比如:
ldr r0, =0x12345678
這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,後面跟的立即數沒有超過8位,那麼在實際彙編的時候該ldr偽指令是被轉換為mov指令的。

ldr偽指令和ldr指令不是一個同東西
----------------------------------------------------------------------------------------------------------

LDR指令的格式: 

LDR{條件}   目的暫存器     <儲存器地址>

作用:將 儲存器地址 所指地址處連續的4個位元組(1個字)的資料傳送到目的暫存器中。

LDR指令的定址方式比較靈活,例項如下:

LDR R0,[R1]                                                   ;將儲存器地址為R1的字資料讀入暫存器R0。

LDR R0,[R1,R2]                                             ;將儲存器地址為R1+R2的字資料讀入暫存器R0。

LDR R0,[R1,#8]                                             ;將儲存器地址為R1+8的字資料讀入暫存器R0。

LDR R0,[R1],R2                                               ;將儲存器地址為R1的字資料讀入暫存器R0,並將R1+R2的值存入R1。

LDR R0,[R1],#8                                               ;將儲存器地址為R1的字資料讀入暫存器R0,並將R1+8的值存入R1。

LDR R0,[R1,R2]!                                          ;將儲存器地址為R1+R2的字資料讀入暫存器R0,並將R1+R2的值存入R1。

LDR R0,[R1,LSL #3]                                   ;將儲存器地址為R1*8的字資料讀入暫存器R0。

LDR R0,[R1,R2,LSL #2]                         ;將儲存器地址為R1+R2*4的字資料讀入暫存器R0。

LDR R0,[R1,,R2,LSL #2]!                       ;將儲存器地址為R1+R2*4的字資料讀入暫存器R0,並將R1+R2*4的值存入R1。

LDR R0,[R1],R2,LSL #2                            ;將儲存器地址為R1的字資料讀入暫存器R0,並將R1+R2*4的值存入R1。

LDR R0,Label                                                ;Label為程式標號,Label必須是當前指令的-4~4KB範圍內。

要注意的是

LDR Rd,[Rn],#0x04                                                              ;這裡Rd不允許是R15。

另外LDRB 的指令格式與LDR相似,只不過它是將儲存器地址中的8位(1個位元組)讀到目的暫存器中。

LDRH的指令格式也與LDR相似,它是將記憶體中的16位(半字)讀到目的暫存器中。

LDR R0,=0xff

這裡的LDR不是arm指令,而是偽指令。這個時候與MOVE很相似,只不過MOV指令後的立即數是有限制的。這個立即數必須是0X00-OXFF範圍內的數經過偶數次右移得到的數,所以MOV用起來比較麻煩,因為有些數不那麼容易看出來是否合法。

二、STR指令

STR指令的格式為:
STR{條件}  源暫存器,<儲存器地址>
STR指令用亍從源暫存器中將一個32位的字資料傳送到儲存器中。該指令在程式設計中比較常
用,丏定址方式靈活多樣,使用方式可參考指令LDR。

指令示例:
STR R0,[R1],#8             ;將R0中的字資料寫入以R1為地址的儲存器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8]             ;將R0中的字資料寫入以R1+8為地址的儲存器中。”

str     r1, [r0]         將r1暫存器的值,傳送到地址值為r0的(儲存器)記憶體中

三、MOV

MOV PC LR                 ;返回主程式



相關文章