我正在编写一些汇编代码来执行'Hello World',但我想写入UNIX系统服务中的stdout,而不是WTO或PUT到DDName。
我使用'as'和'ld',没有任何特殊的选项来组装和链接,例如。
as -mlist hw.asm >hw.lst
ld hw.o
字符串
我希望我需要从某个地方拉入BPX 1WRT的库代码,但我在文档中找不到它。我最终得到:
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
型
1条答案
按热度按时间mrzz3bfm1#
您使用CALL宏而不是LINK(或更好的LINKX)宏来调用BPX 1WRT。这将静态地将BPX 1WRT的加载模块包含到链接程序中。使用LINKX来动态加载和执行BPX 1WRT。
链接错误是因为在链接步骤的SYSLIB DD中没有BPX 1WRT所在的系统库。