ATPCS是: Arm Thumb procedure Call Standard的縮寫。意思是arm程序和thumb程序中子程序調用的基本規範。
寄存器的使用規則
當參數個數小於等於4個的時候,子程序間通過R0~R3來傳遞參數,在返回前無需恢復寄存器R0~R3的內容;如果參數個數大於4個,餘下的參數就通過sp所指向的數據棧進行參數傳遞。在棧上開闢8字節的空間進行參數傳遞。
在子程序中,使用R4~R11來保存局部變量,如果子程序要使用這些寄存器,進入子程序時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值;
寄存器R12用作scratch寄存器,記爲ip;在程序調用過程中間臨時寄存器IP;
寄存器R13用做堆棧指針SP。在子程序中寄存器R13不能用做其它用途。寄存器SP在進入子程序時的值和退出子程序的值必須相等。
寄存器R14稱爲鏈接寄存器LR,它用於保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用做其他用途。
寄存器R15爲程序計數器PC,不能用做其他用途。
子程序結果返回規則
函數調用完畢後,如果函數有返回值,函數一般把返回值保存在r0寄存器中,因此一般我們通過bl指令調用一個函數後,就可以通過在彙編裏面訪問r0得到返回值。
子程序結果返回規則:
1.結果爲一個32位的整數時,可以通過寄存器R0返回.
2.結果爲一個64位整數時,可以通過R0和R1返回,依此類推.
3.結果爲一個浮點數時,可以通過浮點運算部件的寄存器f0,d0或者s0來返回.
4.結果爲一個複合的浮點數時,可以通過寄存器f0-fN或者d0~dN來返回.
5.對於位數更多的結果,需要通過調用內存來傳遞.
數據棧使用規則
棧指針可以指向不同的位置,ARM有4種數據棧,分別是:
遞增空棧,
遞增滿棧,
遞減空棧,
遞減滿棧,
ATPCS規定數據棧爲遞減滿棧(FD),並對數據棧的操作是8字節對齊的;下面是數據棧相關的名詞解釋;
1.數據棧棧指針.stack pointer 指向最後一個寫入棧的數據的內存地址.
2.數據棧的基地址.stack base 是指數據棧的最高地址.由於ATPCS中的數據棧是FD類型的,實際上數據棧中最早入棧數據佔據的內存單元是基地址的下一個內存單元.
3.數據棧界限.stack limit 是指數據棧中可以使用的最低的內存單元地址.
4.已佔用的數據棧.used stack 是指數據棧的基地址和數據棧棧指針之間的區域.其中包括數據棧棧指針對應的內存單元.
5.數據棧中的數據幀(stack frames) 是指在數據棧中,爲子程序分配的用來保存寄存器和局部變量的區域.
異常中斷的處理程序可以使用被中斷程序的數據棧,這時用戶要保證中斷的程序數據棧足夠大.