【arm】ARM寄存器以及使用說明


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的寄存器進行了預定義,所有的寄存器和協處理器名都是大小寫敏感的.預定義的寄存器如下:

  1. Ro-R15和r0-r15
  2. a1-a4(參數,結果或者臨時寄存器,與r0-r3同意)
  3. v1-v8(變量寄存器,與r4-r11同意)
  4. sb和SB(靜態基址寄存器,與r9同意)
  5. sl和SL(堆棧限制寄存器,與r10同意)
  6. fp和FP(幀指針,與r11同意)
  7. ip和IP(過程調用中間臨時寄存器,與r12同意)
  8. sp和SP(堆棧指針,與r13同意)
  9. lr和LR(連接寄存器,與r14同意)
  10. pc和PC(程序計數器,與r15同意)
  11. cpsr和CPSR(程序狀態寄存器)
  12. spsr和SPSR(程序狀態寄存器)
  13. f0-f7和F0-F7(FPA寄存器)
  14. s0-s31和S0-S31(VFP單精度寄存器)
  15. d0-d15和D0-D15(VFP雙精度寄存器)
  16. p0-p15(協處理器0-15)
  17. 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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM