1. 程式人生 > >ARM彙編:載入和儲存指令集(六大類)---LDR、LDRB、LDRH、STR、STRB、STRH

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指向的地址)中。