尝试在 z/OS 上的汇编器中调用 BPX1WRT 时发生链接错误

问题描述 投票:0回答:1

我正在编写一些汇编代码来执行“Hello World”,但我想写入 UNIX 系统服务中的 stdout,而不是 WTO 或 PUT 到 DDName。

我使用“as”和“ld”,没有任何特殊选项来组装和链接,例如

as -mlist hw.asm >hw.lst
ld hw.o

我希望我需要从某个地方提取 BPX1WRT 的库代码,但我在文档中找不到它。我最终得到:

 Assembler Done No Statements Flagged
 IEW2457E 9208 SYMBOL BPX1WRT UNRESOLVED.  NO CALL LIBRARY SPECIFIED.
 IEW2665S 40FF MODULE *NULL*  IS NON-EXECUTABLE AND WAS NOT SAVED BECAUSE
          STORENX=NEVER.
IEW5033 The binder ended with return code 12.

我将其编码为可重入代码。这是代码(我希望这里存在可寻址性错误,因为我还没有链接它)

        PRINT ON,GEN,DATA
HELLO   CSECT
*
* Prolog
*
        SAVE (14,12)
        BASR R12,0
        USING *,R12
        STORAGE OBTAIN,LENGTH=DYNSIZE,ADDR=(R11)
        USING DYNAREA,R11
        LA R2,SAVEA
        ST R2,8(,R13)
        ST R13,SAVEA+4
        LR R13,R2
*
* Body
* Write Hello World to STDOUT
*
        MVC RECORD,=C'Hello World'
        MVC RECLEN,RECSIZE
        LA  R15,RECORD
        ST  R15,RECADDR
        CALL BPX1WRT,                                                  +
               (STDOUT,                                                +
               RECORD,                                                 +
               BPXALET,                                                +
               RECLEN,                                                 +
               RV,                                                     +
               RC),                                                    +
               VL,MF=(E,PLIST)

*
* Epilog
*
        STORAGE RELEASE,LENGTH=DYNSIZE,ADDR=(R11)
        RETURN (14,12),RC=0
        LTORG
*
* Statics (constants)
*
STDOUT  DC F'0'
STDIN   DC F'1'
STDERR  DC F'2'
BPXALET DC F'0'
*
* Dynamic (storage obtain'ed) area
*
DYNAREA DSECT
DYNSIZE EQU DYNEND-*
*
* Stack save area always first
*
SAVEA   DS 18F
*
* Working storage
*
RECSIZE EQU RECEND-*
RECORD  DS CL80
RECLEN  DS F
RECEND  EQU *
RECADDR DS A
RV      DS F
RC      DS F
PLIST   DS 10A * Is this enough?
*
* End of working storage
*
DYNEND  EQU *
*
* Equates
*
R0      EQU 0
R1      EQU 1
R2      EQU 2
R3      EQU 3
R4      EQU 4
R5      EQU 5
R6      EQU 6
R7      EQU 7
R8      EQU 8
R9      EQU 9
R10     EQU 10
R11     EQU 11
R12     EQU 12
R13     EQU 13
R14     EQU 14
R15     EQU 15
        END
assembly zos
1个回答
0
投票

您正在使用 CALL 宏而不是 LINK(或更好的 LINKX)宏来调用 BPX1WRT。这将静态地将 BPX1WRT 的加载模块包含到您的链接程序中。使用 LINKX 来动态加载和执行 BPX1WRT。

链接错误是因为链接步骤的SYSLIB DD中没有BPX1WRT所在的系统库。

© www.soinside.com 2019 - 2024. All rights reserved.