如何在辅助/汇编器中打印文字值

时间:2019-07-03 01:53:39

标签: assembly mainframe zos s390x

           MAIN       CSECT
           USING     MAIN,15
           L         6,=F'1000'
           XDECO     6,DISCOUNT
           XPRNT     LINE,80
           BR        14
           LTORG
LINE       DC        C'0'
DISCOUNT   DS        12C
           END       MAIN

所以我在IBM汇编器中有这段代码,我想做的是在寄存器6中打印1000decimal的值,但是当我运行代码时它什么也没显示

1 个答案:

答案 0 :(得分:2)

自从我使用 S/3x0 汇编程序以来已经快三十年了;自从我使用 ASSIST 以来已经有四十多个了,但让我们看看我是否能记住。

您的行 XDECO 6,DISCOUNT 会将字符“1000”放在位置 DISCOUNT;这似乎是正确的。我认为问题很可能是您的 XPRNT 语句中指定的长度。 (但请参阅下面我对运输控制的评论。)

在您的 XDECO 之后,您的存储部分如下所示:

  • LINE(1 个字节):“0
  • 折扣(12 个字节):“ 1000”(八个空格,后跟 "1000")

就是这样。只有 13 个字节。但是您的 XPRNT 说要打印 80 个字节,从 LINE 开始。问题是,只定义了前 13 个字节。在一个真正的汇编程序中,你有 13 个定义的字节,在未定义的区域中可能还有二进制零;我不确定 ASSIST 系统会做什么。

您应该执行以下操作之一:在 DC CL67' ' 之后声明您自己的另外 67 个字节 (DISCOUNT) 的填充;或将您的 XPRNT 限制为 13 个字节。

注意:与上面的评论相反,从 LINE 打印而不是从 DISCOUNT 打印是正确的; XPRNT 使用 carriage control 的第一个字符,并打印后面的内容;在这种情况下,'0' 不会被打印出来,而是用来告诉打印机在打印后面的文本之前前进 2 行。

实际上,习惯上第一个 XPRNT 使用回车控件“1”来指示前进到新页面。您的程序可能正在打印正确的信息(可能在“ 1000”之后有一些垃圾),但是如果没有提前到新页面,您会看到错误的位置,而不是直接在您的列表之后.

顺便说一句,这只是一个样式:您的 DISCOUNT 字段应该声明为:

DISCOUNT   DS        CL12

或者,甚至更好:

DISCOUNT   DC        CL12' '    NOTE: USE OF DC RATHER THAN DS HERE

而不是:

DISCOUNT   DS        12C

DISCOUNT DS CL12 表示声明一个长度为12的字符字段(未初始化;DS,“声明存储”,表示只声明该字段); DISCOUNT DC CL12' ' 表示声明一个长度为 12 的字符字段并预填充空白(DC,“声明常量”,不仅声明该字段,而且按指示填充它)。相比之下,DISCOUNT DS 12C 声明了一个包含 12 个字段的序列,每个字段的长度为 1(因为未指定)。这里不会让你感到厌烦,但是当没有明确指定长度时,一些汇编指令会使用字段的长度作为默认值,因此在声明时使用正确的长度是个好主意。