不同计算机语言混合编程的连接方法探讨

2015-01-02 06:46齐晶薇
赤峰学院学报·自然科学版 2015年20期
关键词:汇编语言C语言调用

齐晶薇

(哈尔滨远东理工学院,黑龙江 哈尔滨 150025)

现阶段广泛采用的计算机软件开发语言,如C语言,由于其具备较高的编程效率,在各个行业软件研究开发中得到了广泛应用.作为一种低级语言,汇编语言与高级语言相比,又具有无可比拟的运行速度优势.在这两种计算机语言进行混编时,如何使两者实现有效连接,就成为计算机编程人员需要着力探究的问题.

1 不同计算机语言混合编程的可行性

在现阶段计算机软件研究开发中,在同一个应用系统中采取两种或多种不同类型的计算机编码语言,已经成为可能,并获得了实践的认可.作为计算机语言而言,即便一种语言具备再强的功能,但总有该项语言的弱点和不足,呈现出局限性和先进性并存的特征.

例如,数据库语言,与C语言、Fortran等计算机高级语言形式相比,其在数据管理方面性能突出,但在计算能力及运行速度等层面又远远不及后两者.计算机汇编语言,作为一种低级语言,又具备了较快的运行速度,在存储空间占用上,小于C语言等高级语言,更为重要的一点是,汇编语言具备对计算机硬件进行访问控制的能力[1].因此,不同的计算机语言各有其优劣,将不同计算机语言进行混合编程,则可以吸取各种语言的优势及特长,为计算机编程用户提供更具针对性的编程需求.例如,在计算机编程中,将大部分程序采用高级语言的形式进行编写,在计算机程序的一些重点部分,需要多次运行的部位,其对运行速度和效率具有较高的要求时,或者需要对计算机硬件进行直接访问时,此时就可采用汇编语言进行编程.如此一来,可以发挥出各自语言的优点,既达到了多种计算机语言综合运用的目的,又能使计算机编程效率提升,缩短研发周期.

2 不同计算机语言混合编程连接方法要注意并解决的基本问题

不同计算机语言混合编程在进行连接时,应考虑并解决的基本问题有以下几方面:

2.1 存储器分配

计算机高级语言在经过编译之后,往往会产生格式为OBJ的文件,与之相应地,计算机汇编语言在经过编译之后,同样会产生OBJ格式的文件,借助连接程序,通过将两者加以连接,从而构成了具备执行条件的EXE文件,在EXE文件形成后,连接程序就已将其装入计算机内存系统中,等待执行.从这一流程可以看到,在存储器分配环节,主要是由连接程序加以掌控的,因此,用户可以忽略这一环节.

但涉及到Basic语言时,因为其承担解释程序的任务,因此,情况就要稍显复杂,此时应从计算机存储器中找到汇编语言的存放位置,再将相关信息加以传送,使Basic语言能够有效接收.

2.2 参数传递

汇编语言和计算机高级语言之间呈现出一种彼此依存的关系,一般而言,可将汇编语言视为计算机高级语言所具备的外部过程,在对汇编语言进行调用时,由计算机高级语言采取函数方式或过程方式进行[2].而汇编语言和计算机高级语言这两种程序在进行参数传递时,常采用堆栈的方式进行,具体而言,就是调用程序首先将参数在堆栈中进行依次压入,当调用程序被启用,此时堆栈中被压入的参数再依次弹出,转变为操作数,以备使用.

因此,要使参数有效传递,需要对计算机不同语言所具有的生成方式、堆栈结构及其参数入栈方式加以明确.Pascal、Fortran、Basic等高级语言在参数入栈的顺序上和参数表中参数的顺序相一致,也就是采用自左至右的方式,C语言在参数入栈顺序上则采取自右至左的相反顺序.

3 以Pascal语言、C语言与汇编语言混合编程为例,探究其连接方法

3.1 Pascal语言与汇编语言连接方法和程序

Pascal语言作为一种计算机高级语言,可将汇编语言看做是其外部过程,汇编语言在写法上与外部调用过程相同,在进行汇编语言程序编写时,首先要有公共程序名称,即public procedure name.在对程序段进行定义编写时,要采用public组合型加以说明解释,程序运行结束后,在返回上采用ret指令,又因为参数传递时采用的是堆栈方式,因此,在程序返回处理时,通常要使返回指令带有常数,这样即可越过参数区.

除了调用汇编语言过程之外,Pascal语言还要对过程的定义加以解决.在对调用过程进行定义时,可以使用语句$include:’name’,在这一语句中,文件名为 name,以 name作为Pascal语言调用函数或过程名,此时对程序进行编译时,include语句如碰到编译程序,编译程序就能够对Pascal语言文件加以编译处理.

在对汇编语言进行调用时,Pascal程序可以根据参数顺序依次将变量压入堆栈,在堆栈中变量以字作为单位,并将段地址及偏移地址加以保存,Pascal程序中的参数获取借助BP寄存器得以实现.

3.2 C语言与汇编语言连接方法和程序

3.2.1 C语言程序中汇编码集成方法

与Pascal语言与汇编语言间的关系相同,C语言与汇编语言连接时,汇编程序也是以外部过程的形式存在,然后借助函数及过程,C语言达到对汇编语言程序进行调用的目的.一般而言,在混合编程过程中,C语言与汇编语言的混编方法有以下两种:

3.2.1.1 将汇编程序从C语言中直接加以调用

如混编过程中需要多次使用汇编代码时,较常采用此方法.该方法的实现过程主要分为以下几步:将汇编子程序进行编写,使其具备特定功能;采用C函数的形式,将汇编子程序从C程序中加以调用.在这一过程中,尤其应注意以下几个要点:①采用C函数形式对汇编子程序进行调用时,需要对函数加以显式说明,主要通过将“Extern”作为C程序中的关键字这一方式实现;②存储模式如不同,则汇编语言在格式上也要加以区别,例如,小模式下的C程序,需要采用近过程进行汇编,相应地,大模式下的C程序,就应采用远过程进行汇编;③在参数获取中,由于远过程汇编方式下,其返回地址需要占用四个字节,而在借助BP寄存器进行参数压入时,这一过程又需要占用二个字节,因此,远过程汇编方式下,要从BP+6对应的单元来获取首个参数.在近过程汇编方式下,从BP+4对应的单元获取首个参数;④BP寄存器在汇编程序中的保护问题.在子过程变量的存放上,Turbo C对DI及SI存放方式不加阻拦,而当两个或两个以上的变量存入BP寄存器中时,BP寄存器会将多出的变量部分转移到堆栈中加以存储.这一汇编过程可以用以下程序加以说明:

⑤返回值问题.C数据在返回位置上,每个数据类型都占有一个标准,通常具有极小模式、小模式、中模式(AX)及紧凑模式、大模式、巨模式(DX:AX),以AX为返回值位置的数据类型有char;enum;unsigned char;short int,这些数据类型的返回数据要在RET指令前加以放置.采用远过程定义汇编子程序,在过程名上要借助PUBLIC伪指令,将其作公共类型定义.下面用实例加以说明:

为更为全面地对此连接方法加以说明,可再列举一个实例.例如,在计算机中将两个整型数据键入,并将整型数据之间的差加以显示.数据的键入及显示部分采用C语言编写,而数据之差采用汇编语言编写.此实例的程序编写如下所示:

3.2.1.2 内联汇编

内联汇编的方法指的是在C语言程序中直接插入汇编语言的代码,因此,也被称为嵌入式汇编方法,C语言编译器基本都支持此方法.内联汇编的连接方式主要是借助“asm”这一C语言中的关键字加以实现,将汇编语言的代码直接放置在asm之后,此时再通过C语言编译程序实现汇编指令的传送及汇编步骤.内联汇编具有简单直接等特点,无须考虑参数传递及外链命名等方面,但涉及到对不同的目标平台加以编译时,内联汇编的方法就不具备可移植性.下面列举相关实例:

结合这一实例,在内联汇编中,要注意以下几个要点:①汇编语言的代码应将C语言变量进行初始化后再加以使用,在汇编类型上要用ptr加以指示;②C语言以分号结束语句,汇编语言结束语句采用换行时,此时嵌入C语言程序中的汇编指令可以不用分号(;)结束;③采用C语言中的return指令进行返回,而不是按照asm中的ret指令;④C程序中不能嵌入伪指令,如DW,DB等;⑤宏指令及宏操作符也不能嵌入C程序,如ENDM,IRP,MACRO,%,,&等.

3.2.2 C语言程序和汇编子程序间的连接

集成环境下,如对由C语言及汇编语言混编而成的程序加以编译及连接,首先要采用MASM.EXE这一宏汇编方式对汇编语言加以编译,得到OBJ格式文件.在生成OBJ文件后,将其嵌入C语言程序中,经连接后,即可得到EXE文件.在C语言程序中嵌入OBJ文件的步骤为:于Turbo C中编辑格式为*.Prj的工程文件,以文件名列表,作为文件内容,如mymasm.obj等;选择project name这一位于project中的选项,然后采用(*)格式键入工程文件的名称,即可实现C语言程序与汇编子程序间的连接[5].

结语

不同计算机语言混合编程能够实现语言间的调用,借助参数传递,一方面充分利用了汇编语言的优势,另一方面又为诸如C程序等计算机高级语言性能的发挥提供了空间,在社会各行业的计算机软件研发中,多语言混合编程已显示出其重要价值.本文主要对Pascal语言、C语言与汇编语言的连接方法进行了阐述,希望为计算机语言接口技术的深入研究提供借鉴参考.

〔1〕周谧.C/C++与FORTRAN混合编程技术及其应用研究[J].科技创新与应用,2015(13):76.

〔2〕张喆,郑宾.基于N I TestStand的多语言混合编程技术研究[J].电子测试,2012(11):78-83.

〔3〕孟祥娜.汇编语言与C语言混合编程方法探讨[J].电脑编程技巧与维护,2014(22):26-27.

〔4〕王茹.ARM汇编语言与C/C++语言混合编程实现方法[J].电大理工,2012(2):27-29.

〔5〕金微.汇编语言与C语言混合编程的接口技术[J].无线互联科技,2013(9):109+111.

猜你喜欢
汇编语言C语言调用
基于Visual Studio Code的C语言程序设计实践教学探索
高等学校计算机专业课程教学改革实践——以汇编语言与接口技术课程为例
核电项目物项调用管理的应用研究
51单片机C语言入门方法
汇编语言与C语言的混合程序设计技术研究
基于C语言的计算机软件编程
提高《汇编语言程序设计》教学效率的思考与实践
基于系统调用的恶意软件检测技术研究
高职高专院校C语言程序设计教学改革探索
利用RFC技术实现SAP系统接口通信