当然!下面是ARM架构中常用汇编指令的总结,涵盖数据处理、数据传输、分支跳转、堆栈操作等类别,方便你快速查阅和理解。
ARM 常用汇编指令分类及说明
1. 数据处理指令(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 | 测试 | 按位与,更新状态寄存器 |
2. 数据传输指令(Load/Store)
指令 | 作用 | 说明 |
---|
LDR Rd, [Rn, #offset] | 从内存加载数据到寄存器 | 载入字或字节 |
STR Rd, [Rn, #offset] | 将寄存器数据存入内存 | 存储字或字节 |
LDMIA Rn!, {Rlist} | 递增地址多寄存器加载 | 从地址Rn开始递增装载多个寄存器 |
STMIA Rn!, {Rlist} | 递增地址多寄存器存储 | 从地址Rn开始递增存储多个寄存器 |
3. 分支指令(Branch)
指令 | 作用 | 说明 |
---|
B label | 无条件跳转到标签 | 跳转指令 |
BL label | 跳转并链接(调用子程序) | 同时保存返回地址 |
BX Rm | 跳转到寄存器地址 | 可用于返回或跳转 |
BLX label | 跳转并链接到地址 | 支持切换Thumb和ARM状态 |
4. 堆栈操作指令(Stack)
指令 | 作用 | 说明 |
---|
PUSH {Rlist} | 将寄存器列表入栈 | 等价于 STMDB SP!, {Rlist} |
POP {Rlist} | 从栈中弹出寄存器列表 | 等价于 LDMIA SP!, {Rlist} |
5. 状态寄存器和控制指令
指令 | 作用 | 说明 |
---|
MSR CPSR, Rn | 设置程序状态寄存器 | 修改状态寄存器 |
MRS Rd, CPSR | 读取程序状态寄存器 | 读取状态寄存器 |
SVC #imm | 软中断(系统调用) | 调用操作系统 |
6. 其他常用指令
指令 | 作用 | 说明 |
---|
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:
明白!下面我帮你整理一份更详细的ARM汇编指令手册概要,涵盖:
- 指令格式和条件执行
- 数据处理指令细节
- 数据传输指令扩展
- 分支指令条件控制
- 特殊指令及用法
并配合代码示例,助你全面掌握ARM汇编。
一、ARM指令格式与条件执行
1. 指令格式
ARM指令一般为32位固定长度,格式如下:
[cond][opcode][S][Rn][Rd][Operand2]
cond
:4位条件码,决定指令是否执行(如EQ、NE、GT等)
opcode
:操作码,表示指令类型(ADD、SUB、MOV等)
S
:是否更新条件码(状态寄存器)
Rn
、Rd
:寄存器操作数
Operand2
:第二操作数,支持立即数、寄存器等多种形式
2. 条件执行
- 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时跳转
二、数据处理指令详解
1. MOV(数据传送)
MOV R0, #5 ; R0 = 5
2. ADD、SUB、RSB(算术)
ADD R1, R0, #3 ; R1 = R0 + 3
SUB R2, R1, R0 ; R2 = R1 - R0
RSB R3, R0, #10 ; R3 = 10 - R0
3. 逻辑运算(AND, ORR, EOR, BIC)
AND R0, R1, R2 ; 按位与
ORR R0, R1, R2 ; 按位或
EOR R0, R1, R2 ; 异或
BIC R0, R1, R2 ; 按位清除(R1 & ~R2)
4. CMP和TST(比较和测试)
CMP
:计算Rn - Operand2
,更新条件码但不保存结果
TST
:计算Rn & Operand2
,更新条件码
CMP R0, #10
BGE label ; 如果R0 >= 10跳转
TST R1, #0x1 ; 测试R1最低位是否为1
BEQ label2
三、数据传输指令详解
1. LDR/STR(加载/存储)
LDR R0, [R1] ; 从R1指向的地址加载数据到R0
STR R2, [R1, #4] ; 将R2存储到R1+4地址
- 支持预递增/预递减和后递增/后递减寻址
- 支持字节(LDRB/STRB)和半字(LDRH/STRH)访问
2. 多寄存器加载/存储
LDMIA R0!, {R1-R3} ; 递增地址加载R1-R3,R0递增
STMDB SP!, {R4-R7} ; 递减地址存储R4-R7,SP递减(堆栈操作)
四、分支指令详解
1. B和BL
B label ; 跳转
BL func ; 跳转并链接,保存返回地址到LR
BEQ label
BNE label2
2. BX和BLX
BX Rm
:跳转到寄存器地址,支持切换ARM和Thumb状态
BLX label
:跳转并链接,支持切换状态
五、特殊指令和系统调用
1. SVC(软中断,系统调用)
SVC #0 ; 触发软中断,进入内核态
2. NOP(空指令)
NOP ; 无操作,占位
六、示例综合
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:
发表回复