如何在 assist/assembler 中打印文字值
how to print a literal value in assist/assembler
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 但是当我 运行 代码时它没有显示任何东西
自从我使用 S/3x0 汇编器以来已经快三十年了;自从我使用 ASSIST 以来已有 40 多个,但让我们看看我是否记得。
您的行 XDECO 6,DISCOUNT
会将字符“1000”放在 DISCOUNT
位置;这似乎是正确的。我认为问题可能出在您的 XPRNT
语句中指定的长度。 (但请参阅下面我对回车控制的评论。)
在你的 XDECO 之后,你的存储部分看起来像这样:
- LINE(1 字节):“
0
”
- DISCOUNT(12 个字节):“
1000
”(八个空格,后跟
"1000")
就是这样。只有 13 个字节。但是你的 XPRNT
说要打印 80 个字节,从 LINE
开始。问题是,只定义了前 13 个字节。在一个真正的汇编程序中,你有 13 个已定义的字节,并且可能在未定义区域中有二进制零;我不确定 ASSIST 系统会做什么。
您应该执行以下操作之一:在 DISCOUNT
之后声明您自己的另外 67 个字节 ( DC CL67' '
) 的填充;或将您的 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
,“declare storage”,表示只声明该字段); DISCOUNT DC CL12' '
表示声明一个长度为12的字符域,并预填空格(DC
,“声明常量”,不仅声明该域,而且按指示填充)。相反,DISCOUNT DS 12C
声明了十二个字段的序列,每个字段的长度为 1(因为未指定)。它不会在这里烧你,但是一些汇编程序指令会在未明确指定长度时使用字段的长度作为默认值,因此在声明时使用正确的长度是个好主意。
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 但是当我 运行 代码时它没有显示任何东西
自从我使用 S/3x0 汇编器以来已经快三十年了;自从我使用 ASSIST 以来已有 40 多个,但让我们看看我是否记得。
您的行 XDECO 6,DISCOUNT
会将字符“1000”放在 DISCOUNT
位置;这似乎是正确的。我认为问题可能出在您的 XPRNT
语句中指定的长度。 (但请参阅下面我对回车控制的评论。)
在你的 XDECO 之后,你的存储部分看起来像这样:
- LINE(1 字节):“
0
” - DISCOUNT(12 个字节):“
1000
”(八个空格,后跟 "1000")
就是这样。只有 13 个字节。但是你的 XPRNT
说要打印 80 个字节,从 LINE
开始。问题是,只定义了前 13 个字节。在一个真正的汇编程序中,你有 13 个已定义的字节,并且可能在未定义区域中有二进制零;我不确定 ASSIST 系统会做什么。
您应该执行以下操作之一:在 DISCOUNT
之后声明您自己的另外 67 个字节 ( DC CL67' '
) 的填充;或将您的 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
,“declare storage”,表示只声明该字段); DISCOUNT DC CL12' '
表示声明一个长度为12的字符域,并预填空格(DC
,“声明常量”,不仅声明该域,而且按指示填充)。相反,DISCOUNT DS 12C
声明了十二个字段的序列,每个字段的长度为 1(因为未指定)。它不会在这里烧你,但是一些汇编程序指令会在未明确指定长度时使用字段的长度作为默认值,因此在声明时使用正确的长度是个好主意。