ARM彙編指令ldr和MOV的區別

1.“八位圖”數據

 

2、MOV指令

MOV指令可以把立即數或者寄存器內容(注意:這裏絕對不可以是內存!!)傳遞給一個寄存器。
 
MOV對於立即數是有要求的,就是上邊的“8位圖”數據。
只能由一個8bit連續有效位通過偶數次移位得到的數。
 
它爲什麼會有這樣的限制呢?
原因是,MOV本身就是一個32bit指令,除了指令碼本身,他不可能再帶一個可以表示32bit的數字,所以用了其中的12bit來表示

立即數,其中4bit表示移位的尾數(循環右移,且數值*2),8bit用來表示要移位的一個基數。如果立即數超過這個範圍,就沒有辦法用一條MOV指令給寄存器賦值

        要想判斷一個數是否是合法的立即數,可以把這個數左移或右移偶數位,看能否變成一個8爲的數。如果能,則是合法的立即數,可以用MOV指令操作。否則,不是合法立即數,不能用MOV指令來操作。

(這裏就要用到LDR僞指令了,查看反彙編指令,你會看到LDR僞指令此變成了兩條指令~~)。
3、LDR指令
ldr指令既可以是大範圍的地址讀取僞指令,也可以內存訪問指令。
當它的第二個參數前面有“=”時,表示僞指令,否則表示內存訪問指令。
LDR指令:就是個單寄存器存儲的ARM存儲器訪問指令。
(LDR補充了MOV指令不能訪問內存的缺陷。)
 
 ARM是RISC結構的,數據從內存到CPU之間的移動只能通過ldr/str指令(我說的是但個寄存器~~)。
想要把數據從內存中某處讀取到寄存器中,只能用ldr。
 
4、LDR僞指令
1)LDR僞指令沒有立即數範圍的限制,既,可以直接賦值。因爲這是一條僞指令。
    如果立即數在MOV的要求內,系統會自動用一條彙編MOV指令來實現。
    如果不在MOV的範圍內,就用其它的方式來實現,比如變成了兩條指令,或者從PC偏移地址讀取一個32位的數據給寄存器。
2)關於LDR僞指令,可以裝載一個32bit立即數的說法並不正確,
     因爲在實際中並不是這一條語句裝載了32bit立即數(跟上面的貌似一樣,呵呵~~),比如:
    ldr r1,=0x70000000
    其實真正的彙編代碼是將某個地址的值傳遞給r1,就是說需要一個地址存放0x70000000這個立即數,在反彙編中,
    如果仔細看會返現,如果這個立即數可以用mov指令的表達形式來表達,編譯器就直接用mov了~~
 


ARM彙編中ldr僞指令和ldr指令
     ARM是RISC結構,數據從內存到CPU之間的移動只能通過L/S指令來完成,也就是ldr/str指令。
    比如想把數據從內存中某處讀取到寄存器中,只能使用ldr比如:
          ldr r0, 0x12345678
    就是把0x12345678這個地址中的值存放到r0中。
    而mov不能實現這個功能,mov只能在寄存器之間移動數據,或者把立即數移動到寄存器中。


        ldr僞指令:雖然ldr僞指令和ARM的ldr指令很像,但是作用不太一樣。
 ldr僞指令可以在立即數前加上=,以表示把一個值(一般是一個地址)寫到某寄存器中,比如:
 ldr r0, =0x12345678 @立即數前面有等號,所以是LDR僞指令
 這樣,就把0x12345678這個值寫到r0中了。所以,ldr僞指令和mov是比較相似的。
 只不過mov指令限制了立即數的長度爲8位,也就是不能超過512。而ldr僞指令沒有這個限制。
如果使用ldr僞指令時,後面跟的立即數沒有超過8位,那麼在實際彙編的時候該ldr僞指令是被轉換爲mov指令的。
 
比如:
ldr r1,=0x10
會變成
mov r1,#0x10


        綜述所述:ldr僞指令用於加載32位的立即數或一個地址值到指定寄存器。
在彙編編譯源程序時,ldr僞指令被編譯器替換成一條合適的指令。
若加載的常數未超出mov或mvn的範圍,則使用mov或mvn指令代替該ldr僞指令,
否則彙編器將常量放入文字池,並使用一條程序相對偏移的ldr指令從文字池讀出常量。       
 
總之: ldr僞指令和ldr指令不是一個同東西。

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