找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3748|回复: 0

【C】_cdecl调用约定

[复制链接]
发表于 2014-3-2 17:31:10 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
_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;
;}

本帖被以下淘专辑推荐:

回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 00:02 , Processed in 0.033368 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表