In this project, I wrote a 2-pass assembler that converts a set of instructions written in a simple mnemonic language into machine code for the CPU I built in project 7.
The first pass of an assembler figures out what line number corresponds to each symbol that are used by branching operations. The second pass takes in the tokens and the label dictionary, generates the set of machine instructions, and fills in the address values for branch instructions from the symbol table.
I tested my assembler using the assembly version of the program.mif file from last week:
The output MIF file is
which is identical to the program.mif file.
I wrote a fib.txt file which holds the assembly version of the program that generates the first ten numbers of the fibonacci sequence.
My assembler was able to translate the assembly code into machine code, as shown below. The file is identical from the original fibonacci.mif file.
The first ten numbers are shown by oport:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
I wrote a sum.txt file and converted it to sum.mif using my assembler.
The recursive program sums numbers from 1 to 6.
The assembler converted the text file into a MIF file.
The sum is shown by oport whose final value is 21.
1 + 2 + 3 + 4 + 5 + 6 = 21
The displays correspond to the value of RC.
The displays reflect the value of RB.
If there are two identical labels, my assembler will catch the error.
If the operation is not in the instruction table, then the seemlier will report the error. For example, the assembler does not know the operation "output."
If the order of registers are flipped, my assembler will catch the error and suggest correction.
I used try and except to handle this kind of errors.
the immediate value was put after the destination register whereas the right order should be movie 1 RA.
In the following example, the source register RG is not in the register fields.
The destination register RF is not in the register fields, so the assembler will report an error.
I wrote two more test programs to test ALL the rest CPU's capabilities.
The program testBra.txt tests the remaining three branching operations(BRAZ, BRAN, BRAO).
The program testInstr.txt uses all the rest instructions.
I commented what should be executed in the text files. The results of simulation are as expected.