11

ret该指令是否会导致“esp”寄存器增加 4?

4

3 回答 3

25

是的,它执行

pop eip

您可以使用

mov eax, [esp]
jmp eax

避免它。

编辑:这正是它的ret作用。例如,jmp rel_offetis nothing than a hidden add eip, offset,或者jmp absolute_offsetis 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 回答