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

发布于 2022-09-03 19:51:03 字数 69 浏览 13 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

千鲤 2022-09-10 19:51:03

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

长梦不多时 2022-09-10 19:51:03

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

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

leave
ret

这两条指令相当于

movl    %ebp, %esp
popl    %ebp
popl    %eip
吹泡泡o 2022-09-10 19:51:03

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文