常用汇编知识

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 目标变址寄存器
rax 64 bit 函数返回值寄存器
rbp 64 bit 栈基址寄存器—指向栈底
rip 64 bit 地址偏移寄存器 (存放着当前程序指令地址)
rsp 64 bit 栈寄存器—指向栈顶

1.2. 汇编指令

命令 描述
jmp 无条件段内直接转移指令
sub 减法指令
jle 条件转移指令
mov 传送指令 (movl 32位, movw 16位, movb 8位)
cmp 比较指令
push 进栈指令
pop 出栈指令
ret 段内过程返回指令,使子程序结束,继续执行主程序。(popl %rip 恢复指令指针寄存器)
callq 相当于 pushq %rip;jmpq addr
leaveq 相当于 movq %rbp;%rsp popq %rbp
retq 相当于 popq %rip
leal 用于加载有效地址到指定寄存器
nop 空操作

callq,leaveq,retq 中的q是指64位操作数。


2. 参考