This project will give you practice in writing in an assembly-like language.
In class we have seen some examples of programs written for our virtual machine. In this project you will try your hand at writing a program yourself.
Copy the code for the virtual machine and disassembler from the course directory.
cp /homes/tvandrun/Public/cs245/proj8/* .
Write a program gcd.vml that computes the
greatest common divisor of 180 and the integers from
18 to 24, using the Euclidean algorithm.
In particular, implement a program from the following pseudo-code:
for (i = 18; i <= 24; i++)
print gcd(180, i);
int gcd(int a, int b) {
if (b == 0) return a;
else return gcd(b, a mod b);
}
Recall that the file that the virtual machine reads in doesn't look like the examples we've seen in class. we have always looked at the disassembled versions---the actual file executed is just a sequence of numbers. The format is that the first number gives the number of instruction words, and the rest of the numbers are the actual instructions.
You'll probably want to write the program in phases.
When I wrote mystery (the program
that calculated the factorial of 5), I started by using
"labels" instead of instruction positions for
jumps.
LOAD 5 r1
LOAD 0 r2
LOAD 1 r3
LOAD L1 r4
LOAD L2 r6
PSH 4 r5
WRLO 0 r1
JAL r4
POP r2
RELO 0 r5
PRN r5
HLT
L1:
RELO 0 r5
IF r5 r6
WRLO 0 r3
RET
L2:
SUB r5 r3 r7
WRLO 1 r5
WRLO 2 r29
PSH 4 r8
WRLO -1 r8
WRLO 0 r7
JAL r4
RELO 0 r7
RELO -1 r8
POP r8
RELO 2 r29
RELO 1 r5
MUL r5 r7 r8
WRLO 0 r8
RET
Then I counted off positions to determine what the labels were, and also replaced all the instructions and registers with plain numbers. Furthermore, I counted the number of instruction words.
84
1 5 1
1 0 2
1 1 3
1 31 4
1 41 6
14 4 5
17 0 1
12 4
15 2
16 0 5
8 5
9
L1:
16 0 5
7 5 6
17 0 3
13
L2:
4 5 3 7
17 1 5
17 2 29
14 4 8
17 -1 8
17 0 7
12 4
16 0 7
16 -1 8
15 8
16 2 29
16 1 5
5 5 7 8
17 0 8
13
Finally, I made every number appear on a line by itself (and I got rid of the labels).
84 0 1 5 1 1 0 2 1 1 3 1 31 4 1 41 6 14 4 5 17 0 1 12 4 15 2 16 0 5 8 5 9 16 0 5 7 5 6 17 0 3 13 4 5 3 7 17 1 5 17 2 29 14 4 8 17 -1 8 17 0 7 12 4 16 0 7 16 -1 8 15 8 16 2 29 16 1 5 5 5 7 8 17 0 8 13
Turn in your code by copying your directory (eg, proj8)
to a turn-in directory
I've made for you.
cp -r proj8 /cslab.all/ubuntu/cs245/turnin/(your user id)
DUE:Friday, Apr 27, 5:00 pm.