记录 x86_64 架构下的常用寄存器和汇编指令。
1. 汇编知识
1.1. 寄存器
64 位模式下,虽然处理器现在只能支持 48 位的地址,但是理论上,地址最大为 64 位。从寄存器来看,64 位模式与 32 位最主要的区别如下所示:
- 16 个 64 位通用寄存器(32 位模式只有 8 个通用寄存器)
- 8 个 80 位浮点寄存器
- 1 个 64 位状态标志寄存器 RFLAGS (只使用低 32 位)
- 1 个 64 位指令指针寄存器 RIP
| 寄存器 | 描述 |
|---|---|
| bp | 16 bit 栈基址寄存器—指向栈底。 |
| sp | 16 bit 栈寄存器—指向栈顶。 |
| ebp | 32 bit 栈基址寄存器—指向栈底。 |
| esp | 32 bit 栈寄存器—指向栈顶。 |
| eax | 32 bit 通用寄存器 (函数返回数值,约定保存于 a 寄 存器)。 |
| edx | 32 bit 通用寄存器。 |
| esi | 32 bit 源变址寄存器。 |
| edi | 32 bit 目标变址寄存器。 |
| rbp | 64 bit 栈基址寄存器—指向栈底。 |
| rsp | 64 bit 栈寄存器—指向栈顶。 |
| rip | 64 bit 地址偏移寄存器 (存放着当前程序指令地址)。 |
| rax | 64 bit 函数返回值寄存器。 |
1.2. 汇编指令
| 命令 | 描述 |
|---|---|
| mov | 传送指令 (movl 32位, movw 16位, movb 8位)。 |
| jmp | 无条件段内直接转移指令。 |
| sub | 减法指令。 |
| cmp | 比较指令。 |
| jle | 条件转移指令,小于等于就跳转。 |
| je | 条件跳转指令,相等时跳转。 |
| jae | 条件跳转指令,大于等于。 |
| jne | 条件转移指令,不等时,跳转。 |
| push | 进栈指令。 |
| pop | 出栈指令。 |
| ret | 段内过程返回指令,使子程序结束,继续执行主程序。(popl %rip 恢复指令指针寄存器)。 |
| retq | 相当于 popq %rip。 |
| callq | 相当于 pushq %rip;jmpq addr。 |
| leaveq | 相当于 movq %rbp;%rsp popq %rbp。 |
| leal | 用于加载有效地址到指定寄存器。 |
| nop | 空操作。 |
callq,leaveq,retq 中的 q 是指 64 位操作数。