|
Back Issue
|
Generating REXX with the Assembler
Two challenges of creating REXX code that accesses system control blocks is
- calculating the correct offset values
- ensuring that the offsets are still correct after a system upgrade
An example follows of using the assembler to calculate offsets. The generated REXX
code should produce the same results as FINDJSAB
which appears on the REXX samples page here.
The assembler is being used as a preprocessor for generating REXX code.
//S1 EXEC ASMC,PARM='DECK,NOOBJECT'
//ASM.SYSLIB DD
// DD DISP=SHR,DSN=SYS1.MODGEN
//ASM.SYSIN DD *
MACRO
.* This macro generates a symbol for use in
.* the generated REXX code
.* Name is the symbol name
.* Value is the symbol value
SETSYM &NAME,&VALUE
&LAB1 SETC '&NAME'
.* generate an EQU statement to make value available
&LAB1 EQU &VALUE
.* generate a SETA statement to make symbol &NAME visible
AINSERT '&&&LAB1 SETA &LAB1',FRONT
MEND
*
REXX DSECT *** We do not wish to open a CSECT
* 00010000
* DSECTS required to define values
PRINT ON,NOGEN
IHAPSA
IHAASCB
IHAASSB
IHASTCB
IKJTCB
IAZJSAB
* STORAGE SHORTCUT (PTR)
&PTR SETC 'C2D(STORAGE(D2X'
* STORAGE SHORTCUT (CHAR)
&CHAR SETC 'STORAGE(D2X'
PRINT ON,GEN
* GENERATE REXX CODE
PUNCH '/* REXX */'
PUNCH '/* BASED ON EXPANSION OF IAZXJSAB MACRO */'
PUNCH '/* THIS EXEC RETURNS CURRENT JOBNAME, JOBID, USERID AND */'
PUNCH '/* NAME OF THE COMPONENT WHICH CREATED THE JSAB */'
PUNCH '/* FOR THE CURRENT TASK / ADDRESS SPACE */'
PUNCH 'NUMERIC DIGITS 10'
SETSYM TOLD,PSATOLD-PSA
PUNCH 'tcb = &PTR.(&TOLD),4)) /* GET CURRENT TCB */'
PUNCH 'jsab = 0 /* NULL POINTER */'
PUNCH 'If tcb \= 0 THEN DO'
SETSYM STCBP,TCBSTCB-TCB
PUNCH ' stcb = &PTR.(tcb+&STCBP),4))'
SETSYM JSABP,STCBJSAB-STCB
PUNCH ' jsab = &PTR.(stcb+&JSABP),4))'
PUNCH ' END'
PUNCH 'If jsab = 0 then do'
SETSYM AOLD,PSAAOLD-PSA
PUNCH ' ascb = &PTR.(&aold),4)) /* GET CURRENT ASCB */'
SETSYM ASSBP,ASCBASSB-ASCB
PUNCH ' assb = &PTR.(ascb+&ASSBP),4))'
PUNCH ' If assb = 0 THEN DO'
PUNCH ' Say ''Unable to locate JSAB from ASCB at ''D2X(ascb)'
PUNCH ' EXIT 8'
PUNCH ' end'
SETSYM JSABQ,ASSBJSAB-ASSB
PUNCH ' jsab = &PTR.(assb+&JSABQ),4))'
PUNCH ' If jsab = 0 then do'
PUNCH ' Say ''Unable to locate JSAB from ASCB at ''D2X(ascb)'
PUNCH ' exit 8'
PUNCH ' end'
PUNCH ' end'
SETSYM FLG1,JSABFLG1-JSAB
PUNCH 'flg1 = &PTR.(jsab+&FLG1),1))'
PUNCH 'Do While flg1 > 127'
PUNCH ' eye = &CHAR.(jsab),4)'
PUNCH ' If eye \= ''JSAB'' THEN DO'
PUNCH ' Say ''Invalid JSAB found at ''D2X(jsab)'
PUNCH ' exit 8'
PUNCH ' end'
SETSYM NEXT,JSABNEXT-JSAB
PUNCH ' jsab = &PTR.(jsab+&NEXT),4))'
PUNCH ' If jsab = 0 then do'
PUNCH ' Say ''Unable to locate a valid JSAB'''
PUNCH ' exit 8'
PUNCH ' end'
PUNCH ' flg1 = &PTR.(jsab+&FLG1),1))'
PUNCH ' END'
SETSYM JBNM,JSABJBNM-JSAB
PUNCH 'jbnm = &CHAR.(jsab+&JBNM),8)'
SETSYM JBID,JSABJBID-JSAB
PUNCH 'jbid = &CHAR.(jsab+&JBID),8)'
SETSYM SCID,JSABSCID-JSAB
PUNCH 'comp = &CHAR.(jsab+&SCID),4)'
SETSYM USID,JSABUSID-JSAB
PUNCH 'usid = &CHAR.(jsab+&USID),8)'
PUNCH 'Say ''JOBNAME=''jbnm'' JOBID=''jbid'' USERID=''usid'
PUNCH 'Say ''COMPONENT=''comp'
PUNCH 'EXIT 0'
END
//SYSPUNCH DD DISP=SHR,DSN= ....
The target library would be a partitioned datasets with RECFM=FB and LRECL=80.
In the example above, the member name might be FINDJSAB.
Feedback
Comments or suggestions can be
sent to the author.
Last Issue