您的位置:首页 > 编程语言 > C语言/C++

汇编与C/C++的混合使用

2011-04-30 18:00 363 查看
基本知识:

C的函数返回值: char,bool从al返回;short int从ax返回;int,指针从eax返回;float double long double从浮点堆栈返回。

C的参数传递:  参数按从右到左的顺序压栈,由调用者平衡堆栈

函数在堆栈中的布局:

  【参数列表】

  【返回地址】

  【ebp】

  【局部变量】

如int func(int a,int b,int c)

c

b

a

eip (返回地址)

ebp(mov ebp esp)

locals (局部变量列表)

1.  ASM文件调用C模块中的函数,须遵循先声明后使用的原则。

        在ASM文件的.code之前声明你从C模块调用的函数。

例如,你要调用C文件中一个名为 int funC(char a,int b,char* c)的函数,

则可这样声明:funC proto,a:byte,b:DWORD,c:ptr DWORD。

2.  在C文件中调用ASM文件中的函数,也须遵循先声明后使用的原则。

将要导出的函数在.code之前修饰为public。(如要导出一个名为func1的函数,则表示为: public func1

例如,Asm中有个函数原型为:func proc [uses esi,edi...],a:dword,b:ptr BYTE,c:ptr DWORD

则可在C文件中这样声明:extern void func(int a,char *b,int *c);

如果在func中有返回值,则根据具体情况声明为 int/char/char*/int*/double/... func(int a,char *b,int* c);

3.  在C++文件中调用ASM模块中的函数 或者在ASM模块调用C++文件中的函数,在声明的时候要将extern扩展为extern "C"

不论是C++文件导出给ASM的函数,还是从ASM导入来的函数,都要声明为

“extern "C" 返回类型 函数名(参数列表)”

的形式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 c byte float 扩展