当然!下面是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,
MOV R1,
ADD R2, R0, R1
SUB R3, R2,
CMP R3,
BNE label_not_equal
MOV R4,
B end
label_not_equal:
MOV R4,
end:
php
267 Bytes
© 菜鸟-创作你的创作
明白!下面我帮你整理一份更详细的ARM汇编指令手册概要,涵盖:
- 指令格式和条件执行
- 数据处理指令细节
- 数据传输指令扩展
- 分支指令条件控制
- 特殊指令及用法
并配合代码示例,助你全面掌握ARM汇编。
一、ARM指令格式与条件执行
1. 指令格式
ARM指令一般为32位固定长度,格式如下:
[cond][opcode][S][Rn][Rd][Operand2]
php
35 Bytes
© 菜鸟-创作你的创作
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,
BEQ zero_label
php
45 Bytes
© 菜鸟-创作你的创作
二、数据处理指令详解
1. MOV(数据传送)
MOV R0,
php
26 Bytes
© 菜鸟-创作你的创作
2. ADD、SUB、RSB(算术)
ADD R1, R0,
SUB R2, R1, R0
RSB R3, R0,
php
103 Bytes
© 菜鸟-创作你的创作
3. 逻辑运算(AND, ORR, EOR, BIC)
AND R0, R1, R2
ORR R0, R1, R2
EOR R0, R1, R2
BIC R0, R1, R2
php
113 Bytes
© 菜鸟-创作你的创作
4. CMP和TST(比较和测试)
CMP:计算Rn - Operand2,更新条件码但不保存结果
TST:计算Rn & Operand2,更新条件码
CMP R0,
BGE label
TST R1,
BEQ label2
php
98 Bytes
© 菜鸟-创作你的创作
三、数据传输指令详解
1. LDR/STR(加载/存储)
LDR R0, [R1]
STR R2, [R1, #4]
php
78 Bytes
© 菜鸟-创作你的创作
- 支持预递增/预递减和后递增/后递减寻址
- 支持字节(LDRB/STRB)和半字(LDRH/STRH)访问
2. 多寄存器加载/存储
LDMIA R0!, {R1-R3}
STMDB SP!, {R4-R7}
php
91 Bytes
© 菜鸟-创作你的创作
四、分支指令详解
1. B和BL
B label ; 跳转
BL func ; 跳转并链接,保存返回地址到LR
php
52 Bytes
© 菜鸟-创作你的创作
BEQ label
BNE label2
php
28 Bytes
© 菜鸟-创作你的创作
2. BX和BLX
BX Rm:跳转到寄存器地址,支持切换ARM和Thumb状态
BLX label:跳转并链接,支持切换状态
五、特殊指令和系统调用
1. SVC(软中断,系统调用)
SVC
php
28 Bytes
© 菜鸟-创作你的创作
2. NOP(空指令)
NOP
php
23 Bytes
© 菜鸟-创作你的创作
六、示例综合
MOV R0,
MOV R1,
ADD R2, R0, R1
CMP R2,
BGT greater
MOV R3,
B end
greater:
MOV R3,
end:
php
136 Bytes
© 菜鸟-创作你的创作
www.52runoob.com/archives/53…