POP
作者:Vesper Vei
1 分钟阅读
目录
POP(pop)
基本作用
POP 指令将栈顶数据弹出到目标操作数中,然后上移栈指针。
与 PUSH 相反,POP 会使 ESP/RSP 增加。
指令执行过程
64 位:
操作数 = [rsp]rsp = rsp + 832 位:
操作数 = [esp]esp = esp + 4指令格式
允许以下操作数:
- pop r/m16
- pop r/m32
- pop r/m64
不允许:
- pop 内存到内存
- pop 立即数
行为特性
- 栈指针向上移动
- 原栈数据不会被清空,只是逻辑上失效
- POP 不能直接弹立即数
- 弹入目标寄存器需要匹配大小(pop rax → 8 bytes)
等效展开示例
pop rax; 等价于mov rax, [rsp]add rsp, 8ASCII 栈示意
执行前:
rsp → +------------------+ | 要弹出的值 | +------------------+执行 pop rax 后:
rsp → +------------------+ | (旧数据) | +------------------+; rax = 原栈顶值
⚠️注意,这里的 0x0012FF88 处的栈数据不会被清空,但程序正常执行时会覆盖
常见用途
- 恢复保存的寄存器
- 函数返回前恢复栈状态
- 移动栈顶跳过数据
- PWN 中用于 stack pivot 或栈调节