编写 BMS 宏

由于 BMS 宏是汇编语言语句,因此必须遵循汇编语言语法规则。

以下一组规则起作用,但它们比实际规则更严格。 有关汇编语言语法规则的完整集合,请参阅 High Level Assembler Language Reference
  1. 列 1 中的开始名称。 映射和映射集名称的长度最多可以为 7 个字符。 字段名的最大长度 (DFHMDF 宏) 取决于编程语言。 BMS 通过向字段名称添加一个字符的后缀来创建标签。 这些标签的长度不得超过目标语言允许的长度,因为它们会复制到程序中。 因此,地图字段名的限制为: COBOL 语言为29个字符,Pl/I和汇编语言H为30个字符,汇编语言F为7个字符。对于C和C++语言,若地图作为内部数据对象复制到程序中,限制为30个字符;若作为外部数据对象, 限制为6个字符(有关复制地图的更多信息,请参阅获取和定义地图存储空间)。
  2. 在第 10 列中启动宏标识,或者如果名称超过 8 个位置,请在其与名称之间留一个空白。 对于字段定义,标识始终为 DFHMDF; 对于映射定义,标识为 DFHMDI; 对于开始和结束映射集的映射集宏,标识为 DFHMSD。
  3. 其余字段描述由关键字 (例如,位置参数的 POS) 后跟值组成。 有时关键字没有值,但如果有值,那么等号 (=) 总是将关键字与其值分隔开。
  4. 在宏标识后留一个空白,然后启动关键字。 它们可以按任何顺序显示。
  5. 用一个逗号 (无空格) 分隔关键字,但不要在最后一个逗号后面放置逗号。
  6. 关键字可以延伸到第 71 列。 如果需要更多空间,请在最后一个完全适合该行的关键字后面的逗号后面停止,并在下一行的第 16 列中恢复。
  7. 初始值 (INITIAL , XINIT 和 GINIT 关键字) 是规则的例外,因为即使在新行上开始,它们也可能不合适。 除非涉及双字节字符,否则您可以在初始值本身的第一个字符之后的任何位置拆分这些字符。 以这种方式拆分时,请使用 71 之前的所有列,并在下一行的第 16 列中继续。 与普通单字节 (SBCS) 数据相比,双字节字符集 (DBCS) 数据表达更复杂。 如果您具有 DBCS 初始值,请参阅步骤 12
  8. 用单引号将初始值括起来。 如果需要 文本中使用单引号,请使用两个连续的单引号 (汇编程序将除去额外的单引号)。 对于汇编程序来说,省略号也具有特殊意义,您可以使用相同的技巧:在需要一个省略号的地方使用两个省略号,汇编程序就会删除多余的省略号。
  9. 如果对宏使用多行,请在 除最后一行以外的所有行的第 72 列中放置一个字符 (除空白以外的任何字符)。
  10. 如果要在映射中使用注释,请在宏之间使用注释行,而不是在组成单个宏的行之间使用注释行。 注释行在列 1 中有星号,在列 72 中有空白。 您的注释可以显示在第 2-71 列中的任何位置。
  11. 仅使用大写, INITIAL 参数和注释中的值除外。
  12. 对于包含 DBCS 的初始值。 如果具有 完全 DBCS 的初始数据,请对数据使用 GINIT 关键字,并同时指定关键字 PS=8 。 如果您的数据同时包含 DBCS 和 SBCS 字符,即,如果它是混合的,请使用 INITIAL 并指定 SOSI=YES。 (我们需要解释第三种替代方法 XINIT ,因为您可能会在维护的代码中找到它。 但是,如果可能,您应该使用 GINIT 和 INITIAL ,因为 XINIT 更难使用,并且您的数据未被完全验证。 XINIT 可用于纯 DBCS 或混合 DBCS。 带有 PS=8 的 XINIT 遵循 GINIT 的规则,带有 SOSI=YES 的 XINIT 遵循那些针对 INITIAL 的规则 (大部分至少)。 主要区别是您使用 XINIT 以十六进制表示数据,但对 GINIT 和 INITIAL 使用普通字符。)
    这是您编写 DBCS 初始值的方式:
    • 使用单引号将数据括起来,就像使用普通 INITIAL 参数一样。
    • 对常量中的每个 DBCS 字符使用两个普通字符 (两对带有 XINIT 的十六进制数字) ,对每个 SBCS 字符使用一个普通字符 (一对带有 XINIT 的字符)。
    • 将每个 DBCS 字符串用紧接前面的移出 (SO) 字符和紧接后面的移入 (SI) 字符括起来。 SO是十六进制 X'0E' ,在大多数键盘上显示为'<',SI是 X'0F' ('>')。 (XINIT with PS=8 是一个例外;SO/SI括号是隐含的,无需键入。) 例如,所有这些都定义了相同的初始值,这完全是 DBCS。 (忽略该时刻的 LENGTH 值; 我们会在某个时刻解释这些值。)
       GINIT='<D1D2D3D4D5>',PS=8,LENGTH=10
      INITIAL='<D1D2D3D4D5>',SOSI=YES,LENGTH=12
      XINIT='C4F1C4F2C4F3C4F4C4F5',PS=8,LENGTH=10
      XINIT='0EC4F1C4F2C4F3C4F4C4F50F',SOSI=YES,LENGTH=12
    • SBCS 和 DBCS 序列可以与 INITIAL (以及 XINIT 与 SOSI=YES) 的任意组合相互跟随。 如果在上一个示例中的 DBCS 字符串前面添加 "ABC" ,并在该字符串后面添加 "def" ,那么有:
      
      INITIAL='ABC<D1D2D3D4D5>def',SOSI=YES,LENGTH=18
      XINIT='C1C2C30EC4F1C4F2C4F3C4F4C4F50F848586',SOSI=YES,LENGTH=18
    • 要计算初始值的长度,请对每个 DBCS 字符计数 2 ,对每个 SBCS 字符计数 1 ,无论您是用普通字符还是十六进制对表示它们。 对于 GINIT (以及具有 PS=8的 XINIT) ,您不计算 SO 和 SI 字符,但对于 INITIAL (以及具有 SOSI=YES 的 XINIT) ,您将为每个 SO 和每个 SI 添加一个。 (请注意先前示例中相同常量的不同 LENGTH 值。) 在所有情况下, LENGTH 值都不得超过 256。
    • 对于 GINIT 和 INITIAL ,如果您的常量不适合在一行上,那么将使用 "扩展" 延续规则,这些规则与先前描述的规则稍有不同。 通过扩展延续,您可以在初始值中的任何完整字符 (SBCS 字符, DBCS 对或结束 DBCS 字符串的 SI) 之后停止。 如果您位于 DBCS 字符串中间,请添加一个 SI (一行上的 SOs 和 SIs 必须平衡)。 然后使用连续字符填写贯穿第 72 列的行。 任何字符都会这样做,只要它与行上最后一个有意义的字符不同。
      如果已在 DBCS 字符串中停止,请在下一行的第 16 列中放入 SO 字符并在 17 中恢复; 否则仅在 16 中恢复,因此:
      GXMPL1 DFHMDF
      POS=(02,21),LENGTH=20,PS=8,GINIT='<D1D2D3D4D5D6>******
      <D7D8D9D0>'
      IXMPL1 DFHMDF
      POS=(02,21),LENGTH=23,PS=8,INITIAL='abc<D1D2D3D4>ABC**
      DEFGHIJ'

      不能将扩展延续与 XINIT 配合使用; 请使用步骤 7中描述的规则。

    • 如果 LENGTH 规范超过了您提供的初始值的长度,那么如果您使用了 GINIT (或带有 PS=8的 XINIT) ,那么将在右边使用 DBCS 空白将该值填入 LENGTH 值。 如果使用了 INITIAL ,那么如果常量的最后一部分是 SBCS ,那么填充字符是 SBCS 空白; 如果最后一部分是 DBCS ,那么 DBCS 空白。 如果将 XINIT 与 SOSI=YES 配合使用,那么填充字符始终为 SBCS 空白。