Linux基础 -- ARM 32位常用机器码(指令)整理

发布于:2025-03-01 ⋅ 阅读:(125) ⋅ 点赞:(0)

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 位指令集中,最常用的指令包括:

  • 数据处理MOVADDSUBCMPAND
  • 加载/存储LDRSTRPUSHPOP
  • 分支BBLBX
  • 系统控制NOPSVCMRSMSR

网站公告

今日签到

点亮在社区的每一天
去签到