ARM基礎學習 ATPCS子程式呼叫基本規範

2021-07-31 08:27:56 字數 1365 閱讀 2438

atpcs是: arm thumb procedure call standard的縮寫。意思是arm程式和thumb程式中子程式呼叫的基本規範。

暫存器的使用規則

當引數個數小於等於4個的時候,子程式間通過r0~r3來傳遞引數,在返回前無需恢復暫存器r0~r3的內容;如果引數個數大於4個,餘下的引數就通過sp所指向的資料棧進行引數傳遞。在棧上開闢8位元組的空間進行引數傳遞。

在子程式中,使用r4~r11來儲存區域性變數,如果子程式要使用這些暫存器,進入子程式時必須儲存這些暫存器的值,在返回前必須恢復這些暫存器的值;

暫存器r12用作scratch暫存器,記為ip;在程式呼叫過程中間臨時暫存器ip;

暫存器r13用做堆疊指標sp。在子程式中暫存器r13不能用做其它用途。暫存器sp在進入子程式時的值和退出子程式的值必須相等。

暫存器r15為程式計數器pc,不能用做其他用途。

子程式結果返回規則

函式呼叫完畢後,如果函式有返回值,函式一般把返回值儲存在r0暫存器中,因此一般我們通過bl指令呼叫乙個函式後,就可以通過在彙編裡面訪問r0得到返回值。

子程式結果返回規則:

1.結果為乙個32位的整數時,可以通過暫存器r0返回.

2.結果為乙個64位整數時,可以通過r0和r1返回,依此類推.

3.結果為乙個浮點數時,可以通過浮點運算部件的暫存器f0,d0或者s0來返回.

4.結果為乙個復合的浮點數時,可以通過暫存器f0-fn或者d0~dn來返回.

5.對於位數更多的結果,需要通過呼叫記憶體來傳遞.

資料棧使用規則

棧指標可以指向不同的位置,arm有4種資料棧,分別是:

遞增空棧,

遞增滿棧,

遞減空棧,

遞減滿棧,

atpcs規定資料棧為遞減滿棧(fd),並對資料棧的操作是8位元組對齊的;下面是資料棧相關的名詞解釋;

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

2.資料棧的基位址.stack base 是指資料棧的最高位址.由於atpcs中的資料棧是fd型別的,實際上資料棧中最早入棧資料佔據的記憶體單元是基位址的下乙個記憶體單元.

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

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

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

異常中斷的處理程式可以使用被中斷程式的資料棧,這時使用者要保證中斷的程式資料棧足夠大.

perl子程式學習筆記

一.定義 子程式即執行乙個特殊任務的一段分離的 它可以使減少重複 且使程式易讀.perl中,子程式可以出現在程式的任何地方.定義方法為 sub subroutine 二.呼叫 呼叫方法如下 1.用 呼叫 subname sub subname 2.先定義後呼叫,可以省略 符號 sub subname...

perl學習 4 子程式

子程式,模擬c語言中的函式,在形式上個人認為最大的區別 沒有形參 usr bin perl sub marine marine marine 所有的perl 子程式都會返回值,在perl 中返回值和不返回值是沒有區別的。當然,不是所有perl子程式返回的值都是有用的。由於所有的被呼叫的子程式都要返回...

perl學習之子程式

一 定義 子程式即執行乙個特殊任務的一段分離的 它可以使減少重複 且使程式易讀。perl中,子程式可以出現在程式的任何地方。定義方法為 sub subroutine 二 呼叫 呼叫方法如下 1 用 呼叫 subname sub subname 2 先定義後呼叫 可以省略 符號 sub subname...