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

混合编程方法:

模块链接法

汇编指令嵌入法

1: 模块链接法则

模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序。

1:C语言调用汇编语言子程序:即由汇编语言实现子程序,C语言实现主程序。

2: 汇编语言调用C语言子程序:即由C语言实现子程序,汇编语言实现主程序。

1.1 C语言调用汇编语言子程序

首先准备汇编语言子程序,如下(采用了简化段定义方式):

.

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

78c5cedcb60aeded94b3345f8e7959f5.png

成功生成 ok.obj

在VC6中创建一个项目,添加C语言源文件到项目,再把汇编生成obj文件也添加到项目(跟源文件一样),然后编译即可。

extern int getmax(int a, int b);

#include

int main(int argc, char* argv[])

{

int m = getmax(, );

printf("%d",m);

return ;

}

如何添加OBJ文件:

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

方式二: 工程选项》设置

bd2b65ad24d9ad8baf564a3c83bc7e93.png

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

fdbd3eb088433fff73d60c4afc85edeb.png

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

运行

23448d373b09ed935e32a3ce9a96b456.png

1.2汇编语言调用C语言子程序

在VC6下编译c程序为obj或lib(注意在C++下定义C函数要加extern “C”前缀表明是一个C语言函数,而不是C++);

在汇编里使用proto申明c函数的原型,使用invoke伪指令调用c函数;

声明调用者代码:

.

.model flat, stdcall

printf PROTO C param1:ptr sbyte, param2:vararg ; 声明调用函数

.data

szMsg byte 'Hello World!', 0ah,

.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(, );

printf("%d",m);

return ;

}

2: X86汇编指令嵌入法

指令意思差异还是很大的

98972c823cd2b1db2ba56df76e66e5f8.png

单片机C 语言与汇编语言混合编程

在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

keil C语言与汇编语言混合编程

C与汇编混合编程主要有以下几种:(1)C语言中嵌入汇编(2)无参数传递的函数调用(3)有参数传递的函数调用 一.C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #prag ...

C51与汇编语言混合编程

函数内部混合编程 若想在C语言函数内部使用汇编语言,应使用以下Cx51编译器控制命令: #pragma asm ; Assembly code #pragma endasm  功能作用:asm和end ...

c语言环境初始化&c语言和汇编混合编程

bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...

arm:c语言和汇编混合编程

仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...

C语言调用Python 混合编程

导语 Python有很多库,Qt用来编写界面,自然产生C++调用Python的需求.一路摸索,充满艰辛 添加头文件搜索路径,导入静态库 我的python头文件搜索路径:C:\Python27amd64 ...

【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程

最近一个项目中需要在VxWorks下使用一个高精度实时时钟,要求精度为1ms,溢 出时间大于5小时.VxWorks提供系统时钟,该时钟在操作系统启动后开始计数,精度为1个tick,可以通过tickGe ...

Java语言与C语言混合编程(2)--在Java中调用C语言本地库

在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...

批处理与python代码混合编程的实现方法

批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值, 比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写, bathome出品的命令工具包管理器bc ...

随机推荐

给li标签添加自定义属性

给li标签添加属性

  • < ...

    U盘启动盘的制作--用U盘硬装Windows系统、或是重装Windows系统

    借助IT天空的优启通U盘启动盘的制作--用U盘装Windows系统.或是重装Windows系统之U盘启动盘的制作 1.==================================== 2.== ...

    loadrunner中切割字符串

    下面函数的作用: http://blog.csdn.net/hgj125073/article/details/8447605 通过-与: 字符切割字符串,即-与:字符已经被\0 字符取代 char  ...

    Python中import的使用

    python中的import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中. import语句的作用 import ...

    Mysql自定义函数总结

    存储函数 创建存储函数,需要使用CREATE FUNCTION语句,基本语法如下: CREATE FUNCTION func_name([func_parameter]) RETURNS TYPE [ ...

    HTML 属性

    HTML 属性 HTML 元素 HTML 标题 属性为 HTML 元素提供附加信息. HTML 属性 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形 ...

    linux下的mount命令的用法详解

    挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...

    BrandZ:2016年全球最具价值品牌百强榜&lpar;完整报告&rpar;

    https://wppbaz.com/admin/uploads/files/BZ_Global_2016_Report.pdf Millward Brown编制的BrandZ最新排行榜(2016 B ...

    linux系统学习笔记:文件、目录、用户

    本篇主要从stat函数开始,逐个说明stat结构的每一个成员,以此来了解文件的所有属性.同时将说明修改这个属性的各个函数. 一.文件 使用stat函数族得到和文件有关的信息结构. #include & ...

    jmeter按比例执行业务场景

    可用函数 __counter实现: 函数助手中 找到 __counter,如 ${__counter(false,num)},功能简介 ---- 参数为true,每个用户有自己的计数器 ---- 参数 ...

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值