新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATPCS ARM體系中匯編語言和c語言之間參數傳遞規則

        ATPCS ARM體系中匯編語言和c語言之間參數傳遞規則

        作者: 時間:2016-11-10 來源:網絡 收藏
        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.對于位數更多的結果,需要通過調用內存來傳遞.



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 淮阳县| 桂阳县| 潞西市| 贞丰县| 玉屏| 台江县| 漳平市| 瑞丽市| 资溪县| 临沭县| 宁都县| 津市市| 徐水县| 滕州市| 科技| 九江市| 宣汉县| 肃北| 遂川县| 广昌县| 治县。| 汝阳县| 道孚县| 广水市| 喜德县| 赣州市| 许昌市| 开原市| 阿城市| 博乐市| 拉孜县| 将乐县| 泰安市| 化隆| 儋州市| 高台县| 浠水县| 安多县| 临泉县| 上犹县| 庆城县|