Mark-8 Design | Microcomputer According to Titus | Microcontroller Project | Postscriptum | Lessons Home |

Lesson 8: Assembly Language

by David G. Larsen, Peter R. Rony, Jonathan A. Titus and Christopher A. Titus

MOST 8-BIT microprocessors, such as the 8080A, Z-80, 6800, 6502, and F-8, can add and subtract only 8-bit numbers, which can represent only decimal quantities between 0 and 255. This is not enough resolution or dynamic range for many applications. Consequently, multiple-precision and jloating-point numbers are used.

The term multiple precision refers to the use of two or more computer words to represent a numeric quanti- ty.--l-H- the above-mentioned microprocessor chips, a computer word is called a byte, and is 8 bits long. A double-precision number, therefore, contains 2 bytes, or 16 bits, and can represent any unsigned integer number between 0 and 65,535. Similarly, a triple-precision number contains 3 bytes, or 24 bits, and can represent any unsigned integer number between 0 and 16,777,216. Despite this ability to represent very large numbers, multiple-precision numbers do have their limitations, especially when units such as picograms, liters per second, and kilograms all appear in a single equation.

IN THE March column, integer addition and subtraction subroutines were discussed. Since microprocessors like the 8080 and 6800 do not have multiplication and division instructions, subroutines that contain addition and subtraction instructions must be written to perform these operations. A typical paper- and-pencil decimal and binary multiplication for two different sets of numbers is shown in Figure 1.

As you can see, the mechanics of multiplication is very similar in these two examples. As the multiplicand is multiplied by larger and larger powers of ten or powers of two, the result of the multiplication has to be shifted to the left by one, to increase the significance of the result. For instance, when 1024 is multiplied by the 9 in 596, the result (9216) is shifted to the left by one place, because the multiplication is really 90 x 1024 and the result is really 92,160.

IN SOME of our previous columns, we have provided examples of short subprograms or subroutines that could be used by a main program. Subroutines are powerful software building blocks. They facilitate program development since they may be written and tested apart from the main body of software. In addition, they can be adapted for use with almost any type of program. In this month's column, we will focus upon their operation as well as on the use of stack instructions.

We have previously discussed the use of both unconditional and conditional jump instructions, which transfer computer control to another software task starting at the sixteenbit address specified within the jump instruction itself. The jump instruction is a one-way branch since it points to a single address, as illustrated in Figure 1. However, short subprograms that are used repeatedly exist in many software tasks. Examples of such tasks include mathematical computation, control, and teletypewriter input/output routines. It seems wasteful to duplicate these subprograms throughout the main program, so an attempt is made to separate them at the end of the main program and, in some manner, branch to them when they are needed.

ONE of the problems facing many microcomputer users is the preparation of software for particular applications. The software examples provided in past columns are short enough to have been put together or assembled by hand, i.e., each mnemonic was translated into its octal, hexadecimal or binary equivalent. Addresses for jumps, calls and input!output devices are easily added or changed since the computer programs are short and the addresses are probably listed in sequential order on the rought draft. Unfortunately, not all software preparation is this easy. Many application programs can be many thousands of steps long. This column will initiate a discussion of the aids available for microcomputer program development.

One of the biggest problems in software development is the clear, concise statement of the problem and its solution. All of the desired results, inputs, outputs and the complete program flow-including all decision making steps-must be considered before the programming is started. This can be in outline or block diagram form, but a flow chart will prove much easier to follow. A typical flow chart is shown in Figure 1.

A s THE APPLICATION of microcomputers continues to grow, more and more users are asking what the best language is for programming the microcomputer. There are currently only two languages that have widespread support, assembly language and the BASIC* language.

In choosing a language, there are a number of advantages and disadvantages associated with each that must be considered. The two languages should be compared on the basis of cost of programming, memory requirements, machine independence of programs, program relocatability, users' libraries, logicaloperations, use of nonstandard peripherals, and speed of execution. This listing is not in order of importance. In fact, there are probably items of interest that have been omitted. For each particular microcomputer application, the user may be interested in only one of the items, such as memory (storage) requirements, while others may feel that all of the items are important and must be considered.