<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>
{}
表示是可选的部分,<>
表示是必要的部分post
大部分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实现长跳转code
B{<cond>} <target_addr> BL{<cond>} <target_addr> BX{<cond>}, <Rm> BLX <target_address> BLX{<cond>} <Rm>
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> ;相等测试
<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位带加数的无符号数乘法
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由有符号get
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> ;断点中断