定义
假设有如下场景:函数 A 调用了函数 B。寄存器 %rbx 需要在调用 B 函数前后保持一致。
1 2 3 4 5 6 7
| func A: ... call func B ...
func B: ...
|
调用者保存寄存器:
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。
被调用者保存寄存器:
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(被调用者保存):
%rbx ,%rbp,%r12,%r13,%r14,%r15
caller saved(调用者保存):
%rax,%rdi,%rsi,%rdx,%rcx,%8,%r9,%r10,%r11