混合编程方法:
- 模块链接法
- 汇编指令嵌入法
1: 模块链接法则
模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序。
- 1:C语言调用汇编语言子程序:即由汇编语言实现子程序,C语言实现主程序。
- 2: 汇编语言调用C语言子程序:即由C语言实现子程序,汇编语言实现主程序。
1.1 C语言调用汇编语言子程序
首先准备汇编语言子程序,如下(采用了简化段定义方式): .386 .model flat, C .STACK .CODE getmax PROC Param1:SDWORD, Param2:SDWORD MOV EAX, Param1 CMP EAX, Param2 JG EXIT MOV EAX, Param2 EXIT: RET getmax ENDP END
用新的汇编程序ML汇编源文件,格式为:ML /c /coff 源文件名
这样就会生成一个Win32下支持的格式的obj文件
成功生成 ok.obj
在VC6中创建一个项目,添加C语言源文件到项目,再把汇编生成obj文件也添加到项目(跟源文件一样),然后编译即可。
extern int getmax(int a, int b); #includeint 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 C param1:ptr sbyte, param2:vararg ; 声明调用函数 .data szMsg byte 'Hello World!', 0ah, 0 .code start: mov eax, OFFSET szMsg invoke printf, eax ret end 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, int b); int main(int argc, char* argv[]) { int m = getmax(12, 8); printf("%d",m); return 0; }
2: X86汇编指令嵌入法
指令意思差异还是很大的