伪指令SEGMENT被用来声明一个普通段。一个再定位类型(relocation type)和一个地址分配类型(allocation type)可以按如下形式指明:
segment | SEGMENT | class | reloctype | alloctype |
其中
segment | 是分配给段的符号名。该符号名由后面的RSEG伪指令引用。段符号名也可用于表达式中代表由连接/定位器计算的组合段的基地址或起始地址。 |
class | class是指定段所用的存储类型。class为该段指明了存储空间。参见下面的表格获取更多信息。 |
reloctype | 是该段的再定位类型。它决定连接/定位器要完成什么样的再定位选项。参见下面的表格获取更多信息。 |
alloctype |
是该段的地址分配类型。它决定连接/定位器要完成什么样的再定位选项。参见下面的表格获取更多信息。 |
Class(存储类型)
一个模块中每个段的名称必须是唯一的。但是,连接器将把相同类型的段组合起来。对于在其它源文件模块中定义的段也是如此。class为段指明了存储类型空间。A251区分基本存储类型和用户定义的存储类型。连接/定位器使用class访问属于那一存储类型的所有段。
基本的存储类型如下表:
基本存储类型 | 说 明 |
---|---|
BIT | BIT空间(地址20H .. 2FH)。 |
CODE | CODE空间 |
CONST | CONST空间;同CODE但只能存储常数;通过MOVC访问。 |
DATA | DATA空间(地址0到7FH & SFR寄存器) |
EBIT | 扩展的251位空间(地址20H .. 7FH) |
EDATA | EDATA空间 |
ECONST | ECONST空间;同EDATA但只能存储常数 |
IDATA | IDATA空间(地址0到0FFH) |
ECODE | Intel/Atmel WM 251和Philips 80C51MX存储程序代码的整个地址空间。 |
HCONST | Intel/Atmel WM 251和Philips 80C51MX存储常数的整个地址空间。 |
HDATA | Intel/Atmel WM 251和Philips 80C51MX存储数据的整个地址空间。 |
XDATA | XDATA空间;通过MOVX访问。 |
用户定义的存储类型名称(只适用于AX51和A251)
用户定义的存储类型名称由一个基本的存储类型名称和一个扩展名组成,还要用单引号(')把它括起来。使用它们,我们可以像使用基本的存储类型名称一样访问相同的地址空间。好处是我们可以用一个用户定义的存储类型声名几个段,以后使用连接器把那一类型(及其段)定位在一个特定的物理地址中。参见英文手册336页的“CLASSES”获取如何定位用户定义类型的信息。
例程
seg1 | SEGMENT | 'NDATA FLASH' |
seg2 | SEGMENT | 'HCONST BITIMAGE' |
seg3 | SEGMENT | 'DATA1' |
重定位类型(Relocation Type)
选项重定位类型定义可能由连接/定位器完成的重定位操作。下表列出了正确的重定位类型:
重定位类型 | 说 明 |
AT 地址 | 声明一个绝对段。该段将被定位在指定的地址。 |
BITADDRESSABLE | 声明一个将被放置在位可寻址空间(DATA空间20H到2FH)的段。BITADDRESSABLE只适用于DATA存储类型的段,并且长度不能超过16个字节。 |
INBLOCK | 声明一个必须包含在2048字节模块中的段。该重定位类型只对具有CODE存储类型的段有效。 |
INPAGE | 声明一个必须包含在2048字节页中的段。 |
OFFS 偏移量 | 声明一个绝对段。该段被定位在指定类型存储空间起始地址加指定偏移量的位置。与AT重定位类型相比较,它的优点是起始地址可以用Lx51连接/定位器控制指令CLASSES修改。参见英文手册336页的“CLASSES”获取更多信息。 |
OVERLAYABLE | 指明该段可以与其它段共享存储空间。具有该重定位类型的段可以与其它也用OVERLAYABLE重定位类型声明过的段相重叠。当使用该重定位类型时,段名必须遵守C251,CX51,C51或PL/M-51的段名规则。 |
INSEG | 参见C编译器用户指南获取更多信息。 |
地址分配类型(Allocation Type)
选项地址分配类型定义可能由连接/定位器完成的地址分配操作。下表列出了正确的地址分配类型:
地址分配类型 | 说 明 |
BIT | 为段指明位对齐。对于所有具有BIT存储类型的段这是默认值。 |
BYTE | 为段指明字节对齐。对于除BIT外的所有段,这是默认值。 |
WORD | 为段指明字对齐。 |
DWORD | 为段指明双字对齐。 |
PAGE | 声明一个段的起始地址必须在256字节的页边界上。 |
BLOCK | 声明一个段的起始地址必须在2048字节的块边界上。 |
SEG | 声明一个段的起始地址必须在64K字节的段边界上。 |
段声明的例子
IDS SEGMENT IDATA ;定义一个名为IDS的段,其存储类型为IDATA。 MYSEG SEGMENT CODE AT 0FF2000H ;定义一个名为MYSEG的段,其存储类型为CODE,而且被定位在地址0FF2000H。 HDSEG SEGMENT HDATA INSEG DWORD ;定义一个名为HDSEG的段,存储类型为HDATA。该段位于64K字节的段内,并且是DWORD对齐的。 XDSEG SEGMENT XDATA PAGE ;定义一个名为XDSEG的段,存储类型为XDATA。该段是PAGE对齐的,也就是说从256字节的页开始。 HCSEG SEGMENT HCONST SEG ;定义一个名为HCSEG的段,存储类型为HCONST。该段是SEGMENT对齐的,也就是说从64K字节段开始。