关于我正在使用的内容:我正在使用z390便携式大型机汇编程序和模拟器。
尝试组装时,我收到“无基址寄存器”错误。
我尝试输入USING *,12
,但无论我把它放在哪里都没有做任何事情。 “找不到基地登记册”
我尝试应用BASR 12,0;
出错了。我得到了:
17:53:44 PROG4 EZ390 EZ390E error 11 ABEND PSW=07050600 800FFCEC F6F6F6F64040 ????? ABEND S0C1
17:53:44 PROG4 EZ390 EZ390E error 12 program aborting due to abend S0C1
装配手册位于http://publibz.boulder.ibm.com/epubs/pdf/asmr1020.pdf,但我无法应用它。
我查看的来源:http://en.wikipedia.org/wiki/IBM_Basic_assembly_language#Assembler_instructions
如何让汇编程序找到基址寄存器?
更新:基本寄存器仍有问题。
其他资源:
www.tradingwiz.net63.net/pdf/Sessions5and6.pdf
www.z390.org/z390_Documentation.htm
TITLE 'CS 4321 Program #4 by J. Colt Wright'
PRINT NOGEN
COPY SUBENTRY
USING *,12
TITLE 'PROGRAM 4 80/80 LISTING'
PRINT NOGEN
COPY2 SUBENTRY
WTO 'PROG4 COPY PROG4 (ASCII) TO COPY (ASCII)'
OPEN (INFILE,INPUT)
OPEN (OUTFILE,OUTPUT)
WTO 'Files opened successfully'
*
LOOP EQU *
GET INFILE,IRECORD
MVC ORECORD,=CL80' '
MVC ORECORD(72),IRECORD
PUT OUTFILE,ORECORD
B LOOP
*
EOF EQU *
CLOSE (INFILE,,OUTFILE)
WTO 'PROG4 ENDED OK'
SUBEXIT
SUBEXIT
INFILE DCB DDNAME=INFILE, X
DSORG=PS, X
RECFM=FT, X
LRECL=72, X
EODAD=EOF, X
MACRF=GM
*
OUTFILE DCB DDNAME=OUTFILE, X
DSORG=PS, X
RECFM=FT, X
LRECL=80, X
MACRF=PM
*
IRECORD DC CL72' '
ORECORD DC CL80' '
ENDPGM DS D
END COPY
我得到异常终止或“找不到基址寄存器”错误,具体取决于我是否提供COPY2 SUBENTRY.
我正在尝试运行代码。
除此之外我还有代码。
答案 0 :(得分:2)
首先,您不需要COPY SUBENTRY,因为在首次处理过程中只会将宏定义的副本放入源中。有时您可能需要它(特别是宏调试),但这不是其中之一。 (SUBENTRY / EXIT随z390一起分发为辅助宏。)
我拿走了你的程序并删除了PRINT NOGEN语句。一般来说,我不喜欢使用PRINT NOGEN,因为它抑制了很多信息,例如SUBENTRY生成的指令。在树木打印输出的时代,你看到了更多,但现在当列表发送到磁盘时,这不是什么大问题。
通常,当您有像SUBENTRY这样的输入宏时,它会设置一个基址寄存器。删除PRINT NOGEN表明它实际上将寄存器13(或R13 - 汇编程序中的常用缩写)保存区域放在程序区的开头,和它使用R13作为基址寄存器并初始化它。发生的事情是你遇到了汇编程序的文档规则,但没有多少人记住它。规则是:如果一个地址被多个USING语句覆盖,汇编器将使用编号较小的寄存器。你的USING *,12开头是覆盖整个程序,这没关系,但它与SUBENTRY产生的“USING COPY2 + 8,13”重叠。
所以会发生的是,您的数据区域由两个寄存器覆盖,汇编程序选择较低的值(12)。而且因为你从来没有在R12中加载一个值,它指的是谁知道什么。因此,当您尝试从该寄存器中访问数据时 - 繁荣。
简单的解决方案是从程序中删除USING *,12,汇编程序从R13生成基本位移地址。我这样做了,因为我没有输入文件而死了,但是我预料到了。
答案 1 :(得分:0)
我没有使用z390(并且一般只知道390个程序集),但是:SUBENTRY
和SUBEXIT
必须是扩展为{{1}的宏声明和适当的寄存器摆弄进入/退出,所以我猜想将CSECT
嵌套在COPY2 SUBENTRY ... SUBEXIT
内是一个非常糟糕的主意。
答案 2 :(得分:0)
该网站没有明确表达如何对原始问题发表评论,因此我将在此处输入。
需要更多信息。汇编程序期望哪个基址寄存器? PRINT NOGEN说“不要显示由宏生成的指令”,如果没有看到它们,我们无法分辨出发生了什么。 PRINT GEN通常是默认值,通常很有用。
至于你的S0C1:在PSW之后显示的F6F6F6F64040
的值是理解问题的关键。您添加的BASR 12,0
指令似乎导致代码库使用了无效的地址。在异常终止时,寄存器12寻址具有F6F6...
值的数据块,其第一个字节(F6)是无效操作码。无效的操作码产生S0C1异常终止。当基址寄存器被分配了不正确的地址时,就会发生这种情况。