天天看點

【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指令。
歡迎關注我的個人微信公衆号,一起交流學習嵌入式開發知識!

繼續閱讀