单片机函数的声明及段的命名规则
1、函数的声明
为了使C程序和汇编程序相互调用,要求汇编程序必须遵循C51中函数名的转换规则,否则将无法实现程序的相互调用。C51中函数名的转换规则如下表所示。
C51函数声明 | 转换函数名 | 说明 |
void func (void) | FUNC | 无参数传递或参数不通过寄存器传递的函数,其函数名不作改变转入目标文件中 |
void func (char) | _FUNC | 带有用寄存器传递参数的函数,在其名字前加上前缀“_”作为区别,表明函数包含寄存器内的参数传递 |
void func (void) reentrant | _?FUNC | 对于再入函数,在其名字前加上前缀“_?”作为区别,它包含堆栈内的参数传递 |
2、段的命名规则
C51程序模块被编译后,其中的函数都以“?PR?函数名?模块名”为名的命名规则被分配到CODE段中;而函数中的DATA和BIT对象则以“?函数名?BYTE”和“?函数名?BIT”的命名规则建立DATA和BIT段。在C51程序和汇编程序相互调用时,汇编语言必须遵循C51中有关段名命名规则,其命名规则如下表所示。
数据 | 段类型 | 段名 |
程序代码 | CODE | ?PR?函数名?模块名(所有模式) |
局部变量 | DATA | ?DT?函数名?模块名(SMALL模式) |
PDATA | ?PD?函数名?模块名(COMT模式) | |
XDATA | ?XD?函数名?模块名(LARGE模式) | |
局部bit变量 | BIT | ?BI?函数名?模块名(所有存储器模式) |
以下给出一个示例:
;**********汇编程序使用A51进行编译、
调试**********
NAMES;定义模块名
?PR?SCAN_KEY?SCANsegmeode;
定义程序代码段
PUBLSCAN_KEY;定义公共符号,函数名
RSEG?PR?SCAN_KEY?SCAN;程序代码段
SCAN_KEY:;起始地址……END
/***********C程序使用C51进行编译、
调试************/
#include<reg51.h>
externvoidscan_key();/*对外部被调函数的声明
*/voiin(void)
{……scan_key();/*调用汇编函数*/……
}
- 上一篇:单片机中断函数的声明
- 下一篇:单片机C语言与汇编语言的接口方式