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

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

2008-10-30 10:58
4748
收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 10 2008-10-30 11:23
2
0
fast call优先使用eax edx。
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
dayed 1 2008-10-30 12:06
3
0
啊,是ecx,edx吧
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shiove 2008-10-30 14:56
4
0
fast call第一个使用ecx,其次才是edx
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-10-30 15:47
5
0
雪    币: 2108
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 6 2008-10-30 22:36
6
0
查过了标准,即“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的文档,可以查一下,如果我说错了,请指正,谢谢。
游客
登录 | 注册 方可回帖
返回