下是 ARM Cortex-A7 处理器支持的汇编指令集的全面总结,涵盖 ARMv7-A 架构的核心指令及其扩展功能。内容按功能分类,包含指令格式、功能说明及典型应用场景:
一、指令集架构概述
- 特性说明
特性 说明 架构版本 ARMv7-A 指令集支持 ARM (32位)、Thumb-2 (16/32位混合)、VFPv4、NEON 执行模式 ARM/Thumb 状态(通过 CPSR.T 位切换) 寄存器组 16 个通用寄存器(R0-R15)<br>• R13(SP):栈指针<br>• R14(LR):链接寄存器<br>• R15(PC):程序计数器 寄存器组 16个通用寄存器(R0-R15),包括:R13(SP):栈指针,R14(LR):链接寄存器 R15(PC):程序计数器
二、核心指令集分类详解
1. 数据处理指令
| 指令 | 格式 | 功能 | 示例 |
|---|---|---|---|
| MOV |
|
数据传送 |
|
| MVN |
|
取反传送 |
|
| ADD |
|
加法 |
|
| MUL |
|
乘法(32位结果) |
|
| 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(需符合编码规则) |
| 寄存器 | R3 |
| 移位操作 | R1, LSL #3 |
2. 访存指令
| 指令 | 格式 | 功能 | 示例 |
|---|---|---|---|
| LDR | LDR{cond} Rt, [Rn, #offset] | 加载字数据 | LDR R0, [R1, #4] |
| LDRB | LDRB{cond} Rt, [Rn, #offset] | 加载字节数据 | LDRB R2, [R3, #-1]! |
| STR | STR{cond} Rt, [Rn, #offset] | 存储字数据 | STR R2, [R3, #-8]! |
| LDRH | LDRH{cond} Rt, [Rn, #offset] | 加载半字数据 | LDRH R4, [R5], #2 |
| 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 | 带链接跳转(保存返回地址) | BL delay_ms |
| CMP | CMP{cond} Rn, Op2 | 比较(设置 CPSR 标志) | CMP R0, #10 |
| BX | BX{cond} Rm | 切换状态跳转(ARM↔Thumb) | BX LR |
| 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 |
三、指令编码规则
(1)条件执行:
支持的条件码:EQ、NE、CS、CC、MI、PL、VS、VC、HI、LS、GE、LT、GT、LE、AL
示例:ADDEQ R0, R1, R2(当Z=1时执行)
(2) 立即数编码:
ARM模式:12位立即数(8位数值 + 4位循环右移)
Thumb-2模式:更灵活的编码方式
(3) 移位操作:
类型:LSL(逻辑左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)
示例:ADD R0, R1, R2, LSL #3
四、优化技巧
(1) 指令调度:
避免流水线停顿(如避免在加载指令后立即使用结果)
示例:
LDR R0, [R1] ; 加载数据
ADD R2, R3, R4 ; 插入无关操作
ADD R5, R0, R2 ; 此时R0已就绪
(2) 混合ARM/Thumb模式:
使用.thumb/.arm伪指令优化代码密度
Thumb-2代码可减少30%代码体积,性能损失小于10%
(3) 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 |
| ARM Compiler | 使用-mcpu=cortex-a7 -mtune=cortex-a7优化编译 |
六、注意事项
| 类别 | 说明 |
|---|---|
| 对齐访问 | LDR/STR 需按数据大小对齐(字访问需 4 字节对齐)<br>.align 4 确保对齐 |
| 原子操作 | 使用 LDREX/STREX 实现原子操作 |
| 加载并标记独占 | ADD R0, R0, #1 STREX R2, R0, [R1] ; 尝试存储,R2=0表示成功 |
| 异常处理 | 在异常向量表中使用跳转指令: LDR PC, irq_handler_addr ; IRQ异常处理 |
1008

被折叠的 条评论
为什么被折叠?



