1

关于我正在使用的内容:我正在使用 z390 Portable Mainframe Assembler 和 Emulator。

尝试组装时出现“未找到基址寄存器”错误。

我试着放进去,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.

我试图让代码运行。

除此之外,我还有代码工作。

4

3 回答 3

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 生成基位移地址。我这样做了,它死了,因为我没有输入文件,但我预料到了。

于 2012-01-03T19:44:53.350 回答
0

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

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

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

于 2011-11-21T20:17:06.923 回答
0

我没有使用过z390(并且一般只知道一点关于390程序集),但是:SUBENTRY并且SUBEXIT必须是扩展为CSECT声明的宏和适当的寄存器摆弄进入/退出,所以我猜想嵌套在COPY2 SUBENTRY ... SUBEXIT里面COPY SUBENTRY ... SUBEXIT是一个非常糟糕的主意。

于 2011-10-10T00:41:19.580 回答