csapp preliminaries

寄存器

通用寄存器

x86-64有16个通用寄存器,每个寄存器都有8个字节,因此可以存储64位的值。寄存器的名称是rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp、r8、r9、r10、r11、r12、r13、r14和r15。

  1. %rax 作为函数返回值使用。
  2. %rsp 栈指针寄存器,指向栈顶。
  3. %rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数…
  4. %r10,%r11 用作调用者保存。
  5. %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):最近的算术操作是否导致溢出。

GDB

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy
visitors: total visits: time(s) reads: time(s)