ARM中MOV與LDR的區別

2021-08-15 07:36:30 字數 2152 閱讀 7239

from:
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 r0,=

0x56000010 

@r0 is set to be register gpbcon and   is used to select pin function for port b

@in,out special function and others

mov r1,#0x00004000

str r1,[r0]                    

@pin gpb7 is set to be output port

以上三條彙編語句的功能是將數值0x00004000儲存到以0x56000010為位址的儲存單元中。

其反彙編**如下

0:   e59f0044        ldr     r0, [pc, #68]   ; 0x4c

4:   e3a01901        mov     r1, #16384      ; 0x4000

8:   e5801000        str     r1, [r0]

......

4c:   56000010        undefined

可見ldr r0,=

0x56000010       

被轉換成ldr指令來執行

再來看ldr r0,=0x56000000  

mov r1,#0x00004000

str r1,[r0]  

其反彙編**如下

0:   e3a00456        mov     r0, #1442840576 ; 0x56000000

4:   e3a01901        mov     r1, #16384      ; 0x4000

8:   e5801000        str     r1, [r0]

這裡ldr r0,=0x56000000   被轉換成mov     r0, #1442840576

也就是說ldr偽指令是根據後面的資料值來決定轉換為ldr指令或mov指令執行。

那麼同樣是給r0賦值,ldr r0,=0x56000010 能否用mov     r0, #0x56000010來代替呢,

mov指令後面的立即數是有限制的,這個立即數必須

由乙個8位的二進位制數經過偶數次右移後得到才合法資料

ldr r0,=0x56000000   被轉換成mov     r0, #0x56000000,其中立即數0x56000000是可以由0x56經過迴圈右移得到的,而0x56000010無法通過乙個8位的二進位制數經過偶數次右移後得到,所以無法轉換成mov指令來實現。

再舉例如下:

mov r0,#0x101

mov r0,#0xff1

以上兩條指令都不正確,因為立即數不合法。

這樣的話用mov指令是比較麻煩的,因為有些簡單的資料比較容易看出來,有些資料即不容易看出來是否是合法資料。

為了解決這個問題,我們可以用ldr偽指令來實現,根據後面的立即數來決定轉換為ldr指令或mov指令執行,符合mov指令的立即數合法性要求就轉換為mov指令,不符合的話就轉換為ldr載入指令來實現。

原文出處:

ARM中MOV與LDR的區別

分類 arm 2010 11 24 18 35 850人閱讀收藏 舉報arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 比如 ldr r0,0x12345678 就是把0x12345678...

arm中LDR與MOV的區別

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

arm中ldr與mov指令的區別

arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 比如 ldr r0,0x12345678 就是把0x12345678這個位址中的值存放到r0中。而mov不能幹這個活,mov只能在暫存器之...