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指令可以裝載乙個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偽指令和LDR指令
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr比如 ldr r0,0x12345678就是把0x12345678這個位址中的值存放到r...
說說ARM彙編的LDR偽指令
說說arm彙編的ldr偽指令 我們知道arm cpu中有一條被廣泛使用的指令ldr,它主要是用來從儲存器 確切地說是位址空間 中裝載資料到通用暫存器。但不論是armasm還是gnu arm as,都提供了一條與之同名的偽指令ldr,而在實際中使用該偽指令的情況也較多,那他們有什麼不同呢?下面我談談我...
LDR指令和LDR偽指令
arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...