为 AMODE (24) 和 AMODE (31) 汇编语言程序编码 DFHEIENT 宏

对于 AMODE (24) 和 AMODE (31) 程序, DFHEIENT 宏调用 PROLOG 程序,该程序分配工作存储器以保存任何用户变量并供 CICS® 使用。 PROLOG 程序设置此存储器的 CICS 部分。 当程序返回时,此代码将设置由 DFHEIENT 参数指定的寄存器。 转换程序自动插入的 DFHEIENT 宏提供的值可能不足以用于产生大于 4095 字节的转换输出的应用程序。 在这种情况下,您可以提供自己的 DFHEIENT 宏版本,并指定 NOPROLOG 转换程序选项以防止转换程序自动插入其版本的 DFHEIENT 宏。

例如,缺省情况下,转换程序仅设置一个基本寄存器 (寄存器 3) ,这可能会导致程序的可寻址性问题。 您可以使用 CODEREG 操作数提供自己的 DFHEIENT 宏,以便可以指定多个基本寄存器。 如果使用与 CSECT 语句相同的标签对您自己的 DFHEIENT 宏版本进行编码,那么它可以替换源程序中的 CSECT 语句。 如果在没有标签的情况下对 DFHEIENT 宏进行编码,那么它必须紧跟在 CSECT 语句之后。

可以为 DFHEIENT 宏指定以下操作数:
代码
指定值 0 (缺省值) 以指定相对寻址。
或者指定基本寄存器。 请注意,不允许注册 13,14,15 和 1。
数据 (DATAREG)
为应用程序指定一个或多个工作存储器寄存器。 缺省值为寄存器 13 ,建议使用寄存器 13 作为第一个数据动态存储器寄存器。 如果没有, DFHECALL 宏生成的代码将添加额外的指令来处理寄存器 13。 DFHECALL 宏确保寄存器 13 寻址 DFHEISTG 在动态存储器中定义的保存区域。
EIBREG
指定用于寻址 EXEC 接口块 (EIB) 的寄存器。 缺省值为寄存器 11。
状态
为要使用的应用程序指定一个或多个静态寄存器。 缺省值为 register 3。
静态
指定静态区域开头的汇编程序标签。 必须指定值; 此参数没有缺省值。

在程序中使用基本寄存器

可以使用以下操作数来指定基本寄存器:
  • CODEREG-基本寄存器 (寄存器 13,14,15 ,不允许 1)
  • DATAREG-动态存储器寄存器
  • EIBREG-注册以寻址 EIB
例如,以下简单汇编语言应用程序使用 BMS 命令 SEND MAP 将映射发送到终端。
INSTRUCT CSECT
         EXEC CICS SEND MAP('DFH$AGA') MAPONLY ERASE
         END
以下示例代码增加了此程序的基本寄存器和数据寄存器的数量:
INSTRUCT DFHEIENT CODEREG=(2,3,4),
         DATAREG=(13,5),
         EIBREG=6
         EXEC CICS SEND
         MAP('DFH$AGA')
         MAPONLY ERASE
         END

符号寄存器 DFHEIPLR 等同于显式指定或缺省情况下获取的第一个 DATAREG。 DFHECALL 宏确保寄存器 13 寻址 DFHEISTG 在动态存储器中定义的保存区域,因此建议使用寄存器 13 作为第一个数据动态存储器寄存器。 如果没有, DFHECALL 生成的代码将添加额外的指令来处理寄存器 13。

DFHEIPLR 通过扩展 CICS 命令来包含 DFHEIENT 设置的值。 您应该将此寄存器专用,或者确保在每个 CICS 命令之前将其复原。

在程序中使用相对寻址

使用相对寻址时,不需要使用任何基本寄存器来寻址程序指令,但必须至少使用一个寄存器来寻址程序中的静态数据。 在 DFHEIENT 宏上指定以下操作数:
  • CODEREG=0 ,用于指定不使用任何寄存器来寻址程序指令。
  • STATREG ,用于指定一个或多个寄存器以寻址程序中的静态数据区。
  • STATIC ,用于指定程序中静态数据的开始地址。
如果使用相对寻址,请使用 IEABRCX DEFINE 宏 (由 z/OS®提供) 来重新定义分支指令的汇编程序助记符,以使用相对分支指令。 此外,确保作为 EXECUTE 指令目标的任何 LTORG 语句和指令出现在 STATIC 操作数中指定的标签之后。 例如:
         IEABRCX DEFINE                 Define relative branch mnemonics
RELATIVE DFHEIENT CODEREG=0,STATREG=(8,9),STATIC=MYSTATIC
         ....
         EX    R2,VARMOVE             Execute instruction in static area
         ....

MYSTATIC DS    0D                     Static data area
MYCONST  DC    C'constant'            Static data value
VARMOVE  MVC   WORKA(0),WORKB         Executed instruction
         LTORG ,                      Literal pool

有关 IEABRCX 宏的更多信息,请参阅 IEABRCX- z/OS MVS Programming: Assembler Services Reference IAR-XCT中的相对分支宏扩展。

需要 LTORG 语句的位置

使用 DLI 选项翻译的汇编语言程序会在每个 CSECT 语句之后插入 DLI 初始化调用。 大于 4095 字节且不使用 DFHEIENT 宏的 CODEREG 操作数来建立多个基本寄存器的汇编语言程序必须包含 LTORG 语句,以确保由 DFHEIENT 或 DLI 初始化调用生成的字面值位于基本寄存器的范围内。

通常,长度超过 4095 字节的每个 CSECT 都需要一个 LTORG 语句。

相关信息