采用 System/390 汇编语言进行编码

使用汇编语言对 IBM® MQ for z/OS® 程序进行编码时,请注意以下部分中的信息。

名称

调用描述中的参数名称和结构描述中的字段名称以混合大小写的形式显示。 在 IBM MQ随附的汇编语言宏中,所有名称均为大写。

使用 MQI 调用

MQI 是调用接口,因此汇编语言程序必须遵守操作系统链接约定。

具体而言,汇编语言程序在发出 MQI 调用之前,必须将寄存器 R13 指向至少包含 18 个全字的保存区域。 此保存区域为被调用程序提供存储器。 它在调用者寄存器的内容销毁之前存储这些寄存器,并在返回时复原调用者寄存器的内容。

注: 这对于使用 DFHEIENT 宏来设置其动态存储器,但选择将缺省 DATAREG 从 R13 覆盖到其他寄存器的 CICS® 汇编语言程序很重要。 当 CICS Resource Manager 接口从存根接收控制时,它会将寄存器的当前内容保存在 R13 所指向的地址。 未能为此目的保留保存区域将产生不可预测的结果,并且可能导致 CICS中的异常终止。

声明常量

大多数常量在宏 CMQA 中声明为等式。

但是,以下常量无法声明为等式,并且在使用缺省选项调用宏时不会包含这些常量:
  • MQACT_NONE
  • MQCI_NONE
  • MQFMT_NONE
  • MQFMT_ADMIN
  • MQFMT_COMMAND_1
  • MQFMT_COMMAND_2
  • MQFMT_DEAD_LETTER_HEADER
  • MQFMT_EVENT
  • MQFMT_IMS
  • MQFMT_IMS_VAR_STRING
  • MQFMT_PCF
  • MQFMT_STRING
  • MQFMT_TRIGGER
  • MQFMT_XMIT_Q_HEADER
  • MQMI_NONE
要包含这些常量,请在调用宏时添加关键字 EQUONLY=NO。

CMQA 防范多重声明,因此可以多次将其包含在内。 但是,仅在首次包含宏时,关键字 EQUONLY 才会生效。

指定结构的名称

为允许声明结构的多个实例,生成该结构的宏使用用户可指定的字符串和下划线字符 (_) 作为各字段名称的前缀。

请在调用宏时指定字符串。 如果不指定字符串,那么宏使用结构的名称来构造前缀:

* Declare two object descriptors
CMQODA         Prefix used="MQOD_" (the default)
MY_MQOD CMQODA         Prefix used="MY_MQOD_"

调用描述 中的结构声明显示缺省前缀。

指定结构的形式

宏可以通过两种形式之一生成结构声明(由 DSECT 参数控制):
DSECT=YES
汇编语言 DSECT 指令用于启动新数据段;结构定义紧跟在 DSECT 语句之后。 由于未分配存储器,因此无法初始化。 宏调用中的标签用作数据段的名称;如果未指定标签,那么将使用结构的名称。
DSECT=NO
汇编语言 DC 指令用于定义例程中当前位置的结构。 字段使用值进行初始化,可以通过对宏调用中的相关参数进行编码来指定这些值。 宏调用中未指定值的字段使用缺省值进行初始化。

如果未指定 DSECT 参数,那么采用 DSECT=NO。

控制列表

您可以使用 LIST 参数来控制汇编语言列表中结构声明的外观:
LIST=YES
结构声明出现在汇编语言列表中。
LIST=NO
结构声明不出现在汇编语言列表中。 如果未指定 LIST 参数,那么采用此形式。

指定字段的初始值

您可以指定要用于对结构中的字段初始化的值,方法是将该字段的名称(没有前缀)编码为宏调用中的参数,随附所需的值。

例如,要声明具有使用 MQMT_REQUEST 初始化的 MsgType 字段以及使用字符串 MY_REPLY_TO_QUEUE 初始化的 ReplyToQ 字段的消息描述符结构,请使用以下代码:

MY_MQMD    CMQMDA      MSGTYPE=MQMT_REQUEST,       X
REPLYTOQ=MY_REPLY_TO_QUEUE

如果将命名常量(或等式)指定为宏调用中的值,请使用 CMQA 宏来定义命名常量。 不得将字符串值用单引号 (' ') 引起来。

编写可重新输入的程序

IBM MQ 将其结构用于输入和输出。 如果要使程序保持可重新输入,请执行以下操作:
  1. 将结构的工作存储器版本定义为 DSECT,或者定义在已定义的 DSECT 内联的结构。 然后,将 DSECT 复制到使用以下方式获取的存储器:
    • 对于批处理程序和 TSO 程序, STORAGE 或 GETMAIN z/OS 汇编程序宏
    • 对于 CICS,工作存储器 DSECT (DFHEISTG) 或 EXEC CICS GETMAIN 命令
    要正确初始化这些工作存储器结构,请将对应结构的常量版本复制到工作存储器版本。
    注: MQMD 和 MQXQH 结构的长度各超过 256 个字节。 要将这些结构复制到存储器,请使用 MVCL 汇编程序指令。
  2. 通过使用 LIST 形式 (MF=L) 的 CALL 宏保留存储器中的空间。 使用 CALL 宏进行 MQI 调用时,请使用宏的 EXECUTE 格式 ( MF=E) ,使用先前保留的存储器,如 使用 CEDF下的示例中所示。 有关如何执行此操作的更多示例,请参阅 IBM MQ随附的汇编语言样本程序。

使用汇编语言 RENT 选项来帮助确定程序是否可重新输入。

有关编写可重新输入程序的信息,请参阅 MVS/ESA Application Development Guide: Assembler Language Program, GC28-1644。

使用 CEDF

如果要使用 CICS提供的事务 CEDF ( CICS Execution Diagnostic Facility) 来帮助您调试程序,请将 ,VL 关键字添加到每个 CALL 语句,例如:

CALL MQCONN,(NAME,HCONN,COMPCODE,REASON),MF=(E,PARMAREA),VL

先前示例是可重新输入的汇编语言代码,其中 PARMAREA 是所指定的工作存储器中的区域。