汇编语言的优势就是速度快,占用存储空间不大,而且可以随时控制硬件,这些优点是其它的程序语言无法取代的。汇编语言也有不足之处,就是在高级程序的编写与调试时存在着较大的困难,特别是在处理一些数据或者一些混合运算时显得更加困难。
C语言,它的优势就是在于功能全面,表达形式多样且灵活,开发使用效率很高,具有其它高级语言无法具有的优势。通常在软件开发过程中,大部分程序采用高级语言编写,以提高程序的开发效率;但在要求执行速度快、占用空间少或要求直接控制硬件的场合,则利用汇编语言编写,以提高程序的运行效率。
1.汇编语言和C语言混合编程的方法
C语言和汇编语言混合编程的具体方法有以下几种[2]:
(1)进行混合编程时,一个任务往往被分为若干功能模块,每个模块以函数或子程序的形式存在,根据每一模块的特点选用适合的语言独立编程,然后使用相应的语言编译系统对其进行编译形成目标文件,最后将多个目标文件连接在一起形成一个完整的可执行文件。
(2)在C语言程序中使用汇编程序中定义的变量和常量。
(3)在C语言程序中直接内嵌汇编语句,可以实现C语言无法实现的硬件控制功能。
(4)在C语言程序中使用内部函数直接调用汇编语言语句。
1.1 C语言主程序调用汇编语言子程序
为了能正确地实现C语言程序对汇编语言程序的调用,汇编源程序必须严格按照编译系统要求约定的段顺序和规定的段组合。
1.1.1 汇编语言子程序的一般格式汇编语言子程序的一般格式如下[3]:MYCODE SEGMENT PARA PUBLIC'CODE'PUBLIC-函数名;公共符号名说明DGROUP GROUP MYDATA,MYBBSMYDATA SEGMENT WORD PUBLIC'CODE'
...定义变量,初始化数据
MYDATA ENDS
MYBBS SEGMENT WORD PUBLIC'CODE'
...非初始化数据,开辟内存区
MYBBS ENDS
ASSUME
CS:MYCODE,DS:DGROUP,SS:DGROUP
...
-函数名PROC NEAR/FAR
PUSH BP
MOV BP,SP
PUSH SI
PUSHDI
...程序主体语句
POP DI
POP SI
POP BP
RET
-函数名ENDP
...
MYCODE ENDS
END
1.1.2 被调用汇编语言子程序的格式约定对被调用程序的格式与汇编语言程序的一般格式进行比较,可得出如下规律[4]:
(1)由于程序中堆栈段是面向机器的,即C语言程序与汇编语言子程序共用了一个堆栈段,所以需要特别强调的是汇编子程序的开头必须执行以下两条指令:
PUSH BP
MOVE BP,SP
(2)因为C语言程序允许子过程使用SI和DI存放局部变量,只有当变量多于两个时,才需要存储在堆栈中,所以在模式中出现了:PUSH SI和PUSH DI等语句。
(3)对于将被C语言程序调用的过程或子程序,必须用PUBLIC伪操作说明该过程或子程序是供外部调用的,如PUBLIC函数名。
(4)在整个程序中分别定义了代码段MYCODE、初始化数据段MYDATA和非初始化数据段MYBBS,并将MYDATA和MYBBS两段合成为段组DGROUP,同在一个段组中的各段的基址是共享的。
(5)在"程序主体语句"部分一定要有关于函数值的返回语句,也就是说该返回值必须放置在RET语句之前。
(6)被调用过程需要通过RET命令返回。
(7)结束处的END语句只表示程序结束,没有标识启动位置。
1.1.3 C语言主程序中调用的格式约定
为了让C语言主程序能成功调用汇编语言子过程,C程序中要使用关键字"EXTERN"对调用函数做显式说明,将被调用的汇编语言过程说明为外部函数。当外部引用函数无返回值或是INT型时,对它的说明可以缺省。具体格式如下:
EXTERN返回值类型过程名(参数说明)
1.2 汇编语言主程序调用C语言子程序汇编语言的一些优势是C语言所无法比拟的,比如
汇编程序在输入时可以采取各种进制数据以及直接读取数据等,为此,可以用汇编程序作为主程序调用C语言子程序[4]。
汇编语言主程序的格式基本上与汇编程序子程序的一般格式一致,只需在程序开始处加入语句:EXTERN函数名说明这个函数是外部的,是将被调用的C语言子程序。省去主过程语句中关于BP,SI,DI的堆栈操作语言。在主过程语句中通过CALL语句实现对外部函数的调用。格式如下:
CALL NEAR PTR函数名对于C语言子程序作为子程序时,程序中应只包含C函数,无需再作EXTERN说明。
1.3 C语言程序中嵌入汇编语言语句在C语言中允许直接编写汇编语言代码,C程序中嵌入汇编语句可以没有分号,具体语法如下[5]:asm
asm {mov ax,data1
xchg ax,data2
mov data1,ax}
C语言允许嵌入四类汇编命令:一般指令、串操作指令、跳转指令和数据定义与分配指令[4]。
2.汇编语言与C语言连接的关键问题
汇编语言和C语言混合编程,需要解决3个主要问题:函数调用过程中参数的传递、汇编程序与C程序模块的连接以及调用关系的确定[4]。
2.1 参数传递
汇编语言程序和C语言程序在调用时会涉及到参数传递,一般采用堆栈进行传递。在汇编语言中将BP作为基址寄存器,调用程序先将来自于C语言程序中的参数依次压入堆栈中,然后当需要使用这些参数时,再用BP加上不同的偏移量依次对堆栈中的数据进行存取操作。
2.2 调用关系的确定
对于将要涉及到调用的过程或函数需要事先说明和建立调用与被调用关系。被调用的过程或函数应预先说明为外部类型,以便被外部模块引用,而调用程序也需要在程序中说明将要引用的外部模块的名称。在说明调用关系时还应根据不同的存储模式确定相应的汇编语言格式。C程序小模式对应汇编程序的近类型过程,而C程序大模式则对应汇编程序的远类型过程。
总而言之,汇编语言和C语言的混合编程方法可以使汇编语言与C语言之间取长补短,充分发挥各自优势,相互交叉调用,进行参数传递,共享数据信息和数据结构,使由此开发的软件更实用、更安全可靠,使开发和编程工作达到事半功倍的效果。
参考文献:
[1] 罗南超,向昌成,李唐辉. 汇编语言实现多种进制的通用输入输出[J]电脑知识与技术, 2008,(36) .
[2] 崔卫东. VC++与汇编语言混合编程的研究与实现[J]福建电脑, 2007,(05) .
[3] 宋金华. 汇编语言和C语言在图形处理中的综合应用[J]湖北广播电视大学学报, 2010,(12) .
[4] 张银,索旭华,廖建林,郭娟. AOCC应用软件的快速仿真平台的研究与技术实现[J]航天控制, 2010,(02) .
[5] 宋金华. 汇编语言和C语言在图形处理中的综合应用[J]计算机与信息技术, 2009,(Z2) .