我正在尝试使用 BPX2OPN 服务打开现有的 HFS 文件并确定其中有多少字节。我找到的示例仅用于创建文件而不是打开现有文件,但我假设我也可以使用它来打开现有文件。
这是我正在使用的代码:
USING PARMS,R1
L R10,PPATHL
ST R10,PATHLEN
L R9,PPATHA
ST R9,PATHNAME
LA R8,STAT#LENGTH
ST R8,STATL
XC S_MODE,S_MODE
MVI S_MODE2,S_IRUSR
XC O_FLAGS(OPNF#LENGTH),O_FLAGS
MVI O_FLAGS4,O_RDONLY
L R2,0(,R9)
L R3,4(,R9)
L R4,8(,R9)
L R5,12(,R9)
L R6,16(,R9)
CALL BPX2OPN, x
(PATHLEN, x
PATHNAME, x
O_FLAGS, x
S_MODE, x
STATL, x
STAT, x
RV, x
RC, x
RN),MF=(E,BPXOPND)
L R7,RV
L R8,RC
L R9,RN
LA 0,27
ST 0,0(,0)
我在通话后强制异常结束。我的代码是31位AMODE。我看到以下寄存器:
D 406 00000010 DATA AT PSW 26908F58 - 001B5000 0000BFAF B06C4740
D 406 00000010 AR/GR 0: 00000000/00000000_0000001B 1: 00000002/00000000_00000072
D 406 00000010 2: 00000000/00000000_4B4B6184 3: 00000000/00000000_81A38161
D 406 00000010 4: 00000000/00000000_A2859989 5: 00000000/00000000_85A24BA3
D 406 00000010 6: 00000000/00000000_A7A30000 7: 00000000/00000000_FFFFFFFF
D 406 00000010 8: 00000000/00000000_00000079 9: 00000000/00000000_0594003A
D 406 00000010 A: 00000000/00000000_00000012 B: 00000000/00000000_2690CE40
D 406 00000010 C: 00000000/00000000_A6908E8E D: 00000000/00000000_2690CE40
D 406 00000010 E: 00000000/00000000_A6908F4A F: 00000000/00000050_00000000
查看寄存器,R7 表示失败(-1),R8 是返回代码(0x79),即 EINVAL,R9 的右字节(原因代码)是 0x3A,这似乎表明我有一个 我的路径名中存在 NULL,但是如果您查看 R2、R3、R4、R5、R6,则没有 NULL(在 EBCDIC 中是 ../data/series.txt)。我想也许我需要长度的地址而不是存储在 parm 列表中的长度,但这样做会给我一个 EBADADDR 代码。 任何有关我如何编码错误的建议,或者如果我可能无法使用此服务,我们都将不胜感激。
我最终能够解决我的问题😁
我将错误的内容存储到
PATHNAME
中 - 我将一个指针存储到 PATHNAME 中,宏正在加载该地址,而不是直接使用该地址。所以,而不是:
ST R9,PATHNAME
我应该只加载 R9 (或其他一些寄存器)并直接在宏中引用它,例如
CALL BPX2OPN, x
(PATHLEN, x
(R9), x
O_FLAGS, x
S_MODE, x
STATL, x
STAT, x
RV, x
RC, x
RN),MF=(E,BPXOPND)
工作正常,通话成功。