段名转换
  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的CalssLoader

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Ja ...

  2. Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)

    1.首先看一下队列窗口的界面 2.看一下上传队列窗口的界面 3.看一下下载队列窗口的界面 4.队列窗口的实现 package com.oyp.ftp.panel.queue; import stati ...

  3. Oracle Berkeley DB Java 版

    Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...

  4. 对C++默认构造函数的理解

    在文章开始之前,首先指出对于c++新手的两个常见的误解: 一.任何class如果没有定义default constructor,就会被合成出一个来. 二.编译器合成出来的default constru ...

  5. 数据库VIEW(视图)

    视图是基于 SQL 语句的结果集的可视化的表. 视图包括行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 我们能够向视图加入 SQL 函数.WHERE 以及 JOI ...

  6. EasyInvoice 简介

    注:本文首发于博客园 EasyInvoice 简介,转载请保留本链接 EasyInvoice(简称 EI) 是一款专门为网上卖家量身打造的管理进销存的软件. 1. 简介 解决卖家日常经营中一直存在的商 ...

  7. Java基础知识强化55:经典排序之归并排序(MergeSort)

    1. 归并排序的原理: 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例: 无序数组[6 2 4 1 5 9] ...

  8. htm初学笔记

    一.什么是html HTML(HyperText Markup Language):超文本标记语言,一种纯文本类型的语言 --使用带有尖括号的“标记”将网页中的内容逐一标识出来 用来设计网页的标记语言 ...

  9. (转)回车 执行button点击

    功能说明:当我们注册或者执行搜索时,输入内容后,不用单击按钮来执行按钮单击事件,而直接通过回车来执行按钮单击事件.只要在text框中onkeydown事件中加入执行按钮的onclick事件就OK了 代 ...

  10. c - 字符串长度.

    //字符串的长度. int lenOfStr(char *s) { char *p = s; ; while(*p++) len++; return len; }