彙編指令 ldr和str,ldm和stm的區別

2022-03-09 05:33:16 字數 1153 閱讀 2227

(1)ldr:l表示load,load的含義應該理解為:load from memory into register。下面這條語句就說明的很清楚:

ldr   r1,     [r2]

r1<——[r2]

就是把r2所指向的儲存單元的內容的值(乙個memory位址內的值),讀取到r1中(乙個register)

(2)str:s表示store,store的含義應該理解為:store from a register into memory。下面這條語句表示的很清楚:

str    r1,     [r2]

r1——>[r2]

就是把暫存器r1中的內容「儲存」到r2所指向的儲存的單元中(乙個memory位址)。

顯然,這兩條語句都有個特點,就是暫存器寫在前面(左邊)而記憶體位址寫在後面(右邊),資料傳送的方向則是恰好相反的。

(3)ldm:l的含義仍然是load,即是load from memory into register。

雖然貌似是ldr的公升級,但是,千萬要注意,這個指令執行的方向和ldr是不一樣的,是從左到右執行的。該指令是將記憶體中堆疊內的資料,批量的賦值給暫存器,即是出棧操作;其中堆疊指標一般對應於sp,注意sp是暫存器r13,實際用到的卻是r13中的記憶體位址,只是該指令沒有寫為[r13],同時,ldm指令中暫存器和記憶體位址的位置相對於前面兩條指令改變了,下面的例子:

ldmfd     sp! ,   

實際上可以理解為:    ldmfd     [sp]!,    

意思為:把sp指向的3個連續位址段(應該是3*4=12位元組(因為為r0,r1,r2都是32位))中的資料拷貝到r0,r1,r2這3個暫存器中去;

(4)stm:s的含義仍然是store,與ldm是配對使用的,其指令格式上也相似,即區別於str,是將堆疊指標寫在左邊,而把暫存器組寫在右邊。

stmfd  sp!,   

該指令也可理解為:  stmfd  [sp]!,  

顯然,這兩個堆疊操作指令也有個特點,就是暫存器組寫在後面(右邊)而堆疊指標寫在前面(左邊),而且實際上使用的是堆疊指標中的記憶體位址,這一點與前面兩條指令是有區別的。

(補充:sp後面的!的作用:r0的值在ldm過程中發生的增加或減少,最後寫回到r0中去,也就是ldm時會改變r0的值

ARM彙編中LDR偽指令和LDR指令

arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr比如 ldr r0,0x12345678 就是把0x12345678這個位址中的值存放到r0中。而mov不能實現這個功能,mov只能在暫存器...

ARM彙編中LDR偽指令和LDR指令

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!arm是risc結構,資料從記憶體到cpu之間的移動只能通過l s指令來完成,也就是ldr str指令。比如想把資料從記憶體中某處讀取到暫存器中,只能使用ldr比如 ldr r0,0x12345678就是把0x12345678這個位址中的值存放到r...

LDR指令和LDR偽指令

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