HLASM Environment: JCL, ASMA90, and Your First Assembly Program
HLASM Environment: JCL, ASMA90, and Your First Assembly Program
Writing and running an HLASM program on z/OS involves three steps: writing the assembler source, invoking the assembler (ASMA90) via JCL, and linking and running the resulting object module. This module walks through each step with a working example.
The HLASM Toolchain
Source (.asm) → ASMA90 Assembler → Object Deck → Linkage Editor → Load Module → Execute- ASMA90 — the HLASM assembler program. It translates HLASM source into an object deck
- IEWL / IEWBLINK — the z/OS Linkage Editor. It resolves external references and builds a load module
- Load module — the executable stored in a partitioned dataset (PDS) ready to run
Your First HLASM Program
This program loads the value 42 into register 3 and returns to the caller:
FIRST CSECT
STM 14,12,12(13) Save caller's registers
LR 12,15 Set up base register
USING FIRST,12 Tell assembler our base
LA 3,42 Load 42 into register 3
L 14,12(13) Restore return address
LM 0,12,20(13) Restore registers 0-12
BR 14 Return to caller
END FIRSTKey points:
CSECT— Control Section. Marks the start of the programSTM 14,12,12(13)— Save registers 14 through 12 (wrapping around) into the caller's save areaLR 12,15— Copy register 15 (entry point address) to register 12 (our base register)USING FIRST,12— Tells the assembler that register 12 holds the address of label FIRSTLA 3,42— Load Address: loads the immediate value 42 into register 3BR 14— Branch to address in register 14 (return to caller)END FIRST— Marks the end of the source and specifies the entry point
JCL to Assemble and Link
//ASSEMBLE JOB (ACCT),'HLASM FIRST',CLASS=A,MSGCLASS=X
//*
//ASM EXEC PGM=ASMA90,
// PARM='OBJECT,NODECK,NOESD,NORLD,NOXREF'
//SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR
// DD DSN=SYS1.MODGEN,DISP=SHR
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,1))
//SYSOBJECT DD DSN=&&OBJ,UNIT=SYSDA,SPACE=(CYL,(2,1)),
// DISP=(NEW,PASS)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
FIRST CSECT
STM 14,12,12(13)
LR 12,15
USING FIRST,12
LA 3,42
L 14,12(13)
LM 0,12,20(13)
BR 14
END FIRST
/*
//*
//LINK EXEC PGM=IEWL,
// PARM='LIST,XREF,MAP'
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,1))
//SYSLMOD DD DSN=MY.LOADLIB(FIRST),DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSN=&&OBJ,DISP=(OLD,DELETE)
//*
//RUN EXEC PGM=FIRST
//STEPLIB DD DSN=MY.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*Understanding the Assembly Listing
ASMA90 produces an assembly listing that shows:
- The source statement
- The machine code generated (in hexadecimal)
- The location counter offset
LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT
000000 90ECD00C 00000C 2 STM 14,12,12(13)
000004 18CF 3 LR 12,15
000006 18FF 4 USING FIRST,12
000008 4130002A 5 LA 3,42The LOC column shows the offset from the start of the CSECT. OBJECT CODE is the hexadecimal machine instruction.
Common ASMA90 PARM Options
| Parameter | Meaning |
|---|---|
OBJECT | Generate object deck output |
LIST | Produce assembly listing |
XREF(SHORT) | Cross-reference listing |
NODECK | Don't write a card-image object deck |
FLAG(0) | Set minimum diagnostic level |
RENT | Check for reentrant code |
HLASM Source Dataset Conventions
On z/OS, HLASM source is typically stored in a PDS with:
- Record format: FB (Fixed Block)
- Logical record length: 80
- Block size: 3200 (or larger)
Columns 1–71 contain the HLASM statement. Column 72 is used for continuation. Columns 73–80 are the sequence number field (informational only).
Frequently Asked Questions
Q: What is the difference between ASMA90 and the older Assembler H? ASMA90 is IBM's current HLASM assembler product (product number 5696-234). Assembler H was its predecessor on System/370. ASMA90 adds structured programming macros (IF/ELSE/ENDIF, DO/ENDDO), improved diagnostics, Unicode support, and optimised code generation. All Assembler H source assembles correctly under ASMA90 — the migration is purely a JCL change.
Q: What does the USING directive do?
USING label,register tells the assembler which register holds the address of a given label at runtime. The assembler uses this information to generate correct base-displacement addresses for all references to labels within range of that register. Without a USING, the assembler cannot generate addresses and will produce errors. Every HLASM program must establish at least one base register.
Q: What is a CSECT? CSECT (Control Section) marks the beginning of a relocatable section of code or data. A program can have multiple CSECTs — the linker places them consecutively in the load module. The first CSECT in a program is typically the main code section. The name on the CSECT becomes the entry point name used in JCL.
Part of HLASM Mastery Course — Module 2 of 22.
