ret
该指令是否会导致“esp”寄存器增加 4?
问问题
15021 次
3 回答
25
是的,它执行
pop eip
您可以使用
mov eax, [esp]
jmp eax
避免它。
编辑:这正是它的ret
作用。例如,jmp rel_offet
is nothing than a hidden add eip, offset
,或者jmp absolute_offset
is mov eip, absolute_offset
。当然,处理器处理它们的方式存在差异,但从程序员的角度来看,这就是发生的一切。
此外,还有一种特殊形式的ret
:ret imm8
也会将此 imm8 值添加到esp
: 例如一个__stdcall
函数使用它从堆栈中丢弃其参数。更不用说retf
在 16 位模式下使用的版本,它也会cs
从堆栈中弹出。
编辑2:
pop register
方法:
mov register, [esp]
add esp, 4
于 2010-11-27T15:53:46.263 回答
2
是的,因为在堆栈上有(嗯,应该有,请参阅缓冲区溢出)恢复程序执行的地址。所以 ret 意味着
pop ret_addr ; pop deletes ret_addr from stack by adding 4 to esp
mov eip, ret_addr
这是
pop eip
正如鲁斯利克所说
于 2010-11-28T16:16:58.600 回答
0
是的,当处理器在 32 位保护模式下运行时。在实模式或 16 位保护模式下,RET 执行 POP IP,这将导致 ADD ESP,2(而不是 4)。
于 2010-12-02T14:22:07.837 回答