首页
社区
课程
招聘
关于汇编指令ret
发表于: 2015-1-19 20:20 5224

关于汇编指令ret

bxc 活跃值
6
2015-1-19 20:20
5224
一直很疑惑为何很多反汇编引擎都喜欢把retn反汇编成ret.
看了下wiki上是这样描述的:
RET Return from procedure Not a real instruction. The assembler will translate these to a RETN or a RETF depending on the memory model of the target system.

RETN Return from near procedure

RETF Return from far procedure

大意是ret不是一个真正的指令,汇编器将这些转换到RETN或根据目标系统的内存模型RETF.

既然如此为什么反汇编器还是喜欢把retn反汇编成ret呢,难道是历史问题?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 357
活跃值: (3573)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
2
00401000 >- E9 FB4F1000     JMP 00506000
00401005    E8 01000000     CALL 0040100B
0040100A    C3              RETN
0040100B    C3              RETN

怎么我的od引擎反汇编是retn,难道楼主用的是特别版?
2015-1-19 20:46
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
3
不是特指OD,OD在调试选项->命令也可以配置使用RET代替RETN的.

x64_dbg就是把RETN反汇编成RET的.udis86也是.
2015-1-19 21:00
0
雪    币: 1372
活跃值: (5343)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
一直以为没区别 囧~
2015-1-19 21:37
0
雪    币: 53
活跃值: (652)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
RET实际上是汇编器解释的RETN和RETF中的一种,正如引用中所说,RET不是一个真正的指令。
而RETN和RETF的区别在于,RETN是单纯的POP IP,而RETF不仅POP IP,也会POP CS,因此前者被称为“Return from near procedure”,而后者称为“Return from far procedure”。
Near Return的操作码是C3;
Far Return的操作码是CB;
无论是哪种返回方式,在32位Flat Mode下汇编常用的是Near Return(与Flat Mode的寻址方式有关),所以反汇编引擎会将RET翻译为RETN,而不必用到RETF。
2015-1-19 21:48
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
因为实际写汇编的时候是用ret,反汇编器是想让可读性更好(符合编写时候的习惯)吧
2015-1-19 22:01
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
谢谢各位了~
2015-1-19 22:07
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
retf是x86的恶梦。估计没几个人知道如何醒来。
2015-1-19 23:20
0
游客
登录 | 注册 方可回帖
返回
//