ARM彙編:載入和儲存指令集(六大類)---LDR、LDRB、LDRH、STR、STRB、STRH
ARM的六大類指令集---LDR、LDRB、LDRH、STR、STRB、STRH
ARM微處理器支援載入/儲存指令用於在暫存器和儲存器之間傳送資料,載入指令用於將儲存器中的資料傳送到暫存器,儲存指令則完成相反的操作。常用的載入儲存指令如下:
— LDR 字資料載入指令
— LDRB 位元組資料載入指令
— LDRH 半字資料載入指令
— STR 字資料儲存指令
— STRB 位元組資料儲存指令
— STRH 半字資料儲存指令
1、LDR指令
LDR指令的格式為:
LDR{條件} 目的暫存器,<儲存器地址>
LDR
指令用於從儲存器中將一個
32
位的字資料傳送到目的暫存器中。該指令通常用於從儲存器中讀取
32
位的字資料到通用暫存器,然後對資料進行處理。當程式計數器
PC
作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。該指令在程式設計中比較常用,且定址方式靈活多樣,請讀者認真掌握。
指令示例:
LDR R0,[R1] ;將儲存器地址為R1的字資料讀入暫存器R0。
LDR R0,[R1,R2] ;將儲存器地址為R1+R2的字資料讀入暫存器R0。
LDR R0,[R1,#8] ;將儲存器地址為R1+8的字資料讀入暫存器R0。
LDR R0,[R1,R2] ! ;將儲存器地址為R1+R2的字資料讀入暫存器R0,並將新地址R1+R2寫入R1。
LDR R0,[R1,#8] ! ;將儲存器地址為R1+8的字資料讀入暫存器R0,並將新地址R1+8寫入R1。
LDR R0,[R1],R2 ;將儲存器地址為R1的字資料讀入暫存器R0,並將新地址R1+R2寫入R1。
LDR R0,[R1,R2,LSL#2]! ;將儲存器地址為R1+R2×4的字資料讀入暫存器R0,並將新地址R1+R2×4寫入R1。
LDR R0,[R1],R2,LSL#2 ;將儲存器地址為R1的字資料讀入暫存器R0,並將新地址R1+R2×4寫入R1。
2、LDRB指令
LDRB指令的格式為:
LDR{條件}B 目的暫存器,<儲存器地址>
LDRB
指令用於從儲存器中將一個
8
位的位元組資料傳送到目的暫存器中,同時將暫存器的高
24
位清零。該指令通常用於從儲存器中讀取
8
位的位元組資料到通用暫存器,然後對資料進行處理。當程式計數器
PC
作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。
指令示例:
LDRB R0,[R1] ;將儲存器地址為R1的位元組資料讀入暫存器R0,並將R0的高24位清零。
LDRB R0,[R1,#8] ;將儲存器地址為R1+8的位元組資料讀入暫存器R0,並將R0的高24位清零。
3、LDRH指令
LDRH指令的格式為:
LDR{條件}H 目的暫存器,<儲存器地址>
LDRH
指令用於從儲存器中將一個
16
位的半字資料傳送到目的暫存器中,同時將暫存器的高
16
位清零。該指令通常用於從儲存器中讀取
16
位的半字資料到通用暫存器,然後對資料進行處理。當程式計數器
PC
作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的地址,從而可以實現程式流程的跳轉。
指令示例:
LDRH R0,[R1] ;將儲存器地址為R1的半字資料讀入暫存器R0,並將R0的高16位清零。
LDRH R0,[R1,#8] ;將儲存器地址為R1+8的半字資料讀入暫存器R0,並將R0的高16位清零。
LDRH R0,[R1,R2] ;將儲存器地址為R1+R2的半字資料讀入暫存器R0,並將R0的高16位清零。
4、LDM指令:
L的含義仍然是LOAD,即是Load from memory into register。
雖然貌似是LDR的升級,但是,千萬要注意,這個指令執行的方向和LDR是不一樣的,是從左到右執行的。該指令是將記憶體中堆疊內的資料,批量的賦值給暫存器,即是出棧操作;其中堆疊指標一般對應於SP,注意SP是暫存器R13,實際用到的卻是R13中的記憶體地址,只是該指令沒有寫為[R13],同時,LDM指令中暫存器和記憶體地址的位置相對於前面兩條指令改變了,下面的例子:
LDMFD SP! , {R0, R1, R2}
實際上可以理解為: LDMFD [SP]!, {R0, R1, R2}
意思為:把sp指向的3個連續地址段(應該是3*4=12位元組(因為為r0,r1,r2都是32位))中的資料拷貝到r0,r1,r2這3個暫存器中去。
5、STR指令
STR指令的格式為:
STR{條件} 源暫存器,<儲存器地址>
STR
指令用於從源暫存器中將一個
32
位的字資料傳送到儲存器中。該指令在程式設計中比較常用,且定址方式靈活多樣,使用方式可參考指令
LDR
。
指令示例:
STR R0,[R1],#8 ;將R0中的字資料寫入以R1為地址的儲存器中,並將新地址R1+8寫入R1。
STR R0,[R1,#8] ;將R0中的字資料寫入以R1+8為地址的儲存器中。
6、STRB指令
STRB指令的格式為:
STR{條件}B 源暫存器,<儲存器地址>
STRB
指令用於從源暫存器中將一個
8
位的位元組資料傳送到儲存器中。該位元組資料為源暫存器中的低
8
位。
指令示例:
STRB R0,[R1] ;將暫存器R0中的位元組資料寫入以R1為地址的儲存器中。
STRB R0,[R1,#8] ;將暫存器R0中的位元組資料寫入以R1+8為地址的儲存器中。
7、STRH指令
STRH指令的格式為:
STR{條件}H 源暫存器,<儲存器地址>
STRH
指令用於從源暫存器中將一個
16
位的半字資料傳送到儲存器中。該半字資料為源暫存器中的低
16
位。
指令示例:
STRH R0,[R1] ;將暫存器R0中的半字資料寫入以R1為地址的儲存器中。
STRH R0,[R1,#8] ;將暫存器R0中的半字資料寫入以R1+8為地址的儲存器中。
8、STM指令:
S的含義仍然是STORE,與LDM是配對使用的,其指令格式上也相似,即區別於STR,是將堆疊指標寫在左邊,而把暫存器組寫在右邊。
STMFD SP!, {R0}
同樣的,該指令也可理解為: STMFD [SP]!, {R0}
意思是:把R0儲存到堆疊(sp指向的地址)中。