.csect 伪操作

用途

将代码或数据分组到 csect (控制部分) 中,并为该 csect 指定名称,存储映射类和对齐方式。

语法

描述
.csect 限定名称[,编号]

其中QualName=[名称][[StorageMappingClass]]

注意:包含StorageMappingClass的粗体括号是语法的一部分,并指定可选参数。

描述

以下信息讨论如何使用 .csect 伪操作:

  • csect QualName 参数采用以下格式:
    
    symbol[XX]
    

    符号{XX}

    其中, [] (方括号) 或 { } (大括号) 围绕两个或三个字符的存储映射类标识。 这两种类型的方括号产生相同的结果。

    可以省略 QualName 参数。 如果省略,csect 将不命名,并使用 [PR]StorageMappingClass。 如果使用QualNameName参数为可选参数,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。
  • 具有 BSUC 存储映射类的 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