.csect 伪操作
用途
将代码或数据分组到 csect (控制部分) 中,并为该 csect 指定名称,存储映射类和对齐方式。
语法
其中QualName=[名称][[StorageMappingClass]]
注意:包含StorageMappingClass的粗体括号是语法的一部分,并不指定可选参数。
描述
以下信息讨论如何使用 .csect 伪操作:
- csect QualName 参数采用以下格式:
symbol[XX]或
符号{XX}
其中, [] (方括号) 或 { } (大括号) 围绕两个或三个字符的存储映射类标识。 这两种类型的方括号产生相同的结果。
可以省略 QualName 参数。 如果省略,csect 将不命名,并使用 [PR]StorageMappingClass。 如果使用QualName,Name参数为可选参数,StorageMappingClass为必填参数。 如果未指定 名称 ,那么 csect 未命名。
每个 csect 伪操作都有一个关联的存储映射类。 存储映射类确定在其中对 csect 伪操作进行分组的对象部分。 .text 部分通常包含只读数据,例如指示信息或常量。 .data, .bss, .tdata和 .tbss 部分包含读/写数据。 .bss的存储映射类。 .tbss 必须与 .comm和 .lcomm 伪操作 (而不是 .csect 伪操作) 配合使用。
存储映射类还指示应该包含在 csect 中的数据类型。 列出的许多存储映射类具有特定的实现和约定详细信息。 通常,指令可以包含在存储映射类 PR 的 csects 中。 可修改数据可以包含在存储映射类 RW 的 csects 中。
csect 伪操作与下列其中一个存储映射类相关联。 存储映射类标识不区分大小写。 存储映射类标识在 .data, .tbss, .tdata, .text和 .tss 对象文件部分的组中列出。
.text 部分存储器-映射类 PR 程序代码。 标识为模块提供可执行指令的部分。 RO 只读数据。 标识包含在执行期间未修改的常量的部分。 DB 调试表。 标识与只读数据具有相同特征的部分的类。 GL 胶水代码。 标识与程序代码具有相同特征的部分。 此类型的部分具有用于与另一个模块中的例程进行接口的代码。 接口代码需求的一部分是在整个呼叫中保持 TOC 可寻址性。 XO 扩展操作。 标识与 TOC 没有依赖关系 (没有通过 TOC 的引用) 的代码部分。 它旨在驻留在内存中的固定地址,以便它可以成为绝对地址的分支的目标。 注: 不应在汇编程序源程序中使用此存储映射类。
SV 主管呼叫。 标识要作为主管调用处理的代码部分。 TB 回溯表。 标识包含与回溯表关联的数据的部分。 TI 回溯索引。 标识包含与回溯索引关联的数据的部分。 .data 部分存储器-映射类 TC0 TOC 锚点仅由预定义的 TOC 符号使用。 标识特殊符号 TOC。 仅用于 TOC 锚点。 TC TOC 条目。 通常指示包含其他 csects 或全局符号的地址的 csect。 如果它只包含一个地址,那么 csect 的长度通常为 4 个字节。 - TD
- TOC 条目。 标识包含可从 TOC 直接访问的标量数据的 csect。 对于常用的全局符号,这是通过 TOC 中的地址指针 csect 进行间接访问的替代方法。 按照约定, TD 节不应超过 4 个字节。 包含可在程序执行期间修改的已初始化数据。
UA 未知类型。 标识包含未知存储映射类的数据的部分。 RW 读/写数据。 标识包含已知在执行期间需要更改的数据的部分。 DS 键。 标识函数描述符。 此信息用于描述语言 (例如 C 和 FORTRAN) 中的函数指针。 .bss 部分存储器-映射类 BS BSS 类。 标识包含未初始化的读/写数据的部分。 UC 未命名的 FORTRAN 公共。 标识包含读/写数据的部分。 csect 是下列其中一种符号类型:
ER 外部引用 (external reference) SD CSECT 部分定义 LD 入口点-标签定义 CM 公共 (BSS) .tdata 部分存储器-映射类 TL 已初始化线程-本地存储器。 标识在运行时为程序中的每个线程实例化的 csect。 .tbss 部分存储器-映射类 UL 未初始化的线程-本地存储器。 标识在运行时为程序中的每个线程实例化的 csect。 - 具有相同 QualName 值的所有 csects 都分组在一起,并且可以使用具有相同 QualName的 .csect 语句继续部分。 不同的 csects 可以具有相同的名称和不同的存储映射类。 因此,当引用 csect 名称作为其他伪操作数或指令的操作数时,必须使用存储映射类标识。
但是,对于给定的名称,只能外部化一个 csect。 如果将具有相同名称的两个或多个 csects 外部化,那么可能会发生运行错误,因为链接编辑器会将 csects 视为重复的符号定义并仅选择其中一个来使用。
- csect 作为主体重定位。
- 没有指定名称 (Name) 的 csects 通过其存储映射类进行标识,并且每个存储映射类都可以有一个未命名的 csect。 它们是使用仅具有存储映射类的 QualName (例如, .csect [RW] 具有 QualName [RW]) 指定的。
- 如果在出现任何指示信息之前未指定 .csect 伪操作,那么将采用未命名的程序代码 ([PR]) csect。
- 具有 BS 或 UC 存储映射类的 csect 将具有 CM (公共) 的 csect 类型,该类型保留空间但没有已初始化的数据。 使用 .csect 伪操作定义的所有其他 csects 的类型为 SD (节定义)。 .comm 或 .lcomm 伪操作也可用于定义类型为 CM的 csects。 不能在类型为 CM的 csect 中定义外部标签。
- 不标注 .csect 语句。 .csect可以用其QualName来表示,标签可以放在.csect的各个元素上。
参数
| 项 | 描述 |
|---|---|
| 编号 | 指定求值为从 0 到 31 (包括 31) 的整数值的绝对表达式。 此值指示所需对齐的日志库 2。 例如, 8 (双字) 的对齐将由整数值 3 表示; 2048 的对齐将由整数值 11 表示。 这类似于 .align 伪操作的 Number 参数的用法。 对齐发生在 csect 的开头。 csect 的元素未单独对齐。 Number 参数是可选的。 如果未指定,那么缺省值为 2。 |
| QualName | 为 csect 指定名称和StorageMappingClass。 如果未给出Name,则用StorageMappingClass)来标识 csect。 如果 "名称和 "StorageMappingClass均未给出,则该节段未命名,其存储映射类别为 [PR]。 如果指定了名称,还必须指定StorageMappingClass。 |
示例
以下示例定义了三个 csects:
# A csect of name proga with Program Code Storage-Mapping Class.
.csect proga[PR]
lh 30,0x64(5)
# A csect of name pdata_ with Read-Only Storage-Mapping Class.
.csect pdata_[RO]
l1: .long 0x7782
l2: .byte 'a,'b,'c,'d,'e
.csect [RW],3 # An unnamed csect with Read/Write
# Storage-Mapping Class and doubleword
# alignment.
.float -5