. 基本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位整數時,可以通過R0R1傳回,依此類推.
3.
結果為一個浮點數時,可以通過浮點運算部件的暫存器f0,d0或者s0來傳回.
4.
結果為一個複合的浮點數時,可以通過暫存器f0-fN或者d0~dN來傳回.
5.
對于位數更多的結果,需要通過呼叫記憶體來傳遞.

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()