我有以下代码:
START ,
YREGS , register equates, syslib SYS1.MACLIB
CRTMEM CSECT ,
CRTMEM AMODE 31
CRTMEM RMODE ANY
SYSSTATE AMODE64=NO,ARCHLVL=OSREL,OSREL=SYSSTATE
IEABRCX DEFINE convert based branches to relative
*-------------------------------------------------------------------
* Linkage and storage obtain
*-------------------------------------------------------------------
BAKR R14,0 use linkage stack
LARL R12,DATCONST setup base for CONSTANTS
USING DATCONST,R12 "baseless" CSECT
STORAGE OBTAIN,LENGTH=WALEN,EXECUTABLE=NO
LR R10,R1 R10 points to Working Storage
USING WAREA,R10 BASE FOR DSECT
MVC SAVEA+4(4),=C'F1SA' linkage stack convention
LAE R13,SAVEA ADDRESS OF OUR SA IN R13
*-------------------------------------------------------------------
* application logic -
*-------------------------------------------------------------------
STORAGE OBTAIN,LENGTH=DCB_LEN,EXECUTABLE=NO,LOC=24
LR R2,R1 R2 points to Output DCB
LIB_OPEN DS 0H
MVC 0(DCB_LEN,R2),CONST_DCB
OPEN ((R2),OUTPUT),MODE=24
CIJE R15,0,OPEN_SUCCESS
OPEN_FAIL DS 0H
LR R9,R15 put err code in R9
B DONE
*
OPEN_SUCCESS DS 0H
LA R9,0 CRTMEM successful put 0 in R9
*-------------------------------------------------------------------
* Linkage and storage release. set RC (reg 15) -
*-------------------------------------------------------------------
DONE DS 0H
RLSE STORAGE RELEASE,ADDR=(R10),LENGTH=WALEN,EXECUTABLE=NO
LR R15,R9 get saved rc into R15
PR , return to caller
*-------------------------------------------------------------------
* constants and literal pool -
*-------------------------------------------------------------------
DATCONST DS 0D Doubleword alignment for LARL
CONST_DCB DCB DSORG=PO,MACRF=(W),DDNAME=MYDD
DCB_LEN EQU *-CONST_DCB
WRITE_BUFFER DC CL80'Hello world'
LTORG , create literal pool
*-------------------------------------------------------------------
* DSECT -
*-------------------------------------------------------------------
WAREA DSECT
SAVEA DS 18F
WALEN EQU *-SAVEA
IHADCB DCBD
DCBLEN EQU *-IHADCB
END CRTMEM
我的目标是将记录写入 PDSE,然后执行 STOW,然后执行 CLOSE,但我陷入了 OPEN,这给了我一个保护异常。
我已将数据集
FULTONM.ASMXMP.DATA
分配为:
Data Set Name . . . : FULTONM.ASMXMP.DATA .
. .
. General Data Current Allocation .
. Management class . . : STANDARD Allocated tracks . : 100 .
. Storage class . . . : OS390 Allocated extents . : 1 .
. Volume serial . . . : Z2B066 Maximum dir. blocks : NOLIMIT .
. Device type . . . . : 3390 .
. Data class . . . . . : DATAF .
. Organization . . . : PO Current Utilization .
. Record format . . . : FB Used pages . . . . : 5 .
. Record length . . . : 80 % Utilized . . . . : 0 .
. Block size . . . . : 80 Number of members . : 0 .
. 1st extent tracks . : 100 .
. Secondary tracks . : 100 .
. Data set name type : LIBRARY Dates .
. Data set encryption : NO Creation date . . . : 2024/02/09 .
. Data set version . : 1 Referenced date . . : ***None*** .
. Expiration date . . : ***None***
我使用以下 JCL:
//CRTMEM EXEC PGM=CRTMEM
//STEPLIB DD DSN=FULTONM.ASMXMP.LOAD,DISP=SHR
//MYDD DD DSN=FULTONM.ASMXMP.DATA,DISP=SHR
我收到以下异常终止:
IEF236I ALLOC. FOR FULTONMA CRTMEM
IGD103I SMS ALLOCATED TO DDNAME STEPLIB
IGD103I SMS ALLOCATED TO DDNAME MYDD
IEA995I SYMPTOM DUMP OUTPUT
SYSTEM COMPLETION CODE=0C4 REASON CODE=00000011
TIME=23.01.41 SEQ=43178 CPU=0000 ASID=0096
PSW AT TIME OF ERROR 078C1000 80CCD038 ILC 4 INTC 11
NO ACTIVE MODULE FOUND
NAME=UNKNOWN
DATA AT PSW 00CCD032 - 1B22A516 00FFBF27 1001A774
AR/GR 0: 00000000/00000058 1: 00000000/00900EF4
2: 00000000/00000000 3: 00000000/00CCD228
4: 00000000/008B7E88 5: 00000000/008FFCD8
6: 00000000/A6900EF4 7: 00000000/00F6B700
8: 00000000/00000000 9: 00000000/01963E78
A: 00000000/008FFD98 B: 00000000/008B7E88
C: 00000000/010AE210 D: 00000000/26901FB8
E: 00000000/80CCC706 F: 20000000/008B7E88
我在 OPEN 之前放置了 ST 0,0 以按照建议检查寄存器:
I put a ST 0,0 just before the open and I see:
2: 00000000/00016FA8 3: 00000000/02CDAA00
4: 00000000/7F629D70 5: 00000000/008BEE88
6: 00000000/271FAFD8 7: 00000000/7F629006
8: 00000000/008BE288 9: 00000000/7F62A1FF
A: 00000000/271F9FB8 B: 00000000/7F629006
C: 00000000/271F8F38 D: 00000000/271F9FB8
E: 00000000/0000030B F: 20000000/00000000
所以我觉得R2看起来还可以。
这里是STORAGE OBTAIN和OPEN的扩展:
0 368 STORAGE OBTAIN,LENGTH=DCB_LEN,EXECUTABLE=NO,LOC=24
000032 9AFF C0A8 00148 370+ LAM 15,15,=AL1(B'00100000',(0),(0),B'00000000') X01-STORA
+ .SET AR 15 @P9C
000036 5800 C0B8 00158 371+ L 0,=A(DCB_LEN) .STORAGE LENGTH @P9C 01-STORA
1 Page 4
Active Usings: WAREA,R10 DATCONST,R12
0 Loc Object Code Addr1 Addr2 Stmt Source Statement HLASM R6.0 2024/02/10 14.05
000003A 58F0 C0BC 0015C 372+ L 15,=AL1(B'00100000',(0*16),(0),B'00010010') X01-STORA
+ .CONTROL INFORMATION @P9C
00003E 58E0 0010 00010 373+ L 14,16(0,0) .CVT ADDRESS 01-STORA
000042 58EE 0304 00304 374+ L 14,772(14,0) .ADDR SYST LINKAGE TABLE 01-STORA
000046 58EE 00A0 000A0 375+ L 14,160(14,0) .OBTAIN LX/EX FOR OBTAIN 01-STORA
00004A B218 E000 00000 376+ PC 0(14) .PC TO STORAGE RTN 01-STORA
00004E 1821 377 LR R2,R1 R2 points to Output DCB
0000050 379 LIB_OPEN DS 0H
000050 D257 2000 C000 00000 000A0 380 MVC 0(DCB_LEN,R2),CONST_DCB
000056 5000 0000 00000 381 ST 0,0
382 OPEN ((R2),OUTPUT),MODE=24
00005A 0700 384+ CNOP 0,4 Align list to word 01-OPEN
00005C A715 0004 00064 386+ BRAS 1,*+8 (BAS) 02-00318
000060 00000000 387+ DC A(0) Opt byte & DCB or ACB addr 01-OPEN
000064 BE27 1001 00001 388+ STCM R2,B'0111',0+1(1) Store DCB or ACB addr @L3C 01-OPEN
000068 928F 1000 00000 389+ MVI 0(1),143 Set option byte 01-OPEN
00006C 0A13 390+ SVC 19 Issue OPEN SVC 01-OPEN
00006E ECF8 0006 007E 0007A 391 CIJE R15,0,OPEN_SUCCESS
查看宏扩展,我意识到这不是我想要的,因为我希望代码是可重入的,所以我将 OPEN 宏更改为:
381 OPEN ((R2),OUTPUT),MF=(E,OPEN_PARMS),MODE=24
000056 4110 A048 00048 385+ LA 1,OPEN_PARMS LOAD PARAMETER REG 1 02-IHBIN
00005A 94F0 1000 00000 386+ NI 0(1),X'F0' CLEAR OPTION 1 BITS @L3M 01-OPEN
00005E 960F 1000 00000 387+ OI 0(1),15 INSERT OPTION BITS @L3M 01-OPEN
000062 BE27 1001 00001 388+ STCM R2,B'0111',0+1(1) Store DCB or ACB address @L3C 01-OPEN
000066 0A13 389+ SVC 19 Issue OPEN SVC 01-OPEN
但仍然得到了保护例外。我在可写区域中将 OPEN_PARMS 设置为:
000000 00000 0004C 486 WAREA DSECT
000000 487 SAVEA DS 18F
000048 488 OPEN_PARMS DS 1A
我希望得到有关我出错的地方的指导,也许还有一些关于如何调试 SVC 中因保护异常而失败的代码的提示和技巧 😩
我从 @pjfarley3 和 Marc van der Meer 那里得到了很多帮助,并且已经解决了问题。
这是打开然后关闭数据集的“工作代码”(不是超级有用,但至少它显示了打开和关闭)。
关键的区别在于我如何设置 OPEN 和 CLOSE 参数列表 - 我将参数列表的正确副本更改为 OPEN 和 CLOSE 参数的可写区域,然后事情开始变得更好。 我还将获得的存储清除为 0 - 我不相信这是必需的,因此我会出于好奇而进行实验,但这对于 OPEN 和 CLOSE 参数可能是必要的(我认为这对于 DCB 来说不是必要的,因为无论如何,我正在使用 MVC 复制存储)。
START ,
YREGS , register equates, syslib SYS1.MACLIB
CRTMEM CSECT ,
CRTMEM AMODE 31
CRTMEM RMODE ANY
SYSSTATE AMODE64=NO,ARCHLVL=OSREL,OSREL=SYSSTATE
IEABRCX DEFINE convert based branches to relative
*-------------------------------------------------------------------
* Linkage and storage obtain
*-------------------------------------------------------------------
BAKR R14,0 use linkage stack
LARL R12,DATCONST setup base for CONSTANTS
USING DATCONST,R12 "baseless" CSECT
STORAGE OBTAIN,LENGTH=WALEN,EXECUTABLE=NO,LOC=ANY,CHECKZERO=YES
LR R10,R1 R10 points to Working Storage
USING WAREA,R10 BASE FOR DSECT
*
* Clear storage
*
CHI R15,X'0014' X'14': storage zeroed
BE STG_WA_CLEAR
LR R2,R1 system did not clear, do ourselves
LA R3,WALEN
XR R5,R5
MVCL R2,R4 clear storage (pad byte zero)
STG_WA_CLEAR DS 0H
*
MVC SAVEA+4(4),=C'F1SA' linkage stack convention
LAE R13,SAVEA ADDRESS OF OUR SA IN R13
*-------------------------------------------------------------------
* application logic -
*-------------------------------------------------------------------
*
* DCB has to be below the line
*
STORAGE OBTAIN,LENGTH=DCBLEN,EXECUTABLE=NO,LOC=24,CHECKZERO=YES
LR R8,R1 R8 points to Output DCB
USING DCBAREA,R8
*
* Clear storage
*
CHI R15,X'0014' X'14': storage zeroed
BE STG_DCB_CLEAR
LR R2,R1 system did not clear, do ourselves
LA R3,DCBLEN
XR R5,R5
MVCL R2,R4 clear storage (pad byte zero)
STG_DCB_CLEAR DS 0H
*
*
* Copy the DCB template into 24-bit storage
* The OPEN_PARMS and DCBE is 31-bit to minimize below-line stg
*
LIB_OPEN DS 0H
MVC LIB_DCB(DCBLEN),CONST_DCB
MVC OPEN_PARMS(OPENLEN),CONST_OPEN
OPEN (LIB_DCB,OUTPUT),MF=(E,OPEN_PARMS),MODE=31
CIJE R15,0,OPEN_SUCCESS
*
OPEN_FAIL DS 0H
LR R9,R15 put err code in R9
B DONE
*
OPEN_SUCCESS DS 0H
*
*
LIB_CLOSE DS 0H
MVC CLOSE_PARMS(CLOSELEN),CONST_CLOSE
CLOSE (LIB_DCB),MF=(E,CLOSE_PARMS),MODE=31
CIJE R15,0,CLOSE_SUCCESS
*
CLOSE_FAIL DS 0H
LR R9,R15 put err code in R9
B DONE
*
CLOSE_SUCCESS DS 0H
LA R9,0 CRTMEM successful put 0 in R9
*
* Free DCB storage
*
RLSE_DCB DS 0H
STORAGE RELEASE,ADDR=(R8),LENGTH=DCBLEN,EXECUTABLE=NO
*-------------------------------------------------------------------
* Linkage and storage release. set RC (reg 15) -
*-------------------------------------------------------------------
DONE DS 0H
RLSE_WA DS 0H
STORAGE RELEASE,ADDR=(R10),LENGTH=WALEN,EXECUTABLE=NO
LR R15,R9 get saved rc into R15
PR , return to caller
*-------------------------------------------------------------------
* constants and literal pool -
*-------------------------------------------------------------------
DATCONST DS 0D Doubleword alignment for LARL
CONST_DCB DCB DSORG=PO,MACRF=(W),DDNAME=MYDD,DCBE=CONST_DCBE
CONST_DCBE DCBE RMODE31=BUFF
DCBLEN EQU *-CONST_DCB
CONST_OPEN OPEN (*-*,(OUTPUT)),MODE=31,MF=L
OPENLEN EQU *-CONST_OPEN
CONST_CLOSE CLOSE (*-*),MODE=31,MF=L
CLOSELEN EQU *-CONST_CLOSE
*
WRITE_BUFFER DC CL80'Hello world'
LTORG ,
*-------------------------------------------------------------------
* DSECT -
*-------------------------------------------------------------------
WAREA DSECT
SAVEA DS 18F
OPEN_PARMS DS CL(OPENLEN)
CLOSE_PARMS DS CL(CLOSELEN)
WALEN EQU *-SAVEA
DCBAREA DSECT
LIB_DCB DS CL(DCBLEN)
END CRTMEM