ATPCS(ARM-Thumb Procedure Call Standard)概述

來源:互聯網
上載者:User

為了使單獨編譯的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來傳遞參數. 這時寄存器可以記作: A0~A3 , 被調用的子程式在返回前無需恢複寄存器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編譯器和彙編器中都是預定義的.

     資料棧的使用規則

    
棧指標通常可以指向不同的位置.當棧指標指向棧頂元素(即最後一個入棧的資料元素)時,稱為FULL棧.當棧指標指向與棧頂元素相鄰的一個元素時,稱為
Empty棧. 資料棧的增長方向也可以不同. 當資料棧向記憶體減小的地址方向增長時,稱為Descending棧;
當資料棧向著記憶體位址增加的方向增長時,稱為Ascending棧. 綜合這兩種特點可以由以下4種資料棧: FD ED FA EA .
ATPCS規定資料棧為FD類型,並對資料棧的操作是8位元組對齊的,下面是一個資料棧的樣本及相關的名詞.

     1.資料棧棧指標.stack pointer 指向最後一個寫入棧的資料的記憶體位址.

      2.資料棧的基地址.stack base 是指資料棧的最高地址.由於ATPCS中的資料棧是FD類型的,實際上資料棧中最早入棧資料佔據的記憶體單元是基地址的下一個記憶體單元.

     3.資料棧界限.stack limit 是指資料棧中可以使用的最低的記憶體單元地址.

     4.已佔用的資料棧.used stack 是指資料棧的基地址和資料棧棧指標之間的地區.其中包括資料棧棧指標對應的記憶體單元.

     5.資料棧中的資料幀(stack frames) 是指在資料棧中,為子程式分配的用來儲存寄存器和局部變數的地區.

     異常中斷的處理常式可以使用被中斷程式的資料棧,這時使用者要保證中斷的程式資料棧足夠大.
使用ADS編譯器產生的目標代碼中包含了DRFAT2格式的資料幀.在調試過程中,調試器可以使用這些資料幀來查看資料棧中的相關資訊.而對於組合語言來
說,使用者必須使用FRAME偽操作來描述資料棧中的資料幀.ARM彙編器根據這些偽操作在目標檔案中產生相應的DRFAT2格式的資料幀.

    
在ARMv5TE中,批量傳送指令LDRD/STRD要求資料棧是8位元組對齊的,以提高資料的傳送速度.用ADS編譯器產生的目標檔案中,外部介面的資料
棧都是8位元組對齊的,並且編譯器將告訴連接器: 本目標檔案中的資料棧是8位元組對齊的.
而對於組譯工具來說,如果目標檔案中包含了外部調用,則必須滿足以下條件:
外部介面的資料棧一定是8位對齊的,也就是要保證在進入該彙編代碼後,直到該組譯工具調用外部代碼之間,資料棧的棧指標變化為偶數個字;
在組譯工具中使用PRESERVE8偽操作告訴連接器,本組譯工具是8位元組對齊的.

     參數的路由規則.

     根據參數個數是否固定,可以將子程式分為參數個數固定的子程式和參數個數可變的子程式.這兩種子程式的參數路由規則是不同的.

     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.對於位元更多的結果,需要通過調用記憶體來傳遞.

三.幾種特定的ATPCS...

     A.支援資料棧限制檢查的ATPCS.

    
如果在程式設計期間能夠準確地計算出程式所需的記憶體總量,就不需要進行資料棧的檢查,但是在通常情況下這是很難做到的,這時需要進行資料棧的檢查.
在進行資料棧的檢查時,使用寄存器R10作為資料棧限制指標,這時寄存器R10又記作sl.使用者在程式中不能控制該寄存器.具體來說,支援資料棧限制的
ATPCS要滿足下面的規則:
在已經佔有的棧的最低地址和sl之間必須有256位元組的空間,也就是說,sl所指的記憶體位址必須比已經佔用的棧的最低地址低256個位元組.當中斷處理常式
可以使用使用者的資料棧時,在已經佔用的棧的最低地址和sl之間除了必須保留的256個位元組的記憶體單元外,還必須為中斷處理預留足夠的記憶體空間;
使用者在程式中不能修改sl的值;資料棧棧指標sp的值必須不小於sl的值.

     與支援資料棧限制檢查的ATPCS相關的編譯/彙編選項有下面幾種: 選項/SWST
指示編譯器產生的程式碼遵守支援資料棧限制檢查的ATPCS,使用者在程式設計期間不能夠準確計算程式所需的資料棧大小時,需要指定該選項;選項
/noswst指示編譯器產生的程式碼不支援資料棧限制檢查的功能,使用者在程式設計期間能夠準確計算出程式所需的資料棧大小,可以指定該選項,這個選項是默
認的;選項/SWSTNA
如果組譯工具對於是否進行資料棧檢查無所謂,而與該組譯工具串連的其他程式指定了選項swst/noswst,這時使用該選項.

     編寫遵守支援資料棧限制檢查的ATPCS的組合語言程式.

     對於C程式和C++程式來說,如果在編譯時間指定了選項SWST,產生的目標代碼將遵守支援資料棧限制檢查的ATPCS.
對於組合語言程式來說,如果要遵守支援資料棧限制檢查的ATPCS,使用者在編寫程式時必須滿足支援資料棧限制檢查的ATPCS所要求的規則,然後指定選項
SWST,下面介紹使用者編寫組合語言程式時的一些要求.

     葉子子程式是指不調用別的程式的子程式.

     資料棧小於256位元組的葉子子程式不許要進行資料棧檢查,如果幾個子程式組合起來構成的葉子子程式資料棧也小於256位元組,這個規則同樣適用; 資料棧小於256位元組的非葉子子程式可以使用下面的程式碼片段來進行資料棧檢查.

     ARM程式使用: SUB sp,sp,#size ;#size 為sp和sl之間必須保留的空間大小

                  CMP sp,sl;

                  BLLO _ARM_stack_overflow

     THUMB程式使用: ADD sp,#-size ; #size為sp和sl之間必須保留的空間大小

                  CMP sp,sl;

                  BLLO _THUMB_stack_overflow

     資料棧大於256位元組的子程式,為了保證sp的值不小於資料棧可用的記憶體單元最小的地址值,需要引入相應的寄存器.

     ARM程式使用下列代碼: SUB ip,sp,#size;

                        CMP ip,sl;

                        BLLO _ARM_stack_overflow

     THUMB程式使用下列代碼: LDR wr,#-size;

                          ADD wr,sp;

                          CMP wr,sl;

                          BLLO _THUMB_stack_overflow

     支援唯讀段位置無關的ATPCS...

     支援可讀寫段位置無關的ATPCS...

     支援ARM程式和THUMB程式混合使用的ATPCS...

    
在編譯或彙編時,使用/intework告訴編譯器或彙編器產生的目標代碼遵守支援ARM程式和THUMB程式混合使用的ATPCS,它用在以下場合:
程式中存在ARM程式調用THUMB程式的情況;程式中存在THUMB程式調用ARM程式的情況;需要連接器來進行ARM狀態和THUMB狀態切換的情
況;.在下述情況下使用選項nointerwork:程式中不包含THUMB程式;使用者自己進行ARM程式和THUMB程式切換.需要注意的是:在同一個
C/C++程式中不能同時有ARM指令和THUMB指令.



 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.