分類: arm
2010-11-24 18:35
850人閱讀收藏
舉報
arm是risc結構,資料從記憶體到cpu之間的移動只能通過l/s指令來完成,也就是ldr/str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr
比如:ldr r0, 0x12345678
就是把0x12345678這個位址中的值存放到r0中。
而mov不能幹這個活,mov只能在暫存器之間移動資料,或者把立即數移動到暫存器中,這個和x86這種cisc架構的晶元區別最大的地方。
x86中沒有ldr這種指令,因為x86的mov指令可以將資料從記憶體中移動到暫存器中。
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中LDR與MOV的區別
mov 是把立即數賦給乙個暫存器,但對立即數的範圍有要求。只能是由8bit連續有效位通過偶數次移位能得到的數。如果立即數超出這個範圍,就沒辦法用一條mov指令給暫存器賦值。ldr除了普通的讀數之外,也有給暫存器賦立即數的功能。你只要寫 ldr r0,0xabcdef 它沒有立即數範圍的限制。因為這是...
ARM中MOV與LDR的區別
from arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 比如 ldr r0,0x12345678 就是把0x12345678這個 位址中的值 存放到r0中。而mov不能幹這個活,mov...
arm中ldr與mov指令的區別
arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr 比如 ldr r0,0x12345678 就是把0x12345678這個位址中的值存放到r0中。而mov不能幹這個活,mov只能在暫存器之...