C51编译器-高级编程技巧(2)-程序段命名约定
扫描二维码
随时随地手机看文章
Segment Naming Conventions程序段命名约定
Cx51编译器生成的目标(程序代码,程序数据和常量数据)都以程序段的形式存放,段是代码和数据的单元。一个段可能是可重定位的,也可能地址是绝对的。每一个可重定位的段都有一个类型和一个名字。
段名包括:module_name。module_name是声明这个段的源文件的名字(不包含驱动器名,路径和扩展名)。为了能适应现有的各种各样的软件和硬件工具,所有段名都一律大写。
每个段名都有一个前缀,这个前缀对应于段所用的存储器类型。这个前缀放在两个问号(?)之间。下面列出几种标准的段名前缀:
段前缀 存储器类型 描述
?PR? program 可执行的程序代码
?CO? code 程序存储器中的常量数据
?BI? bit 内部数据存储器中的位数据
?BA? bdata 内部数据存储器中的位可寻址数据
?DT? data 内部数据存储器Internal data memory
?FD? far far memory (RAM space)
?FC? const far far memory (constant ROM space)
?ID? idata 间接寻址的内部数据存储器Indirectly-addressable internal data memory
?PD? pdata 分页的外部数据存储器Paged data in external data memory
?XD? xdata 外部数据存储器xdata memory (RAM space)
?XC? const xdata 外部数据存储器xdata memory (常量ROM空间constant ROM space)
Data Objects数据对象
数据对像是在C程序中声明的变量和常量。Cx51为每个声明变量的存储器类型生成一个独的段。以下是不同的数据对象的段名:
段名 描述Description
?BA?module_name 位可寻址的数据对象
?BI?module_name 位对象
?CO?module_name 常量(字符串和初始化的变量)
?DT?module_name data存储区中的对象
?XC?module_name const far存储区中的对象 (requires OMF251 directive)
?XD?module_name far存储区中的对象(requires OMF251 directive)
?ID?module_name idata存储区中的对象
?PD?module_name pdata存储区中的对象
?XC?module_name const xdata存储区中的对象
?XD?module_name xdata存储区中的对象
Program Objectst程序对象
程序对象包括Cx 51编译器用C程序生成的代码。源程序中每个函数都被指定给了一个独立的代码段,这个代码段使用?PR?function_name?module_name命名规则命名。比如源程序SAMPLE.C中的函数error_check生成一个名字为?PR?ERROR_CHECK?SAMPLE的段。
在一个函数体中的声明的局部变量也生成一个段。这些段名以上面的规则命名,只是根据使用的不同存储器区域使用不同的前缀
函数参数的传递使用固定的存储器区域。这对于使用PL/M-51书写的程序一样适用。然而,Cx51可以在寄存器中传递多达3个参数。其他的参数据采用经典的固定的存储器区域。保留的存储器空间用来存放所有的参数,而不论参数是否通过寄存器传递。这些参数区域对于调用的模块来说必须是可以访问的。因此,他采用以下段名公开地定义:
?function_name?BYTE
?function_name?BIT
例如:如果func1是一个既可以接受位参数又可以接受其他数据类型的函数。位参数的传递起始为?FUNC1?BIT,而其他所有参数的传递起始?FUNC1?BYTE。
那些有参数,局部变量或位变量的函数包括了这些变量的所有附加段。这些段可以被BL51 Linker/Locatot。
他们都根据存储器类型生成如下
小存储器模式段命名规则
Information Segment Type Segment Name
Program code code ?PR?function_name?module_name
Local variables data ?DT?function_name?module_name
Local bit variables bit ?BI?function_name?module_name
Compact存储器模式段命名规则
Information Segment Type Segment Name
Program code code ?PR?function_name?module_name
Local variables pdata ?PD?function_name?module_name
Local bit variables bit ?BI?function_name?module_name
Large存储器模式段命名规则
Information Segment Type Segment Name
Program code code ?PR?function_name?module_name
Local variables xdata ?XD?function_name?module_name
Local bit variables bit ?BI?function_name?module_name
为了避免运行时的错误,寄存器传递参数的函数和可重入函数的命名稍微不同。下表列出了这些不同。
Declaration Symbol Description
void func (void) … FUNC没有参数的函数和不使用寄存器传递参数的函数转换到目标文件时,名字不做任何改变,只是将函数名大写
void func1 (char) … _FUNC1 使用寄存器存器传递参数的函数,函数名字添加一个下划线“_”,用来指明函数使用CPU寄存器传递参数
void func2 (void) reentrant… _?FUNC2 对于可重入函数的,可函数的名字前添加“_?”,用来指明是可重入函数。