.comm 伪操作
用途
定义称为公共块的未初始化存储器块。
语法
| 项 | 描述 |
|---|---|
| .comm | Qualname , Expression, [, Number [, Visibility ]] |
其中QualName=Name[[StorageMappingClass]]
注: 名称 是必需的。 StorageMappingClass)是可选的,如果指定,则用括号括起来。 如果省略StorageMappingClass,则 RW 为默认值。 如果指定了 可视性 ,那么可以省略 Number 。
描述
.comm 伪操作定义公共块,这是未初始化的存储器块。 QualName 参数指定公共块的名称。 QualName 定义为全局符号。
Expression 参数指定公共块的大小 (以字节计)。
请注意: Symbols with the TD StorageMappingClass are conventionally no longer than a pointer. (指针在 32 位方式下为 4 字节长,在 64 位方式下为 8 字节长。)
StorageMappingClass参数的有效值为 BS、RW、TD、UC 和 UL。 这些值在 .csect 伪操作的描述中进行说明。 如果对StorageMappingClass参数使用了任何其他值,则会使用默认值 RW,如果使用了-w标志,则会报告一条警告信息。
如果将 TD 用于存储映射类,那么将在 .data 部分中以初始化的 csect 形式将由 Expression 参数指定的长度为零的块写入 TOC 区域。 如果 RW , UC 或 BS 用作存储映射类,那么块不会在当前模块中初始化,并且具有符号类型 CM (公共)。 在装入时,将在 .data 部分末尾的 .bss 部分中创建具有 RW , UC 或 BC 存储映射类的 CM 控制部分的空间。
多个模块可以共享同一个公共块。 如果其中任何一个模块具有同名的外部控制部分 (csect) ,并且同名的 csect 具有 BS 或 UC 以外的存储映射类,那么将初始化公共块并成为该其他控制部分。 如果公共块将 TD 作为其存储映射类,那么 csect 将位于 TOC 区域中。 这是在绑定时完成的。
如果在链接时找到多个具有相同 Qualname 的未初始化公共块,那么将为最大的公共块保留空间。
可以使用 Number 参数来对齐公共块,该参数被指定为所需对齐的日志库 2。
可以使用 可视性 参数来指定公共块的可视性。
参数
| 项 | 描述 |
|---|---|
| 限定名 | 指定公共块的名称和存储映射类。 如果省略了参数的StorageMappingClass部分,则使用默认值 RW。 普通数据块的有效StorageMappingClass)值为 RW、TD、UC、BS 和 UL。 |
| expression | 指定绝对表达式,该表达式给出指定公共块的长度 (以字节为单位)。 |
| 编号 | 指定指定公共块的可选对齐方式。 指定为所需对齐的日志库 2。 例如, 8 (或双字) 的对齐方式为 3 ,而 2048 的对齐方式为 11。 这类似于 .align 伪操作的自变量。 |
| 可视性 | 指定符号的可视性。 有效值为 export, protected, hidden和 internal。 链接程序使用符号可视性。 |
示例
- 以下示例演示如何使用 .comm 伪操作:
.comm proc,5120 # proc is an uninitialized common block of # storage 5120 bytes long which is # global # Assembler SourceFile A contains: .comm st,1024 # Assembler SourceFile B contains: .globl st[RW] .csect st[RW] .long 1 .long 2 # Using st in the above two programs refers to # Control Section st in Assembler SourceFile B. - 此示例显示了两个不同的模块如何访问相同的数据:
- C 模块的源代码td2.c:
/* This C module named td2.c */ extern long t_data; extern void mod_s(); main() { t_data = 1234; mod_s(); printf("t_data is %d\n", t_data); } - 汇编程序模块的源mod2.s:
.file "mod2.s" .csect .mod_s[PR] .globl .mod_s[PR] .set RTOC, 2 l 5, t_data[TD](RTOC) # Now GPR5 contains the # t_data value ai 5,5,14 stu 5, t_data[TD](RTOC) br .toc .comm t_data[TD],4 # t_data is a global symbol - 有关生成可执行文件的指示信息 td2从 C 和汇编程序源:
as -o mod2.o mod2.s cc -o td2 td2.c mod2.o - 正在运行td2将导致打印以下内容:
t_data is 1248
- C 模块的源代码td2.c:
- 以下示例显示如何指定符号的可视性:
.comm block, 1024, , exported
# block is an uninitialized block of storage 1024 bytes
# long. At link time, block is exported.