我正在编写一些汇编代码来执行“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
您正在使用 CALL 宏而不是 LINK(或更好的 LINKX)宏来调用 BPX1WRT。这将静态地将 BPX1WRT 的加载模块包含到您的链接程序中。使用 LINKX 来动态加载和执行 BPX1WRT。
链接错误是因为链接步骤的SYSLIB DD中没有BPX1WRT所在的系统库。