汇编和C 语言函数混合编程的一种方法
倪文军,彭 刚
(交通部天津水运工程科学研究所,天津300456)
摘 要:开发单片机程序常用汇编语言及其编译工具Franklin C 51,汇编语言的缺点是不易实现较复杂的数学计算。而C 语言可以提供丰富的数学计算库函数。实现汇编和C 语言函数混合编程既可提高编程效率,又能容易地完成数学计算。混合编程的关键是在统一的程序接口规则下,正确地进行参数传递。文中用一个具体的混合编程实例,说明了混合编程的一种方法,即在汇编程序中调用C 语言函数。关键词:汇编语言;C 语言;混合编程
中图分类号:TP311111   文献标识码:B    文章编号:1005-8443(2004)S0-0128-03
收稿日期:2004-12-22
作者简介:倪文军(1972-),男,天津市人,毕业于哈尔滨科技大学,工程师,主要从事电子技术研究。
  在单片机软件开发过程中,早期通常用汇编语言来编写程序。然而,当涉及到较复杂的数学运算时,汇
编语言编程相当烦琐和困难,而且容易出错。以汇编语言编制主程序,调用编程工具所提供的C 语言库函数,实现两种语言的混合编程,既可以保持编程者使用汇编语言的编程习惯,又可以利用C 语言工具所提供的运算库函数和强大的数据处理能力,是一种较好的编程途径。Franklin C 51是一种专门针对Intel 8051系列单片机的程序开发工具。它既支持汇编语言编程又支持C 语言编程,同时提供了丰富的C 语言库函数。在Franklin C 51支持下,明确其函数名转换、相关段命名和参数传递规则等关键问题(即两种语言的接口),即可以在两种语言中互相调用和操作共同的变量参数,达到混合编程的目的。
1 Franklin C 51和A 51接口所涉及的几个主要问题
111 C 51函数名的转换及其命名规则
  C 51程序模块编译成目标文件后,其中的函数名依据其定义的性质不同会转换为不同的函数名,因此,在C 和汇编程序的相互调用中,要求汇
编程序必须服从这种函数名的转换规则,否则,将无法调用到
表1 C 51中函数名的转换规则
说明
符号名
解释
V oid func (v oid )FUNC
无参数传递或不含寄存器参数的函数名,不作改变转入目标文件中,名字只是简单的转为大写形式。V oid func (char ) FUNC
带寄存器参数的函数名加说“ ”字符前缀以示区别,它表明这类函数包含器内的参数传递。V oid func (v oid )
reentrant  ?FUNC
对于重入函数加上“ ?”字符前缀以示区别,它表明这类
函数包含栈内的参数传递。
所需的函数或出现错误。C 51中函数名的转换规则如表1所列。112 C 51函数及其相关段的命名规则
一个C 51源程序模块被编译后,其中的每一个函数以“?PR ?函数名?模块名”为名的命名规则被分配到一个独立的C ODE 段。例如,如果模块“FUNC 51”内包含一个名为“func ”的函数,则其C ODE 段的名字
汇编语言转c语言的软件是“?PR ?FUNC ?FUNC 51”。如果—个函数包含有data 和bit 对象的局部变量,编译器将按“?函数名?BY TE 和?函数名?BIT ”命令规则建立一个data 和bit 段,它们代表所要传递参数的起始,其偏移值为零。这些段是公开的,因而它们的地址可被其它模块访问。另外,这些段被编译器赋予“OVER LAY ABLE ”标志,故可被L 51连接/定位器作覆盖分析。依赖于所使用的存储器模式,这些段名按表2所列规则命名,在调用时,汇编语言必须服从C 51有关段名的命名规则。
 水道港口
Journal of Waterway and Harbour                     第25卷增刊 2004年3月
113 C51函数的参数传递规则
C和汇编接口的关键在于要弄清C函数的参数传递规则。Franklin C51具有特定的参数传递规则,这就为二者的接口提供了条件。Franklin C51函数最多可通过CPU寄存器传递3个参数,这种传递技术的优点是可产生与汇编语言相比的高效代码。表3是利用寄存器传递参数的规则。如果参数较多而使得寄存器不够用时,部分参数将在固定的存储区域内传送,这种混合的情况有时会令程序员在弄清每一个参数的传递方式时发生困难。如果在源程序中选择了编译控制命令“#pragma NOREG PARMS”,则所有参数传递都发生在固定的存储区域,所使用的地址空间依赖于所选择的存储器模式。这种参数传递技术的优点是传递途径非常清晰,缺点是代码效率不高,速度较慢。当函数具有返回值时,也需传递参数,这种返回
值参数的传递均是通过CPU内部寄存器完成,其传递规则如表4所示。
表2 各种存储器模式下函数相关段名的命名规则数据  段类型  段名
程序代码CODE?PR?函数名?模块名(所有模式)
局部变量DAT A?DT?函数名?模块名?(S M A LL模式)
PDAT A?PD?函数名?模块名(COMPACT模式)
X DAT?X D?函数名?模块名(LARGE模式)
A
局部BIT变量BIT?BI?函数名?模块名(所有模式)
表3 寄存器参数传递规则
参数类型char int Long,float一般指针第1个参数R7R6,R7R4~R7R1,R2,R3第2个参数R5R4,R5R4~R7R1,R2,R3第3个参数R3R2,R3无R1,R2,R3
表4 函数返回值传递规则
返回值寄存器 说明
Bit C进位标志
(unsingned)char R7
(unsigned)int R6,R7高位在R6,低位在R7
(unsigned)long R4~R7高位在R4,低位在R7
Float R4~R732位IEEE格式,指数和符号位在R7
指针R1,R2,R3R3放存储器类型,高位在R6,低位在R7
2 应用举例
211 汇编中调用C51函数
本例一个工程文件hunbian、m pj包含两个文件,一个是主程序汇编文件asm51.asm,另一个是C语言源文件func51.C,C语言源文件中有一个名为func的函数,它完成某算术运算功能。
C语言源文件清单如下:
#pragma NOREG PARMS/3参数均在固定的存储器区域内传递3/
#include<reg51.h>/3定义所有8051的特殊功能寄存器及中断3/
#include<math.h>/3数学函数头文件3/
unsigned int dd,ee,/3函数计算过程当中的中间变量必需定义成全程变量3/
unsigned char func(unsigned int v-a,unsigned int v-b)
{
dd=v-a/v-b+28;/3函数计算过程中中间变量的换算3/
ee=dd+abs(-112);/3函数计算过程中可以调用现有的库函数3/
return sqrt(ee);/3计算ee的平方根并返回结果3/
}
汇编源文件清单如下:
EXTRN C ODE(func);在汇编中要调用的C语言外部函数func声明
EXTRN DAT A(?func?BY TE);外部函数func局部变量传送段声明当存储模式为S MA LL时放入直接寻址片内存储器
funca51SEG ME NT C ODE;funca51代码段声明
VAR SEG ME NT DAT A;局部变量段声明
ST ACK SEG ME NT I DAT A;堆栈段声明
                      汇编和C语言函数混合编程的一种方法 倪文军等
RSEG VAR ;局部变量段
a-v :DS 2;用于存放第一个int 参数的变量保留两个字节b-v :DS 2;用于存放第二个int 参数的变量保留两个字节result :DS 1;为func 函数返回值char 保留一个字节
RSEG ST ACK DS 20H ;为堆栈保留32个字节根据实际情况可以改变堆栈保留字节数RSEGfunca 51;funca 51代码段起始JMP ST ART;程序开始
ST ART:MOV SP ,#60H ;初始化堆栈根据实际情况往往需要调节初始值MOV RO ,#40H ;置取R0首地址
MOV ?func ?BY TE +0,@RO ;取第一个int 参数高8位I NC RO ;地址加1
MOV ?func ?BY TE +1,@RO ;取第一个int 参数低8位I NC R0;地址加1
MOV ?func ?BY TE +2,@RO ;取第二个int 参数高8位I NC R0;地址加1
MOV ?func ?BY TE +3,@RO ;取第二个int 参数低8位LC A LL func ;调用C 语言函数MOV result ,R7;存取结果E ND :程序结束212 程序开发环境
以上实例程序是利用EasyPack/E Ⅱ8052F 开发系统,在C odeCruiser (V216中文版)开发环境下进行调试
的。其编译工具是Fanklin 的OMF 51编译器。存储器模式是S MA LL 模式。其中设置的关键是在项目设置中的连接选项的参数设置,其参数必须设置在SY M BO LS LI NES NOPUBLICS NOOVER LAY,在
程序调试中为了查看变量所占用的地址可查看工程文件的M 51文件,也可通过变量观察窗口查看所有的变量占用地址。不同的开发环境在设置上基本一致。
参考文献
[1]马忠梅,等1《单片机的C 语言应用程序设计》[M]1北京:北京航空航天大学出版社,19991[2]徐爱钧,等1《单片机高级语言C 51Windows 环境编程与应用》[M]1北京:电子工业出版社,20011
Assembler Language Calling C Language Function
NI Wen 2jun ,PENG 2gang
(T ianjin Research Institute of Water T ransp ort Engineering ,T ianjin 300456,China )
Abstract :Development of single chip com puter program always uses the assembler and the Franklin C 51tools ,the flaw is that it is very difficult to achieve the inv olved com putation of maths.C language provids plentiful mathematical function.T o finish the mixed procedure of assember and C language can not only raise the efficiency of programming but als o accom plish com putation of maths easily.The key of mixed procedure is how to achieve the im part of parameter cor 2rectly under the cons olidated rule of the procedure connects.This paper uses a practical exam ple of mixed procedure
to explain a method ,i.e ,how to use the assembler to call C language function.
K eyw ords :assembler ;C language ;mixed procedure
 水道港口
Journal of Waterway and Harbour                     第25卷增刊 2004年3月

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。