博主主页:MuggleZero
《ARMv8架构初学者笔记》专栏地址:《ARMv8架构初学者笔记》
前文:
【ARMv8基础篇】异常等级
【ARMv8基础篇】寄存器
Procedure Call Standard for the Arm 64-bit Architecture.pdf是ARM64架构函数调用的标准和规范文档,宝藏网页如下所示:
Releases · ARM-software/abi-aa · GitHub
函数调用标准(PCS)用于描述父子函数的编译连接过程,尤其是父函数和子函数的调用的约定,如栈的布局、参数的传递等等。ARM64的通用寄存器如下图所示:
在ARM64架构中,栈从高地址往低地址生长。栈的起始地址是栈底,低地址是栈顶。这个栈顶和我们平时认知中的栈顶是反的,主要还是因为栈的向下生长。下图是栈帧布局的一个示意图,假设目前有个caller,它会调用callee,这个时候栈指针会向下延伸一段,为callee创建一个栈帧布局,callee中的一些局部变量会存在这个callee的栈帧里。当callee返回时,栈指针会跳回caller的栈顶即caller的SP位置,于是callee的栈空间就被释放了。
ARM64架构函数帧布局的关键点:
所有函数调用栈都会组成一个单链表
每个栈由两个地址构成这个链表,位于栈的底部。
低地址存放
指向上一个栈帧的栈基地址FP,类似于链表的prev指针
高地址存放
当前函数的返回地址,进入该函数时LR的值。
函数返回时,ARM64先把栈中的LR值载入当前LR寄存器,然后执行ret指令。
欢迎关注我的个人微信公众号,一起交流学习嵌入式开发知识!
关注「求密勒实验室」