ATPCS

"子程式調用過程中暫存器的使用規則

ATPCS即ARM-THUMB procedure call standard的簡稱。
PCS規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程(函式)調用者與被調用者之間的協定。
PCS強制實現如下約定:調用函式如何傳遞參數(即壓棧方法,以何種方式存放參數),被調用函式如何獲取參數,以何種方式傳遞函式返回值。
PCS的制訂是一系列指標的“tradeoff(折衷)”(因為很大程度上涉及系統的一些性能),如會涉及生成代碼的大小,調試功能的支持,函式調用上下文處理速度以及記憶體消耗。當然,通過編譯器的支持可以讓生成的代碼有不同的特性,如gcc編譯選項可以支持或不支持framepointer來支持深入調試功能或提高程式運行性能。
PCS是體系結構密切相關的,直接涉及編譯器如何使用處理器提供的套用暫存器,如編譯器使用什麼暫存器作為棧指針,利用哪些暫存器作直接傳參等。值得注意的是,沒有誰規定說PCS是必須這樣而不是那樣的。它是套用相關的。任何一個作業系統和套用可以處於它自身的考慮定義自己的PCS。當然,如果那樣,也必須有自己的編譯器。而實際上,在一個處理器設計時,都會有某種假設,所以PCS某種程度上應該是一樣的。
ATPCS就是基於ARM指令集和THUMB指令集過程調用的規範。
ATPCS概述 為了使單獨編譯的C語言程式和彙編程式之間能夠相互調用,必須為子程式之間的調用規定一定的規則.ATPCS就是ARM程式和THUMB程式中子程式調用的基本規則...
一.ATPCS概述...
ATPCS規定了一些子程式之間調用的基本規則.這些基本規則包括子程式調用過程中暫存器的使用規則,數據棧的使用規則,參數的傳遞規則.為適應一些特定的需要,對這些基本的調用規則進行一些修改得到幾種不同的子程式調用規則,這些特定的調用規則包括:支持數據棧限制檢查的ATPCS. 支持唯讀段位置無關的ATPCS. 支持可讀寫段位置無關的ATPCS. 支持ARM程式和THUMB程式混合使用的ATPCS. 處理浮點運算的ATPCS...
有調用關係的所有子程式必須遵守同一種ATPCS. 編譯器或者彙編器在ELF格式的目標檔案中設定相應的屬性,標識用戶選定的ATPCS類型.對應不同類型的ATPCS規則,有相應的C語言庫,連線器根據用戶指定的ATPCS類型連線相應的C語言庫...
使用ADS的C語言編譯器編譯的C語言子程式滿足用戶指定的ATPCS類型. 而對於彙編語言程式來說,完全要依賴用戶來保證各子程式滿足選定的ATPCS類型. 具體來說,彙編語言子程式必須滿足下面三個條件: 在子程式編寫時必須遵守相應的ATPCS規則; 數據棧的使用要遵守ATPCS規則; 在彙編編譯器中使用-apcs選項...
二. 基本ATPCS...
基本ATPCS規定了在子程式調用時的一些基本規則,包括以下三個方面的內容: 各暫存器的使用規則及其相應的名字; 數據棧的使用規則; 參數傳遞的規則. 相對於其他類型的ATPCS,滿足基本ATPCS的程式的執行速度更快,所占用的記憶體更少. 但是它不能提供以下的支持: ARM程式和THUMB程式相互調用; 數據以及代碼的位置無關的支持; 子程式的可重入性; 數據棧檢查的支持. 而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎上再添加其他的規則而形成的.其目的就是提供上述的功能...
暫存器的使用規則:
1. 子程式通過暫存器R0~R3來傳遞參數. 這時暫存器可以記作: A1~A4 , 被調用的子程式在返回前無需恢復暫存器R0~R3的內容.
2. 在子程式中,使用R4~R11來保存局部變數.這時暫存器R4~R11可以記作: V1~V8 .如果在子程式中使用到V1~V8的某些暫存器,子程式進入時必須保存這些暫存器的值,在返回前必須恢復這些暫存器的值,對於子程式中沒有用到的暫存器則不必執行這些操作.在THUMB程式中,通常只能使用暫存器R4~R7來保存局部變數.
3.暫存器R12用作子程式間scratch暫存器,記作ip; 在子程式的連線代碼段中經常會有這種使用規則.
4. 暫存器R13用作數據棧指針,記做SP,在子程式中暫存器R13不能用做其他用途. 暫存器SP在進入子程式時的值和退出子程式時的值必須相等.
5. 暫存器R14用作連線暫存器,記作lr ; 它用於保存子程式的返回地址,如果在子程式中保存了返回地址,則R14可用作其它的用途.
6. 暫存器R15是程式計數器,記作PC ; 它不能用作其他用途.
7. ATPCS中的各暫存器在ARM編譯器和彙編器中都是預定義的.
參數的傳遞規則.
根據參數個數是否固定,可以將子程式分為參數個數固定的子程式和參數個數可變的子程式.這兩種子程式的參數傳遞規則是不同的.
1.參數個數可變的子程式參數傳遞規則
對於參數個數可變的子程式,當參數不超過4個時,可以使用暫存器R0~R3來進行參數傳遞,當參數超過4個時,還可以使用數據棧來傳遞參數. 在參數傳遞時,將所有參數看做是存放在連續的記憶體單元中的字數據。然後,依次將各名字數據傳送到暫存器R0,R1,R2,R3; 如果參數多於4個,將剩餘的字數據傳送到數據棧中,入棧的順序與參數順序相反,即最後一個字數據先入棧. 按照上面的規則,一個浮點數參數可以通過暫存器傳遞,也可以通過數據棧傳遞,也可能一半通過暫存器傳遞,另一半通過數據棧傳遞.
2.參數個數固定的子程式參數傳遞規則
對於參數個數固定的子程式,參數傳遞與參數個數可變的子程式參數傳遞規則不同,如果系統包含浮點運算的硬體部件,浮點參數將按照下面的規則傳遞: 各個浮點參數按順序處理;為每個浮點參數分配FP暫存器;分配的方法是,滿足該浮點參數需要的且編號最小的一組連續的FP暫存器.第一個整數參數通過暫存器R0~R3來傳遞,其他參數通過數據棧傳遞.
子程式結果返回規則
1.結果為一個32位的整數時,可以通過暫存器R0返回.
2.結果為一個64位整數時,可以通過R0和R1返回,依此類推.
3.結果為一個浮點數時,可以通過浮點運算部件的暫存器f0,d0或者s0來返回. 4.結果為一個複合的浮點數時,可以通過暫存器f0-fN或者d0~dN來返回. 5.對於位數更多的結果,需要通過調用記憶體來傳遞.

相關詞條

相關搜尋

熱門詞條

聯絡我們