段名转换
  Cx51编译器生成的目标代码(程序代码、程序数据和常数数据)保存在代码段或数据段中,一个段可以是可重定位的或绝对的,每个可重定位段有一个类型和一个名称。本节说明Cx51编译器命名这些段的惯例段名,包括一个module_name 它是声明目标的源文件名,为了适应大量的现有的软件和硬件工具所有的段名都转换和保存为大写。
  每个段名有一个前缀,它对应于段所用的存储类型,前缀用问号(?)为界。下面是一个标准段名前缀的列表
段前缀存储类型说明
?PR?       program       可执行的程序代码
?CO?      code             程序存储区的常数数据
?BI?        bit               内部数据区的位数据
?BA?      bdata            内部数据区的可位寻址数据
?DT?      data              内部数据区
?FD?      far                FAR存储区RAM空间
?FC?      const far       FAR存储区常数ROM空间
?ID?       idata             间接寻址内部数据区
?PD?     pdata             外部数据区的分页数据
?XD?     xdata            XDATA存储区RAM空间
?XC?     const xdata   XDATA存储区常数ROM空间
 
  数据目标
  数据目标是在C程序中声明的变量和常数,Cx51编译器对每个声明的变量的存储类型产生一个独立的段。下表列出了对不同的变量数据目标产生的段名
段前缀说明
?BA?     module_name  可位寻址数据目标
?BI?      module_name  位目标
?CO?     module_name  常数字符串和已初始化变量
?DT?     module_name  在data中声明的目标
?FC?     module_name  在const far 要求OMF2命令声明的目标
?FD?     module_name  在far 要求OMF2命令声明的目标
?ID?      module_name  在idata声明的目标
?PD?     module_name  在pdata声明的目标
?XC?     module_name  在const xdata 要求OMF2命令声明的目标
?XD?     module_name  在xdata声明的目标
 
  程序目标
  程序目标包括由Cx51编译器产生的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
 
有参数局部变量或bit变量的函数,包含所有这些变量的附加段,这些段可以被BL51连接/定位器覆盖。
 
他们根据所用的存储模式建立如下
SMALL模式段命名规则
信息段类型段名
程序代码code ?PR?function_name?module_name
局部变量data ?DT?function_name?module_name
局部位变量bit ?BI?function_name?module_name
COMPACT模式段命名规则
信息段类型段名
程序代码code ?PR?function_name?module_name
局部变量pdata ?PD?function_name?module_name
局部位变量bit ?BI?function_name?module_name
LARGE模式段命名规则
信息段类型段名
程序代码code ?PR?function_name?module_name
局部变量xdata ?XD?function_name?module_name
局部位变量bit ?BI?function_name?module_name
 
对有寄存器参数和可重入属性的函数名有稍许修改以避免运行错误下表列出了和标准段命名不同之处
声明符号说明
void func(void)…        FUNC     没有参数或参数不通过寄存器传递的函数名没有改变,函数名改为大写
void func1(char)…       _FUNC1    参数通过寄存器传递的函数函数名前有一个下划线_ ,这确定这些函数通过CPU寄存器传递参数
void func2(void) reentrant…  _?FUNC2  可重入的函数函数名前有一个字符串_? ,这用来确定可重入函数

KEIL段协定的更多相关文章

  1. KEIL的ARM编译器对RW和ZI段的一个处理

    按照C编译器编译的结果,一般会产生RO段,RW段,ZI段.RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量. 那么如下的代码 int aaa; i ...

  2. keil mdk中如何确保某一段程序不被优化掉(转)

    源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在RO ...

  3. Keil MDK Code、RO-data、RW-data、ZI-data数据段

      Program Size: Code=10848 RO-data=780 RW-data=372 ZI-data=868   Code 表示程序代码指令部分 存放在Flash区 RO-data 表 ...

  4. Keil C51怎样将子程序段定位在固定的地址位?

    以下2问题均要用C51解决1.怎样将1个子程序段定位在1个固定的地址位置?例如将 INT BCD2HEX(INT XX)定位在1000H2.如何在EEPROM 中固定的位置存放1字符串?如在200H处 ...

  5. keil mdk中如何确保某一段程序不被优化掉

    使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为vo ...

  6. [转]keil使用详解

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  7. KEIL C51高级编程

    第一节 绝对地址访问C51提供了三种访问绝对地址的方法: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWO ...

  8. Keil C51 知识点

    第一节 Keil C51扩展关键字     深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一.因为大多数扩展功能都是直接针对8051系列CPU硬件的.大致有以下8类: 8051存储类型 ...

  9. keil c51笔记

    第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...

随机推荐

  1. UNION ALL vs UNION

    一直没意识到它们之间的区别,只知道UNION ALL在性能上优于UNION,忽略一个很重要的区别:UNION会去掉重复的行,而UNION ALL是包括所有行.

  2. MySQL 分区表原理及使用详解

    今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由 ...

  3. Ubuntu 下配置Samba 实现Linux和windows之间文件共享

    一 Samba 的安装: sudo apt-get insall sambasudo apt-get install smbfs 二 在Ubuntu中创建共享目录: mkdir  /home/shar ...

  4. 两个php.ini; ubuntu下配置文件

    C:\wamp\bin\apache\apache2.4.17\bin\php.ini 用于web访问时的配置文件, C:\wamp\bin\php\php5.6.15\php.ini 用于cli [ ...

  5. SWFLoader交互

    主应用程序: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx=& ...

  6. 【ArcGIS 10.2新特性】地理数据(Geodatabase 和database)10.2 新特性

    1. 大数据支持 ArcGIS与Hadoop集成,将提供一个开源的工具包用于大数据的空间分析,开发者将通过该工具包构建定制化的工作流并在ArcGIS当中执行.         支持更多的大数据平台数据 ...

  7. Linux安装mysql源码

    1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 ...

  8. SAN和NAS的区别

    SAN : STORAGE AREA NETWORK   存储区域网络 NAS : NETWORK ATTACHED STORAGE 网络附加存储 NAS不一定是盘阵,一台普通的主机就可以做出NAS, ...

  9. JavaScript“闭包”精解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. 详细了解 Javascript语言的特殊之处,就在于函数内部可以直接读 ...

  10. Asp.Net WebAPI传递json对象、后台手动接收参数

    1.前台代码 /* * 跨域请求Post * 1个对象参数,后台JObject接受 */ $.post(apiUrl.getOne("PostFourth"), { name: } ...