“ret”指令是否会导致“esp”寄存器加4?
答案 0 :(得分:18)
是的,它执行
pop eip
您可以使用
mov eax, [esp]
jmp eax
避免它。
编辑:这正是ret
的作用。例如,jmp rel_offet
不是隐藏的add eip, offset
,或jmp absolute_offset
是mov eip, absolute_offset
。当然处理器对待它们的方式存在差异,但从程序员的角度来看,这就是发生的一切。
此外,还有一种特殊形式的ret
:ret 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)。