語法格式
<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>
{}
表示是可選的部分,<>
表示是必要的部分
條件碼
大部分ARM指令都支持條件執行,即滿足某些條件的時候執行當前指令,同時,還配合有S
位用來指示當前指令是否會映像CPSR相應的位。
EQ | Equal | 相等 | Z=1 |
NE | Noequal | 不相等 | Z=0 |
CS/HS | CarrySet/HighorSame | 無符號數>= | C=1 |
CC/LO | CarryClear/LOwer | 無符號數< | C=0 |
MI | MInus | 負數 | N=1 |
PL | Plus | 非負數 | N=0 |
VS | oVerflowSet | 上溢出 | V=1 |
VC | oVerflowClear | 沒有上溢出 | V=0 |
HI | HIgh | 無符號> | C=1&&Z=0 |
LS | LowerorSame | 無符號數<= | C=0 |
GE | GreaterorEqual | 帶符號數>= | N=1&&V=1或 N=0&&V=0 |
LT | LessThan | 帶符號數< | N=1&&V=0或 N=0&&V=1 |
GT | GreaterThan | 帶符號數> | Z=0&&N=V |
LE | LessEqual | 帶符號數<= Z=1&&N!=V | |
AL | 無條件執行 |
跳轉
B指令跳轉的范圍是PC+-32M,因為ARM一條指令32bit,操作碼B占了6bit,還有24bit裝數據,考慮到ARM的地址是4byte對齊的,所以最后的兩位都會是0,所以就可以用24bit數據表達26bit的地址空間,2^26=64M,即+-32M。如果需要跳轉的地址距離PC超過了32M,可以將目標地址壓棧,通過內存將地址傳遞給PC實現長跳轉
B{<cond>} <target_addr>
BL{<cond>} <target_addr>
BX{<cond>}, <Rm>
BLX <target_address>
BLX{<cond>} <Rm>
數據處理
- 注意立即數的合法性問題
- 立即數=(8bit數據) ROR 偶數位,如果不能通過這種方式得到,就會報錯
- {S}用於表示當前指令的操作結果是否影響CPSR中的相應位
MOV{<cond>}{S} <Rd>, <shifter_operand> ;數據傳送
MVN{<cond>}{S} <Rd>, <shifter_operand> ;數據求反傳送
ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;加法
ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位加法
SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;減法
SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位減法
RSB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逆向減法
RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位逆向減法
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;邏輯與
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;邏輯或
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;邏輯異或
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位清除
CMP{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;比較
CMN{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;基於相反數的比較
TST{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位測試
TEQ{<cond>} <Rn>, <shifter_operand> ;相等測試
數據處理指令的操作數尋址方式(shifter_operand)
<opcode>{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
#<immediate> ;立即數尋址
<Rm> ;寄存器尋址
<Rm>,LSL #<shift_imm> ;立即數邏輯左移
<Rm>,LSL <Rs> ;寄存器邏輯左移
<Rm>,LSR #<shift_imm> ;立即數邏輯右移
<Rm>,LSR <Rs> ;寄存器邏輯右移
<Rm>,ASR #<shift_imm> ;立即數算術右移
<Rm>,ASR <Rs> ;立即數算術右移
<Rm>,ROR #<shift_imm> ;立即數循環右移
<Rm>,ROR <Rs> ;寄存器循環右移
<Rm>,RRX ;寄存器擴展循環右移
乘法指令
任何乘法指令都必須使用寄存器,不能使用立即數
MUL{<cond>}{S} <Rd>, <Rm>, <Rs> ;32位乘法
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn> ;32位帶加數的乘法
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位有符號數乘法
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位帶加數的有符號數乘法
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位無符號數乘法
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位帶加數的無符號數乘法
PSR指令
MRS{<cond>} <Rd>, CPSR ;將PSR的內容傳送到通用寄存器中
MRS{<cond>} <Rd>, SPSR
MSR{<cond>} CPSR_<fields>, #<immediate> ;將通用寄存器的內容或一個立即數傳送到PSR
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
內存訪問
B字節,H半字,T用戶模式,S由有符號
LDR{<cond> <Rd>, <addressing_mode> ;字數據讀取
LDR{<cond>}B <Rd>, <addressing_mode> ;字節數據讀取
LDR{<cond>}BT <Rd>, <addressing_mode> ;用戶模式的字節數據讀取
LDR{<cond>}H <Rd>, <addressing_mode> ;半字數據讀取
LDR{<cond>}SB <Rd>, <addressing_mode> ;有符號的字節數據讀取
LDR{<cond>}SH <Rd>, <addressing_mode> ;有符號的半字數據讀取
LDR{<cond>}T <Rd>, <post_indexed_addressing_mode> ;用戶模式的字數據讀取
STR{<cond>} <Rd>, <addressing_mode> ;字數據寫入
STR{<cond>}B <Rd>, <addressing_mode> ;字節數據寫入
STR{<cond>}H <Rd>, <addressing_mode> ;半字數據寫入
STR{<cond>}T <Rd>, < post_indexed_addressing_mode> ;用戶模式字數據寫入
批量內存訪問
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers> ;批量內存字數據讀取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_without_pc> ;用戶模式的批量內存字數據讀取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc> ;帶PSR的批量內存字數據讀取
STM{<cond>}<addressing_mode> <Rn>{!}, <registers> ;批量內存字數據寫入
STM{<cond>}<addressing_mode> <Rn>, <registers> ;用戶模式的批量內存字數據寫入
異常發生指令
SWI{<cond>} <immed_24> ;軟中斷
BKPT <immediate> ;斷點中斷