ATPCS 和 AAPCS

1. 基本概念

  • ATPCS (ARM-Thumb Procedure Call Standard)

規定了一些子程序間調用的基本規則,這些規則包括子程序調用過程中寄存器的使用規則,數據棧的使用規則,參數的傳遞規則。有了這些規則之後,單獨編譯的C語言程序就可以和彙編程序相互調用。
使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS類型。而對於彙編語言來說,則需要用戶來保證各個子程序滿足ATPCS的要求。

  • AAPCS (ARM Archtecture Procedure Call Standard)

2007年ARM公司正式推出了AAPCS標準,AAPCS是ATPCS的改進版,目前, AAPCS和ATPCS都是可用的標準。

2. 寄存器使用規則

  • 子程序間通過寄存器R0~R3來傳遞參數。這時,寄存器R0~R3可記作a0~a3。被調用的子程序在返回前無需恢復寄存器R0~R3的內容。
  • 在子程序中,使用寄存器R4~R11來保存局部變量。這時,寄存器R4~R11可以記作v1~v8。如果在子程序中使用了寄存器v1~v8中的某些寄存器,則子程序進入時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。
  • 寄存器R12用作過程調用中間臨時寄存器,記作IP。在子程序之間的連接代碼段中常常有這種使用規則。
  • 寄存器R13用作堆棧指針,記作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在進入子程序時的值和退出子程序時的值必須相等。
  • 寄存器R14稱爲連接寄存器,記作LR。它用於保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用作其他用途。
  • 寄存器R15是程序計數器,記作PC。它不能用作其它用途。

3. 堆棧使用規則

  • ATPCS規定堆棧爲FD(Full Descending: sp指向最後一個壓入的值,數據棧由高地址向低地址生長)類型,即滿遞減堆棧,並且對堆棧的操作是8字節對齊。所以經常使用的指令就有STMFD和LDMFD。
  • 對於彙編程序來說,如果目標文件中包含了外部調用,則必須滿足下列條件:

    外部接口的堆棧必須是8字節對齊的。
    在彙編程序中使用PRESERVE8僞指令告訴連接器,本彙編程序數據是8字節對齊的。

4. 參數傳遞規則

  • 根據參數個數是否固定,可以將子程序分爲參數個數固定的子程序和參數個數可變化的子程序。
  • 這兩種子程序的參數傳遞規則是不一樣的。

4.1 參數個數可變子程序參數傳遞規則

  • 對於參數個數可變的子程序,當參數個數不超過4個時,可以使用寄存器R0~R3來傳遞參數;當參數超過4個時,還可以使用堆棧來傳遞參數。
  • 在傳遞參數時,將所有參數看作是存放在連續的內存字單元的字數據。然後,依次將各字數據傳遞到寄存器R0,R1,R2和R3中。如果參數多於4個,則將剩餘的字數據傳遞到堆棧中。入棧的順序與參數傳遞順序相反,即最後一個字數據先入棧。

4.2 參數個數固定子程序參數傳遞規則

  • 如果系統不包含浮點運算的硬件部件,浮點參數會通過相應的規則轉換成整數參數(若沒有浮點參數,此步省略),然後依次將各字數據傳送到寄存器R0~R3中。如果參數多於4個,將剩餘的字數據傳送堆棧中,入棧的順序與參數順序相反,即最後一個字數據先入棧。在參數傳遞時,將所有參數看作是存放在連續的內存字單元的字數據。

5. 子程序結果返回規則

子程序中結果返回的規則如下:

結果爲一個32位整數時,可以通過寄存器R0返回;
結果爲一個64位整數時,可以通過寄存器R0和R1返回;
結果爲一個浮點數時,可以通過浮點運算部件的寄存器f0、d0或s0來返回;
結果爲複合型浮點數(如複數)時,可以通過寄存器f0~fn或d0~dn來返回;
對於位數更多的結果,需要通過內存來傳遞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章