原文**
(1)
ldr:l表示
load
,load
的含義應該理解為:
load from memory into register
。下面這條語句就說明的很清楚:
ldrr1,[r2]
r1<
——[r2]
就是把r2所指向的儲存單元的內容的值(乙個
memory
位址內的值),讀取到
r1中(乙個
register)
(2)
str:s表示
store
,store
的含義應該理解為:
store from a register into memory
。下面這條語句表示的很清楚:
strr1,[r2]
r1——>[r2]
就是把暫存器
r1中的內容「儲存」到
r2所指向的儲存的單元中
(乙個memory
位址)。
顯然,這兩條語句都有個特點,就是暫存器寫在前面(左邊)而記憶體位址寫在後面(右邊),資料傳送的方向則是恰好相反的。
下面對ldm和stm介紹,使用sp來介紹,因為實際使用中,和sp一起使用更多。
(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]!,
意思是:把
r0儲存到堆疊(sp指向的位址)中。
顯然,這兩個堆疊操作指令也有個特點,就是暫存器組寫在後面(右邊)而堆疊指標寫在前面(左邊),而且實際上使用的是堆疊指標中的記憶體位址,這一點與前面兩條指令是有區別的。
(補充:sp後面的!,作用是指命令執行完後,對應的位址值賦給sp,對於例程的sdm,是說最後sp的值應該是sp+3*4=sp+12)
這四條指令中,前面兩條和後面兩條其實聯絡不多,反而是差別很大,因此,可以直接把這兩組指令區分開來,認為它們之間沒有聯絡,這樣避免誤解。
ARM彙編和內嵌彙編
彙編指令 跳轉指令 b bl blxbx 資料處理指令 mov mvnadd adcsub rsbrsc andor eorbic cmncmp tstteq 狀態暫存器指令 mrs msrldr strldm stmmcr arm和協處理器之間資料交換 mrccond 可選的條件 rd 存放返回狀...
ADS ARM 彙編和GNU ARM彙編
linux unix核心源 用的編譯器是gcc,而gcc採用的是at t的彙編格式,這與ads下使用的彙編格式是不同的。兩種彙編格式的部分對比如下 gnu arm彙編 ads arm彙編 或 include get.equ equ.global export extern import long d...
內嵌彙編和內聯彙編的使用
有時為了高效,有時為了直接控制硬體,有些模組我們不得不直接用組合語言來編寫,並且對外提供呼叫的介面,隱藏細節,這其實就是內聯彙編。如何使用內聯彙編?我們就以 gcc 為例,一窺其中奧秘!一 關鍵字 如何讓 gcc 知道 中內嵌的彙編呢?借助關鍵字!來看下面的例子 asm volatile hlt a...