混合編程方法:
- 模塊鏈接法
- 匯編指令嵌入法
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); #include <stdio.h> 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 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匯編指令嵌入法
指令意思差異還是很大的