混合编程方法:
模块链接法
汇编指令嵌入法
1: 模块链接法则
模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序。
1:C语言调用汇编语言子程序:即由汇编语言实现子程序,C语言实现主程序。
2: 汇编语言调用C语言子程序:即由C语言实现子程序,汇编语言实现主程序。
1.1 C语言调用汇编语言子程序
首先准备汇编语言子程序,如下(采用了简化段定义方式):
.386.model flat, C
.STACK
.CODE
getmax PROCParam1:SDWORD, Param2:SDWORDMOVEAX, Param1CMPEAX, Param2JGEXITMOVEAX, Param2EXIT:
RETgetmax ENDP
END
用新的汇编程序ML汇编源文件,格式为:ML /c /coff 源文件名
这样就会生成一个Win32下支持的格式的obj文件
成功生成 ok.obj
在VC6中创建一个项目,添加C语言源文件到项目,再把汇编生成obj文件也添加到项目(跟源文件一样),然后编译即可。
extern int getmax(int a, intb);
#include
int main(int argc, char*argv[])
{int m = getmax(12, 8);
printf("%d",m);return 0;
}
如何添加OBJ文件:
方式一: 右键你创建的项目添加文件到工程即可正常链接
方式二: 工程选项》设置
将刚才的ok.obj 这个可以是你的汇编程序生成的任何obj文件,添加到
注意:ok.obj 必须在当前工程的目录下
运行
1.2汇编语言调用C语言子程序
在VC6下编译c程序为obj或lib(注意在C++下定义C函数要加extern “C”前缀表明是一个C语言函数,而不是C++);
在汇编里使用proto申明c函数的原型,使用invoke伪指令调用c函数;
声明调用者代码:
.386.model flat, stdcall
printf PROTO Cparam1:ptr sbyte, param2:vararg ; 声明调用函数
.data
szMsg byte'Hello World!', 0ah, 0.codestart:
moveax, OFFSET szMsg
invoke printf, eaxretend start
用新的汇编程序ML汇编源文件,格式为:ML /c /coff 汇编程序文件名
用link32.exe将编译c程序生成的obj/lib与汇编生成的obj文件链接在一起即可,格式如下:
link32 汇编生成的obj文件名 c程序生成的obj/lib文件 /subsystem:console
如果直接调用C语言库函数,直接连接msvcrt.lib文件
例如:
link32 testmix.obj msvcrt.lib /subsystem:console
/subsystem:console表示生成的控制台程序,不是图形窗口程序
C语言调用者程序:
extern int getmax(int a, intb);int main(int argc, char*argv[])
{int m = getmax(12, 8);
printf("%d",m);return 0;
}
2: X86汇编指令嵌入法
指令意思差异还是很大的
原文出处:https://www.cnblogs.com/dgwblog/p/11958065.html