以下是 ARM Cortex-A7 处理器支持的汇编指令集的全面总结,涵盖 ARMv7-A 架构的核心指令及其扩展功能。内容按功能分类,包含指令格式、功能说明及典型应用场景:
一、指令集架构概述
特性 | 说明 |
---|---|
架构版本 | ARMv7-A |
指令集支持 | ARM (32位)、Thumb-2 (16/32位混合)、VFPv4、NEON |
执行模式 | ARM/Thumb 状态(通过CPSR.T 位切换) |
寄存器组 | 16个通用寄存器(R0-R15),包括: - R13(SP):栈指针 - R14(LR):链接寄存器 - R15(PC):程序计数器 |
二、核心指令集分类详解
1. 数据处理指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
MOV | MOV{cond}{S} Rd, Op2 |
数据传送 | MOV R0, #0x1000 |
MVN | MVN{cond}{S} Rd, Op2 |
取反传送 | MVN R1, #0xFF |
ADD | ADD{cond}{S} Rd, Rn, Op2 |
加法 | ADD R3, R2, R1, LSL #2 |
SUB | SUB{cond}{S} Rd, Rn, Op2 |
减法 | SUB R4, R5, #0x20 |
MUL | MUL{cond}{S} Rd, Rn, Rm |
乘法(32位结果) | MUL R0, R1, R2 |
MLA | MLA{cond}{S} Rd, Rn, Rm, Ra |
乘加 | MLA R3, R4, R5, R6 |
AND | AND{cond}{S} Rd, Rn, Op2 |
按位与 | AND R0, R0, #0xFF |
ORR | ORR{cond}{S} Rd, Rn, Op2 |
按位或 | ORR R1, R1, #0x80 |
EOR | EOR{cond}{S} Rd, Rn, Op2 |
按位异或 | EOR R2, R2, R3 |
BIC | BIC{cond}{S} Rd, Rn, Op2 |
位清除 | BIC R2, R2, #0x0F |
LSL/LSR/ASR/ROR | Op{cond}{S} Rd, Rn, Rm/Imm |
移位操作(逻辑/算术/循环) | LSL R0, R1, #3 |
操作数类型:
- 立即数:
#0x1F
(需符合 ARM 编码规则) - 寄存器:
R3
- 移位操作:
R1, LSL #3
(逻辑左移3位)
2. 访存指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
LDR | LDR{cond} Rt, [Rn, #offset] |
加载字数据 | LDR R0, [R1, #4] |
LDRB | LDRB{cond} Rt, [Rn, #offset] |
加载字节数据 | LDRB R2, [R3, #-1]! |
LDRH | LDRH{cond} Rt, [Rn, #offset] |
加载半字数据 | LDRH R4, [R5], #2 |
STR | STR{cond} Rt, [Rn, #offset] |
存储字数据 | STR R2, [R3, #-8]! |
STRB | STRB{cond} Rt, [Rn, #offset] |
存储字节数据 | STRB R0, [R1, #0] |
STRH | STRH{cond} Rt, [Rn, #offset] |
存储半字数据 | STRH R5, [R6, #4] |
LDM | LDM{cond} Rn{!}, {reglist} |
批量加载(递增后) | LDMIA R0!, {R1-R3} |
STM | STM{cond} Rn{!}, {reglist} |
批量存储(递减前) | STMDB SP!, {R4-R6, LR} |
PUSH | PUSH{cond} {reglist} |
入栈(等价于STMDB SP! ) |
PUSH {R0, R1, LR} |
POP | POP{cond} {reglist} |
出栈(等价于LDMIA SP! ) |
POP {R0, R1, PC} |
寻址模式:
- 前变址:
[Rn, #offset]
- 后变址:
[Rn], #offset
- 回写:
!
(如[Rn, #offset]!
)
3. 控制流指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
B | B{cond} label |
无条件跳转 | B main_loop |
BL | BL{cond} label |
带链接跳转(保存返回地址到LR) | BL delay_ms |
BX | BX{cond} Rm |
切换状态跳转(ARM↔Thumb) | BX LR |
CMP | CMP{cond} Rn, Op2 |
比较(设置CPSR标志) | CMP R0, #10 |
TST | TST{cond} Rn, Op2 |
位测试(AND操作不保存结果) | TST R1, #0x80 |
BEQ/BNE | B{cond} label |
条件跳转(EQ=相等,NE=不等) | BEQ error_handler |
BGT/BLT | B{cond} label |
条件跳转(GT=大于,LT=小于) | BGT loop_end |
4. 系统控制指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
MRS | MRS{cond} Rd, psr |
读状态寄存器到寄存器 | MRS R0, CPSR |
MSR | MSR{cond} psr, Rn |
写寄存器到状态寄存器 | MSR CPSR_c, R0 |
CPS | CPS{cond} #mode |
改变处理器模式 | CPS #0x13 (切换到SVC模式) |
WFI/WFE | WFI / WFE |
等待中断/事件(低功耗模式) | WFI |
DMB/DSB/ISB | DMB{option} / etc. |
内存屏障指令 | DMB SY |
5. 协处理器指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
MRC | MRC{cond} p15, op1, Rd, Cn, Cm, op2 |
读协处理器寄存器 | MRC p15, 0, R0, c0, c0, 5 |
MCR | MCR{cond} p15, op1, Rd, Cn, Cm, op2 |
写协处理器寄存器 | MCR p15, 0, R0, c1, c0, 0 |
6. SIMD/NEON 指令
指令 | 格式 | 功能 | 示例 |
---|---|---|---|
VADD | VADD.<dt> Qd, Qn, Qm |
向量加法 | VADD.I16 Q0, Q1, Q2 |
VSUB | VSUB.<dt> Qd, Qn, Qm |
向量减法 | VSUB.F32 Q3, Q4, Q5 |
VMUL | VMUL.<dt> Qd, Qn, Qm |
向量乘法 | VMUL.I32 Q6, Q7, Q8 |
VLD1/VST1 | VLD1.<dt> {Dd}, [Rn]! |
向量加载/存储 | VLD1.64 {D0-D1}, [R0]! |
VZIP | VZIP.<dt> Dd, Dm |
向量交叉存取 | VZIP.8 D0, D1 |
三、指令编码规则
条件执行:
- 支持的条件码:
EQ
、NE
、CS
、CC
、MI
、PL
、VS
、VC
、HI
、LS
、GE
、LT
、GT
、LE
、AL
- 示例:
ADDEQ R0, R1, R2
(当Z=1时执行)
- 支持的条件码:
立即数编码:
- ARM模式:12位立即数(8位数值 + 4位循环右移)
- Thumb-2模式:更灵活的编码方式
移位操作:
- 类型:
LSL
(逻辑左移)、LSR
(逻辑右移)、ASR
(算术右移)、ROR
(循环右移) - 示例:
ADD R0, R1, R2, LSL #3
- 类型:
四、优化技巧
指令调度:
- 避免流水线停顿(如避免在加载指令后立即使用结果)
- 示例:
LDR R0, [R1] ; 加载数据 ADD R2, R3, R4 ; 插入无关操作 ADD R5, R0, R2 ; 此时R0已就绪
混合ARM/Thumb模式:
- 使用
.thumb
/.arm
伪指令优化代码密度 - Thumb-2代码可减少30%代码体积,性能损失小于10%
- 使用
NEON优化:
- 对齐内存访问(使用
ALIGN
伪指令) - 循环展开+向量化:
.loop 4 VLD1.32 {D0-D1}, [R0]! VADD.F32 Q0, Q0, Q1 VST1.32 {D0-D1}, [R2]! .endloop
- 对齐内存访问(使用
五、调试与工具
工具 | 用途 |
---|---|
ARM DS-5 | 指令级调试、性能分析 |
GDB + OpenOCD | 开源调试方案,支持单步执行和寄存器查看 |
objdump | 反汇编工具:arm-none-eabi-objdump -d program.elf |
ARM Compiler | 使用-mcpu=cortex-a7 -mtune=cortex-a7 优化编译 |
六、注意事项
对齐访问:
- LDR/STR要求地址按数据大小对齐(如字访问需4字节对齐)
- 使用
.align 4
伪指令确保对齐
原子操作:
- 使用
LDREX/STREX
实现原子操作:LDREX R0, [R1] ; 加载并标记独占 ADD R0, R0, #1 STREX R2, R0, [R1] ; 尝试存储,R2=0表示成功
- 使用
异常处理:
- 在异常向量表中使用跳转指令:
LDR PC, irq_handler_addr ; IRQ异常处理
- 在异常向量表中使用跳转指令:
七、参考文档
- 《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》
- 《Cortex-A7 Technical Reference Manual》
- 《ARM Cortex-A Series Programmer’s Guide》
此总结覆盖了 Cortex-A7 的主要指令集,实际开发中需结合具体芯片手册和优化指南进行深入应用。