寄存器
- 常用的寄存器分组
- 数据寄存器。包括 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 先出栈, 然后跳转到出栈的数据指向的地址继续执行