如何从从Assembly返回到COBOL的指针处理数据缓冲区

时间:2017-09-21 19:51:14

标签: assembly cobol mainframe

我有一个调用Assembly模块的COBOL程序。该模块返回指向此模块内部获得的一些数据(我将其称为“缓冲区”)的指针。 如何将工作存储器中的变量应用于此指针并使用数据?

在我的COBOL来电者中,我有类似的东西:

工作存储:

>>> import requests
>>> import bs4
>>> soup = bs4.BeautifulSoup(page, 'lxml')
>>> soup.findAll('span', attrs={'data-reactid': '42'})[0].text
'172.17'
>>> soup.findAll('span', attrs={'data-reactid': '48'})[0].text
'171.69'

程序部门:

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.

MYMOD在WK-MOD-PTR中返回一个地址。

我只是尝试使用以下方式处理数据:

CALL 'MYMOD' USING WK-MOD-AREA.

但是它给了我编译错误:

MOVE WK-MOD-PTR TO WK-BUFFER-PTR-COMP.

SET ADDRESS OF WK-BUFFER-PTR TO WK-BUFFER.

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以执行您想要的操作,但无法更改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特别有用)。