. 使用伪操作

用途

允许用户指定基地址并分配基注册号。

语法

描述
. 使用 表达式, 注册

描述

. 使用 伪操作将表达式指定为基地址,并分配一个基寄存器,假定 注册 参数在运行时包含 表达式 的程序地址。 无需先前定义符号名称。

注: . 使用 伪操作不会装入基本寄存器; 程序员应确保在使用隐式地址引用之前将基本地址装入到基本寄存器中。

. 使用 伪操作仅影响具有基于隐式的地址的指令。 它可以在控制部分 (csect) 名称和 csect 中的所有标签上发出。 也可以在 dsect 名称和 dsect 中的所有标签上使用。 不允许其他类型的外部符号 (.extern)。

使用范围

. 使用 伪操作程序的范围 (使用范围) 是 -32768 或 32767 字节,从 . 使用 伪操作程序中指定的基地址开始。 汇编程序将位于使用范围内的每个隐式地址引用 (或表达式) 转换为显式的基于地址的形式。 对于超出使用范围的引用,将报告错误。

当一个 . 使用 伪操作的基地址位于另一个 . 使用 伪操作的范围内时,两个使用范围重叠。 当使用范围重叠发生时,汇编程序通过从基地址中选择最小带符号偏移作为位移来转换隐式地址引用。 相应的基寄存器以显式地址形式使用。 这仅适用于出现在第二个 . 使用 伪操作之后的隐式地址。

在下一个示例中,使用范围为base2data[PR]重叠。 第二个 指令位于第二个 . 使用 伪操作之后。 因为偏移量data[PR]d12大于以下值的偏移量:base2d12,base2仍在选择中。

        .csect  data[PR]
        .long   0x1
dl:     .long   0x2
base2:  .long   0x3
        .long   0x4
        .long   0x4
        .long   0x5
d12:    .long   0x6
        l 12, data_block.T(2)   # Load addr. of data[PR] into r12
        ca1 14, base2(12)       # Load addr. of base2 into r14
        .using base2, 14
        l 4, d12                # Convert to 1 4, 0xc(14)
        .using data[PR], 12
        l 4, d12                # Converts to 1 4, 0xc(14)
                                # because base2 is still chosen
        .toc
data_block.T:   tc data_block[tc], data[PR]

存在一个内部使用表,汇编程序使用该表来跟踪 . 使用 伪操作。 使用表的每个条目都指向 csect ,该 csect 包含 . 使用 伪操作的 表达式 参数指定的表达式或标签。 使用的表仅由 . 使用 伪操作进行更新。 源程序中 . 使用 伪操作的位置会影响基于隐式地址的转换的结果。 下面两个示例说明了此转换。

示例 1:

            .using   label1,4
            .using   label2,5
            .csect   data[RW]
label1:     .long    label1
            .long    label2
            .long    8
label1_a:   .long    16
            .long    20
label2:     .long    label2
            .long    28
            .long    32
label2_a:   .long    36
            .long    40
            .csect   sub1[pr]
            1        6,label1_a      # base address label2 is
                                     # chosen, so convert to:
                                     # 1 6, -8(5)
            1        6,label2_a      # base address label2 is
                                     # chosen, so convert to:
                                     # 1 6, 0xc(5)
示例 2:

            .csect  data[RW]
label1:     .long   label1
            .long   label2
            .long   12
label1_a:   .long   16
            .long   20
label2:     .long   label2
            .long   28
            .csect  sub2[pr]
            .using  label1,4
            1       6,label1_a       # base address label1 is
                                     # chosen, so convert to:
                                     # 1 6, 0xc(4)
           .using   label2,5
            1       6,label1_a       # base address label2 is
                                     # chosen, so convert to:
                                     # 1 6, -8(5)
当在两个不同的 . 使用 伪操作中指定相同的基地址时,两个使用范围一致,而使用的基寄存器则不同。 由于使用表从最低编号寄存器搜索到最高编号寄存器,因此当转换为显式地址形式时,汇编器使用最低编号寄存器作为基本寄存器。 下一个示例显示了以下情况:

        .csect  data[PR]
        .long   0x1
dl:     .long   0x2
base2;  .long   0x3
        .long   0x4
        .long   0x5
dl2:    .long   0x6
        1 12, data_block.T(2)   # Load addr. of data[PR] into r12
        1 14, data_block.T(2)   # Load addr. of data[PR] into r14
        .using data[PR], 12
        1 4, dl2                # Convert to: 1 4, 0x14(12)
        .using data[PR], 14
        1 4, dl2                # Convert to: 1 4, 0x14(12)
        .toc
data_block.T:   .tc data_block[tc], data[PR]

使用域

. 使用 伪操作 (使用域) 的域从 . 使用 伪操作出现在 csect 中的位置开始,并继续到源模块的末尾,但以下情况除外:

  • 后续 .drop 伪操作指定由先前的 . 使用 伪操作指定的相同基本寄存器。
  • 后续 . 使用 伪操作指定由先前的 . 使用 伪操作指定的相同基本寄存器。

这两个例外提供了使用新基地址的方法。 下面两个示例说明了这些例外情况:

示例 1:

        .csect  data[PR]
        .long   0x1
dl:     .long   0x2
base2;  .long   0x3
        .long   0x4
        .long   0x5
dl2:    .long   0x6
        1 12, data_block.T(2)   # Load addr. of data[PR] into r12
        ca1 14, base2(12)       # Load addr. of base2 into r14
        .using base2, 14
        1 4, dl2                # Convert to: 1 4, 0xc(14)
                                # base address base2 is used
        1 14, data_block.T(2)   # Load addr. of data[PR] into r14
        .using data[PR], 14
        1 4, dl2                # Convert to: 1 4, 0x14(14)
        .toc
data_block.T:   .tc data_block[tc], data[PR]
示例 2:

        .csect  data[PR]
        .long   0x1
dl:     .long   0x2
base2;  .long   0x3
        .long   0x4
        .long   0x5
dl2:    .long   0x6
        1 12, data_block.T(2)   # Load addr. of data[PR] into r12
        ca1 14, base2(12)       # Load addr. of base2 into r14
        .using base2, 14
        1 4, dl2                # Convert to: 1 4, 0xc(14)
        .drop 14
        .using data[PR], 12
        1 4, dl2                # Convert to: 1 4, 0x14(12)
        .toc
data_block.T:    .tc data_block[tc], data[PR]
注: 汇编程序不会转换在 "使用域" 外部的隐式地址引用。 因此,如果这些隐式地址引用出现在定义当前 csect 的基地址的任何 . 使用 伪操作之前,或者出现在 .drop 伪操作删除当前 csect 的所有基地址之后,那么将报告一个错误。
下一个示例显示错误条件:

        .csect  data[PR]
        .long   0x1
dl:     .long   0x2
base2;  .long   0x3
        .long   0x4
        .long   0x5
dl2:    .long   0x6
        1 4, dl2                # Error is reported here
        1 12, data_block.T(2)   # Load addr. of data[PR] into r12
        1 14, data_block.T(2)   # Load addr. of data[PR] into r14
        .using data[PR], 12
        1 4, dl2
        1 4, 0x14(12)
        .drop 12
        1 4, dl2                # Error is reported here
        .using data[PR], 14
        1 4, dl2
        1 4, 0x14(14)
        .toc
data_block.T:   .tc data_block[tc], data[PR]
        .csect  data1[PR]
dl3:    .long   0x7
        .using  data[PR], 5
        1 5, dl3                # Error is reported
                                # here, dl3 is in csect
                                # data1[PR] and
                                # Using table has no entry of
                                # csect data1[PR] 
        l 5, dl2                # No error, because dl2 is in
                                # data [PR]

参数

描述
寄存器 表示表达式的寄存器号。 它必须是绝对的,并且必须求值为 0 到 31 (包括 0 和 31) 之间的整数。
expression 指定包含标签的标签或表达式,该标签或表达式表示程序中的位移或相对偏移量。 如果该符号是组合件中定义的 csect 或目录 (TOC) 条目,那么 表达式 参数可以是外部符号。

示例

以下示例演示了如何使用 . 使用 伪操作:

.csect data[rw]
.long 0x0, 0x0
d1:     .long 0x25
# A read/write csect contains the label d1.
.csect text[pr]
.using data[rw], 12
l 4,d1
# This will actually load the contents of
# the effective address, calculated by
# adding the address d1 to the address in
# GPR 12, into GPR 4