基于C语言与汇编语言的混合编程方法研究.pdf
计算机与信息技术第27卷第5期广西民族师范学院学报Vol.27No.52010年10月JOURNAL OF GUANGXI NORMAL UNIVERSITY FOR NATIONALITIESOct.20100引 言C语言是在当今软件开发领域中应用十分广泛的一种高级程序设计语言,具有数据类型丰富、表达能力强、效率高、可移植性好且使用灵活方便等优点。既具有高级语言程序设计的特点,又具有汇编语言的功能1。在实际应用中,为了完成某种特定的功能、或者需要缩短程序的运行时间、或者需要对计算机硬件进行直接操作以及可能需要利用操作系统的某些功能模块时,往往要使用汇编语言程序,即要应用C语言与汇编语言的混合编程技术。由C语言程序调用汇编语言程序的方法通常有两种形式:一种是在程序中嵌入汇编代码,主要适用于汇编语言程序较短的情况;另一种是直接调用汇编语言子程序。通过分析与研究,给出了TurboC与汇编语言的混合编程应用方法和具体实例。1汇编语言子程序的一般形式276-98MODEL内存模式DATA;定义数据CODEPUBLIC_子程序名1;说明在C程序中调用的子程序名PUBLIC_子程序名n_子程序名1 PROC过程类型;子程序体RET_子程序名1 ENDP;其它子程序_子程序名n PROC过程类型;子程序体RET_子程序名n ENDPEND子程序中的过程类型通常有FAR和NEAR两种。NEAR表示“近过程”,调用程序和被调用程序在同一个段内,调用和返回时仅改变IP寄存器的值,为默认设置的类型;FAR表示“远过程”,调用程序和被调用程序可以不在同一个段内,调用和返回时改变IP和CS寄存器中的值。C语言对应的汇编语言程序中,函数名和变量名前要加一个下划线(_)。在混合编程时,汇编语言子程序的内存收稿日期:2010-7-19作者简介:邹海荣(1972-),男,陕西咸阳人,硕士,陕西理工学院计算机与科学技术系讲师,主要研究方向:计算机应用技术与信息安全。基于C语言与汇编语言的混合编程方法研究邹海荣(陕西理工学院 计算机与科学技术系,陕西 汉中723000)摘要:C语言具简洁、灵活的特点以及丰富的库函数和功能强大的调试手段,适用面非常广泛。但在实际应用中,为了完成某种特定的功能,或需要缩短程序的运行时间,或需要对硬件进行直接操作,或需要利用操作系统的某些功能模块,这时就会使用到汇编语言程序,即要采用C语言与汇编语言的混合编程技术实现。通过研究与分析Turbo C与汇编语言的混合编程方法,为C语言应用开发人员提供方便。关键字:C语言;汇编语言;Turbo C;子程序中图分类号:TP311.1文献标识码:A文章编号:1674-8891(2010)05-0062-04Research on Method of Mixed Programming Based on C Language and Assembly LanguageZOU Hai-Rong(Department of Computer Science and Technology,Shaanxi Institute of Technology Shaanxi HanZhong 723000)Abstract:In practical applications,in order to complete a specific function,programming has to mix the assembly language and C language.Theresearch and analysis of mixed programming based on Turbo C and Assembly Language can offer conveniences for C language application developers.Key words:C language;Assembly language;Turbo C;Subroutine62-模式一般和C语言的内存模式要保持一致。常用的内存模式有五种,如表1所示3256-257。表1内存模式2 C程序中嵌入汇编代码的方法2.1嵌入汇编代码的C程序结构在C语言程序中可以内嵌汇编代码,对于TurboC而言,嵌入汇编指令的格式为:asm 。该方式主要适用于汇编语言程序较短的情况。下面为含有内嵌汇编指令的C程序结构实例。#include“stdio.h”int max(int a,int b)asm mov ax,aasm cmp ax,basm jg okasm mov ax,bOk:return _ax;void main()printf(“%d”,max(5,9);return 0;通过该实例的分析与研究,对于在C语言程序中内嵌汇编代码时,要遵循如下规则:(1)汇编语言代码中所使用的C语言变量应初始化且用ptr指明对应的汇编类型。(2)汇编指令不需要用(;)做语句的结束。(3)在asm块中不用ret指令返回,而用C语言的return语句返回。(4)asm块中的注释是汇编语言的注释,即分号(;)。(5)汇编语言的伪指令(如db等)不能嵌入到C程序中。2.2嵌入汇编指令的C程序的编译与连接在Turbo C集成环境中,嵌入汇编指令的C程序采用TCC命令进行编译和连接,其命令格式为:TCC 。“命令行选项”中和嵌入汇编指令程序相关的选项主要有以下几种形式:(1)/mx开关告诉TASM(由MASM改名而得)区分大小写;(2)-B编译嵌入汇编指令的C程序;(3)-C编译和汇编扩展名为.c和.asm的文件,但不进行连接;(4)-E改变处理嵌入汇编指令的汇编程序为;(5)-e生成可执行文件;(6)-I指定半酣文件的路径;(7)-L指定库文件路径;(8)-ms、m、c、l、h选择编译模式小、中、紧凑、大、巨;(9)-o编译指定的源文件到指定的目标文件.obj;(10)-S编译给定的源文件并产生相应的汇编语言输出文件(.asm),但不进行汇编4181-197。该命令行TCCId:tcinclude-Ld:tclib-B-mc A1 A2.asm mylib.lib表示 在d:tcinclude目 录 中 查 找 包 含 文 件;在d:tclib目录中查找库文件mylib.lib;采用紧凑模式编译文件A1.c(其内嵌入汇编指令),并调用TASM对A2.asm进行编译,然后连接则可生成可执行文件A1.exe。3 C程序直接调用汇编子程序的方法3.1全局变量的传递C语言程序和汇编语言程序可以通过全局变量传递信息,其数据类型的对应关系如表2所示。表2数据类型的对应关系C程序中定义的变量在汇编子程序中使用时要用关键字(extern)在程序的开始进行声明,反之亦然。例如,在C语言程序中定义变量“char sex;intage”,若要在汇编语言子程序中使用这些变量时,则模 式 名数据段(DATA)大小 代码段(CODE)大小小模式(small)64KB64KB中模式(medium)64KB64KB紧凑模式(compack)64KB64KB大模式(large)64KB64KB巨大模式(huge)64KB64KB数据类型数据占用字节数C语言汇编语言charDB BYTE1intDW WORD2longDD DWORD4float(double)DQ DWORD82010年第5期邹海荣 基于C语言与汇编语言的混合编程方法研究10月25日出版63-第27卷广西民族师范学院学报(总第72期)应声明为“extern _sex:BYTE,_age:WORD”。同理,若在C程序中使用在汇编程序中定义的变量,则在汇编程序中应使用public对定义的变量(如_sex DBF)进行声明(如public _sex)。而在C程序中,则要使用extern进行声明(如extern char sex)。由于C语言区分大小写,因此,在与汇编语言混合编程时,最好取消这种限制。对于Turbo C,可在其集成开发环境中的options菜单下的Linker子项中将Case-Sensitive Link设置为off状态即可。3.2参数和返回值的传递C语言程序和汇编语言程序的参数传递是通过堆栈来完成的。堆栈是一种先进后出的内存区域,且只在一端进行出栈和入栈操作。对于C语言参数进栈的顺序是从左到右 例如,某C程序中含有一个用汇编语言编写的子程序:power(int p1,int p2),调用该子程序时在执行该子程序的汇编语句前,堆栈中的内容如图1所示。可见,通过堆栈指针(sp)便可访问参数的内容,完成参数的数据传递。图1子程序调用堆栈情况通过分析下面C程序调用汇编子程序的应用实例,可得出利用堆栈实现参数传递的应用方法。设某C语言程序如下所示:#include“stdio.h”int power(int,int);main()printf(“2的4次幂乘以8为:%d”,power(8,4);被调用的汇编子程序:model smallcodepublic_power_power procpush bxmov bx,spmov ax,bx+4mov cx,bx+6shl ax,clpop bxret_power endpend当汇编语言子程序有返回值时,其返回值是通过ax和dx寄存器进行传递的。表3给出了不同数据类型作为参数时在堆栈中所占的字节数和作为返回值时所在的寄存器。在汇编语言中调用C语言子程序,则先将实参数按C函数的参数顺序的反序(从右至左,先高字节后低字节)入栈,然后在汇编语言中用call指令调用C函数(函数名前要有下划线),调用结束后应恢复sp的值(add sp,size),size的值是“程序返回地址所占的字节数”加上“参数传递所占的字节数”。表3参数和返回值的传递数据类型堆栈中占用字节数寄存器char2axint2axlong4高位字节在dx,低位字节在axnear指针2axfar指针4段地址在dx,偏移地址在axfloat,double8值得地址在64-3.3 C程序与汇编子程序的连接在集成环境下,对采用C语言和汇编语言混合编写的程序进行编译与连接时,则要先用宏汇编(MASM.EXE)将汇编语言程序进行编译,生成相应的OBJ文件。然后,将此OBJ文件添加到C程序中。最后进行连接,生成EXE文件即可。将OBJ文件添加到C程序的方法较简单,在Turbo C中,先编辑一个工程文件(*.Prj),其内容是文件名 列 表(如:myc.c和mymasm.obj);然 后 选 择project主菜单中的project name项,将编辑的工程文件名(*)写入,便可进行连接570-74。最好将汇编语言子程序的函数原型在C程序中给予说明。4结 束 语通过分析与研究在Turbo C环境下C语言和汇编语言混合编程的应用方法和具体实例。给出了C语言和汇编语言混合编程的两种常用方法。4.1直接调用汇编语言子程序直接调用汇编语言子程序即独立编写汇编程序和C程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将C模块和汇编模块链接起来,该方法具有较大的灵活性。采用此方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。4.2在C程序中内嵌汇编语句在C程序中内嵌汇编语句主要适用于汇编语言程序较短的情况,可以在C程序中实现C语言无法实现的一些硬件控制功能(如修改中断控制寄存器、中断标志寄存器等)。参考文献:1谭浩强.C程序设计(第三版)M.北京:清华大学出版社,2008.2李伯成,侯伯亨,张毅等.微型计算机原理及应用M.陕西:西安电子科技大学出版社,2005.3杨路明.C语言程序设计(第2版)M.北京:北京邮电大学出版社,2006.4谭浩强.C程序设计题解与上机指导(第三版)M.北京:清华大学出版社,2007.5 Turbo C语言和汇编语言混合编程的方法和实现J.上饶师范学院学报,2006,3(26).2010年第5期邹海荣 基于C语言与汇编语言的混合编程方法研究10月25日出版65-