段名转换
  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. Linux系统编程(37)—— socket编程之UDP服务器与客户端

    典型的UDP客户端/服务器通讯过程: 编写UDP Client程序的步骤 1.初始化sockaddr_in结构的变量,并赋值.这里使用"8888"作为连接的服务程序的端口,从命令行 ...

  2. (总结)工作中常用的js自定义函数——日期时间类

    //设置时间类 var Wsdatatime = function(){ this.today = (new Date()).getTime(); //当前时间 } Wsdatatime.protot ...

  3. Redis分布式缓存 教程以及DEMO

    原文地址:http://blog.csdn.net/qiujialongjjj/article/category/1800171 redis demo源码下载:http://download.csdn ...

  4. 算法:求 Huffuman树 构造费用

    问题背景:            Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程.            给出一列数{pi}={p0, p1, …, pn-1}, ...

  5. [饭后算法系列] "头尾移动" 排序列表

    1. 问题 一个乱序列表(list), 只支持两种操作: 把一个元素移动到头部, 或者把一个元素移动到尾部. 需要设计一种算法, 使得移动次数最少而使列表有序 举两个例子: 1. {3,5,7,1,9 ...

  6. ubuntu下安装pdo扩展

    ubuntu下安装好LAMP后默认情况没有安装mysql_pdo扩展,以下是安装 步聚,在终端输入以下命令 1.pecl search pdo 2.sudo pecl install pdo 当出现E ...

  7. iOS之UITableView带滑动操作菜单的Cell

    制作一个可以滑动操作的 Table View Cell 本文翻译自 http://www.raywenderlich.com/62435/make-swipeable-table-view-cell- ...

  8. maven 命令小记

    mvn help:system mvn clean compile mvn clean test                            测试 mvn clean package     ...

  9. 基于live555的视频直播 DM368IPNC RTSP分析

    因需要,从个人的理解顺序和需求角度对live555的分析与开发整理,包含RTSP Server与RTSP Client.如何直播H.264流与JPEG流等,均进行了探讨,对live555的初学者有一定 ...

  10. android 限制adb的访问目录

    最近有个特殊的要求,engneer版本既要可以adb访问,且adb有的目录不能访问 如/data/目录. 用传统的chmod chgrp等无法满足客户需求,只能修改内核文件系统部分. 添加函数,检查路 ...