段名转换
  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. COJ 0557 4013多重部分和问题

    4013多重部分和问题 难度级别:B: 运行时间限制:2000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 n种大小不同的数字 Ai,每种各Mi个,判断是否可以从 ...

  2. awr报告基本操作

    1.查看当前的AWR保存策略.设置:快照间隔.保存时间. SQL> col SNAP_INTERVAL format a20    SQL> col RETENTION format a2 ...

  3. Centos6 下启动httpd报错 Could not reliably determine the server's解决方法

    在启动httpd的时候报错: 修改/etc/httpd/conf/httpd.conf 配置,去掉ServerName 前的#(或者手动添加ServerName localhost:80)然后重启ht ...

  4. Javascript 精髓整理篇之二(函数篇)postby:http://zhutty.cnblogs.com

    今天总结的内容是javascript的function, 涉及到function顺便讲讲this. Function 是javascript的函数,也是js的执行单元.函数是JavaScript的一种 ...

  5. Tomcat全攻略

    内容: 一:简单介绍 二:安装及配置 三:应用 四:综述 參考资料 关于作者 相关内容: TCP/IP 介绍 TCP/IP 介绍 !== End Related dW Content Area --& ...

  6. Android:Service的非绑定式的创建和生命周期

    Android的Service若使用非绑定式的创建,则创建后将无法再与它取得联系.即无法传递消息參数等: 所以假设希望创建后仍然与其存在联系,那么能够參考我的前几篇博客<Android:Serv ...

  7. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  8. NumberBox( 数值输入框) 组件

    本节课重点了解 EasyUI 中 NumberBox(数值输入框)组件的使用方法,这个组件依赖于 ValidateBox(验证框)组件.一. 加载方式//class 加载方式<input typ ...

  9. hdu 1076

    水题 AC代码: #include <iostream> using namespace std; int main() { int i,k,t,y,n; cin>>t; wh ...

  10. 学习OkHttp wiki--Interceptors

    Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...