0xAA55 发表于 2014-3-2 17:31:10

【C】_cdecl调用约定

_cdecl调用约定是C\C++默认的调用约定。被_cdecl修饰过的函数有以下特点:
1、参数从右往左入栈。
2、参数个数不固定。
3、调用者维护栈。
4、返回值的处理和_stdcall相同。

_cdecl的好处是支持不定个数参数的函数。
我这里用NASM汇编演示一下调用_cdecl风格的函数:
%define NULL 0

extern _printf;调用C语言的printf

segment .text
_main:push 1
push showstring
call _printf
add esp,8
ret

segment .data
showstring db "Hello World! The number is %u\n.",0

;C语言表示:printf("Hello World! The number is %u\n.",1);
因为是调用者维护栈,所以我们需要必须在调用后“add esp,参数个数”来维护栈。
然后我再用NASM演示一下,_cdecl函数在更底层的方面是个什么样的原型。
global _HelloWorld;输出函数:int _cdecl HelloWorld(int,char);

segment .text;代码段
_HelloWorld:
mov eax,[esp+4]
add eax,[esp+8]
ret

;对应C语言的表达方式:
;int _cdecl HelloWorld(int i,char c)
;{
;    return i+c;
;}
页: [1]
查看完整版本: 【C】_cdecl调用约定