常用汇编知识
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. 参考
人生还有意义。那一定是还在找存在的理由