首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

汇编语言与C语言的混合程序设计技术

作者:印德彬 来源:电子技术与软件工程

汇编语言和C语言是两种不同的编程语言,软件开发过程中采用两种语言混合程序设计技术可以极大的提高工作效率以及程序的性能。文本首先简单介绍C语言调用汇编语言子程序、汇编语言调用C语言子程序、C语言程序嵌入汇编语言三种常见的混合编程方法,在混合编程中还需要注意参数传递、调用关系的确定以及汇编程序与C程序的模块连接三个问题。

【关键词】汇编语言 C语言 混合程序设计

汇编语言是一种面向机器的计算机编程语言类型,汇编语言的应用过程中可以考虑存储器的存储空间,提升存储器的运行速度。此外,汇编语言的控制作用力在硬件方面的应用也具有极大的优势。汇编语言也具有复杂程度高、移植性差的缺点,然而在具体操作硬件以及精确定时上又必须使用汇编语言。因此,必须混合使用汇编语言和C语言。而且C语言同时具备高级语言和低级语言的特征,具有较高的表达性、灵活性及开发性优点,促使汇编语言的程序和C语言程序可以实现良好的衔接,为汇编语言与C语言混合程序设计提供了可能。本文就汇编语言和C语言的混合程序设计技术进行分析。

1 汇编语言与C语言的混合编程方法

1.1 C语言调用汇编语言子程序

在C语言程序中调用汇编指令较多的情况下可以采用直接调用汇编语言子程序的格式,而且由于C语言编译系统要具有约定的段序以及规定的段组合。因此,要实现C语言对汇编语言子程序的调用,汇编语言必须严格遵守编译系统的约定或要求的组合和段顺序。C语言调用汇编子程序必须遵循以下规则。

一是程序内需要使用“EXTERN”关键对函数显示进行说明,并将此作为建立C语言与汇编子程序的接口,而且函数的名字必须在8个字符以内,而且函数名设置为下划线格式。二是根据参数在参数标准的顺序,依据反序作顺序,依次将参数压入栈中。最后一个参数首先进栈,最后一个参数在栈中的地址最高。三是依据参数的值进行传递;四是对代码段进加以说明,并且使用—TEXT作为加代码段命名原则。过程名前加下划线,并且是公共过程pulic-过程名。根据C程序模式大小确定汇编使用远过程或近过程,小模式对应近过程,大模式对应远过程。五是汇编程序的参数取C程序的参数。由于远过程在返回地址时需要占用4个字符,BP压入需要占用2个字符,因此首个参数需要位于BP+6指向的远远。而近过程第一个参数则位于BP+4指向的单元。六是汇编程序需要兼顾保护寄存器。C语言调用编程语言子程序会导致寄存器变量超过2个,而多余部分会自动转入栈中存储。因此,汇编过程必须严格遵守以下开头和结尾格式:

PUSH BP

MOV BP,SP

PUSH SI

PUSH DI

语句

POP SI

POP BP

RET

1.2 汇编语言调用C语言子程序

由于汇编语言的巨大优势,在汇编程序中可以实现调用C语言子程序。汇编语言调用C语言子程序不需要改变汇编语言主程序和子程序的格式,只需确保主程序和子程序的格式相同,并且在程序开始前加入“EXTREN 函数名”即可。表明该函数是用来调用C语言子程序的外部函数。而对外部函数可通过主过程中CALL语句进行调用,并将CALL语句格式设置为“CALL NEAR PTR 函数名”。如果子程序为C语言子程序,并且C语言子程序中只包含C函数,则不需要使用EXTERN说明。

1.3 C语言程序嵌入汇编语言

C语言嵌入汇编语言中有C程序调用汇编子程序模块以及在C程序中嵌入汇编指令两种。两种嵌入方式分别应用在不同的情况。

第一,C程序条用汇编子程序模块的嵌入方式中的模块划分原则:为完成任务的需求,每个模块的体现形式为函数或者过程,再根据模块的特点选择编写语言进行编写。如果主程序的编写包含C语言,而模块使用汇编语言进行编写,则需要使用C程序调用汇编子模块。具体操作方法为分别编写汇编C主程序和汇编子程序,并依据各自的特点形成符合自身编写语言的目标代码模块,再将目标代码模块相互连接从而形成最终的可执行文件,通过执行可执行文件即可实现C程序调用汇编子程序模块。

第二,在C程序中嵌入汇编指令多用于C语言无法实现对硬件控制的情况。例如对寄存器的值、中断标志寄存器的修改、重复使用某种功能、对时间的要求等等,可通过在C程序中嵌入汇编指令去实现。使用C程序中嵌入汇编指令时需要注意换行符、寄存器的命名、修改编译连接的命令以及拷贝MASM.EXE程序,存储在TurboC目录下,并命名为TASM.EXE进行编译。

2 C语言与汇编语言连接的关键问题

混合使用汇编语言和C语言进行编程还需要解决参数传递、调用关系的确定以及汇编程序与C程序的模块连接三个问题。

在参数传递上,参数传递是混合编程过程中必须解决的问题,通常情况下采用堆栈实现参数传递。首先,将汇编语言中的BP作为基址寄存器,调用程序将按照反序C语言中的参数压入堆栈中,BP加上不同的偏移量就可以实现对参数的使用。

在调用关系的确定上,需要实现说明需要调用的函数或过程,并建立相应的调用及被调用关系。其中被调用的函数或过程为外部类型,可被外部模块引用。调用程序内也需要说明被引用外部模块的名称。

在汇编程序与C程序的模块连接上,为确保正确连接,不仅需要确保不同语言模块的存储模式具有一致性,还需要汇编模块遵守C兼容的函数和变量命名约定。

3 结语

汇编语言和C语言具有不同的优点和缺陷,混合汇编语言和C语言进行编程可取长补短,同时发挥两种语言的优势,并且弥补两种语言的不同,实现参数传递、数据共享,而且具有事半功倍的效果。

参考文献

[1]杜钦生,楚叶峰,唐伎玲. 基于ARM的汇编语言与C语言混合编程的方法研究[J]. 长春大学学报,2011(10).

[2]柴孝.C语言与汇编语言的混合程序设计技术[J].信息与电脑(理论版),2011(11).

[3]林法.基于汇编语言与C/C++语言混合编程的设计研究[J].电子技术与软件工程,2014(04).

[4]赵丽,齐兴斌.浅析C语言中嵌入汇编语言的程序实现[J].电力学报,2012(03).

作者单位

湖北仙桃职业学院 湖北省仙桃市 433000