EXEC CICS 命令的翻译代码

应用程序可以用 COBOL、C、PL/I 或汇编语言编写,并包含 EXEC CICS 命令。 CICS®会翻译这些程序,并创建一个等效的源程序,其中每条命令现在都被翻译成原始源程序语言中的调用宏或语句。

翻译注意事项:EXEC CICS 命令中的 LENGTH 选项

在 COBOL、PL/I 和汇编语言中,如果未指定 NOLENGTH 翻译选项,翻译器会默认某些长度。 这意味着它们在指定数据区的程序中是可选的。 在 C 语言中,必须指定所有 LENGTH 选项。

LENGTH 选项指定一个半字二进制值,即 COMMAREA(通信区域)的长度(以字节为单位)。 如果请求是到 CICS TS 5.5 或更早版本的区域的 DPL,或者是通过 ISC 连接的 DPL,则该值不应超过 24 KB。 这一限制为 COMMAREA 和页眉留出了空间。

该 24 KB 限制不适用于 CICS 命令上的 FLENGTH 选项(由于架构限制,与终端相关的 SENDRECEIVE 命令除外)。 FLENGTH 选项用于与容器和日志等相关的命令。

对于临时存储、暂存数据和文件控制命令,数据集定义本身可能会施加更多限制。

COBOL 转换输出

EXEC CICS 命令将转换为对 CICS 接口 DFHEI1的调用。

图 1 显示了一个 EXEC 语句示例。
图 1。 EXEC 语句示例
EXEC CICS RETURN TRANSID('fred')
     COMMAREA(mycommarea) END-EXEC.
译为
Move length of mycommarea to dfhb0020
Call 'DFHEI1' using by content
          x'0e08e0000700001000f0f0f0f2f7404040'
          by content 'fred' by reference mycommarea
          by reference dfhb0020 end-call.

C 转换输出

对于 C 应用程序,每条命令都由重定向语句取代,后面是传递参数的 DFHEXEC 语句。

PL/I 转换输出

对于 PL/I 应用程序,每个命令总是替换为 DO 语句,生成的条目名称的声明, CALL 语句和 END 语句。 ENTRY 声明确保对自变量值进行相应的转换。

如果 PL/I 单元由一条 EXEC CICS 命令组成,则该命令应位于 BEGIN 块内,如下例所示。
示例
ON ERROR BEGIN;
         EXEC CICS RETURN;
         END;
同样,如果 EXEC CICS 命令与 PL/I 条件前缀相关联,则该命令应位于 BEGIN 块内,如下例所示。
示例
(NOZERODIVIDE): BEGIN;
                EXEC CICS GETMAIN
                SET(ptr-ref)
                LENGTH(data-value);
                END;

如果指定了 OPTIONS (MAIN) ,那么转换程序将通过插入 EIB 结构指针作为第一个参数来修改参数列表。 如果未指定 OPTIONS (MAIN) (即,如果要将程序链接到主模块) ,那么不会修改参数列表,如果需要访问链接编辑的程序,那么应用程序员负责在链接编辑的程序中处理 EIB 结构。 在任一情况下,如果程序以有效的 PL/I PROCEDURE 语句开始,那么转换程序将插入 EIB 结构的声明。

汇编程序转换输出

CICS 汇编语言应用程序的调用遵循系统标准。

在进入应用程序时,寄存器 1 , 15,14 和 13 包含以下地址:
  • 寄存器 1 包含参数列表的地址。 此列表至少有两个条目:
    • EIB (EXEC 接口块) 的地址
    • COMMAREA 的地址; 如果没有 COMMAREA ,那么条目为 X'00000000 '
  • 寄存器 15 包含入口点的地址。
  • 寄存器 14 包含返回点的地址。
  • 寄存器 13 包含保存区域的地址。

所有其他寄存器都未定义。

对于汇编语言应用程序,当 CICS 翻译器检测到 EXEC CICS 命令时,每个命令都会被 DFHECALL 宏的调用所取代。 DFHECALL 宏设置命令参数,并调用初始 CICS 命令处理器处理命令。 此宏扩展为使用寄存器 15,14 , 0 和 1 的系统标准调用序列。 有关详情,请参阅 DFHECALL 宏

除了调用 DFHECALL 宏外,转换程序还会将以下宏插入到源程序中:
  • 如果在批处理或联机 CICS 应用程序中使用 EXEC DLI,DFHEIGBL 宏将设置全局。 在 DFHEIGBL 中,如果 DFHEIDL 设置为 1 ,那么这意味着程序包含 EXEC DLI 命令。 如果 DFHEIDB 设置为 1 ,这意味着程序是批处理 DL/I。 如果您未使用 DL/I ,那么会将其注释并设置为 0。
  • DFHEIENT 宏插入在第一条 CSECT 或 START 指令之后。 它执行 prolog 代码来分配工作存储空间,以保存任何用户变量并供 CICS 使用。 有关详情,请参阅 DFHEIENT 宏

    对于 AMODE (24) 和 AMODE (31) 程序,转换程序自动插入的 DFHEIENT 宏提供的值可能不足以用于产生大于 4095 字节的转换输出的应用程序。 在此情况下,您可以提供自己的 DFHEIENT 宏版本。 有关更多信息,请参阅 编码 DFHEIENT for AMODE (24) 和 AMODE (31) 汇编语言程序

    对于 AMODE (64) 程序,必须指定 DFHEIENT 宏参数以指定程序使用相对寻址指令,因为仅支持相对寻址。 有关更多信息,请参阅 编码 DFHEIENT for AMODE (64) 汇编语言程序

  • DFHEIRET 宏执行后记代码,释放应用程序的工作存储:
    • 它会恢复寄存器。

      DFHEIRET RCREG=nn,其中 nn(除 13 以外的任何寄存器编号)包含寄存器恢复后放在寄存器 15 中的返回代码。 有关详细信息,请参阅 为汇编语言程序编码 DFHEIRET

    • 它将控制权返回到寄存器 14 中的地址。

    有关参考信息,请参阅 DFHEIRET 宏

  • DFHEISTGDFHEIEND 宏定义了动态存储,包括参数列表和保存区域所需的存储。 有关详细信息,请参阅 为汇编语言程序扩展动态存储。 有关参考信息,请参阅 DFHEISTG 宏DFHEIEND 宏

包含描述 EIB 的 DSECT 的副本 DFHEIBLK 也会自动包含在内。

程序必须具有 END 语句,因为转换程序不会以其他方式插入缺省宏。 此外, CSECT 或 START 和 END 必须大写才能使转换程序识别它们。

示例

本例显示了一个简单的汇编语言应用程序,该程序使用 BMS 命令 SEND MAP 向终端发送地图,随后显示了程序 INSTRUCT 翻译后的输出结果。

图 2 显示了源程序代码。

图 2。 源程序

INSTRUCT CSECT
         EXEC CICS SEND MAP('DFH$AGA') MAPONLY ERASE
         END
 

该源程序被转换为 图 3 中所示的输出。

图 3。 翻译代码

         DFHEIGBL ,                INSERTED BY TRANSLATOR
INSTRUCT CSECT
         DFHEIENT                  INSERTED BY TRANSLATOR
*        EXEC CICS SEND MAP('DFH$AGA') MAPONLY ERASE
         DFHECALL =X'1804C0000800000000046204000020',
               (CHA7,=CL7'DFH$AGA*'),(______RF,DFHEIV00)
         DFHEIRET                  INSERTED BY TRANSLATOR
         DFHEISTG                  INSERTED BY TRANSLATOR
         DFHEIEND                  INSERTED BY TRANSLATOR
         END