Let's say you have a program like this.
WRITER CSECT
...
OPEN (OUTDCB,OUTPUT)
...
CLOSE OUTDCB
...
OUTDCB DCB DSORG=PS,MACRF=PM,DDNAME=OUTPUT
END
...
OPEN (OUTDCB,OUTPUT)
...
CLOSE OUTDCB
...
OUTDCB DCB DSORG=PS,MACRF=PM,DDNAME=OUTPUT
END
Your installation defines a cataloged procedure to assemble, link edit, and execute an Assembler program called XCLG. It has these statements.
//XCLG PROC
//C EXEC PGM=ASMA90,PARM='OBJECT,NODECK'
//SYSPRINT DD SYSOUT=*
...
//SYSLIN DD DISP=(MOD,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=296),
// DSN=&&LOADSET
...
//L EXEC PGM=IEWL,PARM='MAP,LIST'
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DISP=(OLD,PASS),DSN=&&LOADSET
//SYSLMOD DD DISP=(NEW,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1,1)),
// DSN=&&GOSET(GO)
//G EXEC PGM=*.L.SYSLMOD
//C EXEC PGM=ASMA90,PARM='OBJECT,NODECK'
//SYSPRINT DD SYSOUT=*
...
//SYSLIN DD DISP=(MOD,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=296),
// DSN=&&LOADSET
...
//L EXEC PGM=IEWL,PARM='MAP,LIST'
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DISP=(OLD,PASS),DSN=&&LOADSET
//SYSLMOD DD DISP=(NEW,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1,1)),
// DSN=&&GOSET(GO)
//G EXEC PGM=*.L.SYSLMOD
This procedure has three steps. The first step, identified by step name C, assembles the source program. One of the datasets , identified by DD name SYSLIN, contains the binary program created by the Assembler from your source. This data is not executable as it exists. This dataset has temporary dataset name &&LOADSET
The second step, identified by step name L, prepares a binary executable load module from the object output from the Assembler. The load module is stored in a temporary dataset identifed by data set name &&GOSET and member name GO.
The third step, identified by step name G, executes the load module prepared by the L step. This step has no DD statements. Well, actually that's not quite true. The trick EXEC statement defines a DD statement that is the temporary dataset created by the SYSLMOD DD statement in the L step. It was done this way because the early OS/360 did not have STEPLIB DD statements, and this trick was used to get around this lack.
To run your program you would use JCL like this:
//USERJCL JOB ...
//A EXEC XCLG
//C.SYSIN DD -- Dataset containing source program --
//G.OUTPUT DD -- Output dataset --
//A EXEC XCLG
//C.SYSIN DD -- Dataset containing source program --
//G.OUTPUT DD -- Output dataset --