arm用户态寄存器
常用的arm用户态寄存器如上表所示,有r0~r15这16个寄存器
r0~r3:通常在函数传参时使用(从左到右的顺序,大于4个参数时使用栈来传递)和返回值(r0通常被用作返回值)。在函数内部 r0-r3 也可以用来存储局部变量。
r4~r8,r10,r11:通常用来保存局部变量。r11通常用来作为(FP)栈基地址(下面会对这些概念进行讲述)
r12:可能在函数调用时被链接器使用,在函数内部,也可以存储局部变量。
r13:是SP寄存器,就是当前函数的栈顶指针。
r14:是LR寄存器,存放当前函数的返回地址。
r15:是PC寄存器,存放当前指令的地址。
上面讲述的FP,SP,LR,PC寄存器,它寄存器里面的内容是地址,这点不要混淆。
内存中的栈帧结构
刚刚我们提到了FP,SP,LR,PC寄存器,现在我们来展开聊聊这几个寄存器。
PC指针:刚刚提到PC指针里面存放着当前指令的地址,因为在我们arm架构,传统上是五级流水线,简单描述就是取址,然后取完代码是二进制,对它进行译码,翻译成各个动作,然后cpu参与计算,最后返回。PC指针就存放着当前指令的地址,扮演的角色就是告诉cpu需要访问的地址,也对应五级流水线中的取址操作。
SP指针:在函数申请变量的时候,会有一个动态压栈的过程,栈的大小会随着变量申请而逐渐增长,SP指针就指向你动态压栈所处在的地址。
FP指针:当前函数的起始地址。在函数调用时,进入另一个函数接口,也会进入另一个栈帧结构,里面会保存调用者的的起始地址(FP),用于出现问题时回溯,同时也有当前函数的起始地址(FP)。
LR指针:函数调用时,调用者的下一条指令地址。用于函数调用完返回时,可以进入下一条指令。