+ -
当前位置:首页 → 问答吧 → ret和retf通俗的解释下

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之分)
第二,在子程序中若有数据压入堆栈,则必须在子程序返回前正确地弹出堆栈,否则堆栈的一致性也被破坏。

作者: hsh188d88452d2   发布时间: 2011-05-23