阅读:1574回复:8
关于stdcall&cdecl的问题,请明白人解惑。
被调用者清除(堆)栈和调用者清除(堆)栈
他们到底有什么区别。 NEAR和FAR到底有什么区别。 谢谢。 |
|
沙发#
发布于:2001-12-10 05:04
好好地看一看C语言吧,如果可能在看一看ASM都是很有用的。
|
|
|
板凳#
发布于:2001-12-10 09:32
看看MSDN吧!
|
|
|
地板#
发布于:2001-12-10 10:06
stdcall & cdecl are calling conversion...
you can reference by MSDN |
|
|
地下室#
发布于:2001-12-10 13:36
If you know assembly, I would suggest you to turn on the /Fa switch (assuming you\'re using MS VC++), then read the assembly code generated by the compiler, you\'ll get the answer for __cdecl, __stdcall and fastcall.
|
|
|
5楼#
发布于:2001-12-10 23:46
这和函数参数有关,被调用者清除堆栈,主程序调用完函数后,就不用POP参数所占用的堆栈空间,否则,主程序要自己POP掉参数所占用的堆栈空间,举个例子:
函数A(int i)自己清除堆栈,主程序代码: push 10 call a 函数A(int i)不自动清除堆栈,主程序代码: push 10 call a pop eax //一定要有这行代码,否则会产生堆栈指针错误 |
|
6楼#
发布于:2001-12-11 12:01
CDECL 是使用 C 语言的调用规范。他的调用速度要比 PASCAL 的调用规范慢。
因为在生成汇编代码后 CDECL 比 PASCAL 多一条汇编指令。 CDECL 参数压栈是从左到右,PASCAL 是从右到左。 所以 CDECL 可以实现可变参数。而 PASCAL 不能。 STDCALL 是 CDECL 和 PASCAL 混合,他的参数压栈是从左到右,清除参数压栈用 PASCAL 方式。 |
|
|
7楼#
发布于:2001-12-13 03:37
stdcall:
1. Stack: Called funtion pops up its own arguments 2. Name-decoration: _xxx@?? cdel: 1. Stack: Calling funtion pops up the arguments 2. Name-decoration: _xxx from MSDN. You\'ll care about them when you\'re program mixed C&Assembler, or you\'re trying to use some library with your own built header file |
|
8楼#
发布于:2001-12-13 14:56
_cdecl:Vxd例程默认的类型;
_stdcall:Kmd,Wdm默认的类型; |
|
|