ARM LDR与MOV的区别
KG—MOV指令、LDR指令、LDR偽指令之間的區別
MOV指令、LDR指令、LDR偽指令之間的區別
作為一個擴展(KG),感覺這個東西還是有必要說說的~~
在我編譯一個工程的時候,用MOV指令編譯有的時候出錯,但是有的時候就又對了,還有LDR,怎么有的時候加個“=”有的時候有不加了,暈頭暈鬧的~~
查過相關資料后,發現還是有很多要知道的~~
1、“8位圖”數據
這個是必須的必要知道的~~
看一張圖片就明白了(右移~~):
2、MOV指令
MOV指令可以把立即數或者寄存器內容(注意:這里絕對不可以是內存!!)傳遞給一個寄存器。
對于立即數是有要求的,就是上邊的“8位圖”數據。只能由一個8bit連續有效位通過偶數次移位得到的數。
它為什么會有這樣的限制呢?
原因是,MOV本身就是一個32bit指令,除了指令碼本身,他不可能再帶一個可以表示32bit的數字,所以用了
其中的12bit來表示立即數,其中4bit表示移位的尾數(循環右移,且數值*2),8bit
用來表示要移位的一個基數。
如果立即數超過這個范圍,就沒有辦法用一條MOV指令給寄存器賦值(這里就要用到LDR偽指令了,查看反匯編指令,你會看到LDR偽指令此變成了兩條指令~~)。
3、LDR指令
首先呢:
ldr指令既可以是大范圍的地址讀取偽指令,也可以內存訪問指令。當它的第二個參數前面有“=”時,
表示偽指令,否則表示內存訪問指令。
LDR指令就是個單寄存器存儲的ARM存儲器訪問指令。
補充了MOV指令不能訪問內存的缺陷。
ARM是RISC結構的,數據從內存到CPU之間的移動只能通過ldr/str指令(我說的是但個寄存器~~)。
想要把數據從內存中某處讀取到寄存器中,只能用ldr。
在X86這種CISC構架的就沒有ldr,因為X86一個mov就搞定了,可以說這就是連個芯片之間最大的區別了~~
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只能在寄存器之間移動數據,或者把立即數移動到寄存器中,這個和x86這種CISC架構的芯片區別最大的地方。x86中沒有ldr這種指令,因為x86的mov指令可以將數據從內存中移動到寄存器中。
???????????? 另外還有一個就是ldr偽指令,雖然ldr偽指令和ARM的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把一個值(一般是一個地址)寫到某寄存器中,比如:
這樣,就把0x12345678這個值寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,后面跟的立即數沒有超過8位,那么在實際匯編的時候該ldr偽指令是被轉換為mov指令的。???????? 其實ldr指令可以裝載一個32bit立即數的說法并不確切,因為實際上并不是這一條語句裝載了一個32bit立即數,真正的匯編代碼是將某個地址的值傳遞給r1,就是說需要一個地址存放0x12345678這個立即數。而且如果這個立即數可以用mov指令的形式來表達,會被編譯器實際用mov來代替比如:
ldr r1,=0x10會變成
mov r1,#0x10??????? 綜述所述:ldr偽指令用于加載32位的立即數或一個地址值到指定寄存器。在匯編編譯源程序時,ldr偽指令被編譯器替換成一條合適的指令。若加載的常數未超出mov或mvn的范圍,則使用mov或mvn指令代替該ldr偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的ldr指令從文字池讀出常量。??????? ldr偽指令和ldr指令不是一個同東西。
總結
以上是生活随笔為你收集整理的ARM LDR与MOV的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware9安装Ubuntu 12.1
- 下一篇: iOS开发基础篇——介绍C++内置函数