我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民。我想有一次远行,于细碎流淌的时光与路途之中,观察所有遥不可及的生存方式,以及其中的人们。我发现我爱上了北方,中国的北方。满含苍凉的气息:那些皲裂而贫瘠的黄土地,干涸焦灼似静脉一般延伸的河床,那些皮肤黑皱似柏树老皮的农民...人与大地皆有着原始而朴素的容颜,映照着平凡的历史。—— 七堇年
ARM 汇编代码中几乎处处都在使用寄存器,寄存器是处理器特有的用来暂存指令、数据和地址的高速存储单元。比如,高级语言中的变量,到了汇编中,其值可能就保存在某个寄存器中。
上述代码中的 R0、R2、SP 都是 ARM 寄存器。
ARM 处理器共有 31 个通用寄存器和 6 个状态寄存器。不过,在某一处理器模式下都是使用其中的一部分,包括 15 个通用寄存器(R0 ~ R14),一个或两个状态寄存器(CPSR/SPSR)和程序计数器(PC/R15)。
R0 ~ R14 又可分为两类,即:不分组寄存器(R0 ~ R7)和分组寄存器(R8 ~ R14)。所谓不分组,即该寄存器在各处理器模式下共用同一物理寄存器;所谓分组,即该寄存器在不同的处理器模式下,对应着不同的物理寄存器。
这其中分组寄存器(R8 ~ R14)又可分为两类:(1)R8 ~ R12 有 2 组物理寄存器:1 组用于 FIQ 模式,另 1 组用于除FIQ以外的所有模式。(2)R13 ~ R14 有 6 组物理寄存器,1 组用于用户模式和系统模式,另 5 组分别用于 5 种异常模式。
另外,R13 通常用作堆栈指针,称为 SP;R14 用作链接寄存器,称为 LR。CPSR 是当前程序状态寄存器,SPSR 是程序状态保存寄存器。当出现异常时,SPSR 用于保存 CPSR 的状态。
最后,ARM 处理器采用 3 级流水线机制来加快指令处理速度。所以,PC 总是指向当前指令的下 2 条指令的地址,即当前指令地址值加上 8 个字节。
ARM 处理器支持 7 种运行模式:
- 用户模式 (usr)
- 快速中断模式 (fiq)
- 外部中断模式 (irq)
- 管理模式 (svc)
- 数据访问终止模式 (abt)
- 系统模式 (sys)
- 未定义指令中止模式 (und)
除用户模式外,其他模式均为“特权”模式,处理器可以访问受保护的系统资源,而 ARM 程序逆向分析通常只涉及用户模式。在用户模式下,处理器可以访问 R0 ~ R14、PC (R15)、CPSR,没有 SPSR。
ARM 处理器有两种工作状态:(1)ARM 状态:执行 32 位对齐的 ARM 指令;(2)Thumb 状态:执行 16 位对其的 Thumb 指令。
两种状态下的寄存器命名有部分差异,下面只列出不同的部分:
- Thumb 状态下的 FP 对应 ARM 状态下的 R11
- Thumb 状态下的 IP 对应 ARM 状态下的 R12
- Thumb 状态下的 SP 对应 ARM 状态下的 R13
- Thumb 状态下的 LR 对应 ARM 状态下的 R14
- Thumb 状态下的 PC 对应 ARM 状态下的 R15
Android 平台的 ARM 汇编为 GNU ARM 汇编,使用 GAS (GNU Assembler,GNU 汇编器)。
学习资料:【Android 软件安全与逆向分析】