段名转换
  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. java中一直说一个汉字使用两个字节,原来是不准确的

    utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的

  2. shellAPP

    1,linux操作日志记录,记录从各个ip登陆到系统的账号,指向命令及命令执行时间 #!/bin/bashecho "export PROMPT_COMMAND='{ msg=\$(hist ...

  3. 大型分布式C++框架《四:netio之buffer管理器 下》

    每周一篇又来了.这次主要介绍netio的buffer管理器. 首先buffer管理是每一个网络层不可回避的问题.怎么高效的使用buffer是很关键的问题.这里主要介绍下我们的netio是怎么处理.说实 ...

  4. Java中setCharAt()方法介绍

    --转载自网络,备忘 这是StringBuffer类里面的一个方法:主要是用来替换的,方法里面有两个参数setCharAt(int index,Char ch),第一个参数是取代的位置 索引从0开始 ...

  5. JDBC批量插入数据效率分析

    对于需要批量插入数据库操作JDBC有多重方式,本利从三个角度对Statement和PreparedStatement两种执行方式进行分析,总结较优的方案. 当前实现由如下条件: 执行数据库:Mysql ...

  6. double精度的坑与BigDecimal

    近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进 ...

  7. 使用ViewPager+Fragment来实现带滚动条的多屏滑动-IndicatorFragmentActivity

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17201587 介绍 在android应用中,多屏滑动是一种很常见的风格,博主 ...

  8. MVC框架个人浅析

    1.概述: 相信不少前端从业者,都会遇到MVC编程模式,现今多数轻量级网站用php作为后台交互,MVC编程模式用于JAVAWEB开发,应用类型以系统占多数(包括并不限于系统,电商网站,平台交互当然都能 ...

  9. android源代码百度网盘分享

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46334123 本文出自:[yujun411522的博客] 近期在使用Ubunt ...

  10. html.css溢出

    <!DOCTYPE html><!DOCTYPE html><html><head> <title></title> <m ...