社区
汇编语言
帖子详情
ret和retf通俗的解释下
codefish123
2011-05-23 08:48:37
它门是怎么执行的 最好有示例
...全文
826
5
打赏
收藏
ret和retf通俗的解释下
它门是怎么执行的 最好有示例
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,实现远转移。
[从零学习汇编语言] - 转移指令进阶
文章目录前言回顾1.转移指令原理2. 已接触过的操作符3. 寄存器回顾通用数据处理寄存器指针寄存器变址寄存器段地址寄存器其他寄存器一、ret及re
tf
1.1 ret指令1.2 re
tf
指令 前言 点赞再看,养成习惯! 回顾 1.转移指令原理 还记得什么叫做转移指令吗?我们之前说过:能够修改IP寄存器或者同时修改CS及IP寄存器的指令叫做转移指令。 而通过定义我们又可以推断转移指令之所以可以跳转,主要是由于它可以修改负责存储指令指针信息的CS:IP 地址寄存器的值。 让我们写个小程序加深一下理解: ass
逆向笔记--常用到的汇编知识点
函数调用与返回过程 call过程: // 段内call通常进行两步操作 push ip jmp addr // 如果call的函数不是本段当中的地址 push cs push ip jmp addr ret过程: ret实际上是一个伪指令,由编译器决定在编译时最终使用retn(return from near procedure)或者re
tf
(return from far procedure),这实际上对应了call的两种方式 段内call不需要将段地址压栈,对应的retn只需要实现 pop i
call 和 ret 指令
目录 一. call 二. ret 三.
【汇编】其他转移指令、call指令和ret指令
在汇编语言的世界中,转移指令扮演着连接程序执行流程的重要角色。除了之前提到的 JMP 指令外,汇编语言还提供了其他一些转移指令,其中包括 CALL 和 RET 指令。这些指令不仅允许程序跳转到其他位置执行,还支持子程序的调用和返回,为实现模块化、可维护的代码提供了强大的支持。
第三篇 子程序调用与返回的一点小问题
这篇博文主要是为了简单介绍下,子程序调用的两种情况,调用在定义前和定义在调用前。 一、调用在定义前 1、近调用 code segment assume cs:code start: call f mov ah,4ch int 21h f proc mov ax,0ffffh ret f endp code ends end start 2、远调用 code segme
汇编语言
21,459
社区成员
41,601
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章