Linux基础 -- ARM 32位常用机器码(指令)整理
ARM 32位常用机器码(指令)整理
1. 数据处理指令(运算、逻辑、比较)
指令 |
含义 |
示例 |
备注 |
MOV |
赋值(寄存器传输) |
MOV R0, R1 |
直接将 R1 复制到 R0 |
MVN |
取反 |
MVN R0, R1 |
R0 = ~R1 |
ADD |
加法 |
ADD R0, R1, R2 |
R0 = R1 + R2 |
ADC |
带进位加法 |
ADC R0, R1, R2 |
R0 = R1 + R2 + C (进位) |
SUB |
减法 |
SUB R0, R1, R2 |
R0 = R1 - R2 |
SBC |
带借位减法 |
SBC R0, R1, R2 |
R0 = R1 - R2 - !C |
RSB |
逆向减法 |
RSB R0, R1, #0 |
R0 = 0 - R1 |
AND |
按位与 |
AND R0, R1, R2 |
R0 = R1 & R2 |
ORR |
按位或 |
ORR R0, R1, R2 |
`R0 = R1 |
EOR |
按位异或 |
EOR R0, R1, R2 |
R0 = R1 ^ R2 |
BIC |
按位清除 |
BIC R0, R1, R2 |
R0 = R1 & ~R2 |
CMP |
比较 |
CMP R0, R1 |
计算 R0 - R1 并设置标志 |
TST |
按位测试 |
TST R0, R1 |
计算 R0 & R1 并设置标志 |
2. 乘法和除法指令
指令 |
含义 |
示例 |
备注 |
MUL |
无符号乘法 |
MUL R0, R1, R2 |
R0 = R1 * R2 |
MLA |
乘法累加 |
MLA R0, R1, R2, R3 |
R0 = (R1 * R2) + R3 |
MLS |
乘法减法 |
MLS R0, R1, R2, R3 |
R0 = R3 - (R1 * R2) |
UMULL |
无符号长乘法 |
UMULL R0, R1, R2, R3 |
R1:R0 = R2 * R3 |
SMULL |
有符号长乘法 |
SMULL R0, R1, R2, R3 |
R1:R0 = R2 * R3 |
UDIV |
无符号除法 |
UDIV R0, R1, R2 |
R0 = R1 / R2 (ARMv7 以上) |
SDIV |
有符号除法 |
SDIV R0, R1, R2 |
R0 = R1 / R2 (ARMv7 以上) |
3. 数据传输指令(加载/存储)
指令 |
含义 |
示例 |
备注 |
LDR |
加载数据 |
LDR R0, [R1] |
R0 = *(R1) 读取 R1 指向的内存 |
STR |
存储数据 |
STR R0, [R1] |
*(R1) = R0 |
LDM |
批量加载 |
LDMIA R0!, {R1-R3} |
读取多个寄存器 |
STM |
批量存储 |
STMDB R0!, {R1-R3} |
存储多个寄存器 |
PUSH |
入栈 |
PUSH {R0, R1} |
ARM 栈向低地址增长 |
POP |
出栈 |
POP {R0, R1} |
|
4. 分支与跳转指令
指令 |
含义 |
示例 |
备注 |
B |
无条件跳转 |
B label |
|
BL |
过程调用 |
BL function |
进入子程序,返回地址存 LR |
BX |
返回或跳转 |
BX LR |
过程返回(ARM/Thumb 切换) |
BLX |
远程跳转 |
BLX R0 |
可能涉及 Thumb 模式 |
5. 系统控制指令
指令 |
含义 |
示例 |
备注 |
NOP |
空指令 |
NOP |
什么都不做 |
SVC |
软中断 |
SVC #0 |
系统调用 |
MRS |
读 CPSR |
MRS R0, CPSR |
读取状态寄存器 |
MSR |
写 CPSR |
MSR CPSR, R0 |
修改状态寄存器 |
WFI |
进入低功耗 |
WFI |
等待中断 |
总结
ARM 32 位指令集中,最常用的指令包括:
- 数据处理:
MOV
、ADD
、SUB
、CMP
、AND
- 加载/存储:
LDR
、STR
、PUSH
、POP
- 分支:
B
、BL
、BX
- 系统控制:
NOP
、SVC
、MRS
、MSR