ARM微處理器的指令集概述(四)——MOV和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和LDR的區別

mov指令後面的立即數是有限制的,這個立即數必須一個8位的二進制數經過偶數次右移後得到才合法數據

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

四  再舉例如下:

mov R0,#0x101
mov R0,#0xFF1
以上兩條指令都不正確,因爲立即數不合法。

這樣的話用MOV指令是比較麻煩的,因爲有些簡單的數據比較容易看出來,有些數據即不容易看出來是否是合法數據。

五  使用ldr僞指令解決這個問題

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

在Uboot源碼中看到這樣一條指令 MOV r1,#0xFFFFFFFF

有點費解,查看反彙編代碼如下

mvn r1,#0

原來如此。


發佈了85 篇原創文章 · 獲贊 7 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章