寄存器的使用規則:
寄存器 R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15
ATPCS名稱 a1 a2 a3 a4 v1 v2 v3 v4 WR v5 v6 SB v7 SL v8 FP
IP SP LR PC 1.子程序間經過寄存器R0~R3來傳遞參數。被調用的子程序在返回前無須恢復寄存器R0~R3的內容。
2.在子程序中,使用寄存器R4~R11來保存局部變量。這時,寄存器R4~R11能夠記爲v1~v8。若是在子程序中使用了寄存器v1~v8中的某些寄存器,則子程序進入時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值。在Thumb程序中,一般只能使用寄存器R4~R7來保存局部變量。另外R9,R10和R11還有一個特殊做用,分別記爲:靜態基址寄存器SB,數據棧限制指針SL和楨指針FP。
3.寄存器R12用作過程調用中間臨時寄存器IP。寄存器R13用作堆棧指針SP。在子程序中寄存器R13不能用作其它用途。寄存器SP在進入子程序時的值和退出子程序的值必須相等。寄存器R14稱爲連接寄存器LR,它用於保存子程序的返回地址。若是在子程序中保存了返回地址,寄存器R14則能夠用作其餘用途。寄存器R15爲程序計數器PC,不能用作其餘用途。
4.只有寄存器R0~R7,SP,LR和PC能夠在Thumb狀態下使用,其中R7經常做爲Thumb狀態的工做寄存器,記爲WR。
PCS即Procedure Call Standard(過程調用規範),ATPCS即ARM-THUMB procedure call standard。
PCS規定了應用程序的函數能夠如何分開地寫,分開地編譯,最後將它們鏈接在一塊兒,因此它實際上定義了一套有關過程(函數)調用者與被調用者之間的協議。PCS強制實現以下約定:調用函數如何傳遞參數(即壓棧方法,以何種方式存放參數),被調用函數如何獲取參數,以何種方式傳遞函數返回值。PCS的制訂是一系列指標的「tradeoff(折衷)」(由於很大程度上涉及系統的一些性能),如會涉及生成代碼的大小,調試功能的支持,函數調用上下文處理速度以及內存消耗。固然,經過編譯器的支持可讓生成的代碼有不一樣的特性,如gcc編譯選項能夠支持或不支持framepointer來支持深刻調試功能或提升程序運行性能。PCS是體系結構密切相關的,直接涉及編譯器如何使用處理器提供的應用寄存器,如編譯器使用什麼寄存器做爲棧指針,利用哪些寄存器做直接傳參等。值得注意的是,沒有誰規定說PCS是必須這樣而不是那樣的。它是應用相關的。任何一個操做系統和應用能夠處於它自身的考慮定義本身的PCS。固然,若是那樣,也必須有本身的編譯器。而實際上,在一個處理器設計時,都會有某種假設,因此PCS某種程度上應該是同樣的。
寄存器的使用規則:
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字節的非葉子子程序可使用下面的代碼段來進行數據棧檢查.編程