ret和retf通俗的解释下
时间:2011-05-23
来源:互联网
它门是怎么执行的 最好有示例
作者: codefish123 发布时间: 2011-05-23
ret用栈中的数据修改IP,实现近转移;retf用栈中的数据修改IP和CS,实现远转移。
作者: masmaster 发布时间: 2011-05-23
ret 是32位地址的返回或16位选择子加32位地址的返回(由编译器分辨是翻译成retn还是retf)
retn 是32位地址的返回(NEAR)
retf 是16位选择子加32位地址的返回(FAR)
RET指令把程序的控制点返回到子程序的调用者。通过把保存在堆栈中的返回地址弹出到相应寄存器中实现子程序调用的返回,并从返回地址处继续执行。段内(NEAR)调用返回把32位返回地址弹出到EIP寄存器中;段间(FAR)调用返回先把32位偏移量弹出到EIP寄存器中, 再把16位段值弹出到CS寄存器中。这两种返回指令在功能上与以下两条指令相同:
RETN: POP EIP
RETF: POP CS:EIP
在使用CALL/RET指令时,有两点必须要注意:
第一,NEAR调用在返回时必须使用NEAR返回,FAR调用在返回时必须使用FAR返回。如果在汇编程序设计时错误地使用调用和返回方式,则程序返回的地址可能不对,并且堆栈的一致性将会被破坏。(CALL也有NEAR和FAR之分)
第二,在子程序中若有数据压入堆栈,则必须在子程序返回前正确地弹出堆栈,否则堆栈的一致性也被破坏。
retn 是32位地址的返回(NEAR)
retf 是16位选择子加32位地址的返回(FAR)
RET指令把程序的控制点返回到子程序的调用者。通过把保存在堆栈中的返回地址弹出到相应寄存器中实现子程序调用的返回,并从返回地址处继续执行。段内(NEAR)调用返回把32位返回地址弹出到EIP寄存器中;段间(FAR)调用返回先把32位偏移量弹出到EIP寄存器中, 再把16位段值弹出到CS寄存器中。这两种返回指令在功能上与以下两条指令相同:
RETN: POP EIP
RETF: POP CS:EIP
在使用CALL/RET指令时,有两点必须要注意:
第一,NEAR调用在返回时必须使用NEAR返回,FAR调用在返回时必须使用FAR返回。如果在汇编程序设计时错误地使用调用和返回方式,则程序返回的地址可能不对,并且堆栈的一致性将会被破坏。(CALL也有NEAR和FAR之分)
第二,在子程序中若有数据压入堆栈,则必须在子程序返回前正确地弹出堆栈,否则堆栈的一致性也被破坏。
作者: hsh188d88452d2 发布时间: 2011-05-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28