当然!下面是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:是否更新条件码(状态寄存器)
  • RnRd:寄存器操作数
  • Operand2:第二操作数,支持立即数、寄存器等多种形式

2. 条件执行

  • ARM指令支持条件执行,节省分支跳转
  • 常用条件码:
条件码含义解释
EQEqual零标志Z=1,等于
NENot Equal零标志Z=0,不等
GTGreater ThanZ=0且N=V
LTLess ThanN≠V
GEGreater or EqualN=V
LELess or EqualZ=1或N≠V
ALAlways总是执行

示例

    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: