基本atpcs
基本atpcs規定了在子程式呼叫時的一些基本規則,包括以下三個方面的內容:
1 各暫存器的使用規則及其相應的名字;
2 資料棧的使用規則;
3 引數傳遞的規則.
一:暫存器的使用規則:
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編譯器和彙編器中都是預定義的.
二 :資料棧的使用規則
棧指標通常可以指向不同的位置.當棧指標指向棧頂元素(即最後乙個入棧的資料元素)時,稱為full棧.當棧指標指向與棧頂元素相鄰的乙個元素時,稱為empty棧. 資料棧的增長方向也可以不同. 當資料棧向記憶體減小的位址方向增長時,稱為descending棧; 當資料棧向著記憶體位址增加的方向增長時,稱為ascending棧. 綜合這兩種特點可以由以下4種資料棧: fd ed fa ea . atpcs規定資料棧為fd型別,並對資料棧的操作是8位元組對齊的,下面是乙個資料棧的示例及相關的名詞.
1.資料棧棧指標.stack pointer 指向最後乙個寫入棧的資料的記憶體位址.
3.資料棧界限.stack limit 是指資料棧中可以使用的最低的記憶體單元位址.
4.已占用的資料棧.used stack 是指資料棧的基位址和資料棧棧指標之間的區域.其中包括資料棧棧指標對應的記憶體單元.
5.資料棧中的資料幀(stack frames) 是指在資料棧中,為子程式分配的用來儲存暫存器和區域性變數的區域.
異常中斷的處理程式可以使用被中斷程式的資料棧,這時使用者要保證中斷的程式資料棧足夠大. 使用ads編譯器產生的目標**中包含了d***t2格式的資料幀.在除錯過程中,偵錯程式可以使用這些資料幀來檢視資料棧中的相關資訊.而對於組合語言來說,使用者必須使用frame偽操作來描述資料棧中的資料幀.arm彙編器根據這些偽操作在目標檔案中產生相應的d***t2格式的資料幀.
在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.對於位數更多的結果,需要通過呼叫記憶體來傳遞.
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...
C和彙編混合程式設計 do while
環境 vc do while 會先執行do裡面的迴圈體,執行完去執行while的條件判斷,如果為真,繼續執行do裡面的迴圈體,如果為假,則結束迴圈 c程式 上面先執行sum i i 接著執行i 100,如果為true,則繼續執行do迴圈,否則,結束迴圈。反彙編 5 int i 1,sum 0 004...
C 彙編的混合程式設計
aptcs arm thumb 程式呼叫規範 pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程 函式 呼叫者與被呼叫者之間的協議。協議規定 呼叫函式如何傳遞引數 即壓棧方法,以何種方式存放引數 被呼叫函式 如何獲取引數,以何種方式傳遞函式返...