C語言與匯編語言混合編程實驗


混合編程方法:

  1. 模塊鏈接法
  2. 匯編指令嵌入法

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匯編指令嵌入法

指令意思差異還是很大的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM