LDR偽指令與LDR載入指令

2021-05-25 03:28:27 字數 1619 閱讀 5914

arm指令集中,ldr通常都是作載入指令的,但是它也可以作偽指令。

ldr偽指令的形式是「ldr rn,=expr」。下面舉乙個例子來說明它的用法。

count equ       0x40003100

ldr       r1,=count

mov      r0,#0

str       r0,[r1]

count是我們定義的乙個變數,位址為0x40003100。這中定義方法在組合語言中是很常見的,如果使用過微控制器的話,應該都熟悉這種用法。

ldr       r1,=count是將count這個變數的位址,也就是0x40003100放到r1中。

mov      r0,#0是將立即數0放到r0中。最後一句str      r0,[r1]是乙個典型的儲存指令,將r0中的值放到以r1中的值為位址的儲存單元去。實際就是將0放到位址為0x40003100的儲存單元中去。可見這三條指令是為了完成對變數count賦值。用三條指令來完成對乙個變數的賦值,看起來有點不太舒服。這可能跟arm的採用risc有關。

下面還有乙個例子:將count的值賦給r0

ldr       r1,=count   ;這條偽指令,是將count的位址賦給r1

ldr       r0,[r1]   ;將count的值賦給r0

arm是risc結構,資料從記憶體到cpu之間的移動只能通過ldr/str指令來完成。 比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr,比如: ldr r0, 0x12345678 ;就是把0x12345678這個位址中的值存放到r0中。而mov不能幹這個活,mov只能在暫存器之間移動資料,或者把立即數移動到暫存器中,這個和x86這種cisc架構的晶元區別最大的地方。 

x86中沒有ldr這種指令,因為x86的mov指令可以將資料從記憶體中移動到暫存器中。 

mov是從乙個暫存器或者移位的暫存器或者立即數的值傳遞到另外乙個暫存器。

從本質上是暫存器到暫存器的傳遞,為什麼會有立即數,其實也是有限制的立即數,不是所有立即數都可以傳遞的這個立即數要符合乙個8位數迴圈右移偶數字的取值。原因是,mov本身就是一條32bit指令,除了指令碼本身,它不可能再帶乙個可以表示32bit的數字,所以用了其中的12bit來表示立即數,其中4bit表示移位的位數(迴圈右移,且數值x2),8bit用來表示要移位的乙個基數。

另外還有乙個就是ldr偽指令,雖然ldr偽指令和arm的ldr指令很像,但是作用不太一樣。ldr偽指令可以在立即數前加上=,以表示把乙個位址寫到某暫存器中,比如: 

ldr r0, =0x12345678 

這樣,就把0x12345678這個位址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令時,後面跟的立即數沒有超過8位,那麼在實際彙編的時候該ldr偽指令是被轉換為 mov指令的。

總結:偽指令ldr register, =

expr為32為常量。編譯器根據expr的取值情況來處理這條偽指令:

1、當expr表示的位址沒有超過mov或mvn指令中位址的取值範圍時,編譯器用合適的mov指令或mvn指令代替該ldr偽指令。

2、當expr表示的位址超過了mov或mvn指令中位址的取值範圍時,編譯器將該常數放在緩衝區中,同時用一條基於pc的ldr指令讀取該常數。

LDR指令和LDR偽指令

arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...

LDR指令和LDR偽指令區別

arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...

LDR指令和LDR偽指令的區別

arm指令集中,ldr通常都是作載入指令,但是它也可以作偽指令。初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。ldr偽指令的形式是 ldr rn,expr 作用是裝在乙個32bit常數和乙個位址到暫存器。下面舉乙個例子來說明它的用法。coun...