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