Fork me on Gitee

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汇编指令嵌入法

指令意思差异还是很大的

posted @ 2019-11-29 15:35  ---dgw博客  阅读(3971)  评论(0编辑  收藏  举报