一、在给出命令文件示例前,首先介绍该文件常用到的几种伪指令。
.cinit 程序编译连接时该标号表示部分存放已明确初始化的全局变量和静态变量;
.const 程序编译连接时该标号表示部分存放已明确初始化的字符串常量、全局变量和静态变量;
.switch 程序编译连接时该标号表示部分存放对于大型的switch语句的跳转表;
.text 程序编译连接时该标号表示部分存放可执行代码和浮点数常量;
.bss 该标号表示部分用于存放没有初始化的全局变量和静态变量;
.stack 用该标号定义软件堆栈。
命令文件名后缀为.CMD的文件实现对程序存储器空间和数据存储器空间的分配。该文件经常用到的伪指令有MEMORY伪指令和SECTIONS伪指令。
当然用户也可以用C语言编程实现所需的功能。
MEMORY伪指令用来表示实际存在的目标系统中可被使用的存储器范围,每个存储器范围都有名字、起始地址和长度。MEMORY伪指令的一般语法为:
MEMORY{
PAGE0: name[(attr)]: origin=constant, length=constant;
PAGE1: name[(attr)]: origin=constant, length=constant;
}
PAGE 标示存储器空间.用户可以规定多达255页,通常PAGE0规定程序存储器,PAGE1规定数据存储器.
name 命名存储器范围.存储器可以是1~8个字符,在不同页上的存储器范围可以具有相同的名字,但在一页之内所有的存储器范围必须具有唯一的名字且必须不重叠.
attr 规定与已命名范围有关的1~4个属性.未规定属性的存储器具有所有4个属性.有效的4个属性包括:
R 规定存储器只读;
W 规定存储器只写;
X 规定存储器可以包含可执行代码;
I 规定存储器可以被初始化.
origin 规定存储器范围的起始地址.
length 规定存储器范围的长度.
SECTIONS 伪指令的作用是:描述输入段怎样被组合到输出段内;在可执行程序内定义输出段;规定在存储器内何处存放置输出段;允许重命名输出段.SECTIONS伪指令的一般语法是:
SECTIONS{
name:[property, property, property, …]
name:[property, property, property, …]
name:[property, property, property, …]
}
每一个以name(名字)开始的段说明定义了一个输出段.在段名之后是特性列表,定义段的内容以及它们是怎样被分配的.特性可以用逗号来分开,段可能具有的特性是:
装载位置,它规定段装载在存储器内何处;
运行位置,它定义段在存储器内何处运行;
输入段, 它定义组成输出段的输入段;
段类型, 它定义特定段类型的标志;
填充段, 它定义用于填充未初始化空间的数值.
二、下面是一个简单实用的命令文件示例。
-stack 40
/*---------------------------------------*/
/* 命令文件-存储空间F2407 */
/*---------------------------------------*/
MEMORY
{ PAGE0: VECS :origin=0h, length=40h /* 程序复位 */
PVECS :origin=40h, length=70h /* 外围模块中断向量 */
PROG :origin=0b0h, length=7F50h /* 在片FLASH */
PAGE1:MMRS :origin=0h, length=05Fh /*MMRS */
B2 :origin=0060h, length=020h /*DARAM B2块 */
B0 :origin=0200h, length=100h /*DARAM B0块 */
B1 :origin=0300h, length=100h /*DARAM B1块 */
SARAM :origin=0800h, length=0800h /*SARAM块 */
EXT :origin=8000h, length=8000h /*外部存储器 */
}
/*-----------------------------------------*/
/* SECTIONS ALLOCATION */
/*----------------------------------------*/
SECTIONS{
.reset :{ } 〉 VECS PAGE 0 /* 复位中断向量表 */
.vectors :{ } 〉 VECS PAGE 0 /* 中断向量表 */
.pvecs :{ } 〉 PVECS PAGE 0 /* 外围模块中断向量表 */
.text :{ } 〉 PROG PAGE 0 /* 代码 */
.cinit :{ } 〉 PROG PAGE 0
.bss :{ } 〉 SARAM PAGE 1 /* 块 B2 */
.const :{ } 〉 SARAM PAGE 1 /* 块 B2 */
.stack :{ } 〉B1 PAGE 1 /* 堆栈---40个单元 */