寄存器使用
x64 体系结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄存器。 易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁。 非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存。
下表说明了每种寄存器在整个函数调用过程中的使用方法:
Register |
状态 |
使用 |
RAX |
易失的 |
返回值寄存器 |
RCX |
易失的 |
第一个整型参数 |
RDX |
易失的 |
第二个整型参数 |
R8 |
易失的 |
第三个整型参数 |
R9 |
易失的 |
第四个整型参数 |
R10:R11 |
易失的 |
必须根据需要由调用方保留;在 syscall/sysret 指令中使用 |
R12:R15 |
非易失的 |
必须由被调用方保留 |
RDI |
非易失的 |
必须由被调用方保留 |
RSI |
非易失的 |
必须由被调用方保留 |
RBX |
非易失的 |
必须由被调用方保留 |
RBP |
非易失的 |
可用作帧指针;必须由被调用方保留 |
RSP |
非易失的 |
堆栈指针 |
XMM0 |
易失的 |
第一个 FP 参数 |
XMM1 |
易失的 |
第二个 FP 参数 |
XMM2 |
易失的 |
第三个 FP 参数 |
XMM3 |
易失的 |
第四个 FP 参数 |
XMM4:XMM5 |
易失的 |
必须根据需要由调用方保留 |
XMM6:XMM15 |
非易失的 |
必须根据需要由被调用方保留。 |