ARM-Thumb 過程調(diào)用標準
ATPCS 指定用于特殊用途的寄存器
- 使用寄存器 r0-r3 將參數(shù)值傳送到函數(shù),并將結(jié)果值傳出。可以用 a1-a4 來引用 r0-r3,以使此用法透明。請參閱第 3-9 頁的參數(shù)傳遞。在子程序調(diào)用之間,可以將 r0-r3 用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復 r0-r3。
如果調(diào)用函數(shù)需要再次使用 r0-r3 的內(nèi)容,則它必須保留這些內(nèi)容。
- 使用寄存器 r4-r11 存放函數(shù)的局部變量??梢杂?v1-v8 來引用這些寄存器,以使此用法透明。在 Thumb 狀態(tài)下,在大多數(shù)指令中只有寄存器 r4-r7 可以用于局部變量。
如果被調(diào)用函數(shù)使用了這些寄存器,它在返回之前必須恢復這些寄存器的值。
- 寄存器 r12 是內(nèi)部調(diào)用暫時寄存器 ip。它在過程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。在過程調(diào)用之間,可以將它用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復 r12。
- 寄存器 r13 是棧指針 sp。它不能用于任何其它用途。sp 中存放的值在退出被調(diào)用函數(shù)時必須與進入時的值相同。
- 寄存器 r14 是鏈接寄存器 lr。如果您保存了返回地址,則可以在調(diào)用之間將 r14 用于其它用途。
- 寄存器 r15 是程序計數(shù)器 PC。它不能用于任何其它用途。
生成匯編程序語言時,編譯程序使用特定名稱和基本寄存器名。
另外,s0-s31、d0-d15 和 f0-f31 是浮點協(xié)處理器中寄存器的預定義名稱。
寄存器 | 同義詞 | 特定名稱 | 過程調(diào)用標準中的角色 |
r15 | - | PC | 程序計數(shù)器 |
r14 | - | lr | 鏈接寄存器 |
r13 | - | sp | 棧指針 |
r12 | - | ip | 內(nèi)部過程調(diào)用暫時寄存器 |
r11 | v8 | - | ARM 狀態(tài)變量寄存器 8 |
r10 | v7 | sl | ARM 狀態(tài)變量寄存器 7 棧檢查變體中的棧限制指針 |
r9 | v6 | sb | ARM 狀態(tài)變量寄存器 6 RWPI 變體中的靜態(tài)基址 |
r8 | v5 | - | ARM 狀態(tài)變量寄存器 5 |
r7 | v4 | - | 變量寄存器 4 |
r6 | v3 | - | 變量寄存器 3 |
r5 | v2 | - | 變量寄存器 2 |
r4 | v1 | - | 變量寄存器 1 |
r3 | a4 | - | 自變量/結(jié)果/ 暫時寄存器 4 |
r2 | a3 | - | 自變量/結(jié)果/ 暫時寄存器 3 |
r1 | a2 | - | 自變量/結(jié)果/ 暫時寄存器 2 |
r0 | a1 | - | 自變量/結(jié)果/ 暫時寄存器 1 |
參數(shù)傳遞
有可變個數(shù)自變量的函數(shù)是 variadic。有固定個數(shù)自變量的函數(shù)是 nonvariadic。
向 variadic 和 nonvariadic 函數(shù)傳遞參數(shù)有不同的規(guī)則。
Nonvariadic 函數(shù)
參數(shù)值以下列方式傳遞到 nonvariadic 函數(shù):
1. 前面的整型自變量按順序分配給 r0-r3
2. 其余參數(shù)按順序分配給棧
長整數(shù)分配
超過 32 位的整型參數(shù)(例如,long long 型)有 8 字節(jié)對齊。傳遞 long long 型
參數(shù)時,將它分配給寄存器 r2 和 r3,或者分配給棧。
浮點數(shù)分配
如果系統(tǒng)有浮點硬件,則 FP 參數(shù)如下列方式分配給 FP 寄存器:
1. 按次序檢查每個 FP 參數(shù)。
2. 對于每個參數(shù),檢查可用的 FP 寄存器組。
3. 如果有一個可用,則將編號最低、尺寸適合于參數(shù)的相鄰 FP 寄存器組分配給參數(shù)。
Variadic 函數(shù)
參數(shù)值在整型寄存器 a1-a4 中、必要時在棧中傳遞到 variadic 函數(shù)(a1-a4 是 r0-r3的同義詞)。
使用的字順序如同參數(shù)值存儲在連續(xù)內(nèi)存字中,然后傳輸?shù)剑?br />1. a1-a4,首先是 a1。
2. 棧,首先是最低地址。(這表示它們以相反的順序推入棧中。)
結(jié)果返回
函數(shù)可以:
- 在 a1 中返回單字整型值。
- 在 a1-a2、a1-a3 或 a1-a4 中返回雙字或四字整型值。
- 在 f0、d0 或 s0 中返回浮點值。
- 在 f0-fN 或 d0-dN 中返回復合浮點值(如 complex)。N 的最大值取決于所選的浮點結(jié)構(gòu)(請參閱第 3-17 頁的浮點選項)。
- 較長的值必須在內(nèi)存中間接返回。
評論