ARM 常用汇编指令分类及说明
- 数据处理指令(Arithmetic and Logic)
指令 作用 说明
MOV Rd, Operand2 将操作数移动到寄存器 赋值指令
ADD Rd, Rn, Operand2 加法 Rd = Rn + Operand2
SUB Rd, Rn, Operand2 减法 Rd = Rn - Operand2
RSB Rd, Rn, Operand2 反向减法 Rd = Operand2 - Rn
MUL Rd, Rn, Rm 乘法 Rd = Rn * Rm
AND Rd, Rn, Operand2 按位与 Rd = Rn & Operand2
ORR Rd, Rn, Operand2 按位或 `Rd = Rn
EOR Rd, Rn, Operand2 按位异或 Rd = Rn ^ Operand2
BIC Rd, Rn, Operand2 按位清除 Rd = Rn & ~Operand2
CMP Rn, Operand2 比较 Rn - Operand2,更新状态寄存器
TST Rn, Operand2 测试 按位与,更新状态寄存器
- 数据传输指令(Load/Store)
指令 作用 说明
LDR Rd, [Rn, #offset] 从内存加载数据到寄存器 载入字或字节
STR Rd, [Rn, #offset] 将寄存器数据存入内存 存储字或字节
LDMIA Rn!, {Rlist} 递增地址多寄存器加载 从地址Rn开始递增装载多个寄存器
STMIA Rn!, {Rlist} 递增地址多寄存器存储 从地址Rn开始递增存储多个寄存器
- 分支指令(Branch)
指令 作用 说明
B label 无条件跳转到标签 跳转指令
BL label 跳转并链接(调用子程序) 同时保存返回地址
BX Rm 跳转到寄存器地址 可用于返回或跳转
BLX label 跳转并链接到地址 支持切换Thumb和ARM状态
- 堆栈操作指令(Stack)
指令 作用 说明
PUSH {Rlist} 将寄存器列表入栈 等价于 STMDB SP!, {Rlist}
POP {Rlist} 从栈中弹出寄存器列表 等价于 LDMIA SP!, {Rlist}
- 状态寄存器和控制指令
指令 作用 说明
MSR CPSR, Rn 设置程序状态寄存器 修改状态寄存器
MRS Rd, CPSR 读取程序状态寄存器 读取状态寄存器
SVC #imm 软中断(系统调用) 调用操作系统
- 其他常用指令
指令 作用 说明
NOP 空操作 无任何操作
SWI #imm 软件中断 触发异常,用于系统调用
CLZ Rd, Rm 计算首个“1”前的零位数 用于优化算法
简单示例代码
MOV R0, #5 ; R0 = 5
MOV R1, #3 ; R1 = 3
ADD R2, R0, R1 ; R2 = R0 + R1 = 8
SUB R3, R2, #1 ; R3 = R2 - 1 = 7
CMP R3, #10 ; 比较R3和10
BNE label_not_equal ; 不等跳转
MOV R4, #0
B end
label_not_equal:
MOV R4, #1
end:
php
267 Bytes
© 菜鸟-创作你的创作
明白!下面我帮你整理一份更详细的ARM汇编指令手册概要,涵盖:
指令格式和条件执行
数据处理指令细节
数据传输指令扩展
分支指令条件控制
特殊指令及用法
并配合代码示例,助你全面掌握ARM汇编。
一、ARM指令格式与条件执行
- 指令格式
ARM指令一般为32位固定长度,格式如下:
[cond][opcode][S][Rn][Rd][Operand2]
php
35 Bytes
© 菜鸟-创作你的创作
cond:4位条件码,决定指令是否执行(如EQ、NE、GT等)
opcode:操作码,表示指令类型(ADD、SUB、MOV等)
S:是否更新条件码(状态寄存器)
Rn、Rd:寄存器操作数
Operand2:第二操作数,支持立即数、寄存器等多种形式
- 条件执行
ARM指令支持条件执行,节省分支跳转
常用条件码:
条件码 含义 解释
EQ Equal 零标志Z=1,等于
NE Not Equal 零标志Z=0,不等
GT Greater Than Z=0且N=V
LT Less Than N≠V
GE Greater or Equal N=V
LE Less or Equal Z=1或N≠V
AL Always 总是执行
示例:
CMP R0, #0
BEQ zero_label ; 当R0=0时跳转
php
45 Bytes
© 菜鸟-创作你的创作
二、数据处理指令详解
MOV(数据传送)
MOV R0, #5 ; R0 = 5
php
26 Bytes
© 菜鸟-创作你的创作
支持立即数、寄存器、移位操作等ADD、SUB、RSB(算术)
ADD R1, R0, #3 ; R1 = R0 + 3
SUB R2, R1, R0 ; R2 = R1 - R0
RSB R3, R0, #10 ; R3 = 10 - R0
php
103 Bytes
© 菜鸟-创作你的创作逻辑运算(AND, ORR, EOR, BIC)
AND R0, R1, R2 ; 按位与
ORR R0, R1, R2 ; 按位或
EOR R0, R1, R2 ; 异或
BIC R0, R1, R2 ; 按位清除(R1 & ~R2)
php
113 Bytes
© 菜鸟-创作你的创作- CMP和TST(比较和测试)
CMP:计算Rn - Operand2,更新条件码但不保存结果
TST:计算Rn & Operand2,更新条件码
CMP R0, #10
BGE label ; 如果R0 >= 10跳转
TST R1, #0x1 ; 测试R1最低位是否为1
BEQ label2
php
98 Bytes
© 菜鸟-创作你的创作
三、数据传输指令详解
LDR/STR(加载/存储)
LDR R0, [R1] ; 从R1指向的地址加载数据到R0
STR R2, [R1, #4] ; 将R2存储到R1+4地址
php
78 Bytes
© 菜鸟-创作你的创作
支持预递增/预递减和后递增/后递减寻址
支持字节(LDRB/STRB)和半字(LDRH/STRH)访问多寄存器加载/存储
LDMIA R0!, {R1-R3} ; 递增地址加载R1-R3,R0递增
STMDB SP!, {R4-R7} ; 递减地址存储R4-R7,SP递减(堆栈操作)
php
91 Bytes
© 菜鸟-创作你的创作
四、分支指令详解B和BL
B label ; 跳转
BL func ; 跳转并链接,保存返回地址到LR
php
52 Bytes
© 菜鸟-创作你的创作
条件分支:
BEQ label
BNE label2
php
28 Bytes
© 菜鸟-创作你的创作- BX和BLX
BX Rm:跳转到寄存器地址,支持切换ARM和Thumb状态
BLX label:跳转并链接,支持切换状态
五、特殊指令和系统调用
SVC(软中断,系统调用)
SVC #0 ; 触发软中断,进入内核态
php
28 Bytes
© 菜鸟-创作你的创作NOP(空指令)
NOP ; 无操作,占位
php
23 Bytes
© 菜鸟-创作你的创作
六、示例综合MOV R0, #10
MOV R1, #20
ADD R2, R0, R1
CMP R2, #25
BGT greater
MOV R3, #0
B end
greater:
MOV R3, #1
end:
php
136 Bytes
© 菜鸟-创作你的创作
https://www.52runoob.com/archives/5397