在嵌入式开发或Android逆向研究时,学习arm汇编必不可少
寄存器(用户模式)
寄存器 | 特定名称 | 过程调用的角色 |
---|---|---|
R16 | CPSR(Computer Program Status Register) | 状态寄存器 |
R15 | PC(Program Counter) | 程序计数器 |
R14 | LR(Link Register) | 链接寄存器(用于存放函数返回地址) |
R13 | SP(Stack Pointer) | 栈指针 |
R12 | IP(Internal Procedure ) | 内部过程调用临时寄存器 |
R11 | - | ARM状态局部变量寄存器 - 8 |
R10 | SL(Stack Limit) | ARM状态局部变量寄存器 - 7/栈检查中的栈限制指针 |
R9 | SB(Static Base) | ARM状态变量寄存器 - 6/RWPI变体中的静态基址 |
R8 | - | ARM状态变量寄存器 - 5 |
R7 | - | 局部变量寄存器 - 4 |
R6 | - | 局部变量寄存器 - 3 |
R5 | - | 局部变量寄存器 - 2 |
R4 | - | 局部变量寄存器 - 1 |
R3 | - | 参数/结果/暂时寄存器 - 4 |
R2 | - | 参数/结果/暂时寄存器 - 3 |
R1 | - | 参数/结果/暂时寄存器 - 2 |
R0 | - | 参数/结果/暂时寄存器 - 1 |
指令跳转
//在arm汇编中,有两种调准方式
//1.通过跳转指令实现
//2.通过修改PC寄存器的值实现
//具体可以参考下面连接
其中寄存器的使用必须满足下面的规则:
(1)函数间通过寄存器 R0~R3 来传递参数,低于 32 位的函数返回值存于 R0。
(2)在函数中,使用寄存器 R4~R11 来保存局部变量。函数进入时必须保存所用到的局部变量寄存器的值,在返回前必须恢复这些
寄存器的值;对于函数中没有用到的寄存器则不必进行这些操作。在 Thumb 中,通常只能使用寄存器 R4~R7 来保存局部变量。
(3)寄存器 R12 用作函数间的 scratch 寄存器,记作 IP
(4)寄存器 R13 用作数据栈指针,记作 SP。函数调用前后必须保持堆栈平衡。
(5)寄存器 R14 称为连接寄存器,记作 LR。它用作保存函数的返回地址。如果在函数中保存了返回地址,寄存器 R14 则可以用作其他用途。
(6)寄存器 R15 是程序计数器,记作 PC。