![](/img/trans.png)
[英]Using "saved" registers in the main function at RISC-V Assembly
[英]Which Registers are Saved and Not Saved in RISC-V
我正在上計算機體系結構課程,並且在課程中的一些主題上有點迷失。 在過程調用中保存和不保存哪些寄存器? 這是什么意思?
在寄存器列表上,我的書上說 x8-x9 和 x18-27 是保存的寄存器。 這是否意味着所有其他人都沒有得救? 我讀過一些關於被叫方和來電方的內容——這與這有什么關系嗎? 我通讀了這本書並嘗試谷歌搜索但找不到直接的答案,所以我來到這里。 我選擇這個 class 只是因為沒有提供其他選項並且沒有所有先決條件和背景研究。 結果我很難跟上,所以請簡單地解釋一下。
現在在 riscv-gcc 中實現了什么:
調用保存的 GPR:X8-X9 x18-x27
調用保存的 FPR(如果啟用浮點):F8-F9 F18-F27
所有其他寄存器都是固定的或 Call 被破壞。
#define REG_ALLOC_ORDER \
{ \
/* Call-clobbered GPRs. */ \
15, 14, 13, 12, 11, 10, 16, 17, 6, 28, 29, 30, 31, 5, 7, 1, \
/* Call-saved GPRs. */ \
8, 9, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, \
/* GPRs that can never be exposed to the register allocator. */ \
0, 2, 3, 4, \
/* Call-clobbered FPRs. */ \
47, 46, 45, 44, 43, 42, 32, 33, 34, 35, 36, 37, 38, 39, 48, 49, \
60, 61, 62, 63, \
/* Call-saved FPRs. */ \
40, 41, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \
/* None of the remaining classes have defined call-saved \
registers. */ \
64, 65 \
}
ra
由調用者處理,如果需要,您可以查看 riscv.c,您將看到ra
何時被riscv_save_reg_p
保存。
對於 LLVM 移植:被調用者保存的 GPR 是:X1、X3-X4、X8-X9 和 X18-X27 被調用者保存的 FPR(如果啟用浮點):F8-F9 F18-F27
def CSR_ILP32_LP64
: CalleeSavedRegs<(add X1, X3, X4, X8, X9, (sequence "X%u", 18, 27))>;
def CSR_ILP32F_LP64F
: CalleeSavedRegs<(add CSR_ILP32_LP64,
F8_F, F9_F, (sequence "F%u_F", 18, 27))>;
def CSR_ILP32D_LP64D
: CalleeSavedRegs<(add CSR_ILP32_LP64,
F8_D, F9_D, (sequence "F%u_D", 18, 27))>;
這與 gcc 所做的有點不同。 在 gcc 中,X3 和 X4 被認為是固定的。
對於 LLVM 中的 X2,它由 setStackPointerRegisterToSaveRestore 處理。
嘗試用通俗易懂的方式解釋。 如果 function 使用被調用者寄存器(例如 x8),它將保存並恢復它,這意味着之后我們將擁有相同的值。 如果它使用不屬於此列表的寄存器(例如 gcc 的 ra),它將不會執行此工作,並且由調用者 function 在使用它之前設法恢復值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.