如何从从 Assembly 返回到 COBOL 的指针中寻址数据缓冲区
Posted
技术标签:
【中文标题】如何从从 Assembly 返回到 COBOL 的指针中寻址数据缓冲区【英文标题】:How to address a databuffer from a pointer returned from Assembly to COBOL 【发布时间】:2017-09-21 19:51:13 【问题描述】:我有一个调用汇编模块的 COBOL 程序。这个模块返回一个指向在这个模块内获得的一些数据(我称之为“缓冲区”)的指针。 如何将工作存储中的变量寻址到此指针并使用数据?
在我的 COBOL 调用者中,我有类似的内容:
工作存储:
01 WK-MOD-AREA.
03 WK-MOD-PTR PIC 9(09) COMP VALUE 0.
01 WK-BUFFER-PTR USAGE POINTER.
01 FILLER REDEFINES WK-BUFFER-PTR.
03 WK-BUFFER-PTR-COMP PIC 9(09) COMP.
01 WK-BUFFER-DATA PIC X(5656) VALUE SPACES.
程序科:
CALL 'MYMOD' USING WK-MOD-AREA.
MYMOD 在 WK-MOD-PTR 中返回一个地址。
我刚刚尝试使用以下方法处理数据:
MOVE WK-MOD-PTR TO WK-BUFFER-PTR-COMP.
SET ADDRESS OF WK-BUFFER-PTR TO WK-BUFFER.
但它给了我编译器错误:
==000657==> IGYPS2161-S "ADDRESS OF" operand "WRK-BUFFER"
was found as the receiving operand of a "SET" statement,
but was not a level-01 or level-77 "LINKAGE SECTION" item.
The statement was discarded.
提前致谢。
【问题讨论】:
@SimonSobisch 我的错......它实际上是通过引用调用的。没有“引号”。 【参考方案1】:你可以做你想做的,但你不能改变WORKING-STORAGE SECTION
中某个项目的地址,这些项目有一个固定的地址,并且在程序第一次启动时分配。
正如您的编译器已经告诉您的那样,您可以使用 LINKAGE SECTION
中的项目执行此操作,因为这些项目没有固定地址并且没有分配。
根据您的实际使用情况,您可以将POINTER
直接传递给程序而不是中间变量:
Working-Storage SECTION.
01 WK-BUFFER-PTR USAGE POINTER.
LINKAGE SECTION.
01 WK-BUFFER-DATA PIC X(5656) VALUE SPACES.
Procedure Division.
CALL 'MYMOD' USING WK-BUFFER-PTR.
SET ADDRESS OF WK-BUFFER-DATA TO WK-BUFFER-PTR.
注意事项:
您仍然必须确保数据在使用后在某处被释放(可能通过调用带有释放参数的分配程序)。 您必须确保访问的字段不会超过实际分配的长度,如果它并不总是 5656 字节。为确保这一点,您可以使用引用修改WK-BUFFER-DATA (1:actual-length)
或具有可变大小的表 DEPENDING ON
(特别适用于 OCCURS UNBOUNDED
)。
【讨论】:
道具让我想起了大约 25 年前的 COBOL 课。以上是关于如何从从 Assembly 返回到 COBOL 的指针中寻址数据缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]
从 COBOL mainprog 调用 COBOL/DB2 subprog 从 subprog 的编译单元返回 CEE3204S 错误
如何从从json获得的url加载图像到collectionview