ASSEMBLER
I
wrote a little multipass assembler to translate the
lcc assembly output into an executable image.
The
xr16 assembler reads one or more assembly files and
emits both image and listing files. The lexical analyzer
reads the source characters and recognizes tokens
like the identifier _main. The parser scans tokens
on each line and recognizes instructions and operands,
such as register names and effective address expressions.
The symbol table remembers labels and their addresses,
and a fixup table remembers symbolic references.
In
pass one, the assembler parses each line. Labels are
added to the symbol table. Each instruction expands
into one or more machine instructions. If an operand
refers to a label, we record a fixup to it.
In
pass two, we check all branch fixups. If a branch
displacement exceeds 128 words, we rewrite it using
a jump. Because inserting a jump may make other branches
far, we repeat until no far branches remain.
Next,
we evaluate fixups. For each one, we look up the target
address and apply that to the fixup subject word.
Lastly, we emit the output files.
I
also wrote a simple instruction set simulator. It
is useful for exercising both the compiler and the
embedded application in a friendly environment.
Well,
by now you are probably wondering if there is any
hardware to this project. Indeed there is! First,
lets consider our target FPGA device.