寄存器

  • 常用的寄存器分组
    • 数据寄存器。包括 rax、rbx、rcx、rdx这是四个64位宽寄存器,可以拆成32位宽的寄存器eax、ebx、ecx、edx。
    • 变址寄存器。包括 rdi、rsi。(index register).
    • 指针寄存器。包括 rbp、rsp。(pointer register)
    • 指令指针寄存器。包括 rip。
    • 标志寄存器。包括 cf (进位标志)、af(辅助进位标志)、pf(奇偶标志)、 zf(零标志)、 of(溢出标志)、sf(符号标志)。
    • 段寄存器。包括 cs、ds、es、ss、fs、gs。Linux中一般不会用到。
    • 其他:比如64位cpu引入r8-r15等几个通用的寄存器。
  • 主要用途
    • rax 通常用来执行加法,一般函数返回值也使用。
    • rbx 数据存储
    • rcx 通常用于计数,比如for 循环里面的索引。
    • rsp 指向栈顶,rbp指向栈底,通常用 rbp + offset值寻址栈上的局部变量
    • rsi rdi 通常在字符串操作时,rsi存放数据源的地址,rdi存放目的的地址
    • rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数。。。
    • rbx,rbp,r12,r13,14,15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。
    • r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。
  • 简单命令
    • xchg %rbx, %rdx 交换操作数的内容
    • jmpq *%rbx 跳转到rbx保存的地址继续执行
    • jmpq *(%rbx) 跳转到rbx保存的地址指向的地址继续执行
    • andq 0xf, %rax 与操作
    • addq $1, %rax 计算和操作
    • subq $1, %rax 计算差操作
    • incq %rax 自增操作
    • decq %rax 自减操作
    • negq %rax 补码操作
    • notq %rax 取反操作
    • cltq (convert long to quad) eax 符号扩展为rax。即把 eax的值扩宽为64bit。
    • leaq (load effective address)
      • lea 8(%rbx), %rax 就是将rbx+8这个值直接赋给rax,而不是把rbx+8处的内存地址里的数据赋给rax。
      • 而mov指令则恰恰相反,例如:mov 8(%rbx), %rax 则是把内存地址为rbx+8处的数据赋给rax。
    • call xxx 会先把此指令的下一条指令压栈,然后跳转到操作数指定的地址继续执行。
    • retq 先出栈, 然后跳转到出栈的数据指向的地址继续执行