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

查看:165
本文介绍了c - 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 寄存器当前指向的段)中的调用过程,有时称为段内返回。

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

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


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

这篇关于c - x86汇编指令集为什么设计一个ret命令,为什么不用pop eip代替?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆