Basic Assembly Language (BAL) is the commonly used term for a low-level programming language used on IBM System/360 and successor mainframes. Originally "Basic Assembly Language" applied only to an extremely restricted dialect designed to run under control of IBM Basic Programming Support (BPS/360) on systems with only 8 KB of main memory, and only a card reader, a card punch, and a printer for input/output — thus the word "Basic". However, the full name and the initialism "BAL" almost immediately attached themselves in popular use to all assembly-language dialects on the System/360 and its descendants. BAL for BPS/360 was introduced with the System/360 in 1964.
Contents
- General characteristics
- Assembler Statement Format
- Types of instructions
- Machine instructions mnemonic
- Assembler instructions
- Macros and conditional assembly
- Operating system macros
- Examples
- Versions
- 70907094 Support Package assembler
- Basic Programming Support assembler
- Basic Operating System assembler
- Assembler D
- Assembler E and F
- Assembler G
- Assembler H
- Assembler XF
- High Level Assembler
- IBM System360 Model 44 PS assembler
- IBM System360 TSS assembler
- Non IBM assemblers
- References
Assemblers on other System/360 operating systems through System/370, System/390, and System z, as well as the UNIVAC Series 90 mainframes made by Sperry Corporation, and the BS2000 Mainframes currently made by Fujitsu, inherited and extended its syntax. The latest derived language is known as the IBM High-Level Assembler (HLASM). Programmers utilizing this family of assemblers also refer to them as ALC, (for Assembly Language Coding), or simply "assembler".
BAL is also the mnemonic of the "Branch And Link" instruction.
General characteristics
The architecture of IBM mainframes has undergone several extensions over the years, including System/360, System/370, System/370 XA, ESA/370, ESA/390, and z/Architecture. Each of these architectures has retained compatibility with most of the features of its predecessor. BAL uses the native instruction set of these machines. It is thus closer to the hardware than third-generation languages such as COBOL.
The instruction set consists of the low-level operations supported by the hardware, such as:
The extreme simplicity of these operations means that the source code of a program written in assembler will usually be much longer than an equivalent program in, say, COBOL or Fortran. In the past, the speed of hand-coded assembler programs was often felt to make up for this drawback, but with the advent of optimizing compilers, C for the mainframe, and other advances, assembler has lost much of its appeal. IBM continues to upgrade the assembler, however, and it is still used when the need for speed or very fine control is paramount.
Another reason to use assembler is that not all operating system functions can be accessed in high level languages. The application program interface of mainframe operating systems is defined as a set of assembly language "macro" instructions, that typically invoke Supervisor Call (SVC) [on z/OS] or Diagnose (DIAG) [on z/VM] hardware instructions to invoke operating system routines. It is possible to use operating system services from programs written in high-level languages by use of assembler subroutines.
Assembler Statement Format
The format of assembler language statements reflects the layout of an 80-column punched card, though successive versions have relaxed most of the restrictions.
Basic Assembly language also permitted an alternate statement format with the statement starting in column 25, allowing the assembled instruction to be punched into the same card beginning in column 1. This option was not continued in later versions of the assembler.
Types of instructions
Three main types of instructions are found in the source code of a program written in assembler.
Machine instructions (mnemonic)
There is a "one-to-one" relationship with machine instructions. The full mnemonic instruction set is described in the Principles of Operation manual for each processor. Examples:
* This is a comment line * Load the fullword integer stored at the * location labeled 'ZIGGY' into general register 3: L 3,ZIGGY SLA 4,5 shift the value in general register 4 left by 5 bits MVC TARGET,SOURCE move characters from location 'SOURCE' to 'TARGET' AP COUNT,=P'1' add 1 to value in memory location 'COUNT' (packed decimal format) B NEXT unconditional branch to label 'NEXT' HERE EQU * This is a label CLC TARGET,=C'ADDRESS' Compare memory location 'TARGET' to string 'ADDRESS' BE THERE branch if equal to program label 'THERE'
Generally accepted standards, although by no means mandatory, include the identification of general purpose registers with mnemonics. Unlike assemblers for some other systems, such as X86 assembly language, register mnemonics are not reserved symbols but are defined through EQU statements elsewhere in the program. This improves readability of assembler language programs and provides a cross-reference of register usage. Thus typically you may see the following in an assembler program:
Some notable instruction mnemonics are BALR for a call storing the return address in a register before stacks were used, SVC, DIAG, and ZAP. The latter inspired the name of the SuperZAP utility by a programmer using the pseudonym WAMOZART, cf. SuperZap at the Free On-line Dictionary of Computing.
Assembler instructions
Assembler instructions. sometimes termed directives on other systems, are a request to the assembler to perform various operations during the assembly. For instance, CSECT means "start a section of code here"; DC defines a constant to be placed in the object code.
Macros and conditional assembly
Basic assembler language did not support macros. Later assembler versions allowed the programmer to group instructions together into macros and add them to a library, which can then be invoked in other programs, usually with parameters, like the preprocessor facilities in C and related languages. Macros can include conditional assembler instructions, such as AIF (an IF construct), used to generate different code according to the chosen parameters. That makes the macro facility of this assembler very powerful. While multiline macros in C are an exception, macro definitions in assembler can easily be hundreds of lines.
Operating system macros
Most programs will require services from the operating system, and the OS provides standard macros for requesting those services. These are analogous to Unix system calls. For instance, in MVS (later z/OS), STORAGE (with the OBTAIN parameter) dynamically allocates a block of memory, and GET retrieves the next logical record from a file.
Unlike Unix system calls, macros are not standardized across operating systems though. Even something as simple as writing a "sequential file" is coded differently e.g. in Z/OS than in Z/VSE.
Examples
The following fragment shows how the logic "If SEX = 'M', add 1 to MALES; else, add 1 to FEMALES" would be performed in assembler.
CLI SEX,C'M' Male? BNE IS_FEM If not, branch around L 7,MALES Load current value of MALES into register 7 AL 7,=F'1' add 1 ST 7,MALES store back the result B GO_ON Finished with this portion IS_FEM EQU * A label L 7,FEMALES Load current value in FEMALES into register 7 AL 7,=F'1' add 1 ST 7,FEMALES store back the result GO_ON EQU * - rest of program - * MALES DC F'0' Counter for MALES (initially=0) FEMALES DC F'0' Counter for FEMALES (initially=0)
The following is the ubiquitous Hello world program, and would, executing under an IBM operating system such as OS/VS1 or MVS, display the words 'Hello World' on the operator's console:
"WTO" is an assembler macro that generates an operating system call. Because of saving registers and later restoring and returning, this small program is usable as a batch program invoked directly by the operating system Job control language (JCL) like this:
or, alternatively, it can be CALLed as a subroutine from such a program:
CALL 'HELLO'Versions
With the exception of the assemblers for the IBM System/360 Model 20 the IBM assemblers were largely upward-compatible. The differences were mainly in the complexity of expressions allowed and in macro processing. OS/360 assemblers were originally designated according to their memory requirements.
7090/7094 Support Package assembler
This cross-assembler ran on a 7090 or 7094 system and was used while System/360 was in development.
Basic Programming Support assembler
The assembler for BPS is the true "basic assembler." It was intended to be loaded from cards and would run on an 8 KB System/360 (except Model 20). It had no support for macro instructions or extended mnemonics (such as BH in place of BC 2 to branch if condition code 2 indicates a high compare). It could assemble only a single control section and did not allow dummy sections (structure definitions). Parenthesized expressions were not allowed and expressions were limited to three terms with the only operators being '+', '-', and '*'.
Basic Operating System assembler
The Basic Operating System had two assembler versions. Both required 16 KB memory, one was tape resident and the other disk.
Assembler D
Assembler D was the DOS/360 assembler for machines with a memory size of 16 KB. It came in two versions: A 10 KB variant for machines with the minimum 16 KB memory, and a 14 KB variant for machines with 24 KB. An F-level assembler was also available for DOS machines with 64 KB or more. D assemblers offered nearly all the features of higher versions.
Assembler E and F
Assembler E was designed to run on an OS/360 system with a minimum of 32 KB of main storage, with the assembler itself requiring 15 KB. Assembler F could run under either DOS/360 or OS/360 on a system with a 64 KB memory, with the assembler requiring 44 KB. These assemblers were a standard part of OS/360; the version that was generated was specified at system generation (SYSGEN).
Assembler G
"Assembler G" was a set of modifications made to Assembler F in the 1970s by the University of Waterloo (Assembler F was/is open source). Enhancements were mostly in better handling of input/output and improved buffering which speed up assemblies considerably. "Assembler G" was never an IBM product.
Assembler H
Assembler H Version 2 was announced in 1981 and included support for Extended Architecture (XA), including the AMODE and RMODE directives. It was withdrawn from marketing in 1994 and support ended in 1995. It was replaced by High Level Assembler.
Assembler XF
Assembler XF was an upgrade of Assembler F which included the new System/370 architecture instructions. This version provided a common assembler for OS/VS and DOS/VS systems. Other changes included relaxing restrictions on expressions and macro processing. Assembler XF required a minimum partition/region size of 64 KB (virtual). Recommended size was 128 KB.
High Level Assembler
High Level Assembler (HLASM), announced in 1992 as a licensed program "becomes the default translator for System/370 (TM) and System/390 (TM) operating environments." The assembler supports the MVS, VSE, and VM operating systems and successors. As of Release 6 it now is able to run under Linux on zSeries and generate ELF or COFF object files. It features a long list of mostly usability enhancements, and incorporates the SLAC (Stanford Linear Accelerator) modifications to Assembler H. Among features added were an indication of CSECT/DSECT for location counter, a list of "using" registers currently active, an indication of whether a variable is read or written in the cross-reference, and allowing mixed-case symbol names. The RSECT directive (Read-only Control Section) allows the assembler to check reentrancy on a per-section basis. RSECT was previously "undocumented and inconsistently implemented in Assembler H." HLASM is the current assembler for IBM mainframe systems as of 2012.
IBM System/360 Model 44 PS assembler
The IBM System/360 Model 44 Programming System Assembler processed a language that was a "selected subset" of OS/360 and DOS/360 assembler language. It had no support for storage-to-storage (SS) instructions or the convert to binary (CVB), convert to decimal (CVD), read direct (RDD) and write direct (WRD) instructions. It did include four instructions unique to the Model 44: Change Priority Mask (CHPM), Load PSW Special (LPSX), Read Direct Word (RDDW), and Write Direct Word (WRDW). It also included directives to update the source program, a function performed by utility programs in other systems (SKPTO, REWND, NUM, OMIT, and ENDUP). It provided named common and implicitly defined &SETA symbols, but had some restrictions as well.
IBM System/360 TSS assembler
The assembler for the System/360 Model 67 Time Sharing System had a number of differences in directives to support unique TSS features. The PSECT directive generated a Prototype Control Section containing relocatable address constants and modifiable data used by the program.
Non-IBM assemblers
There have been several IBM-compatible assemblers for special environments.