ARM MOV和 LDR指令關係

2021-09-22 06:49:20 字數 1313 閱讀 3398

而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指令的。

arm指令集中,ldr通常都是作載入指令的,但是它也可以作偽指令。

ldr偽指令的形式是「ldr rn,=expr」。下面舉乙個例子來說明它的用法。

count equ       0x40003100

……ldr       r1,=count

mov      r0,#0

str       r0,[r1]

count是我們定義的乙個變數,位址為0x40003100。這中定義方法在組合語言中是很常見的,如果使用過微控制器的話,應該都熟悉這種用法。

ldr       r1,=count是將count這個變數的位址,也就是0x40003100放到r1中。

mov      r0,#0是將立即數0放到r0中。最後一句str      r0,[r1]是乙個典型的儲存指令,將r0中的值放到以r1中的值為位址的儲存單元去。實際就是將0放到位址為0x40003100的儲存單元中去。可 見這三條指令是為了完成對變數count賦值。用三條指令來完成對乙個變數的賦值,看起來有點不太舒服。這可能跟arm的採用risc有關。

下面還有乙個例子

;將count的值賦給r0

ldr       r1,=count

ldr       r0,[r1]

ldr       r1,=count這條偽指令,是怎樣完成將count的位址賦給r1,有興趣的可以看它編譯後的結果。這條指令實際上會編譯成一條ldr指令和一條dcd偽指令。

ldr 的兩種用法

1)ldr pc, =myhandleirq 表示將myhandleirq符號放入pc暫存器中

2)ldr pc,myhandleirq 表示將讀取儲存器中myhandleirq符號所表示的位址中的值,及需要多讀一次儲存器。

分類: 

arm solve

ARM MOV和LDR 和 LDR偽指令區別

mov 是把立即數賦給乙個暫存器,但對立即數的範圍有要求。只能是由8bit連續有效位通過偶數次移位能得到的數。如果立即數超出這個範圍,就沒辦法用一條mov指令給暫存器賦值。ldr除了普通的讀數之外,也有給暫存器賦立即數的功能。你只要寫 ldr r0,0xabcdef 它沒有立即數範圍的限制。因為這是...

LDR指令和LDR偽指令

arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...

LDR指令和LDR偽指令區別

arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...