Yes, making it a simple callable assembler routine is the safest option, but introduces yet another assembler routine into the production source pool when there are fewer and fewer assembler-knowledgeable programmers left.
If COBOL supported the "hardware builtin" functions provided with XLC it would be totally safe. As I said in a prior reply, I worry most about the structure of the PROCEDURE-POINTER possibly changing for 64-bit mode, which an assembler subroutine certainly avoids. Peter -----Original Message----- From: IBM Mainframe Discussion List <[email protected]> On Behalf Of Matt Hogstrom Sent: Wednesday, March 17, 2021 1:29 PM To: [email protected] Subject: Re: This Call-Assembler-inside-COBOL technique works, but is it risky to use? I recall doing something like this about 30 years ago which I know would break one day. I wanted to process VB ISAM but that wasn’t supported so I figured out a way to search backwards from WS with negative indexes until I found the DCB for the file and “moved a byte” with the right bit on for V. I would expect your hack to work for many years, although, the next guy to try and maintain the code might not understand it. I’d make it callable module. I mean, who doesn’t need a good STCK once in a while? Nice. Matt Hogstrom [email protected] PGP Key: 0x90ECB270 > On Mar 17, 2021, at 11:50 AM, Farley, Peter x23353 > <[email protected]> wrote: > > I discovered that one can code and call extremely simple assembler code from > completely within a COBOL source program, but it is a two-step process which > I will describe below. > > My question is whether using a technique like this is "risky" in the sense > that it may someday, under a future incarnation of the compiler, stop working? > > The technique: > > Code a simple assembler program like the following and browse the resulting > listing that shows the generated object code: > > COBSTCKE CSECT , > L 15,0(,1) GET ARGUMENT ADDRESS > STCKE 0(15) STCKE INTO ARGUMENT AREA > XR 15,15 SET RETURN CODE = 0 > BR 14 RETURN TO CALLER > > Then copy the generated object code into a COBOL source program as follows: > > ID DIVISION. > PROGRAM-ID. COBSTCKE. > ENVIRONMENT DIVISION. > DATA DIVISION. > WORKING-STORAGE SECTION. > 01 WS-TOD-VALUE PIC X(16). > > 01 WS-GETTOD-PROGRAM. > * GET ARGUMENT ADDRESS L 15,0(,1) > 05 FILLER PIC X(04) VALUE X'58F01000'. > * STCKE INTO ARGUMENT AREA STCKE 0(15) > 05 FILLER PIC X(04) VALUE X'B278F000'. > * SET RETURN-CODE = 0 XR 15,15 > 05 FILLER PIC X(02) VALUE X'17FF'. > * RETURN TO CALLER BR 14 > 05 FILLER PIC X(02) VALUE X'07FE'. > > 01 WS-GETTOD-PTR. > 05 GETTOD-ADDR PROCEDURE-POINTER VALUE NULL. > 05 FILLER REDEFINES GETTOD-ADDR. > 10 GETTOD-ADDR1 POINTER. > 10 GETTOD-ADDR2 POINTER. > > PROCEDURE DIVISION. > > SET GETTOD-ADDR1 TO ADDRESS OF WS-GETTOD-PROGRAM. > CALL GETTOD-ADDR USING WS-TOD-VALUE. > DISPLAY FUNCTION HEX-OF (WS-TOD-VALUE). > GOBACK. > > Peter -- This message and any attachments are intended only for the use of the addressee and may contain information that is privileged and confidential. If the reader of the message is not the intended recipient or an authorized representative of the intended recipient, you are hereby notified that any dissemination of this communication is strictly prohibited. If you have received this communication in error, please notify us immediately by e-mail and delete the message and any attachments from your system. ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN
