言编写的子程序、要求较高的
处理速度而必须用更简练的汇编语言编写的特殊函数或因时序要求严格而不得不使用灵活性更强的汇编语言编写的某些接口程序。另一方面,在以汇编语言为主体的
程序开发过程中,如果涉及到复杂的数学运算,往往需要借助C语言工具所提供的运算库函数和强大的数据处理能力,这就要求在汇编中调用C函数。本文所涉及的
内容,正是讨论如何在Franklin C51和A51的编程过程中,实现C函数和汇编子程序的互相调用。
2 Franklin C51和A51接口所涉及的几个主要问题
2.1 C51函数名的转换及其命名规则
C51程序模块编译成目标文件后,其中的函数名依据其定义的性质不同会转换为不同的函数名,因此,在C和汇编程序的相互调用中,要求汇编程序必须服从这种
函数名的转换规则,否则,将无法调用到所需的函数或出现错误。C51中函数名的转换规则如表1所列。
2.2 C51函数及其相关段的命名规则
一个C51源程序模块被编译后,其中的每一个函数以“?PR?函数名?模块名”为名的命名规则被分配到一个独立的CODE段。例如,如果模块
“FUNC51”内包含一个名为“func”的函数,则其CODE段的名字是“?PR?FUNC?FUNC51”。如果一个函数包含有data和bit对
象的局部变量,编译器将按“?函数名?BYTE和?函数名?BIT”命令规则建立一个data和bit段,它们代表所要传递参数的起始位置,其偏移值为
零。这些段是公开的,因而它们的地址可被其它模块访问。另外,这些段被编译器赋予“OVERLAYABLE”标志,故可被L51连接/定位器作覆盖分析。
依赖于所使用的存储器模式,这些段的段名按表2所列规则命名,在相互调用时,汇编语言必须服从C51有关段名的命名规则。
2.3 C51函数的参数传递规则
C和汇编接口的关键在于要弄清C函数的参数传递规则。Franklin
C51具有特定的参数传递规则,这就为二者的接口提供了条件。Franklin
C51函数最多可通过CPU寄存器传递三个参数,这种传递技术的优点是可产生与汇编语言相比的高效代码。表3是利用寄存器传递参数的规则。如果参数较多而
使得寄存器不够用时,部分参数将在固定的存储区域内传送,这种混合的情况有时会令程序员在弄清每一个参数的传递方式时发生困难。如果在源程序中选择了编译
控制命令“#pragma
NOREGPARMS”,则所有参数传递都发生在固定的存储区域,所使用的地址空间依赖于所选择的存储器模式。这种参数传递技术的优点是传递途径非常清
晰,缺点是代码效率不高,速度较慢。当函数具有返回值时,也需传递参数,这种返回值参数的传递均是通过CPU内部寄存器完成,其传递规则如表4所示。
表3 寄存器参数传递规则
下面是几个说明参数传递规则的例子:
func1(int a) “a”在R6/R7中传递
func2(int b,int c,int *d)
“b”和“c”分别在R6/R7和R4/R5中传递,
“d”在R1/R2/R3中传递
func3(long e,long f)