CP/M - ASSEMBLY LANGUAGE by Stanley M. Gee, PUGSKUG, August 1987 (Assembly language primer for CP/M) Assembly language programing, while not difficult, is tedious and slow for most beginners. You may wonder why, if assembly programing is so tedious and slow, it is used almost universally by the computer industry. Assembly language programs are written in machine coding and run faster. Unlike a higher level language like basic, the programmer in assembly language must have an understanding of the computer architecture. Memory locations which are taken care of by the basic software are the responsibility of the assembly programmer. There are several books written on assembly programming and I would recommend that any one truly interested in learning assembly language programming obtain any or all of the books available and study them in earnest. Also there are courses taught in assembly language programming which will assist the neophyte in learning about this primitive language. Assembly language programs can be written with the CP/M editor (Ed. note: if you're a masochist!), a Word Processor like Perfect Writer or with the CP/M Dynamic Debugger Tool (DDT). After the program is written with a word processor or the editor, it must be compiled with ASM.COM. If successful the HEX file generated by the compiler must be loaded with LOAD.COM which generates the machine coding. The program is then executable after it is loaded. If the program is written using the DDT.COM it must be saved with the SAVE.COM. Simple programs can and should be written with the DDT utility. However programs written with the DDT utility will not have a comment field. Large programs should be written using your word processor. The DDT utility must be used if you do not have the source or original program listing. The source file for an assembly language is normally divided into five fields. Each field is separated by spaces or a tab character. The separation of the fields makes for a more readable source program. The first field contains program line numbers. These line numbers are ignored by the Assembler and is optional. The second field contains labels much like the labels in a Fortran program. The labels can be 16 characters long (Ed note: depending on the assembler) and must start with a letter. A colon may follow the label. A label is optional except when it is used in the operand field. A label should appear only once in the label field; however it may appear in the operand field many times. The third field contains Mnemonics, which is a fancy term for name and is not optional. The fourth field is the Operand field which requires one or more operands, however some Mnemonics do not require an operand. This field can be occupied by a label, constant or an expression. The fifth column is for Comments and begins with a semi-colon. This field is also optional; however, it is good programming practice to comment your programs. A numerical constant is a fixed number which can be binary, octal, decimal or hexadecimal. Dollar signs can be used as delimiters within the numerical constants. A string constant is a series of characters delimited by apostrophe symbols. Delimiter is a fancy programming term which means a special character used to block off a series of characters or numbers, much like the use of the apostrophe symbols. Delimiter is a fancy programming term which means a special character used to block off a series of characters or numbers, much like the use of the apostrophe in marking of quotations. Arithmetic and logical operators are also possible. A single dollar sign, when used as an operand, causes the current value of the location counter to be used. Lastly there are the assembler directives. DB = define byte, DW = define word and DS = define storage. These directives initialize storage areas in memory. The DB statements are stored as 8-bit values and the DW statement is stored as 16 bit values. The low-order bit is stored first then the high-order bit. DS is evaluated and the number of memory locations is reserved. ORG = start address of the instructions following. End = end of source program. EQU = assignment of a value to a label. IF and ENDIF = conditional branching when IF is true. The assembly language source file must have an .ASM extension. Upon completion of the program it must be compiled with the ASSY compiler. The correct syntax is "ASSY Filename.shp ". SHP breaks down as follows: "S" is the disc drive where the HEX file will reside. "H" and "P" can be substituted with a "Z" to skip the generation of the files. "X" can be substituted for the "P" to send the PRN file to the lineprinter. After entering the ASM command the computer will respond with CP/M ASSEMBLER - VER 2.0 followed by any error message. When the assembler is finished it will return a hexadecimal address of the first free space following the assembly language program, a use factor of the symbol table area and an end of assembly message in the following format. XXXX yyyH USE FACTOR END OF ASSEMBLY If errors are encountered they must be corrected and the program must be recompiled. Upon successful compilation, the program must then be loaded with the LOAD command. The correct syntax is A>LOAD B:PROGRAM The computer will respond with FIRST ADDRESS 0100 LAST ADDRESS 0345 BYTES READ 0244 RECORDS WRITTEN 02 If the load was successful the Program can now be executed.