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的系統例程。
?