能力值:
( LV13,RANK:410 )
|
-
-
2 楼
fast call优先使用eax edx。
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
啊,是ecx,edx吧
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
fast call第一个使用ecx,其次才是edx
|
能力值:
(RANK:1060 )
|
-
-
5 楼
|
能力值:
(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的文档,可以查一下,如果我说错了,请指正,谢谢。
|
|
|