一、Cortex-A架构基础
-
架构版本
- Cortex-A系列属于ARM的应用处理器,常见于ARMv7(如Cortex-A7/A9)和ARMv8(AArch64,如Cortex-A53/A72)。
- ARMv7使用32位指令集(AArch32),ARMv8支持64位(AArch64)。
-
寄存器组
- 通用寄存器:
- ARMv7:
R0-R12
(通用),R13
(SP),R14
(LR),R15
(PC)。 - AArch64:
X0-X30
(64位),W0-W30
(低32位)。
- ARMv7:
- 状态寄存器:
CPSR
(ARMv7):保存条件标志、模式(用户/内核等)。NZCV
(AArch64):独立标志位(Negative/Zero/Carry/Overflow)。
- 通用寄存器:
二、汇编基础语法
1. 数据传送指令
; ARMv7示例
MOV R0, #42 ; R0 = 42
LDR R1, =0x1000 ; R1 = 0x1000(加载地址)
STR R0, [R1] ; 将R0的值存入R1指向的内存
; AArch64示例
MOV X0, #42 ; X0 = 42
LDR X1, =0x1000 ; X1 = 0x1000
STR X0, [X1] ; 存储到内存
2. 算术与逻辑运算
ADD R0, R1, R2 ; R0 = R1 + R2
SUB R3, R4, #5 ; R3 = R4 - 5
AND R5, R6, #0xFF ; R5 = R6 & 0xFF
3. 控制流指令
; 条件分支(ARMv7依赖CPSR标志)
CMP R0, #10 ; 比较R0和10
BEQ label_equal ; 若相等则跳转
; AArch64使用显式条件码
CMP X0, #10
B.EQ label_equal ; 条件跳转
三、函数调用与系统调用
1. 函数调用约定
- 参数传递:
- ARMv7:
R0-R3
传递前4个参数,其余用栈。 - AArch64:
X0-X7
传递前8个参数。
- ARMv7:
- 返回值:
R0
(ARMv7)或X0
(AArch64)。
2. 系统调用(以write
为例)
; ARMv7(Linux EABI)
MOV R7, #4 ; syscall号4=write
MOV R0, #1 ; fd=1(stdout)
LDR R1, =msg ; 缓冲区地址
LDR R2, =len ; 字符串长度
SWI 0 ; 触发系统调用
; AArch64(Linux)
MOV X8, #64 ; syscall号64=write
MOV X0, #1 ; fd=1
LDR X1, =msg ; 缓冲区地址
LDR X2, =len ; 长度
SVC #0 ; 触发系统调用
四、内存管理与特权模式
-
内存访问
- 使用
LDR/STR
访问内存,LDP/STP
(AArch64)批量加载/存储。 - 对齐要求:ARMv7要求4字节对齐,AArch64要求16字节对齐。
- 使用
-
特权模式
- Cortex-A支持多种模式(用户/内核/中断等),通过
CPSR
或PSTATE
切换。 - 系统调用(
SWI/SVC
)会触发特权级切换到内核模式。
- Cortex-A支持多种模式(用户/内核/中断等),通过
五、进阶主题
-
NEON指令集
Cortex-A支持SIMD加速(如VADD.F32 Q0, Q1, Q2
)。 -
缓存与内存屏障
DMB SY ; 数据内存屏障(AArch64) LDR R0, [R1] ; 确保之前的写操作完成
-
异常处理
配置向量表(VBAR_EL1
)处理中断/异常。
六、调试工具
-
GDB
gdb-multiarch ./program layout asm # 查看反汇编 si # 单步执行指令
-
objdump
arm-linux-gnueabi-objdump -d a.out # 反汇编
七、学习资源
-
官方手册
- 《ARM Architecture Reference Manual》(ARMv7/ARMv8)
- 《ARM Cortex-A Series Programmer’s Guide》
-
实践项目
- 在QEMU模拟器上运行汇编程序:
qemu-arm -L /usr/arm-linux-gnueabi ./program
- 在QEMU模拟器上运行汇编程序: