標籤:
ARM指令集2
ARM微處理器支援載入/儲存指令用於在寄存器和儲存空間之間傳送資料,載入指令用於將儲存空間中的資料傳送到寄存器,儲存指令則完成相反的操作。
LDR指令(與MOV有區別,MOV只能操作通用寄存器)
LDR指令格式為:
LDR{條件}目的寄存器,<儲存空間地址>
LDR指令用於從儲存空間中將一個32位的字資料傳送到目的寄存器中。該指令通常用於從儲存空間中讀取32位的字資料到通用寄存器,然後對資料進行處理。
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。
LDRB指令
LDRB指令格式為:
LDR{條件}B目的寄存器,<儲存寄存器>
LDRB指令用於從寄存器中將一個低8位的位元組資料傳送到目的寄存器中,同時將寄存器的高24位清零。該指令通常用於從儲存空間中讀取8位的位元組數到通用寄存器,然後對資料進行處理。
指令樣本:
LDRB R0,[R1];將儲存空間地址為R1的位元組數讀入寄存器R0,並將R0的高24位清零。
LDRB R0,[R1,#8];將儲存空間地址為R1+8的位元組資料讀入寄存器R0,並將R0的高24位清零。
LDRH指令
LDRH指令格式為:
LDR{條件}H目的寄存器,<儲存寄存器>
LDRH指令用於從寄存器中將一個低16位的半位元組資料傳送到目的寄存器中,同時將寄存器的高16位清零。該指令通常用於從儲存空間中讀取16位的半位元組數到通用寄存器,然後對資料進行處理。
指令樣本:
LDRB R0,[R1];將儲存空間地址為R1的半位元組數讀入寄存器R0,並將R0的高16位清零。
LDRB R0,[R1,R2];將儲存空間地址為R1+R2的半位元組資料讀入寄存器R0,並將R0的高16位清零。
STR指令
STR指令的格式為:
STR{條件}源寄存器,<儲存空間地址>
STR指令用於從源寄存器中將一個32位的字資料傳送到儲存空間中。
指令樣本:
STR R0,[R1],#8;將R0中的字資料寫入以R1為地址的儲存空間中,並將新地址R1+8寫入R1。
STR R0,[R1,#8];將R0中的字資料寫入以R1+8為地址的儲存空間中。
批量載入/儲存指令
ARM微處理器所支援的批量資料載入/儲存指令可以一次在一片連續的儲存單元和多個寄存器之間傳送資料,批量載入指令用於將一片連續的儲存空間中的資料傳送到多個寄存器,批量資料存放區指令則完成相反的操作。常用的載入儲存指令如下:
LDM 批量資料載入指令
STM 批量資料存放區指令
LDM指令
LDM指令格式為:
LDM{條件}{類型}指令用於從由基底位址暫存器{! },寄存器列表{}
LDM(或STM)指令用於從基底位址暫存器所指示的一片連續的儲存空間到儲存空間所指示的多個寄存器之間傳送資料,該指令的常見用途是將多個寄存器的內容入棧或出棧。其中,{類型}為以下幾種情況:
{! }為可選尾碼,若選用該尾碼,則當資料傳送完畢之後,將最後的地址寫入基底位址暫存器,否則基底位址暫存器的內容不變。基底位址暫存器不允許為R15,寄存器列表可以為R0~R15的任意組合。
寄存器列表{}為可選尾碼,當指令為LDM且寄存器列表中包含R15,選用該尾碼時表示:除了正常的資料傳送之外,還將SPSR複製到CPSR。
指令樣本:
STMFD R13!,{R0,R4-R12,LR}
將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧。
LDMFD R13!,{R0,R4-R12,PC}
將堆棧內容恢複到寄存器(R0,R4到R12,LR)。
資料交換指令
ARM微處理器所支援資料交換指令能在儲存空間和寄存器之間交換資料。資料交換指令有如下兩條:
SWP 字資料交換指令
SWPB 位元組資料交換指令
SWP指令
SWP指令格式為:
SWP{條件}目的寄存器,源寄存器1,[源寄存器2] or LDR 和 STR 兩個指令也能實現SWP指令。
SWP指令用於將源寄存器2所指向的儲存空間中的字資料傳送到目的寄存器中,同時將源寄存器1中的字資料傳送到源寄存器2所指向的儲存空間中。顯然,當元寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和儲存空間的內容。
指令樣本:
SWP R0,R1,[R2];將R2所指向的儲存空間中的字資料傳送到R0,同時將R1中的字資料傳送到R2所指向的儲存單元。
SWP R0, R0, [R1];該指令完成將R1所指向的儲存空間中的字資料與R0中的字資料交換。
移位指令
ARM微處理器支援資料的移位操作,移位操作在ARM指令集中不作為單獨的指令使用,它只能作為指令格式中是一個欄位,在組合語言中表示為指令中的選項。移位操作包括如下幾種類型,ASL和LSL是等價的,可以自由互換:
LSL 邏輯左移
ASL 算術左移
LSR 邏輯右移
ASR 算術右移
ROR 迴圈右移
異常產生指令
ARM微處理器所支援的異常指令有如下兩條:
SWI 軟體中斷指令
BKPT 斷點中斷指令
SWI指令格式為:
SWI{條件}24位的立即數
SWI指令用於產生軟體中斷,以便使用者程式能叫用作業系統的系統API。作業系統在SWI的例外處理常式中提供相應的系統服務,指令中24位的立即數指定使用者程式調用的API類型。
指令樣本:
SWI 0x02
該指令叫用作業系統編號位02的系統常式。
ARM指令集2