Date: 2018.7.30
1、參考
http://blog.chinaunix.net/uid-20321537-id-1966791.html
https://www.cnblogs.com/summer-xwq/p/4153624.html
https://blog.csdn.net/smalosnail/article/details/53048784
2、ARM 32位寄存器
ARM匯編器對ARM的寄存器進行了預定義,所有的寄存器和協處理器名都是大小寫敏感的.預定義的寄存器如下:
- Ro-R15和r0-r15
- a1-a4(參數,結果或者臨時寄存器,與r0-r3同意)
- v1-v8(變量寄存器,與r4-r11同意)
- sb和SB(靜態基址寄存器,與r9同意)
- sl和SL(堆棧限制寄存器,與r10同意)
- fp和FP(幀指針,與r11同意)
- ip和IP(過程調用中間臨時寄存器,與r12同意)
- sp和SP(堆棧指針,與r13同意)
- lr和LR(連接寄存器,與r14同意)
- pc和PC(程序計數器,與r15同意)
- cpsr和CPSR(程序狀態寄存器)
- spsr和SPSR(程序狀態寄存器)
- f0-f7和F0-F7(FPA寄存器)
- s0-s31和S0-S31(VFP單精度寄存器)
- d0-d15和D0-D15(VFP雙精度寄存器)
- p0-p15(協處理器0-15)
- c0-c15(協處理器寄存器0-15)
使用說明:
1、當參數少於4個時,子程序間通過寄存器R0~R3來傳遞參數;當參數個數多於4個時,將多余的參數通過數據棧進行傳遞,入棧順序與參數順序正好相反,子程序返回前無需恢復R0~R3的值;
2、在子程序中,使用R4~R11保存局部變量,若使用需要入棧保存,子程序返回前需要恢復這些寄存器;R12是臨時寄存器,使用不需要保存。
3、R13用作數據幀指針,記作SP;R14用作鏈接寄存器,記作LR,用於保存子程序返回時的地址;R15是程序計數器,記作PC。
4、ATPCS規定堆棧是滿遞減堆棧FD;
5、子程序返回32位的整數,使用R0返回;返回64位整數時,使用R0返回低位,R1返回高位。
3、ARM64位寄存器
ARM64位參數調用規則遵循AAPCS64,規定堆棧為滿遞減堆棧。
寄存器調用規則如下:
- X0~X7:用於傳遞子程序參數和結果,使用時不需要保存,多余參數采用堆棧傳遞,64位返回結果采用X0表示,128位返回結果采用X1:X0表示。
- X8:用於保存子程序返回地址, 盡量不要使用 。
- X9~X15:臨時寄存器,使用時不需要保存。
- X16~X17:子程序內部調用寄存器,使用時不需要保存,盡量不要使用。
- X18:平台寄存器,它的使用與平台相關,盡量不要使用。
- X19~X28:臨時寄存器,使用時必須保存。
- X29:幀指針寄存器,用於連接棧幀,使用時需要保存。
- X30:鏈接寄存器LR
- X31:堆棧指針寄存器SP或零寄存器ZXR
參考自: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf 5.1.1小節。
注意:
子程序調用時必須要保存的寄存器:X19~X29和SP(X31)。
不需要保存的寄存器:X0~X7,X9~X15
THE END!