.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 伪操作的自变量。
可视性 指定符号的可视性。 有效值为 exportprotectedhiddeninternal。 链接程序使用符号可视性。

示例

  1. 以下示例演示如何使用 .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.
    
  2. 此示例显示了两个不同的模块如何访问相同的数据:
    1. 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);
      }
      
    2. 汇编程序模块的源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
      
    3. 有关生成可执行文件的指示信息 td2从 C 和汇编程序源:
      
      as -o mod2.o mod2.s
      cc -o td2 td2.c mod2.o
      
    4. 正在运行td2将导致打印以下内容:
      
      t_data is 1248
      
  3. 以下示例显示如何指定符号的可视性:
		.comm block, 1024, , exported
		# block is an uninitialized block of storage 1024 bytes 
		# long. At link time, block is exported.