
A DSECT or
Dummy Section provides the programmer with the ability to describe the layout
of an area of storage without reserving virtual storage for the area that is
described. The DSECT layout can then be
used to reference any area of storage which is addressable by the program. Think of the DSECT as a template, or
pattern, which can be “dropped” on any area of storage. Once the DSECT is “positioned”, the symbolic
names in the DSECT can be used to extract data from the underlying storage
area.
How is the DSECT positioned?
This is a two-step process.
First, a register is associated with the DSECT name by coding a USING
directive. Loading the register with
the storage address completes the process.
Consider the sample code below.
CUSTOMER DSECT
FNAME DS
CL4
LNAME DS
CL5
BALANCE DS
PL5
MAIN CSECT
...
USING CUSTOMER,R7
LA R7,TABLE
MVC NAME1,FNAME
MVC NAME2,LNAME
...
TABLE EQU
*
DC CL4’FRED’
DC CL5’SMITH’
DC PL5’432.98’
...
NAME1 DS
CL10
NAME2 DS
CL20
The “CUSTOMER” DSECT is created by coding the DSECT directive
which indicates the beginning of the dummy section. The general format for this directive is listed below.
NAME OPERATION OPERAND
Any Symbol DSECT Not required
The pattern for the DSECT is
created using a series of DS directives to describe a collection of fields in
storage. The end of the DSECT is
indicated by the beginning of the CSECT.
While the DSECT can be coded almost anywhere in the program, it is a
common practice to place any DSECTs you will need above the main control
section, as in the example above. In
order to code a DSECT in the “middle” of a control section, the CSECT directive
would appear twice as indicated below.
MAIN CSECT
...
CUSTOMER DSECT
FNAME DS
CL4
LNAME DS
CL5
BALANCE DS
PL5
MAIN CSECT
The second CSECT directive
indicates that the “MAIN” control section is being continued.
After defining the dummy section, it must be associated with an
available register in a USING directive.
In the example code above, the statement “USING CUSTOMER,R7” associates register seven with
the “CUSTOMER” dummy section.
Addressability is established when the register is loaded with the
address of the table. At that point,
FNAME contains the value “FRED”, and
LNAME contains the value “SMITH”.
Loading the register “drops” the DSECT on the storage area whose address
is contained in the register.
You should consider the power of the above technique. There were no symbolic names associated with
the table when it was defined. By
creating a DSECT, we are able to dynamically assign symbols to an area of storage
and retrieve the data the area contains.
DSECTs have many uses in assembly language including array processing,
locate mode I/O ( See SEQUENTIAL FILE
PROCESSING ), and data structure creation and manipulation. Most sophisticated assembler programs involve DSECTS to some
degree. Because of their importance, we will consider the use of DSECTs in
array processing.
Loading an Array With Data
In the following example we will load an “empty”
storage area with data that is read from a file. We will use the same DSECT as in the previous example.
CUSTOMER DSECT
FNAME DS CL4
LNAME DS CL5
BALANCE DS
PL5
CRECLEN EQU
*-CUSTOMER
MAIN CSECT
...
USING CUSTOMER,R7
LA R7,TABLE POSITION THE DSECT
LA R4,CRECLEN LOAD # OF RECS INTO R4
LOOP EQU *
GET FILEIN,RECIN READ A RECORD
MVC FNAME,FNAMEIN MOVE DATA ...
MVC LNAME,LNAMEIN ... FROM RECIN ...
ZAP BALANCE,BALIN ... TO THE TABLE
LA R7,CRECLEN(R0,R7) BUMP THE DSECT
BCT R4,LOOP BRANCH BACK IF MORE RECS
...
TABLE DS 100CL(CRECLEN) EMPTY
AREA FOR 100 RECORDS
The address of the empty table is placed in R7 by the first LA
instruction. This has the effect of
positioning the DSECT at the beginning of the table area, since the USING
directive associated register seven with the DSECT name. The length of a
typical table entry is computed as “CRECLEN” using a EQUATE directive and
placed in R4 by the LA instruction. A
record is retrieved and the data is moved from the input buffer, RECIN, and
placed in the table using the symbolic names that were defined in the DSECT.
In order to move the DSECT to the next empty table entry we code
the following line,
LA R7,CRECLEN(R0,R7) BUMP
THE DSECT
This type of statement is
used quite often in DSECT processing and so we consider it in some detail. The statement uses explicit addressing and
the technique is considered acceptable practice. The effect is to compute the second operand address explicitly
from the base register (R7), index register (R0), and displacement (CRECLEN). When R0 is specified as an index register,
that component of the address computation is ignored. The “effective” address that would be computed consists of the
contents of R7 plus the displacement of 14 represented by CRECLEN. Since R7 contains the address of a table
entry, adding 14 to R7 will create the address of the next table entry. The DSECT has been “bumped” down to the next
table entry.
The BCT instruction is used for loop control, and insures that
each entry in the table is filled.