c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验

混合编程方法:

模块链接法

汇编指令嵌入法

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文件

dc15d8c8bd085db184e04a59961139fa.png

成功生成 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文件:

方式一: 右键你创建的项目添加文件到工程即可正常链接

方式二: 工程选项》设置

b21dc686fac110e5d829b33d639b2c59.png

将刚才的ok.obj 这个可以是你的汇编程序生成的任何obj文件,添加到

d96892dfce9236ced0f7d337c5fd4d4a.png

注意:ok.obj 必须在当前工程的目录下

运行

1e4283e3620c03e83a76297ee3282594.png

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

指令意思差异还是很大的

48038d0fc04d5e9011bd77d8d4045881.png

原文出处:https://www.cnblogs.com/dgwblog/p/11958065.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言汇编语言混合编程时,我们可以使用C语言调用汇编语言编写的函数或者在汇编语言中调用C语言编写的函数。这种混合编程可以提高程序的效率和性能,因为汇编语言可以更加细致地控制计算机硬件资源。 下面是一个简单的示例,展示如何在C语言中调用汇编语言编写的函数: ```c #include <stdio.h> // 声明汇编语言编写的函数 extern int asmAdd(int a, int b); int main() { int a = 10, b = 20; int sum = asmAdd(a, b); printf("Sum of %d and %d is %d\n", a, b, sum); return 0; } ``` 上面的程序中,我们声明了一个汇编语言编写的函数`asmAdd`,并在C语言的`main`函数中调用该函数。下面是这个汇编语言函数实现: ```assembly // 汇编语言实现函数 asmAdd section .text global asmAdd asmAdd: ; 汇编语言实现函数体 add eax, edx ret ``` 注意,在汇编语言中,我们需要使用`global`关键字来标识需要被C语言调用的函数。在上面的示例中,我们将`asmAdd`函数标识为全局函数,以便在C语言中调用。 在C语言中调用汇编语言编写的函数时,需要注意传递参数和返回值的方式。在上面的示例中,我们将两个整数作为参数传递给了`asmAdd`函数,并将返回值作为整数类型返回。在汇编语言中,参数和返回值通常使用寄存器来传递和保存。在上面的示例中,我们使用`eax`和`edx`寄存器来保存参数,并将结果存储在`eax`寄存器中返回给C语言。 总之,C语言汇编语言混合编程可以提高程序的效率和性能,但是需要注意参数和返回值的传递方式,并且需要掌握一定的汇编语言编程技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值