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

QQ登录

只需一步,快速开始

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

【C】_cdecl调用约定

[复制链接]

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24263 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 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-5-3 03:47 , Processed in 0.043028 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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