test2.sm
2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
.data
display:
.word 0 # base do display
.word 0 # display + 4
.word 0 # display + 8
htop:
.word heap # guarda o endereco da primeira livre
heap:
.text # comeca o programa
push _let_0
jump # saltar o codigo das funcoes
nfactor_1: # codigo de funcao
push 4 # espaco p/ SL e indice(s) for
link
push display # comeca SL in
push 8 # nivel actual x 4
add
dup # 2 x o endereco dentro do display
load
push -4
local
store # guarda o valor do display no SL
push 0
local # calcula o FP
swap
store # regista a FP no display, fim SL in
# comeca If Then Else
push _then_1
# comeca ==
push _neq_3
# comeca IdExp
push 12 # deslocamento
local # endereco na actual frame
load
# fim de IdExp
push 0 # expressao inteira
sub
skipz
jump # se nao sao iguais, para _neq_3
pop # tira a label a mais
push 1
push _fimEQ_4
jump
_neq_3:
push 0
_fimEQ_4: # fim de comp. ==
skipz
jump # para a parte Then
pop # comeca a parte Else
# comeca mul
# comeca IdExp
push 12 # deslocamento
local # endereco na actual frame
load
# fim de IdExp
# comeca Function Call
# comeca sub
# comeca IdExp
push 12 # deslocamento
local # endereco na actual frame
load
# fim de IdExp
push 1 # expressao inteira
sub # arithmetic exp
dup # espaco para o valor de retorno
push nfactor_1 # label: nome da funcao e ID unico
call
swap
pop # retira args
# fim de Function Call
mul # arithmetic exp
push _fimIF_2
jump
_then_1:
push 1 # expressao inteira
_fimIF_2: # fim de If Then Else
push 8
local
store # copia o resultado para V.R.
push -4
local
load # le o SL
push display
push 8 # nivel actual x 4
add
store # guarda o valor do SL no display
unlink # termina a frame da funcao
jump
_let_0:
push 0 # espaco para retornar
push 4 # espaco p/ SL, locais e indice(s) for
link
push display # comeca SL in
push 4 # nivel actual x 4
add
dup # 2 x o endereco dentro do display
load
push -4
local
store # guarda o valor do display no SL
push 0
local # calcula o FP
swap
store # regista a FP no display, fim SL in
# inicializa as variaveis locais
# corpo do let
# comeca ExpSeq
# comeca Function Call
push 10 # expressao inteira
dup # espaco para o valor de retorno
push nfactor_1 # label: nome da funcao e ID unico
call
swap
pop # retira args
# fim de Function Call
# fim de ExpSeq
push 4
local
store # copia o resultado para V.R.
push -4
local
load # le o SL
push display
push 4 # nivel actual x 4
add
store # guarda o valor do SL no display
unlink # termina a frame do let