x86汇编指令集为什么设计一个ret命令,为什么不用pop eip代替?

x86汇编指令集为什么设计一个ret命令,为什么不用pop eip代替?

回答:

ret 含有平栈的操作。
pop eip 只是恢复了调用时的下一条指令的地址。没处理 栈指针。


RET - 从过程返回

操作码 指令      说明
C3   RET     近返回到调用过程
CB   RET     远返回到调用过程
C2 iw  RET imm16  近返回到调用过程,并从堆栈弹出 imm16 个字节
CA iw  RET imm16  远返回到调用过程,并从堆栈弹出 imm16 个字节

说明  

将程序控制权转移到位于栈顶的返回地址。此地址通常由 CALL 指令放入堆栈,返回目标是 CALL 指令的下一条指令。

可选的源操作数指定弹出返回地址之后要释放的堆栈字节数;默认值是无。此操作数可用于从堆栈释放传递到被调用过程并且不再需要的参数。用于切换到新过程的
CALL 指令使用带非零字计数的调用门访问新过程时,必须使用此操作数。这里,RET
指令的源操作数指定的字节数必须与调用门的字计数字段中指定的相同。

RET 指令可用于执行三种不同类型的返回:

  近返回 - 返回到当前代码段(CS 寄存器当前指向的段)中的调用过程,有时称为段内返回。

  远返回 - 返回到当前代码段之外的段中的调用过程,有时称为段间返回。

  特权级别间远返回 - 远返回到与当前执行程序或过程不同的特权级别。


文字格式太难编辑了,还是贴图吧~

RET

POP

回答:

其实是语义含义的问题:ret表示返回进入函数之前的指令,那么这个语义屏蔽了硬件实现的细节。尽管硬件在实现上是pop %eip,但是并没有规定eip一定使用栈在保存。

当然,完整的返回函数还包含leave指令:

leave

ret

这两条指令相当于

movl    %ebp, %esp

popl %ebp

popl %eip

回答:

http://newsmth.net/nForum/!article/CSArch/48232

以上是 x86汇编指令集为什么设计一个ret命令,为什么不用pop eip代替? 的全部内容, 来源链接: utcz.com/p/194181.html

回到顶部