The main program is "gen21.txt". It accepts a N-obj (a.obj) file produced by "nut32" compiler and outputs a S-obj file to stdout (the screen). S-obj file is a machine code for a processor (we use another virtual machine Som-v2 for this purpose), called "somv2.exe".
(to read further about som-v2 goto this link)
First we compile the code generator itself, "gen21.txt" and rename the object file to "gen21.obj".
c:>
nut32 < gen21.txt
c:>
ren a.obj gen21.obj
Now "gen21.obj" will be our executable code generator. We try it out on the previous example "ex-ch2.txt".
c:>
nut32 < ex-ch2.txt
Compile the source and now we have "a.obj" as a N-obj file. Here is what N-obj looks like:
30
30
2
1 14 1 0
4
1 20 1 2
6
0 0 4 0
8
1 19 257 6
10
1 14 1 0
12
1 14 1 10
14
1 8 0 12
16
0 0 14 0
18
1 19 257 16
20
1 16 20 0
22
1 13 18 20
24
0 0 22 0
26
1 13 8 24
28
0 0 26 0
30
1 19 1 28
0
3
18
print 3 8 1 1
20
sq 3 18 1 1
22
main 3 30 0 1
Generate S-code from it using our code generator "gen21.obj". Keep the output in "ex-ch2.s".
c:>
nsim32 gen21.obj < a.obj >
ex-ch2.s
Here is "ex-ch2.s"
----------------
5678920
1
16
3104
23 294 280 292 532 294 280
280
3 532 550 5151 1824 800 532
2000
1999
3
print
3 3 1 1
sq
3 7 1 1
main
3 12 0 1
----------------
The first line "5678920" denotes Som-v2 object file. The next line "1 16" is the starting address and length of the machine code. The whole next block is the machine code (S-code). Each S-code has the format arg:24 op:8, for example "3104" is:
arg = 3104 >> 8 = 12
op = 3104 & 255 = 32
So this instruction is "call 12".
Here is the encoding table of S-code (from my textbook chapter 4).
Encoding
0
-- 1 add
2 sub 3 mul 4 div
5
band 6 bor 7
bxor 8 not
9 eq
10
ne 11 lt 12
le 13 ge
14 gt
15
shl 16 shr 17
mod 18 ldx
19 stx
20
ret 21 -- 22
array 23 <end> 24 get
25
put 26 ld 27
st 28 jmp
29 jt
30
jf 31 lit 32
call 33 --
34 inc
35
dec 36 sys 37
case 38 fun
The next block "2000 1999" is the data block, it contains start and end address follows by the data. This numbers say there is no data. The last block is the symbol table.
To "run" the S-obj, use Som-v2 virtual machine ("somv2.exe") like this:
c:>
somv2 -x < ex-ch2.s
It should give out the correct result (400) on the
screen.
To see "help" of somv2, do "somv2 -?".
last update 12 July 2010