All of the macros described in this information can be written
in re-enterable form. These macros are classified as one of two types:
macro that pass
parameters in registers 0 and 1, and macros that pass parameters in
a list. The macros
that pass parameters in registers present no problem in a reenterable
program; when the macro is coded, the required parameter values should be
contained in registers. For example, the POST macro requires that
the ECB address be coded as follows:
POST ecb address
One method of coding this in a reenterable program would be to
require this address to refer to a portion of storage that has been
allocated to the active task through the use of a GETMAIN macro.
The address would change for each use of the load module. Therefore,
you would load one of the general registers 2-12 with the address,
and designate that register when you code the macro. If register 4
contains the ECB address, the POST macro is written as follows:
POST (4)
The macros that pass parameters in a list require the use of special
forms of the macro when used in a reenterable program. The macros
that pass parameters in a list are identified within their descriptions
in z/OS MVS Programming: Assembler Services Reference ABE-HSP and z/OS MVS Programming: Assembler Services Reference IAR-XCT.The
expansion of the standard form of these macros results in an in-line parameter list
and executable instructions to branch around the list, to save parameter
values in the list, to load the address of the list, and to pass control
to the required system routine. The
expansions of the list and execute forms of the macro simply divide
the functions provided in the standard form expansion: the list form
provides only the parameter list, and the execute form provides executable
instructions to modify the list and pass control. You provide the
instructions to load the address of the list into a register.
The list and execute forms of a macro are used in conjunction to
provide the same services available from the standard form of the
macro. The advantages of using list and execute forms are as follows:
- Any parameters that remain constant in every use of the macro
can be coded in the list form. These parameters can then be omitted
in each of the execute forms of the macro which use the list. This
can save appreciable coding time when you use a macro many times.
(Any exceptions to this rule are listed in the description of the
execute form of the applicable macro.)
- The execute form of the macro can modify any of the parameters
previously designated. (Again, there are exceptions to this rule.)
- The list used by the execute form of the macro can be located
in a portion of virtual storage assigned to the task through the use
of the GETMAIN macro. This ensures that the program remains reenterable.
Figure 1 shows the use of the list and execute
forms of a DEQ macro in a reenterable program. The length of the
list constructed by the list form of the macro is obtained by subtracting
two symbolic addresses; virtual storage is allocated and the list
is moved into the allocated area. The execute form of the DEQ macro
does not modify any of the parameters in the list form. The list
had to be moved to allocated storage because the system can store
a return code in the list when RET=HAVE is coded. Note that the coding
in a routine labeled MOVERTN is valid for lengths up to 256 bytes
only. Some macros do produce lists greater than 256 bytes when many
parameters are coded (for example, OPEN and CLOSE with many data control
blocks, or ENQ and DEQ with many resources), so in actual practice
a length check should be made. The move long instruction (MVCL) should
be considered for moving large data lists.
Figure 1. Using
the List and the Execute Forms of the DEQ Macro .
.
LA 3,MACNAME Load address of list form
LA 5,NSIADDR Load address of end of list
SR 5,3 Length to be moved in register 5
BAL 14,MOVERTN Go to routine to move list
DEQ ,MF=(E,(1)) Release allocated resource
.
.
* The MOVERTN allocates storage from subpool 0 and moves up to 256
* bytes into the allocated area. Register 3 is from address,
* register 5 is length. Area address returned in register 1.
MOVERTN GETMAIN R,LV=(5)
LR 4,1 Address of area in register 4
BCTR 5,0 Subtract 1 from area length
EX 5,MOVEINST Move list to allocated area
BR 14 Return
MOVEINST MVC 0(0,4),0(3)
.
.
MACNAME DEQ (NAME1,NAME2,8,SYSTEM),RET=HAVE,MF=L
NSIADDR ... ...
NAME1 DC CL8'MAJOR'
NAME2 DC CL8'MINOR'