【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]