驱动之路 __stdcall__cdcel调用约定

先来了解一下__stdcall__cdcel调用约定

在来了解一下C和C++编译方式的不同

c编译器方式编译默认的是__cdcel调用约定,比如:

void a(int a,int b)

{...}

push b

push a

call _a

add esp,8//esp是栈顶指针

 

__stdcall调用约定,比如:

push b

push a

call _a@8  这个函数内部会自动还原堆栈ret 8

 

 

上面是C编译器编译2种不同约定生成的命名

 

 

 

 

c++编译器方式编译默认的是__stdcall调用约定,比如:

void a(int a,int b)

{...}

push b

push a

call _a@ZH8AS  //反正后面一大堆符号,这个函数内部会自动还原堆栈ret 8

 

如果要用C++编译器编译一个函数或者一个变量用C的编译方式来命名的话,得加一个extern "C" 关键字,意思就是,以C的编译方式来命名

extern "C" void a(int a,int b)

{...}

push b

push a

call _a@8  这个函数内部会自动还原堆栈ret 8

 

posted @ 2013-09-17 10:31  宝贝,我永远都在  阅读(175)  评论(0)    收藏  举报