汇编语言与C语言的混合程序设计技术一、混合编程中如何进行参数传递汇编语言程序和C语言程序在调用时会涉及到参数传递,一般采用堆栈进行传递。在汇编语言中将BP作为基址寄存器,调用程序先将来自于C语言程序中的参数依次压入堆栈中,然后当需要使用这些参数时,再用BP加上不同的偏移量依次对堆栈中的数据进行存取操作不同类型数据的传送有着一些不同1、整数型常量的传递整数型常量的传递是将所传递整数从上到下按顺序存储在参数区中,以字为单位按十六进制方式存放2、字符型常量的传递c语言规定字符型常量要用单引号括起,因此传递时应特别注意传递的方式是将字符以ASCII码的形式以字节为单位放在参数区中如遇多个字符的传递可直接将多个字符顺序连写在一起用单引号括起来3、字符串常量的传递,在C语言里,字符串要求用双引号括起来传递的方式不同于以上两常量它是将字符串存放在某个数据区域内将字符串的首址指针放存参数区中因此在参数区中我们不可能找到所传送的字符串,能见到的只有一个地址指针4、整数型变量传递整数型变量的传递类似于整数型常量的传递只是将整数型变量中的内容加以传递5、字符型数组的传递字符型数组的传递类似于字符串常量的传被传递数组中的字符被存放到某个数据区而将字符数组所在的首址指针放到参数区6、整型数组的传递由于整型数组的数据量一般较大,因此我们认为整型数组的传递以传递指针为好。正是由于C语言有指针运算功能,数组的传递先进行指针运算,得到数组的首指针,再将指针传送到参数区中。二、简述混合编程的常见形式C调用汇编有两种方法,一是直接在C中插入汇编语句,二是分别编写汇编子程序和C语言程序,由C调用汇编程序。方法一适用只需一两句汇编就能完成的程序;方法二较通用,如用汇编编写延时子程序可以实现精确延时。使用方法二的注意事项有以下几点:1、函数声明C中在函数前加extern声明此函数为外部函数,在汇编中要声明函数名为全局变量如externvoiddelay(void);/定义函数/globldelay;/声明全局变量/_delay:;/函数开始/2、参数传递一般用寄存器传递参数,如果返回结果需要多个字节表示,最好用SRAM保存即在汇编中将结果存入SRAM在C中读取相应的地址。3、保存寄存器保存寄存器:Reservedregister寄存器在调用子程序时,内容是不能被改变的,如果汇编子程序需用该寄存器,就要在程序入口时先将它们入栈,返回时再出栈4、变量和函数接口问题C定义的变量编译为.asm后就被放进.bss区,此时变量名的前面都带了下划线,C中定义的函数编译后在函数名前也带了下划线。例如:externintnum就会变成.bss_num,1。5、汇编和C接口中寻址方式的改变问题在C语言中对局部变量的建立和访问是通过堆栈实现,寻址是通过堆栈寄存器SP实现的。而汇编语言为了精简程序代码,TI在直接寻址方式中,地址的低7位直接包含在指令中,这低7位所能寻址的具体位置可由DP寄存器或SP寄存器决定。具体实现可通过设置ST1寄存器的CPL位实现,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,与低7位组成16位地址;在SP寻址的时候,16位地址是由SP(16位)与低7位直接相加得来。由于C语言的环境决定局部变量的寻址必须通过SP寄存器实现,而汇编语言影响SP寄存器,则在混合编程时可通过在汇编环境中使用DP方式寻址避免二者的干扰,编程中只要注意对CPL位正确设置即可。三、简述MASM的发展历程MASM4.00这是最先广泛使用的一个MASM版本,适用于DOS下的汇编编程。它很精巧,但使用起来不是很智能化,需要用户自己一板一眼地写出所有的东西。很多教科书上讲的8086汇编语法都是针对这个版本的,对程序员来说。它只比用Debug方便一点点MASM5.00MASM5.00比4.00在速度上快了很多,并将段定义的伪指令简化为类似.code与.data之类的定义方式,同时增加了对80386处理器指令的支持,对4.00版本的兼容性很好MASM5.10对程序员来说,这个版本最大的进步是增加了对@@标号的支持。这样,程序员可以不再为标号的起名花掉很多时间。另外,MASM5.10增加了对OS/21.x的支持MASM5.10B1989年推出,比上一个版本更稳定、更快,它是传统的DOS汇编编译器中最完善的版本MASM6.001992年发布,有了很多的改进。编译器可以使用扩展内存,这样可以编译更大的文件,可执行文件名相应从Masm.exe改为Ml.exe。从这个版本开始可以在命令行上用*.asm同时编译多个源文件,源程序中数据结构的使用和命令行参数的语法也更像C的风格。最大的改进之一是开始支持.if/.endif这样的高级语法,这样,使用复杂的条件分支时和用高级语言书写一样简单,可以做到几千行的代码中不定义一个标号;另外增加了invoke伪指令来简化带参数的子程序调用。这两个改进使汇编代码的风格越来越像C,可读性和可维护性提高了很多MASM6.00A未发售的版本MASM6.00B最后一个支持OS/2的MASM版本,修正了上一版本中的一些错误MASM6.10修正了一些错误,同时增加了/Sc选项,可以在产生的list文件中列出每条指令使用的时钟周期数MASM6.10A1992年发布,修正了一些内存管理方面的问题MASM6.111993年11月发布,支持WindowsNT,可以编写Win32程序,同时支持Pentium指令,但不支持MMX指令集MASM6.11C1994年发布,增加了对Windows95VxD的支持MASM6.121997年8月发布,增加.686,.686P,.MMX声明和对相应指令的支持MASM6.131997年12月发布,增加了.K3D声明,开始支持AMD处理器的3D指令MASM6.14这是一个很完善的版本,它在.XMM中增加了对PentiumIII的SIMD指令集的支持,相应增加了OWORD(16字节)的变量类型MASM6.15Masm6.15界面2000年4月发布,放在VisualC++6.0ProcessorPack中。MASM7.0放在VisualC++.NET2002。MASM7.1放在VisualC++.NET2003。MASM8.0放在VisualC++.NET2005,它也可以汇编x64的代码。最新版本:12位于VisualC++2013中在这些新版VisualC++的bin目录中,皆有ml.exe。VisualC++.NET2005的相同目录,还有一个ml64.exe,它可以汇编x64的代码。相关的说明,都包含在这些新版VisualC++的说明文件里。四、简述VC++编译C++源代码的具体步骤1、选择Vc++编译环境2、文件新建-win32consoleApplication-右上角输入工作名称、位置-完成3、新建-C++sourcefile-右上角输入名称-完成。4、输入代码5、编译、链接,然后执行,五、简述其他混合编程语言及其应用领域1、java与C++联合C++调用JAVA主要用到了SUN公司的JNI技术,JNI是JavaNativeInterface的缩写。从Java1.1开始,JavaNativeInterface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互2、C#和C++混合编程由于历史原因,很多时候我们的代码并不完全是使用.NET写成的。这时候和以往C++代码的混合编程就显得相当重要了3、VC++与MATLAB混合编程通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能。让Matlab调用C函数是通过DLL文件实现的,而这个DLL的开发过程不仅仅可以使用Matlab自带的mex命令,还可以使用VC++开发环境,使用VC有很多好处,一是让我回到了原来熟悉的开发环境中,二能够使用更加标准的C++编译器,第三点也是最爽的,可以使用VC强大的调试功能。4、VB和Fortran语言混合编程利用Fortran语言强大的计算功能并结合VisualBasic语言良好的可视化界面设计功能,开发出能计算复杂工况且具有较好的人机交互界面的结构动力分析有限元计算程序系统5、LabVIEW与MATLAB混合编程MATLAB支持ActiveX自动化技术。通过使用MATLAB自动化服务器功能,可以在其它应用程序中执行MATLAB命令,并与MATLAB的工作空间进行数据交换。因此可以借助这一特性,把LabVIEW与MATLAB结合,充分利用MATLAB提供的大量高效可靠的算法和LabVIEW的图形化编程能力,混合开发出功能强大的应用软件。