Therefore, a program in assembly language is very much like a machine
language program made legible to humans. You might compare the
machine language version of a program to a TNT -derivation done in the
obscure Godel-numbered notation, and the assembly language version to
the isomorphic TNT-derivation, done in the original TNT-notation, which
is much easier to understand. Or, going back to the DNA image, we can
liken the difference between machine language and assembly language to
the difference between painfully specifying each nucleotide, atom by atom,
and specifying a nucleotide by simply giving its name (i.e., 'A', 'G', 'C', or
'T). There is a tremendous saving of labor in this very simple "chunking"
operation, although conceptually not much has been changed.
Programs That Translate Programs
Perhaps the central point about assembly language is not its differences
from machine language, which are not that enormous, but just the key idea
that programs could be written on a different level at all! Just think about
it: the hardware is built to "understand" machine language programs-se-
quences of bits-but not letters and decimal numbers. What happens when
hardware is fed a program in assembly language? It is as if you tried to get a
cell to accept a piece of paper with the nucleotide sequence written out in
letters of the alphabet, instead of in chemicals. What can a cell do with a
piece of paper? What can a computer do with an assembly language
program?
And here is the vital point: someone can write, in machine language, a
translation program. This program, called an assembler, accepts mnemonic
instruction names, decimal numbers, and other convenient abbreviations
which a programmer can remember easily, and carries out the conversion
into the monotonous but critical bit-sequences. After the assembly lan-
guage program has been assembled (i.e., translated), it is run-or rather, its
machine language equivalent is run. But this is a matter of terminology.
Which level program is running? You can never go wrong if you say that
the machine language program is running, for hardware is always involved
when any program runs-but it is also quite reasonable to think of the
running program in terms of assembly language. For instance, you might
very well say, "Right now, the CPU is executing a JUMP instruction",
instead of saying, "Right now, the CPU is executing a '111010000' instruc-
tion". A pianist who plays the notes G-E-B E-G-B is also playing an arpeg-
gio in the chord of E minor. There is no reason to be reluctant about
describing things from a higher-level point of view. So one can think of the
assembly language program running concurrently with the machine lan-
guage program. We have two modes of describing what the CPU is doing.
Levels of Description, and Computer Systems 291