首页
社区
课程
招聘
[求助]如何区分fast call和this call
发表于: 2008-10-30 10:58 5213

[求助]如何区分fast call和this call

2008-10-30 10:58
5213
利用IDA反汇编,发现很多函数通过ecx传递参数,如何快速的辨别是this call还是fast call?郁闷死了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
fast call优先使用eax edx。
2008-10-30 11:23
0
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
啊,是ecx,edx吧
2008-10-30 12:06
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
fast call第一个使用ecx,其次才是edx
2008-10-30 14:56
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
2008-10-30 15:47
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
查过了标准,即“the standard",ISO C++ 2001标准中对于编译所谓的调用约定并没有规定,又查了一下C89和C99,其实也没有提到参数的调用约定。

这个东西不是标准化的,不同编译器有不同的实现方式。对于像_cdecl,_stdcall这种约定,基本所有编译器都一样,算是约定俗成的。

但对于_fastcall,_thiscall,至少我们目前主流的编译器中的VC和BCB是不同的。

微软的VC中,它的文档中指出_fastcall的前两个参数是通过ecx,edx传递的,其它所有参数从右向左使用堆栈传递,被调用者清栈。

而Borland的BCB中,_fastcall应该是使用eax,edx,ecx这三个寄存器传递前三个参数。

在VC中,thiscall方式的解释是,thiscall不是一个关键字,是编译器专用。它的所有参数(指参数表中列出的参数)通过堆栈传递,而对象的this指针放在ecx寄存器。被调用者清栈。

而BCB中,this指针不被当做一个特殊对待的参数,编译器将它作为函数的第一个参数,参数表中的参数是第2、3个参数。所以this通常是eax传递的,而其它参数通过edx,ecx传递,如果还有更多参数,则压入堆栈。

注:关于VC的标准,有MSDN可查。但是对于BCB,我本人手头没有文档,因此上面所说的是根据自己的经验猜测的,不保证是正确的。

如果谁手头有BCB的文档,可以查一下,如果我说错了,请指正,谢谢。
2008-10-30 22:36
0
游客
登录 | 注册 方可回帖
返回
//