C语言与汇编语言混合编程技术研究
【摘 要】虽然C语言可以完成许多由汇编语言完成的工作,人们说它是一种介于高级语言与低级语言之间的一种中级语言,但在实际应用中,为了完成某种特定的功能,或需要缩短程序的运行时间,或需要对硬件进行直接操作,或需要利用操作系统的某些功能模块,这时就会使用到汇编语言程序,即要采用C语言与汇编语言的混合编程技术实现。汇编语言开发的程序代码短、执行速度快,而C语言是应用广泛的面向过程的开发语言。通过给出混合编程的方法、约定规则以及实现的具体步骤,说明了混合编程需要注意的问题,最后给出了相应的实例。
【关键词】C语言;汇编语言;混合编程;方法 1.C语言的概念
C语言是在当今软件开发领域中应用十分广泛的一种高级程序设计语言,具有数据类型丰富、表达能力强、效率高、可移植性好且使用灵活方便等优点。既具有高级语言程序设计的特点,又具有汇编语言的功能[1]Ⅶ。在实际应用中,为了完成某种特定的功能、或者需要缩短程序的运行。
在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。 2.汇编语言的概念
汇编语言是一种符号语言,它与机器密切相关,是面向机器的语言,从而有代码短,占用的存储空间小,运行速度快,直接控制硬件等优点,所以它的运行速度是高级语言所不能比拟的。但用汇编语言开发程序,编程工作量大,开发周期长,容易出错且不易调试。
汇编语言属低级语言,而C语言是高级语言,所谓高级语言就是更容易被人们理解的语言,其实汇编语言能实现的功能往往也能通过C语言来实现,甚至用C语言会更简单,但是汇编语言有一个优势是其他任何语言所不具备的,这也是为什么汇编语言一直能在编程中占有一席之地,那就是汇编语言对硬件的直接控制,也就是说他能直接对硬件操作,可以绕过操作系统等等之类。虽然有的领域其他编程也能实现,但是在很多地方往往是汇编语言能更加简单,更加完美的完成。而且学好了汇编语言你就能对cpu是怎么工作的有了清晰的认识,所以学计算机专业的一般都会学汇编语言。 3.混合编程的一般方法
对于LF240xA的混合编程一般有3种方法:一、对C语言程序编译后形成的汇编程序进行手工修改与优化;二、在C语言程序中直接嵌人汇编语句;三、分别编写C语言程序和汇编语言程序,然后独立编译成目标代码模块,再进行链接。第一种编程方式要求对汇编与C语言都极其熟悉,并且这样的编程方式对程序的可读性和扩展性的负面影响比较大,一般不建议使用。第二种方法适用于语句执行频率非常高,并且C编程与汇编编程效率差异较大的情况,例如进入中断的通用中断子程序等。第三种方式是混合编程最常用的方式之一,在这种方式下,C语言程序与汇编语言程序均可使用另一方定义的函数与变量。下面着重介绍后两种方法。
3.1C语言程序中嵌入汇编语言
C语言程序支持asm指令,所以可以利用这条指令直接将汇编语句嵌入到C语言程序中。LF240xA中一些C语言无法操作的控制位,可以采用这种方式来实现。这种方法只需在汇编语句两边加上双引号并用小括号括起来,前面再加上asm关键字,即“asm(“汇编语句”);”。需要注意的是,汇编语句不能紧挨着前一个双引号,它们之间必须用空格、Tab或标号开头。例如,在汇编语言中开中断指令SETC INTM,嵌入到C语言中为“asm(“SETCINTM”);”。这种方式虽然操作简单,但是汇编代码很有可能破坏原来的C语言环境,从而导致不可预料的结果。因此只提倡在程序开始的系统初始化部分少量使用,而在C语言中嵌入实现某一完整功能的多句汇编语言时,不提倡采用这种方式。 3.2 C语言与汇编语言程序相互调用 3.2.1 C语言程序调用汇编函数
C语言程序中调用的汇编函数,在汇编语言中其名称以程序标号的形式出现。程序标号作为操作数用.global进行定义,在前面加下划线“_”。汇编函数也可以利用累加器给C语言程序传递返回值。 LF240xA有8个辅助寄存器(AR0~AR7)可供使用,在C语言环境中这些寄存器都有明确的分
3.2.2汇编语言程序调用C函数
汇编语言程序中调用C函数。被调用的C函数在C语言环境中需要用extern进行定义,在汇编程序中用.ref说明为外部标号,且函数名加“_”。在调用C函数之前应手工编程将参数以逆序写入当前运行任务所使用的任务堆栈中,压栈之前堆栈指针可不作调整。被调用的C函数即可正常访问调用者传递的参数,函数调用完毕后需要调整堆栈指针,清除函数调用中参数所占用的堆栈空间。C函数的返回值可以通过访问累加器获得。具体例子如下。 3.3注意事项 3.3.1中断的处理
LF240xA发生中断时,程序指针(PC)就指向相应的中断向量,并通过中断向量映射到相应的中断服务子程序。例如,在0004h~0005h处是INT2的中断向量,在此存储了1条跳转指令,跳转至INT2的服务子程序。LF240xA的C语言有interrupt修饰符可以用来定义中断服务子程序, 3.3.2字母大小写
在C语言环境中,对于字母大小写的区分是很严格的,因此在混合编程的过程中也应该严格遵守这一点。例如,在写命令文件时,误将“.data”写成“.daTA”,此时系统将无法给初始化代码分配存储空间,导致程序无法执行。 3.3.3 C语言库函数应用
TI的C编译器中内置了很多函数,包含在rts2xx.1ib的函数库中。库函数并不是C语言的一部分,它是由人们根据需要编制并提供给用户直接使用的。每一种C编译系统都提供了一批库函数,不同的编译系统所提供的库函数的数目、函数名及函数功能是不完全相同的。要使用库函数,只需在源文件中添加语句“#include”函数名.h””,就可使用相应的库函数了。 4.Turbo C程序中内嵌汇编指令行
嵌入方法。可在C程序中直接嵌入汇编指令,它就好像C程序的语句一样,当C语言程序中想直接控制硬件或加快运行速度,但可用较短的汇编程序实现时,可采用这种方法,它实现的方法是: (1)在嵌入汇编指令前, 必须用关键字asm说明。 (2)内嵌式汇编指令中的操作数。 (3)汇编指令操作数也可以是结构数据。 5.C语言与汇编语言混合编程的方法
通常地把组合两种或两种以上程序设计语言,通过向互调用、参数传递、共享数据结构和数据信息而形成程序的过程叫做混合编程。混合编程中的光关键问题是建立不同语言之间的接口,C语言和汇编语言混合编程可分为C程序内嵌汇编指令、C程序调用汇编语言子程序和汇编语言调用C函数三种方法。 6.C语言与汇编语言混合编程的约定规则 (1)命名约定。 (2)声明约定。 (3)寄存器使用约定。 (4)储存模式约定。 (5)参数传递约定。 7.结束语
C语言与汇编语言的混合编程同时具有了两种语言的优点,彼此相当互调用,进行参数传递,是一种有效的程序设计方法,这种(下转第25页)(上接第32页)方法可以发挥各自的优势和特点,充分利用现有的多种实用程序、库程序等使软件的开发效率大大提高,开发周期大大缩短,在工业控制和科学技算中具有很强的实用性。只要多实践,多积累,可避免各种错误,真正掌握C语言与汇编语言的混合编程技术。■
【参考文献】
[1]翟乃强,隋树林,汇编语言与C语言及Visual C++混合编程[J].青岛科技大学学报,2003,24(B09):136~138.
[2]钱晓捷,汇编语言程序设计(第二版)[M],电子工业出版社,2003.6.
[3]钱春英,浅谈C语言与汇编语言混合编程的一些技术[J].南通航运职业技术学院学报,2005,4(1):50~52,55.
[4]郭晓梅,汇编语言与C语言的混合编程及应用[J].南京农专学报,2002,18(4):49~52,62.