ARM架构基础概念
ARM(Advanced RISC Machines)是一种精简指令集计算机(RISC)架构,广泛应用于移动设备、嵌入式系统和物联网设备。其核心特点包括低功耗、高性能和模块化设计。
学习总结:
1、ARMv8 是 ARM 公司发布的第一代支持 64 位处理器的指令集和体系结构
2、A64 指令集的指令宽度是 32 位,而不是 64 位。A64 指令集和 A32 指令集是不兼容的
-
ARMv8 支持如下几种数据宽度
-
字节( byte): 8 位。
-
半字( halfword): 16 位。
-
字( word): 32 位。
-
双字( doubleword): 64 位。
-
四字( quadword): 128 位。
-
指令集类型:
- ARM32(AArch32):32位指令集,如ARMv7架构。
- ARM64(AArch64):64位指令集,如ARMv8及更高版本。
-
工作模式(ARM32):
- 用户模式(User)、快速中断模式(FIQ)、外部中断模式(IRQ)等。
- 特权模式(如Supervisor)用于操作系统内核。
ARM寄存器组
通用寄存器(ARM32)
- R0-R12:通用寄存器,用于数据操作。
- R13(SP):栈指针,指向当前栈顶。
- R14(LR):链接寄存器,保存函数返回地址。
- R15(PC):程序计数器,指向下一条指令地址。
特殊寄存器
- CPSR(Current Program Status Register):存储状态标志(如N、Z、C、V)和当前模式。
- SPSR(Saved Program Status Register):在异常模式下保存CPSR。
ARM指令集示例
数据处理指令
MOV R0, #10 ; R0 = 10
ADD R1, R0, R2 ; R1 = R0 + R2
CMP R1, R2 ; 比较R1和R2,更新CPSR标志位
分支指令
B label ; 无条件跳转到label
BL func ; 调用函数func,LR保存返回地址
BX LR ; 返回到LR指定的地址
内存访问指令
LDR R0, [R1] ; 从R1指向的地址加载数据到R0
STR R2, [R3] ; 将R2的值存储到R3指向的地址
ARM汇编编程实践
简单函数调用
.global main
main:
MOV R0, #5 ; 参数1
MOV R1, #3 ; 参数2
BL add_func ; 调用add_func
B exit
add_func:
ADD R0, R0, R1 ; R0 = R0 + R1
BX LR ; 返回
exit:
MOV R7, #1 ; 退出系统调用号
SWI 0 ; 触发软中断
栈操作示例
PUSH {R0, R1} ; 将R0、R1压栈
POP {R2, R3} ; 弹出栈顶数据到R2、R3
调试与工具
- GDB调试:
arm-none-eabi-gdb program.elf target remote :1234 ; 连接QEMU或硬件调试器
- 交叉编译工具链:
- arm-none-eabi-gcc:ARM嵌入式开发编译器。
- objdump:反汇编工具,用于分析二进制文件。
常见应用场景
- 嵌入式开发:STM32、Raspberry Pi等硬件平台。
- 移动设备:Android/iOS设备的底层优化。
- 操作系统内核:Linux内核的ARM移植与驱动开发。
通过理解寄存器、指令集和调试工具,可以逐步掌握ARM架构的开发与优化技巧。