ОК - Я уверен, что делаю что-то глупое, но я этого не вижу.
У меня есть небольшой образец программы на ассемблере, который я собираюсь предоставить коллеге, который хочет изучить ассемблер, но в нем есть странная ошибка, которую мне нужно сначала исправить. .
Когда выходной файл (DDNAME SYSUT2) является временным 80-байтовым файлом, он работает нормально. Измените SYSUT2 на SYSOUT=*, и он зациклится на «Закрывающемся файле» WTO.
Итак, вот программа:
//C.SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB
// DD DISP=SHR,DSN=SYS1.MODGEN
// DD DISP=SHR,DSN=SYS1.ASM.SASMMAC2
//* DD DISP=SHR,DSN=JOCS065.STEVE.SOURCE
- - - - - - - - - - - - - - - - 4 Line(s) not Displayed
TITLE 'TEST PROGRAM'
SYMBOLIC CSECT
ASMDREG .Register equates
SAVE (14,12),,'SYMBOLIC PARM SUB &SYSDATE &SYSTIME'
LR R12,R15 .R12 -> entry point
USING SYMBOLIC,R12 .Establish addressability
* Get the parm passed
L R1,0(R1) .R1 -> parm
LTR R1,R1 .Is there one?
BZ RETURN .No - return
* We have a parm
LH R2,0(R1) .R2 = PARM LENGTH
LTR R2,R2 .parm length = 0?
BZ RETURN . Yes - return
* And the parm has length
BCTR R2,0 .Decrement length for move
EX R2,SETOUT .Move parm to output
* Open output file and write parm to output
LA R4,FILE1 .R4 -> DCB for output file.
USING IHADCB,R4 .Establish addressability
OPEN (FILE1,OUTPUT) .Open log file
TM DCBOFLGS,DCBOFOPN .Open successful ?
BZ BADOPEN .No - go to error routine
WTO 'SIMSG001 OPEN successful.'
DROP R4
WTO 'SIMSG003 writing to file'
PUT FILE1,OUTREC .PUT output record
WTO 'SIMSG004 Closing file...'
CLOSE (FILE1) .close files
WTO 'SIMSG005 Returning to caller...'
B RETURN .Return
* EXecute instructions
SETOUT MVC OUTREC(0),2(R1)
*****************************************************************
* PROGRAM TERMINATION
*****************************************************************
RETURN DS 0H
WTO 'SIMSG006 RESTORING REGISTERS AND RETURNING'
XR R15,R15 .Clear R15 (RC=0)
RETURN (14,12),RC=(15) .Restore caller's regs and return
BADOPEN DS 0H
WTO 'SIMSG002 OPEN failed.'
B RETURN
*****************************************************************
* STORAGE AREAS
*****************************************************************
OUTREC DC 80C' ' .OUTPUT CARD IMAGE
*****************************************************************
* MACROS AND LITERALS
*****************************************************************
PRINT NOGEN
FILE1 DCB RECFM=F,LRECL=80,BLKSIZE=80, X
DSORG=PS,DDNAME=SYSUT2,MACRF=PM
DCBD
PRINT GEN
*
LTORG LITERAL STORAGE
END
//L.SYSLMOD DD DISP=SHR,DSN=<your.load.library>(SYMBOLIC)
//L.SYSPRINT DD SYSOUT=*
//L.SYSIN DD DUMMY
и JCL для его выполнения:
//JOBLIB DD DISP=SHR,DSN=<your.load.library>
//*
//STEP EXEC PGM=SYMBOLIC,PARM='THIS IS MY PARAMETER'
//SYSUT2 DD SYSOUT=*
Отправьте это и циклы заданий, и вы должны отменить это. Вы получаете «THIS IS MY PARAMETER», записанный в SYSUT2, но WTO показывает:
+SIMSG001 OPEN successful.
+SIMSG003 writing to file
+SIMSG004 Closing file...
+SIMSG005 Returning to caller...
+SIMSG006 RESTORING REGISTERS AND RETURNING
+SIMSG004 Closing file...
+SIMSG005 Returning to caller...
+SIMSG006 RESTORING REGISTERS AND RETURNING
+SIMSG004 Closing file...
+SIMSG005 Returning to caller...
+SIMSG006 RESTORING REGISTERS AND RETURNING
+SIMSG004 Closing file...
+SIMSG005 Returning to caller...
+SIMSG006 RESTORING REGISTERS AND RETURNING
+SIMSG004 Closing file...
+SIMSG005 Returning to caller...
+SIMSG006 RESTORING REGISTERS AND RETURNING
навсегда.
Измените SYSUT2 на:
//SYSUT2 DD DISP=(MOD,PASS),
// DSN=&AMSCNTL,
// UNIT=SYSDA,
// SPACE=(TRK,1)
работает (я знаю, что у меня был еще один шаг, чтобы сгенерировать временный файл в Sysout).
Таким образом, наличие FILE1 (SYSUT2) в качестве SYSOUT вызывает повреждение, так что кажется, что R14 восстанавливается только для того, чтобы указывать на WTO для SIMSG004.
Это старая программа, так что она должна работать. Я мало занимался ассемблером за последние 4 года, но у меня есть некоторый код, использующий стек компоновки и относительную адресацию, но я хочу сначала придерживаться некоторого простого кода базового смещения для обучения этого коллеги.
Любая идея, где это идет не так?