寄存器
通用寄存器
x86-64有16个通用寄存器,每个寄存器都有8个字节,因此可以存储64位的值。寄存器的名称是rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp、r8、r9、r10、r11、r12、r13、r14和r15。
- %rax 作为函数返回值使用。
- %rsp 栈指针寄存器,指向栈顶。
- %rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数…
- %r10,%r11 用作调用者保存。
- %rbx,%rbp,%r12,%r13,%14,%15 用作被调用者保存。
什么是调用者(caller)和被调用者(callee)?如果函数binky调用winky,我们把binky称为调用者,winky称为被调用者。例如,(1)和(3)都是被调用者的。被调用者可以自由地使用这些寄存器,覆盖现有的值而不采取任何预防措施,如果这些寄存器持有一个调用者想要保留的值,调用者必须在进行调用之前将该值复制到一个“安全”的位置;相反,如果被调用者打算使用调用者拥有的寄存器,它必须首先保留其值,并在退出调用前恢复它。
条件码寄存器
这些寄存器描述了最近的算术或逻辑操作的属性,可以检测这些寄存器来执行条件分支指令:
- CF (carry flag):最近的算术操作是否产生了进位或借位。
- ZF (zero flag):最近的算术操作的结果是否为0。
- SF (sign flag):最近的算术操作的结果是否为负数。
- OF (overflow flag):最近的算术操作是否导致溢出。