蒋仁祥
(福建师范大学数学和计算机学院,福建 福州 350007)
浅谈汇编语言与C语言的混合程序设计技术
蒋仁祥
(福建师范大学数学和计算机学院,福建 福州 350007)
汇编语言实际上就是一种针对机器的语言形式,具有极快的运行速度和较小的存储空间,可在一定条件下直接控制硬件,在多种领域中均得到广泛的应用,并具有至关重要的作用。然而在实际的编写与调试环节中,其难度和复杂程度都是很大的,特别是混合运算环节。C语言具有极高的灵活性和表达能力,在软件的开发环节,运用汇编语言与C语言的混合程序设计技术,不仅可以有效解决单一使用汇编语言处理数据时的困难,还可大幅提高实际的运行效率。文章阐述了两种语言混合编程的具体方法,以及二者在连接时应注意的问题,为该混合程序设计技术的推广与应用奠定基础。
汇编语言;C语言;混合程序设计
较大程序的设计过程中,若在充分使用汇编语言程序的前提下,充分融合其他高级语言程序,这样不仅可以全面发挥出各类程序的特点,还能实现二者融合所带来的优势,实现现阶段主流的混合编程。程序设计过程中,C语言在一定条件下,可完成汇编语言对应子程序的调用,这一过程是可逆的,汇编语言与C语言可相互调用,另外由于C语言具有较高的表达能力,所以在被调用时汇编语言还能将对应的语句融入其中,这是单一程序编程无法达到的,具有很高的实际价值。然而,在混合编程阶段,应密切注意汇编语言与 C语言之间的连接情况,对可能造成影响的因素进行综合分析,确保混合编程发挥出最佳的效果。
在实际的编程过程中,将 C语言与汇编语言充分结合的编程方法主要包括四方面内容:
(1)混合编程过程中,指定编程任务会被分成多种功能模块,通常情况下,模块主要以程序或者是函数的形态表现,结合模块的实际特点选取适宜的语言完成编程,随后运用对应的编译系统将编程结果按要求转换为目标文件,最终将所有目标文件进行连接,从而生成完整的文件。
(2)对于C语言程序而言,往往需要运用到在汇编程序中完成定义的常规变量。
(3)一般而言,可将汇编语句直接、快速编入C语言程序中,拓展了C语言程序的功能,有效解决了C语言程序无法控制硬件的缺陷。
(4)通过运用函数的方法,可在C语言内部快速调用汇编语句。
对于 C语言程序而言,可直接完成汇编语言代码的编写任务,将指定的汇编语句融入到 C语言程序中时,一般不需要分号,如果所选汇编语句以组的形式存在,则需使用大括号({})。汇编语句包含多种形式,可在C语言中使用的主要分为四类,分别为跳转、串操作、分配以及一般指令等内容。
为达到调用效果,还需从细节入手,确定汇编语言所对应源程序的段组合是否切实满足编译的实际需求,如果源程序违约势必会对调用效果造成不同程度的影响。
3.1 基本格式
汇编程序子程序格式中的开头和末尾分别表示程序的开始与结束,均属伪指令范畴。汇编程序子程序名实际上就是一个标示符,由编程人员自行创建。另外,子程序名通常还表示汇编程序中第一条指令的实际逻辑地址,也可称作入口地址。一般而言,类型只分两种,分别为NEAR与FAR,不同类型会对程序中的调用及返回指令对应的翻译系统造成直接影响。处在程序中心位置的序列为程序段,程序段具备特定的功能,在程序段的末尾,通常会有一条返回指令(RET)。
3.2 子程序的基本格式
与上述基本格式相比子程序主要具备以下几方面特点:
(1)由于C语言和汇编语言的堆栈段相同,所以,为了达到混合编程的目的,对应的汇编程序在运行的初期必须进行两条指令,这两条指令分别为 PUSH BP(缓存栈基址)和MOVE BO,SP。
(2)C语言程序的调用对象需在PUBLIC伪操作的支持下进行说明,确定该子程序将要被外部所调用。
(3)C语言支持对应子程序采用DI或SI完成变量的存储任务,由于在实际情况中,变量一般在两个时以后进行存放,所以在C语言子程序中会生成PUSH SI/DI语句。
(4)在程序段中,不仅定义了代码生成器、信息资料管理器还将其合成为整体的数据段(DGROUP),段组内所用的基址是一致的。
(5)程序核心语句中应包含返回函数值,而且该个函数值的具体位置应处在RET语句之前。
(6)调用的返回过程需由RET语句命令。
(7)末尾处的END仅代表程序运行完毕,并为标明实际的启动位置。
从汇编语言的角度讲,其具有的优势是 C语言难以媲美的,比如在输入的过程中,汇编语言支持所有进制的数据,并无需翻译直接读取。所以在汇编语言中调用 C语言是可以且具有一定价值的。汇编语言中各类程序的格式并没有太大出入,主程序要求程序的开始阶段具有EXTERN语句,以此表名此函数将被调用,属外部范畴。过程语句中,可在CALL语句的支持下,完成外部函数的调用任务,具体格式为CALL NEAR PTY。如果C语言程序中的子程序具备被调用的条件,则在成为汇编语言程序的子程序时,程序中可以包含 C语言函数,无需添加EXTERN语句进行说明。C语言程序调用过程中软件的堆栈分配如图1所示。
图1 软件堆栈分配结构示意图
汇编语言与 C语言连接并混合编程的过程中,需要密切注意三方面内容,分别为参数传递、调用关系和模块连接,只有妥善处理这三方面内容,才能有效提高汇编语言与 C语言的连接及混合编程质量,从而真正提高程序运行效率,改善编程环境。
(1)参数传递
汇编语言与 C语言在连接和混合编程的过程中,参数会在一定条件下进行传递,一般而言,传递过程通常运用堆栈形式。从汇编语言的角度讲,主要选取BP作为堆栈基址的寄存器,首先将调用过程中 C语言程序产生的参数进行编排和划分,并将其压入至堆栈当中,如果程序在后续的运行过程中需要使用堆栈中的参数时,可再次使用BP 将参数按照实际要求和偏移量实施存取。
(2)调用关系
程序在调用之前,应建立并完善调用关系,以此说明该子程序将被调用。在调用的过程中,对应程序应表明自身已属外部类型范畴,从而为后续的引用和计算提供便利,同时,调用程序同样需要及时说明将要被引用程序的具体名称。在确定调用关系的过程中,还需结合各类存储模式的具体要求,确定程序的语言格式。C语言程序的小模式一般与汇编语言程序中的近类型相对应,而大模式则与远类型相对应。
(3)模块连接
为确保汇编语言与 C语言连接与混合编程的可靠性,还需进一步完善两方面工作,其一是汇编语言程序与 C语言程序所使用的存储模式必须为一致的;其二是汇编语言程序需支持 C语言程序的命名要求,在连接和使用之前需拟定兼容合约,由于汇编语言程序的特点较为明显,所以编程中函数及变量的命名一般以 C语言程序的要求为准,汇编语言程序必须严格遵守约定。
C语言程序中主要涵盖了六种形式的存储模式,分别为微型存储模式、小型存储模式、中型存错模式、紧凑型存储模式、大型存储模式以及巨型存储模式,由此可见,存储模式主要由空间和大小区分。其中微型存储模式中的程序和堆栈均处于相同段内;小型存储模式具有数据和代码段,实际数量均为一个。如要进行混合编程,必须确保两个程序使用相同的存储模式。对于汇编语言而言,Model代表此程序所用的伪指令,而后需所接内容即为存储模式,一般为上述模式的其中一种。如果 C语言程序使用了小型存储模式,在汇编语言中将会表现为Model Small,此时两种程序所用存储模式为统一类型。由于小型存储模式采用Near作为基础指针,所以该存储模式具有较高的运行效率,因此在实际的混合编程情况中,应在条件满足的情况下尽可能选用小型存储模式。
C语言程序的编译过程中,程序中变量及函数名称的下方会被添加一道下划线,为确保连接质量,在调用子程序中,任意一种标示符的都需添加下划线。从C语言程序的角度讲,其会对调用对象中具体变量与函数予以伪命令,以此达到说明的目的,通常将命令放置在函数与变量的外部。另外,为了保存汇编语言程序中完整的标示符,还需使用PUBLIC操作符对指定标示符进行定义。如果汇编语言程序需使用 C语言程序中的函数,需要在所选函数的名称前添加下划线,同时在程序开始阶段运用EXTERN语句进行说明,如图2所示。
图2 汇编语言程序访问C语言程序函数
总之,汇编语言与 C语言的充分融合,打破了单一语言程序编程的局限性,两种语言程序的特点均可得到充分的发挥,并在运行的过程中相互协调,通过参数传递功能,还可实现数据信息的共享,从而为相关软件的开发提供良好的保障,使其更加安全可靠,推动了编程事业的全面快速发展。
表1 GPU与CPU下视频编码时间表
本系统为GOP级的并行编码算法,它利用可编程GPU以及相应的计算统一设备架构CUDA对基于AVS标准的编码器进行加速,实现了一个基于GPU的AVS并行编码器。与基于CPU上的AVS并行编码器相比,它在保证了视频图像质量同时,也在很大程度上提高了编码的速率。
[1] 王涛.AVS视频解码器C语言建模研究[D].天津:天津大学,2008.
[2] 陈志波.H.264运动估值4网络视频传输关键问题研究[D].北京:清华大学,2003.
[3] 甘新标,沈立,王志英.基于CUDA的并行全搜索运动估计算法[J].计算机辅助设图形学学报,2010,22(3):457-460.
[4] 张舒,褚艳利.GPU高性能运算之CUDAIM〕[M].北京:中国水利水电出版社,2009:2-141.
[5] AVS工作组.视频编码标准 AVS 技术介绍[J].电子产品世界,2005,(10):58-62.
[6] 蒋兴昌,周军,罗传飞.H.264 并行编码算法的研究[J].电视技术,2008,32(2):33-35.
Discussion about assembly language and C language programming techniques mixed
Assembly language is actually a form of language for the machine, with fast speed and less storage space, under certain conditions, the direct control of the hardware, in a variety of fields have been widely used and has to close important role. However, in the actual writing and debugging session, the difficulty and complexity are great, especially the hybrid operation links. C language with a high degree of flexibility and skills in software development aspects, the use of assembly language and C language programming mixed technology, not only can effectively solve the problems single-use assembly language processing the data, but also a substantial increase in the actual operating efficiency. Paper describes two specific methods of mixed programming languages, as well as the connection between the two in question should be noted, to lay the foundation for the promotion and application of hybrid programming techniques.
Assembly language; C language; hybrid programming
TP313
A
1008-1151(2015)02-0016-03
2015-01-11
蒋仁祥(1967-),福建平潭人,福建师范大学数学和计算机学院讲师,研究方向为高校计算机教学。