天天看点

【ARMv8基础篇】函数调用标准和栈布局

作者:MuggleZero 

 《ARMv8架构初学者笔记》专栏地址:《ARMv8架构初学者笔记》

前文:

【ARMv8基础篇】异常等级

【ARMv8基础篇】寄存器

Procedure Call Standard for the Arm 64-bit Architecture.pdf是ARM64架构函数调用的标准和规范文档,宝藏网页如下所示:

​​Releases · ARM-software/abi-aa · GitHub​​

函数调用标准(PCS)用于描述父子函数的编译连接过程,尤其是父函数和子函数的调用的约定,如栈的布局、参数的传递等等。ARM64的通用寄存器如下图所示:

【ARMv8基础篇】函数调用标准和栈布局

在ARM64架构中,栈从高地址往低地址生长。栈的起始地址是栈底,低地址是栈顶。这个栈顶和我们平时认知中的栈顶是反的,主要还是因为栈的向下生长。下图是栈帧布局的一个示意图,假设目前有个caller,它会调用callee,这个时候栈指针会向下延伸一段,为callee创建一个栈帧布局,callee中的一些局部变量会存在这个callee的栈帧里。当callee返回时,栈指针会跳回caller的栈顶即caller的SP位置,于是callee的栈空间就被释放了。

【ARMv8基础篇】函数调用标准和栈布局

ARM64架构函数帧布局的关键点:

  • 所有函数调用栈都会组成一个单链表
    【ARMv8基础篇】函数调用标准和栈布局
  • 每个栈由两个地址构成这个链表,位于栈的底部。
  • 低地址存放

    指向上一个栈帧的栈基地址FP,类似于链表的prev指针

  • 高地址存放

    当前函数的返回地址,进入该函数时LR的值。

  • 函数返回时,ARM64先把栈中的LR值载入当前LR寄存器,然后执行ret指令。
欢迎关注我的个人微信公众号,一起交流学习嵌入式开发知识!

继续阅读