LDR指令和LDR偽指令區別

2021-08-10 09:58:34 字數 1463 閱讀 9785

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

初學者一般不會注意到它們的區別,其實在嵌入式開發過程中,這兩條指令時非常常用的!我們應該了解他們的區別。

ldr偽指令的形式是「ldr rn,=expr」。作用是裝在乙個32bit常數和乙個位址到暫存器。

下面舉乙個例子來說明它的用法。

count equ       0x56000054

ldr       r1,=count

mov       r0,#0

str       r0,[r1]

count是我們定義的乙個變數,位址為0x56000054。

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

mov      r0,#0是將立即數0放到r0中。

str   r0,[r1]  是乙個典型的儲存指令,將r0中的值放到以r1中的值為位址的儲存單元去。

實際就是將0放到位址為0x56000054的儲存單元中去。

可見這三條指令是為了完成對變數count賦值。

再舉乙個例子

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指令和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...