调用者保存寄存器和非调用者保存寄存器

定义

假设有如下场景:函数 A 调用了函数 B。寄存器 %rbx 需要在调用 B 函数前后保持一致。

1
2
3
4
5
6
7
func A:
...
call func B
...

func B:
...

调用者保存寄存器:\color{red}{调用者保存寄存器:}

1
2
3
4
5
6
7
8
9
func A:
...
save register %rbx
call func B
restore register %rbx
...

func B:
...

如上图所示,寄存器 %rbx 是由函数 B 的调用者,即函数 func A 来保存并且恢复的。函数 B 感知不到这个情况,可以尽情使用寄存器 %rbx。

被调用者保存寄存器:\color{red}{被调用者保存寄存器:}

1
2
3
4
5
6
7
8
9
func A:
...
call func B
...

func B:
save register %rbx
...
restore register %rbx

如图所示,寄存器 %rbx 是由被调用函数,即函数 B 来保存并回复的。函数 A 感知不到这个情况。

寄存器分类

不同的寄存器有不同的保存策略。
callee saved(被调用者保存):\color{red}{callee \ saved(被调用者保存):}

%rbx ,%rbp,%r12,%r13,%r14,%r15

caller saved(调用者保存)\color{red}{caller \ saved(调用者保存):}

%rax,%rdi,%rsi,%rdx,%rcx,%8,%r9,%r10,%r11