尝试打开现有文件进行读取/统计时,BPX2OPN 失败

问题描述 投票:0回答:1

我正在尝试使用 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 代码。 任何有关我如何编码错误的建议,或者如果我可能无法使用此服务,我们都将不胜感激。

assembly zos
1个回答
0
投票

我最终能够解决我的问题😁

我将错误的内容存储到

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)

工作正常,通话成功。

© www.soinside.com 2019 - 2024. All rights reserved.