PUSH
作者:Vesper Vei
1 分钟阅读
目录
PUSH(push)
基本作用
PUSH 指令将一个操作数压入栈中,并更新栈顶指针。
栈在 x86/x64 中向低地址增长,因此 PUSH 会减少 ESP/RSP 的数值,再把数据写入新栈顶。
指令执行过程
以 64 位为例:
rsp = rsp - 8[rsp] = 操作数32 位为:
esp = esp - 4[esp] = 操作数指令格式
允许以下操作数:
- push r/m16
- push r/m32
- push r/m64
- push imm8 / imm16 / imm32(在 x64 会符号扩展为 64 位)
立即数 push 的符号扩展是 PUSH 的一个独特行为。
行为特性
- 栈指针向下移动
- 写入值不会清空旧内存,只是覆盖
- 立即数会进行 sign-extend(push imm32 → 64bit)
- 操作数不能为两个内存地址
- 栈布局会改变,影响函数调用偏移计算
等效展开示例
push rax; 等价于sub rsp, 8mov [rsp], raxpush 0x1234sub rsp, 8mov qword ptr [rsp], 0x0000000000001234ASCII 栈变化示意
执行前:
rsp → +------------------+ | (旧栈数据) | +------------------+执行 push rax 后:
+------------------+rsp → | rax 的值 | +------------------+ | (旧栈数据) |
常见用途
- 保存寄存器内容
- 函数调用时压入参数
- 对齐栈空间
- 临时保存数据
- PWN 中用于控制栈布局、覆盖返回地址