2017-09-21 2 views
3

어셈블리 모듈을 호출하는 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의 주소를 반환 내 COBOL 발신자에

내가 좋아하는 뭔가가있다.

난 그냥 사용하는 주소에게 데이터를 tryed :

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

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

를하지만 나에게 compiller 오류 제공 : 사전에

==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. 

감사합니다.

+1

'CALL'MYMOD 'USING'WK-MOD-AREA '대신에'CALL'MYMOD 'USING WK-MOD-AREA' ('BY REFERENCE' 변수를 전달) 'BY VALUE'). –

+0

@SimonSobisch 내 잘못 ... 그것은 참조로 acctualy 전화입니다. '따옴표'가 없습니다. –

답변

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과 함께 사용) 테이블을 사용할 수 있습니다.
+1

약 25 년 전에 COBOL 수업을 상기시키기위한 도구. –

+0

대단히 감사합니다! 의도 한대로 작동했습니다. –

관련 문제