ret指令会导致esp寄存器加4吗?

时间:2010-11-27 15:46:57

标签: assembly return instructions

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

3 个答案:

答案 0 :(得分:18)

是的,它执行

pop eip

您可以使用

mov eax, [esp]
jmp eax

避免它。

编辑:这正是ret的作用。例如,jmp rel_offet不是隐藏的add eip, offset,或jmp absolute_offsetmov eip, absolute_offset。当然处理器对待它们的方式存在差异,但从程序员的角度来看,这就是发生的一切。

此外,还有一种特殊形式的retret imm8也会将此imm8值添加到esp:例如__stdcall函数使用它来丢弃其参数从堆栈。更不用说在16位模式下使用的retf版本,它也会从堆栈中弹出cs

EDIT2:

pop register

表示:

mov register, [esp]
add esp, 4

答案 1 :(得分:2)

是的,因为在堆栈上有(好吧,应该有,请参见缓冲区溢出)地址到哪里继续执行程序。因此ret意味着

pop ret_addr           ; pop deletes ret_addr from stack by adding 4 to esp
mov eip, ret_addr

pop eip
正如ruslik所说的那样

答案 2 :(得分:0)

是,当处理器以32位保护模式运行时。在实模式或16位保护模式下,RET执行POP IP,这将导致ADD ESP,2(而不是4)。