ret和retf通俗的解释下

codefish123 2011-05-23 08:48:37
它门是怎么执行的 最好有示例
...全文
826 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfq0987 2011-05-25
  • 打赏
  • 举报
回复
ret返回时pop ip
retf返回时pop cs,pop ip
大熊猫侯佩 2011-05-25
  • 打赏
  • 举报
回复
一个近返回,一个带段地址返回。后者在win32编程中很少用到。
xiaopoy 2011-05-24
  • 打赏
  • 举报
回复
ret代表函数return。
retf代表函数return with flag。这儿的flag可以用感觉理解成EFLAG,虽然retf不会真的恢复EFLAG,但它要恢复CPU的执行环境。
因为在32bit保护模式里return with flag的切换段寄存器直接意味着代码的执行权限的改变,于是retf在保护模式里就经常用在系统软件中断调用的返回时,用来切换执行到非特权级别执行权限,当然中断的处理例程里因为中断例程是特权级别执行权限,返回时也需要用retf来切换堆栈。

至于rtn和rtnf怎么返回,就记住rtn只返回一个EIP,rtnf先返回CS,又返回EIP就可以了。具体的堆栈怎么操作,视CPU架构而定, 现在的PC CPU架构中, intel的Protected mode/Real-address mode /System management mode (SMM)/Compatibility mode (sub-mode of IA-32e mode)是按照32-bit来操作堆栈的, 64-bit mode (sub-mode of IA-32e mode)是按照64bit操作堆栈的。
4号机器人 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之分)
第二,在子程序中若有数据压入堆栈,则必须在子程序返回前正确地弹出堆栈,否则堆栈的一致性也被破坏。
masmaster 2011-05-23
  • 打赏
  • 举报
回复
ret用栈中的数据修改IP,实现近转移;retf用栈中的数据修改IP和CS,实现远转移。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧