risc-v-register-caller-callee-saved
【RISC-V】常用Register以及Caller/Callee Saved
發布於 2026-04-21·18·
RISC-V
開發OS最重要的事情之一就是要熟悉使用的指令集,但我經常忘記RISC-V有哪些暫存器以及它們的功能等等,這篇文章就來記錄一下。
首先RISC-V每顆CPU核心都有幾類暫存器:
| Register | ABI 名稱 | Caller/Callee Saved | 用途 |
|---|---|---|---|
| x0 | zero | — | 恆為 0。寫入會被丟棄,讀取永遠得到 0。 |
| x1 | ra | Caller | 返回地址 (Return Address)。執行 call 時自動更新。 |
| x2 | sp | Callee | 堆疊指標 (Stack Pointer)。必須保持 16-byte 對齊。 |
| x3 | gp | — | 全域指標 (Global Pointer)。指向靜態全域變數區。 |
| x4 | tp | — | 執行緒指標 (Thread Pointer)。OS 常拿來存 CPU HartID 或 PCB。 |
| x5 - x7 | t0 - t2 | Caller | 臨時暫存器 (Temporary) 0 - 2。 |
| x8 | s0 / fp | Callee | Saved 0 / 幀指標 (Frame Pointer)。用於 Trace 呼叫堆疊。 |
| x9 | s1 | Callee | Saved 1。 |
| x10 - x11 | a0 - a1 | Caller | 函式參數 0 - 1 / 回傳值。Syscall 結果也存於此。 |
| x12 - x17 | a2 - a7 | Caller | 函式參數 2 - 7。a7 通常用於傳遞 Syscall ID。 |
| x18 - x27 | s2 - s11 | Callee | Saved 2 - 11。swtch.S 必須手動保存這組暫存器。 |
| x28 - x31 | t3 - t6 | Caller | 臨時暫存器 3 - 6。 |
註: