在z390大型机代码中使用Statement

时间:2011-10-09 23:30:12

标签: assembly mainframe zos

关于我正在使用的内容:我正在使用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.

我正在尝试运行代码。

除此之外我还有代码。

3 个答案:

答案 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个程序集),但是:SUBENTRYSUBEXIT必须是扩展为{{1}的宏声明和适当的寄存器摆弄进入/退出,所以我猜想将CSECT嵌套在COPY2 SUBENTRY ... SUBEXIT内是一个非常糟糕的主意。

答案 2 :(得分:0)

该网站没有明确表达如何对原始问题发表评论,因此我将在此处输入。

需要更多信息。汇编程序期望哪个基址寄存器? PRINT NOGEN说“不要显示由宏生成的指令”,如果没有看到它们,我们无法分辨出发生了什么。 PRINT GEN通常是默认值,通常很有用。

至于你的S0C1:在PSW之后显示的F6F6F6F64040的值是理解问题的关键。您添加的BASR 12,0指令似乎导致代码库使用了无效的地址。在异常终止时,寄存器12寻址具有F6F6...值的数据块,其第一个字节(F6)是无效操作码。无效的操作码产生S0C1异常终止。当基址寄存器被分配了不正确的地址时,就会发生这种情况。

相关问题