轉載請註明出處
作者:小馬
很多人學了ARM好長時間也不清楚到底什麼是ATPCS。其實ADS安裝檔案裡有一個英文PDF文檔專門講什麼是ATPCS,但由於是英文的,很少有人完整的看過這篇文檔。 所以我想簡單介紹一下自己對ATPCS的理解(看了原文的文檔和網上的一些資料),如果想要瞭解更深入的話,可以去查看原文檔.
ATPCS是ARM-Thumb Procedure Call Standard 的縮寫, 也就是ARM,Thumb的程式調用標準. 總體來說該標準分為兩部分,一是基本的ATPCS,還有就是擴充的ATPCS。 下面分這兩部分來說明
一標準的ATPCS.
1 對通用寄存器的一些說明. 下表這張表可以清楚的說明情況
根據這張表顯示, r0~r3一般用來傳遞函數的參數,r4~r7則用來放置局部變數. 而r12~r15則可以有特別的用途.
2 浮點數寄存器
基本的ATPCS支援兩種浮點數體繫結構. FPA和AFP. FPA體系有八個可以放置單精確度和雙精確度數的浮點寄存器. AFP體系有16個雙精確度寄存器.
3 參數調用
參數調用分兩種情況,參數可變的調用和參數個數固定的調用. 有以下的規則
* 小於32位的參數值會被自動擴充為32位.
* 64位的參數被當成兩個32位元.
* 對於浮點數.如果晶片本身硬體上支援浮點運算,則浮點參數會放在浮點寄存器裡傳遞. 如果硬體上不支援浮點數運算, 則轉化為整型放通用寄存器傳遞.
* 其它類型通通轉為32位整型數傳遞
* 對於參數可變的程式調用, 前四個參數放在r0~r3中傳遞,如果多於四個參則按相反的順序進棧儲存,所謂相反的順序是指靠前參數後進棧.
* 對於固定參數的調用, 如果有可以做浮點運算的硬體組件, 各個浮點參數按順序處理;為每個浮點參數分配FP寄存器;分配的方法是,滿足該浮點參數需要的且編號最小的一組連續的FP寄存器.第一個整數參數通過寄存器R0~R3來傳遞,其他參數通過資料棧傳遞.
4 子程式返回
* 一個字大小的結果放r0
* 64位可通過r0, r1返回.依次類推
* 如果返回的結果是一個浮點數,則可通過f0, d0或s0返回.
二擴充的ATPCS
1 對PIC的支援.所謂PIC就是position independent code. 當一個程式中的RO(read only) segment 可以在任何地址被載入和使用的時候,它就是ROPI(read only position independent). 通常在一個程式中唯讀往往是code segment, 這就是PIC的由來.
2 對RWPI(read only position independent).
3 支援資料棧限制檢查
就寫這些吧,還有很多東西要去看文檔才知道.