常用汇编知识

2020-12-16

记录 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 位操作数。


2. 参考