Você está na página 1de 72

Gerao de Cdigo para uma Mquina

Hipottica a Pilha

MEPA
Mquina de Execuo para Pascal e
sua linguagem de montagem
MEPA
composta de 3 Regies
No tem HEAP, pois o PS no permite variveis dinmicas

Cdigo ...
2
1
Pilha 0
+ Display: D(b)
Dados (Vetor dos
Estticos Registradores
de Base que
Regio de programa: Regio da Pilha de apontam para
P(i) Dados: M(s) M)
Gerao de Cdigo
Uma vez que o programa da MEPA est carregado na regio P, e os
registradores tm seus valores iniciais, o funcionamento da mquina
muito simples:

As instrues indicadas pelo registrador i so executadas at que seja encontrada a


instruo de parada, ou ocorra algum erro.
A execuo de cada instruo aumenta de 1 o valor de i, exceto as instrues que
envolvem desvios.

Em nvel de projeto, o vetor P ser construdo pelo compilador que o gera


como sada. Esta sada passa a ser a entrada de um programa
interpretador deste cdigo.

Porque falei em vetor P e no arquivo para P???

As reas M e D e os registradores i, s, b, esto fora do escopo do


compilador e, portanto, so definidos e manipulados no programa
interpretador, como mostra a especificao inicial para nosso projeto:
Sistema
Hbrido,
precisa do
Interpretador
para MEPA
Pascal Simplificado
com extenses individuais Linguagem da
MEPA

Linguagem
LF LO Linguagem

C
fonte de alto
Objeto
nvel
LD

JAVA com JavaCC


Registro de ativao para funes
Temporrios Avaliao de expresses ...
Variveis
locais d
Dados Locais 2
D c
1
Estado da mquina Ponto de retorno
0 D [1] anterior
Restaura
Link de acesso = Display na MEPA ambiente
anterior Endereo Retorno
Aponta para o RA do
Link de controle chamador Par Y
Tem endereo
negativo a D[1]
Parmetros reais Par X
...
Valor retornado - funo function f (a,b): integer; Valor retornado - funo
Var c, d Variveis Globais
Begin .... f:= end;
Registro de M
ativao (RA) geral Begin
Na Mepa...
...write(f(X,Y));...
End.
Gerencia as info necessrias para uma nica execuo de um procedimento
Registro de ativao para procedimentos
Gerencia as info necessrias para uma nica execuo de um procedimento

Temporrios Avaliao de expresses ...


Variveis
locais d
Dados Locais 2
D c
1
Estado da mquina Ponto de retorno
0 D [1] anterior
Restaura
Link de acesso = Display na MEPA ambiente
anterior Endereo Retorno
Aponta para o RA do
Link de controle chamador Par Y
Tem endereo
negativo a D[1]
Parmetros reais Par X
Procedure p (a,b)
Valor retornado - funo Var c, d Variveis Globais
Begin ... end;
M
Registro de Begin
ativao (RA) geral p(x,y) Na Mepa...
End.
Gerao de Cdigo para a MEPA

Veremos agora a gerao de cdigo para:

1. Avaliao de expresses
2. Comando de atribuio
3. Comandos Iterativos e Condicionais
4. Procedimentos pr-definidos de E/S
5. Programas sem procedimentos
6. Procedimentos sem parmetros

Vamos anotar no conjunto de instrues os nmeros acima e


redefinir algumas instrues em certos momentos, pois
nos moveremos do simples para o complexo
Linguagem de Montagem da MEPA, separados
por contextos de uso
1. Avaliao de expresses 16 instrues
1. SOMA 10. CMMA
2. SUBT 11. CMIG
3. MULT 12. CMDG
4. DIVI Usados sem 13. CMEG
alterao
5. INVR 14. CMAG
6. CONJ 15. CRCT k
7. DISJ
8. NEGA 16. CRVL n
9. CMME s := s + 1 alterado

Uso da notao polonesa (posfixa) M[s] := M[n]


1. Avaliao de expresses - clculos
E = E1 op E2
Avaliar E1 e E2 e depois operar
Guarda-se os valores v1 e v2 de E1 e E2 na
prpria pilha M, v ser o valor final de E

? ? s v2 v2
s s
? v1 v1 v
s ? m ? m ? m ? m

M M M M
Ex1: a + (b div 9 -3) * c
(operadores com prioridade diferente)

a, b, c esto em 100, 102 e 99


Com os valores -2, 10 e 100
s = 104

Observem que o cdigo para expresses


fica na notao polonesa posfixa

PORQUE????
rvore de Derivao para a expresso
a + (b div 9 -3) * c
E

E + T

T T * F

F ( E ) c

a E - T

T div F F

F 9 3

E -> E + T| E T | T b

T -> T div F | T * F | F
F -> (E) | not F | ID | NRO
Programa-objeto da traduo

CRVL 100 (a)


CRVL 102 (b)
CRCT 9 (c)
DIVI
CRCT 3
SUBT
CRVL 99
MULT
SOMA
Ex2: 1- a + b
(operadores de mesma prioridade)

a, b esto em 100, 102


Com os valores -2, 10
s = 104

Mas podemos tambm deixar os


endereos genricos (A e B)
Programa-objeto da traduo

CRCT 1
CRVL A (endereo de a na pilha M, obtido da TS)
SUBT
CRVL B
SOMA
2. Comando de atribuio

Atribuio a variveis simples: V := E


A expresso E j sabemos traduzir
n o endereo atribudo pelo compilador
varivel V

ARMZ n
M[n] := M[s] alterado

s := s - 1
Ex3: a := a + b * c

a, b, c esto em 100, 102 e 99


Com os valores -2, 10 e 100

Observem que o valor final do registrador s aps


a execuo de uma atribuio ser igual ao seu
valor inicial

Esta propriedade valer para todo comando em


Pascal; excees: desvio e chamadas de
procedimentos e funes
Programa-objeto da traduo

CRVL 100
CRVL 102
CRVL 99
MULT
SOMA
ARMZ 100
3. Comandos Iterativos e Condicionais

Os esquemas do IF e WHILE usam:

1. DSVS p
Usados sem
2. DSVF p alterao

3. NADA

p um nmero que indica o endereo de programa na MEPA


Aqui usaremos rtulos simblicos , em vez de nmeros
If E then C1 else C2 / If E then C
... } traduo de E
... } traduo de E
DSVF L1 DSVF L1
...} traduo de C1 ... } traduo de C
DSVS L2 L1 NADA
L1 NADA
... } traduo de C2
L2 NADA While E do C
L1 NADA
... } traduo de E
DSVF L2 determinado depois
... } traduo de C
DSVS L1 determinado a priori
L2 NADA
Ex4: If q then a:= 1 else a := 2

Neste e nos outros 2 exerccios usaremos


os rtulos simblicos, em ordem
crescente: L1, L2, L3 ....
Programa-objeto da traduo

CRVL Q
DSVF L1
CRCT 1
ARMZ A
DSVS L2
L1 NADA
CRCT 2
ARMZ A
L2 NADA
Ex 5: if a>b then q := p and q
else if a <2 *b then p := true
else q := false
Programa-objeto da traduo

CRVL A L3 NADA DSVS L6


CRVL B CRVL A L5 NADA
CMMA CRCT 2 CRCT 0
DSVF L3 CRVL B ARMZ Q
CRVL P MULT L6 NADA
CRVL Q CMME L4 NADA
CONJ DSVF L5
ARMZ Q CRCT 1
DSVS L4 ARMZ P
Ex 6: while s <=n do s := s +3 * s
Programa-objeto da traduo

L7 NADA MULT
CRVL S SOMA
CRVL N ARMZ S
CMEG DSVS L7
DSVF L8 L8 NADA
CRVL S
CRCT 3
CRVL S
Exerccio: Fazer a traduo para o comando FOR
e o exerccio
29. <comando repetitivo 2> ::= for <identificador> := <expresso>
(to|downto) <expresso> do <comando>

fatorial 100
i 101
n 102
For VC := E1 to E2 do C For VC := E1 downto E2 do C
...} traduo de E1 ...} traduo de E1
ARMZ VC ARMZ VC
L1 NADA L1 NADA
CRVL VC CRVL VC
...} traduo de E2 ...} traduo de E2
CMEG { VC > CF: FIM } CMAG { VC < CF: FIM }
DSVF FIM DSVF FIM
...} traduo de C ...} traduo de C
CRVL VC CRVL VC
CRCT 1 INC CRCT 1 DEC
SOMA SUBT
ARMZ VC ARMZ VC
DSVS L1 DSVS L1
FIM NADA FIM NADA
fatorial 100
i 101
n 102
CRCT 2
ARMZ 101
CRVL 101
L1 NADA
CRCT 1 INC
CRVL 101 SOMA
CRVL 102 ARMZ 101
CMEG { VC > CF: FIM } DSVS L1
DSVF FIM FIM NADA
CRVL 100
CRVL 101
MULT
ARMZ 100
Exerccio: Fazer a traduo para o comando
REPEAT e o exerccio
30. <comando repetitivo 3> ::= repeat <comando> { ; <comando>} until <expresso>

x 101
Repeat C {; C} Until E

L1 NADA
... } traduo de C1...Cn

... } traduo de E

DSVF L1 determinado a priori

L2 NADA no necessrio, mas bom se


parecer com o While
x 101

L1 NADA

CRVL 101
CRCT 1
SOMA
ARMZ 101

CRVL 101
CRCT 10
CMIG

DSVF L1

L2 NADA
Exerccio casa: Fazer a traduo para o comando
CASE com valores constante nicos e depois a
mais geral (Drago Roxo, ingls, pg. 418)
26. <comando condicional 2> ::=
case <expresso> of <elemento do case> { ; <elemento do case> } end
27.<elemento do case> ::= <constante> : <comando>
Case idade of
V1: write(X); 1. Traduza E e guarde em t
V2: write(Y); 2. Desvie para o rtulo de
V3: write(Z); TESTE (no final da traduo
V4: write(W) de Cis) que implementa uma
end tabela que pareia Vi com Ci
e DSVS em cada par para o
rtulo do Ci
Restries Semnticas: 3. Traduza cada Ci (tem um
1. <expresso> deve ser do tipo ordinal rtulo para cada um) e Gere
2. As constantes devem ser nicas (TABELA no um DSVS FIM aps cada um
compilador para guardar valor e rtulo ) 4. O rtulo FIM est no final da
3. O tipo das constantes deve ser tabela
compatvel com o tipo da expresso
4. Procedimentos pr-definidos de E/S

1. LEIT Usam variveis simples


2. IMPR

Read (V1, V2, ..., Vn)


Write(E1, E2,...,En)

Usados sem
alterao
Traduo

LEIT ...} traduo de E1


ARMZ V1 IMPR
LEIT ...} traduo de E2
ARMZ V2 IMPR
... ...
LEIT } traduo de Em
ARMZ Vn IMPR
Ex 9:
Read (a, b)
Write (x, x*y)

CRVL X
LEIT IMPR
ARMZ A CRVL X
LEIT CRVL Y
ARMZ B MULT
IMPR
5. Programas sem procedimentos
1. PARA
( a ltima instruo de um programa)
2. INPP
s := -1 alterado

( a primeira instruo de um programa)

3. AMEN n
(usado para reservar posies de memria para cada linha de
declarao de variveis)
O compilador pode calcular facilmente os endereos das
variveis v1,v2,...vn que devero ser 0,1,...n-1 (quando
esta a primeira declarao)
Usados sem
alterao
Ex 10

program ex1; begin


var n,k: integer; f3:= f1 + f2;
f1,f2,f3: integer; f1 :=f2; f2 := f3;
begin k := k + 1
read(n); end;
f1:=0; f2:=1; k:=1; write(n,f1)
while k <= n do end.
traduo CRVL 3
INPP SOMA
AMEN 2 ARMZ 4
AMEN 3 CRVL 3
LEIT ARMZ 2
ARMZ 0 CRVL 4
CRCT 0 ARMZ 3
ARMZ 2 CRVL 1
CRCT 1 CRCT 1
ARMZ 3 SOMA
CRCT 1 ARMZ 1
ARMZ 1 DSVS L1
L1 NADA L2 NADA
CRVL 1 CRVL 0
CRVL 0 IMPR
CMEG CRVL 2
DSVF L2 IMPR
CRVL 2 PARA
Detalhes de Implementao

No lugar de rtulos simblicos, L1 e L2, devem aparecer


endereos reais.
L1 facilmente calculado, pois a prxima posio de P ao
encontrar um comando que envolve desvio: while, if, etc.
Quando L2 mencionado pela 1a vez, no possvel saber seu
valor real. O que se faz guardar o endereo desta instruo e
quando L2 for determinado (ao final do while), deve-se voltar a
esta posio e preencher o valor de L2.
por isto que guardamos os cdigo gerados num array e no
os gravamos seqencialmente num arquivo de sada:
precisamos eventualmente "voltar" a uma instruo j gerada.
Esta volta para remendar o que j foi gerado chamada de tcnica de
backpatching, pois preenche informao no especificada de rtulos na
gerao de cdigo
6. Procedimentos sem parmetros
As Instrues da MEPA usam endereos fixos.

Como traduzir procedimentos recursivos?

Num dado instante iro existir vrias encarnaes das


variveis locais dos procedimentos que no podem
ocupar a mesma memria!

Soluo: usar uma disciplina de pilha para guardar o


valor anterior das variveis locais e assim liberar espao
para a prxima encarnao.
O valor anterior deve ser restaurado no retorno do
procedimento.
6. Procedimentos sem parmetros
a partir de

AMEN m,n nmero de vars


Cada procedimento
para k := 0 at n-1 faa salva no topo da
pilha o contedo das
s := s+1 variveis locais

M[s] := M[m+k]
alterados

DMEN m,n Os valores so


restaurados no
Para k := n-1 at 0 faa retorno do
procedimento
M[m+k] := M[s]
s := s -1
O programa principal tambm considerado um procedimento
6. Procedimentos sem parmetros
Vejam as informaes do Registro de Ativao
A informao
RTPR necessria para
executar o retorno de
i := M[s] um procedimento o
s := s 1 endereo da instruo
a qual a execuo
alterados deve retornar.
O lugar mais natural
CHPR p para guardar esta
informao a prpria
s := s + 1 pilha.
A instruo RTPR
M[s] := i + 1 sempre encontra a
informao no topo da
i := p pilha, pois a CHPR
guardou ela l.
Exemplo de programa com procedimento
recursivo
program ex2;
var x, y: integer;
procedure p; (Vejam pg 168 do Kowaltowski)
var z: integer; para detalhes de implementao:
begin
z := x; x := x -1;
if z > 1 then p Lembrem que os endereos das
else y := 1; variveis so seqenciais, pois a
y := y * z varredura do programa da
Endereos: esquerda para direita.
end;
begin X: 0 Assim, com ajuda de uma varivel
read(x); global, o procedimento
Y: 1 gerao_cdigo no compilador que
p;
Z: 2 esto desenvolvendo ir atribuir os
write(x,y)
endereos 0, 1, 2 na rea M da
end. Vejam a MEPA para X, Y, Z.
pgina 107 do
Kowaltowski Tendo estas fixas, o AMEN funciona
corretamente.
Configuraes da pilha para cada chamada do procedimento p

... z2
z3

...
z1
z1 z
z2
z1
... ...
y
y
...
z2 z z1

x z3
x z
y
z4 z
y
Os smbolos z1,z2,z3 e z4
x y
denotam os valores das
encarnaes sucessivas de z x
x
Traduo do programa
INPP
AMEN 0,2 CRCT 1
DSVS L1 ARMZ 1
L2 NADA L4 NADA
AMEN 2,1 CRVL 1
CRVL 0 CRVL 2
ARMZ 2 MULT
CRVL 0
ARMZ 1
CRCT 1
SUBT DMEN 2,1
ARMZ 0 RTPR
Programa
CRVL 2 L1 NADA principal
CRCT 1 LEIT
CMMA ARMZ 0
DSVF L3 CHPR L2
CHPR L2 CRVL 0
DSVS L4 IMPR
L3 NADA
CRVL 1
IMPR
DMEN 0,2
Note o uso de DSVS L1 para pular o cdigo do
procedimento p ao iniciar-se a execuo PARA
Casos de declarao de mais de 1 procedimento,
com suas variveis locais

1. Quando no h encaixamento: no pode


haver acesso simultneo s variveis locais
dos 2. Assim, as mesmas posies fixas de
memria podem ser atribudas s posies de
memrias dos 2.

2. Quando h encaixamento: como neste caso


pode haver acesso varivel local de um
procedimento por outro interno, as variveis
locais no podem ocupar a mesma posio de
memria.
Exemplos 7 e 8 (Kowaltowiski, pgs.110 e 113)

Regra Geral para atribuir endereos a


variveis em procedimentos sem
parmetros:
Se um procedimento q, que tem k variveis
locais, est diretamente encaixado dentro de
um procedimento p cuja ltima varivel local
recebeu endereo m, ento as variveis de q
recebem os endereos m+1, m+2, ..., m+k.
Supor que o programa principal um procedimento
encaixado num outro, tal que m = -1, para que as
variveis do pp tenham os endereos 0,1,...k-1.
Tambm: A execuo do programa mantm a pilha
inalterada.
Gerao de Cdigo para a MEPA
Veremos agora a gerao de cdigo para caractersticas mais
complexas do Pascal Simplificado:

7. Procedimentos com parmetros passados


por valor
8. Passagem de parmetros por referncia e os
Problemas gerados para a implementao
anterior (7)

E uma caracterstica bem simples:


9. Implementao de funes
Procedimentos com parmetros passados por
valor (Exemplo)
program exemplo9;
var x,y: integer; Se comportam como variveis locais,
cujos valores so inicializados
procedure p (t:integer); com os valores dos parmetros reais.
var z: integer;
begin Ento tambm tero endereos fixos de pilha.
if t > 1 then p(t-1)
Mas, os valores dos parmetros reais so
else y := 1 avaliados na chamada e ficam no topo da pilha,
z := y; pois so expresses.
y := z * t
Como os valores prvios dos parmetros
end; passados por valor devem ser restaurados aps
Begin o fim do procedimento, VAMOS intercambiar os
read(x); prvios com os efetivos no incio do proc e fazer
a restaurao no fim.
p(x); write(x,y) tima sacada !
End.
7. Procedimentos com parmetros passados por valor

Se comportam como variveis locais, cujos valores so


inicializados com os valores dos parmetros reais.
a partir de
nmero de parmetros
IPVL m, n Inicializa parmetros
para k := 0 at n-1 faa
t:= M[m+k] NOVO
M[m+k] := M[s-n+k]
M[s-n+k] := t
RTPR m, n Restaura valor dos parmetros
i:= M[s]; s := s 1;
para k := n-1 at 0 faa alterado
M[m+k]:= M[s]
s := s - 1
8. Exemplo de procedimento recursivo com parmetro
passado por valor
program exemplo9;
var x,y: integer;
procedure p (t:integer);
var z: integer;
Quando a expresso avaliada ele deixada no
begin topo da pilha.
if t > 1 then p(t-1) Dentro do proc, estes valores iniciam as posies
else y := 1 fixas de memria destinadas aos parmetros
z := y; Como os valores prvios destas posies fixas
tero que ser restaurados aps o trmino do proc,
y := z * t podemos SIMPLESMENTE intercambiar os
end; valores prvios com os efetivos no incio da
execuo e fazer a restaurao no fim.
Begin
read(x); p(x); write(x,y)
End.
Traduo do Programa
INPP CRVL 2
AMEN 0,2 MULT
DSVS L1
ARMZ 1
L2 NADA
IPVL 2,1
DMEN 3,1
AMEN 3,1 RTPR 2,1
CRVL 2 L1 NADA
CRCT 1 LEIT
SUBT ARMZ 0
CHPR L2 CRVL 0
DSVS L4 CHPR L2
L3 NADA CRVL 0
CRCT 1
IMPR
ARMZ 1
L4 NADA
CRVL 1
CRVL 1 IMPR
ARMZ 3 DMEN 0,2
CRVL 3 PARA
Passagem de parmetros por referncia

Suponha que o PS tenha somente passagem de


parmetros passados por referncia

Para gerenciar var locais de proc sem parmetros


guardvamos as var locais no topo da pilha para liberar
espao (que era fixo) para a nova execuo recursiva de
um proc, pois o programa s tinha acesso a instncias
das variveis locais criadas por ltimo.

Mas vejam no prximo programa o que acontece


quando temos proc com variveis passadas por
referncia
program exemplo;
var x, y: integer; Era a z anterior, pois z
procedure p (var s: integer); Passado como parmetro
var z: integer;
Begin
if s = 1 then y := 1
Como p recursivo,
else begin
podemos ter vrias
z := s 1; encarnaes da var local z.
p(z);
O problema que durante
y := y * s a execuo de p os
end comandos podem fazer
End; acesso a duas encarnaes:
Begin a atual e a anterior atravs
x := 4; do par s
p(x); No podemos mais usar a
write(x,y) implementao anterior (7)
End.
Soluo
Vamos atacar a causa do problema: atribuio de ENDEREOS
FIXOS variveis do programa.

Sero substitudos pelo endereo relativo dentro de cada


procedimento (inclui tambm o programa principal)

O compilador associar com cada proc um REGISTRADOR de


BASE (Display D) e s variveis locais de cada proc ser atribudo
um deslocamento fixo, relativo ao contedo deste registrador.

O end de cada var ser um par: nmero do reg de base e o


deslocamento, ambos fixos. Este tipo de endereo chamado
endereo lxico/textual

Os contedos dos registradores de base variaro durante a


execuo do programa, garantindo o acesso correto s variveis
A regio D da MEPA, ser utilizada para formar o
vetor de registradores de base.
Durante a execuo de um proc, o reg de base
correspondente apontar para a regio da pilha M onde
foram alocadas as var locais do proc, formando seu
registro de ativao.
Para uniformizar o esquema de endereamento, o
programa principal possui o registrador de base d0.
No ser mais necessrio guardar e restaurar o valor das
variveis
O programa um procedimento de nvel 0
Se um procedimento p tem nvel m, todos os procs
encaixados em m tem nvel m+1
O nro de registradores corresponde ao nvel de
encaixamento mximo num programa, o que reduzido.
Exemplo Cada procedimento p, q, r, possui
os registradores de base dp, dq, dr,
(Kowaltowski, pp. 119 121) que apontam para as varives
locais dos procedimentos.
Program exemplo;
Var a integer; dp e dq so distintos, mas dp e dr
Procedure p; ocupam o mesmo.

Var b: integer; Aps a/p5/q3 temos a declarao


Procedure q; de c abaixo:
var c: integer;
begin p1 ; ...q2 ; ... end; /*q*/
c
begin q3 ; ... end; /*p*/
Procedure r;
Var d: integer;
begin p4 ;....end; /*r*/ b
2
Begin
... 1
p5 ; r6 ;
0
End. a
M
Aps a/p5/q3/p1 (esq)
Aps a/p5/q3/p1/q3/q2 (dir)

b c

b
2

1 c inacessvel
c
2
0
b 1
b
0

a
a
M M
8. Atacando o problema dos endereos fixos

Como os proc de base compartilham o


mesmo espao com os proc de mesmo
nvel, resolveremos isto da mesma forma
que fizemos para implementar var locais:
Cada proc se encarrega de salvar e restaurar
o contedo de seu reg de base, que ser
guardado na pilha M e realizado pelas
instrues: CHPR p e ENTR K
nvel 8 Instrues, com rtulo 8
desloc

CRVL m,n
ARMZ m,n
AMEN n
DMEN n
Usados como mostra a folha da MEPA, A
INPP
CHPR p (igual verso 6)
ENPR k Usado como mostra a folha da MEPA B; primeira
instruo de um proc, k o nvel; salva o reg de base

RTPR k
D[k] := M[s]
Restaura o reg de base
i := M[s-1]
s := s - 2
8. Agora com parmetros passados por valor e ref

O lugar natural para guardar parmetros


reais no topo da pilha.
No caso de par passados por valor
basta avaliar as expresses
Para par por passados por referncia
usaremos endereamento indireto, sendo
suficiente empilhar o endereo da varivel
passada como parmetro real.
Chamada de proc p (E1,...,En), com v1,...,vn sendo os
valores dos parmetros, passados por valor ou ref
Execuo das instrues aps CHPR e ENPR
O acesso a par formais dentro
de p ser feito usando-se D[k]
Var locais e deslocamentos negativos
D[k] ant Se p tem n parmetros
ret ento o i-simo ter
vn deslocamento (n+3-i)
K
Par
v1 reais
RTPR k,n (MODIFICADA)
D[k] := M[s]
D i := M[s-1]
s := s (n+2) remove os n par
M
8. Manipulao de parmetros passados por ref
nvel
endereo
CREN m,n
CRVI m,n
Usados como mostra a folha da MEPA, A
ARMI m,n

CREN usada para empilhar o valor do par real passado por ref.

CRVI e ARMI sero usadas no corpo do proc para fazer acesso


aos par formais passados por ref

Par passados por valor so tratados como var locais.


Exemplo (Kowaltowski pg 125)
Program ex10;
Var k: integer;
Procedure p(n: integer; var g: integer);
Var h: integer;
Begin
If n < 2 then g := g + n D[k] ant
else begin ret
v2
h:=g;
k
p(n-1, h); v1
g :=h;
p(n-2,g); OBSERVEM a traduo
end;
Write(n,g) K: 0,0 D
End; N:1,-4
Begin G:1,-3
k:= 0; H:1,0 M
Se p tem n parmetros
p(3,k) ento o i-simo ter
end. deslocamento (n+3-i)
K: 0,0 Traduo SUBT
N:1,-4
CRVL 1,-3
G:1,-3
H:1,0 CHPR L2
L4 NADA
DSVS L4
CRVL 1,-4
INPP L3 NADA
CRVI 1,-3 IMPR
AMEN 1
CRVI 1,-3
DSVS L1 ARMZ 1,0
IMPR
L2 ENPR 1 CRVL 1,-4
DMEN 1
AMEN 1 CRCT 1
RTPR 1,2 {remove os 2}
CRVL 1,-4 SUBT
L1 NADA { p.p.}
CRCT 2 CREN 1,0
CHPR L2
CRCT 0
CMME
ARMZ 0,0
DSVF L3 CRVL 1,0
CRCT 3
CRVI 1,-3 ARMI 1,-3
CREN 0,0
CRVL 1,-4 CRVL 1,-4
CHPR L2
SOMA CRCT 2
DMEN 1
ARMI 1,-3
PARA
9. Tratamento de Funes
A implementao de funes semelhante a
de procedimentos
A diferena que o nome da funo corresponde a uma
varivel local adicional
O valor desta varivel dever estar no topo da pilha aps
o retorno da funo.
Para fazer isto sem modificar a MEPA:
Reservar uma posio no topo ANTES de avaliar os
parmetros reais da funo, usando AMEM 1
Esta posio ser usada como uma varivel local, no
corpo da funo; seu endereo NEGATIVO e vale
(n+3), sendo n o nmero de parmetros da funo
O valor devolvido pela funo fica no topo da pilha aps
o RTPR, e pode ser usado numa impresso ou atribuio
Temporrios Avaliao de expresses ...
Variveis
locais d
Dados Locais 2
D c
1
Estado da mquina Ponto de retorno
0 D [1] anterior
Restaura
Link de acesso = Display na MEPA ambiente
anterior Endereo Retorno
Aponta para o RA do
Link de controle chamador Par Y
Tem endereo
negativo a D[1]
Parmetros reais Par X
...
Valor retornado - funo Valor retornado - funo
function f (a,b): integer;
Variveis Globais
Var c, d
Registro de Begin .... f:= end; M
ativao (RA) geral Na Mepa...
Begin
...write(f(X,Y));...
End.
Exemplo (Kowaltowski pg 126 e 127) do prog. pag 88
Programa ex5;
Var m:integer;
Function f(n:integer; var k: integer):integer;
Var p,q: integer; m: 0,0
Begin f: 1,-5
if n <2 then n:1,-4
k:1,-3
begin p: 1,0
f := n; k := 0 q: 1,1
end
else begin
f := f(n-1,p) + f(n-2,q);
k := p + q + 1
end;
write(n,k)
End;
begin write(f(3,m),m) end.
m: 0,0 SOMA
f: 1,-5 Traduo ARMZ 1,-5
n:1,-4
ARMI 1,-3 CRVL 1,0
k:1,-3 DSVS L4 CRVL 1,1
p: 1,0 SOMA
q: 1,1 L3 NADA CRCT 1
INPP AMEM 1 SOMA
ARMI 1,-3
AMEM 1 CRVL 1,-4 L4 NADA
DSVS L1 CRCT 1 CRVL 1,-4
IMPR
L2 ENPR 1 SUBT CRVI 1,-3
AMEM 2 CREN 1,0 IMPR
DMEM 2
CRVL 1,-4 CHPR L2 RTPR 1,2
CRCT 2 AMEM 1 L1 NADA
AMEM 1
CMME CRVL 1,-4 CRCT 3
DSVF L3 CRCT 2 CREN 0,0
CHPR L2
CRVL 1,-4 SUBT IMPR
ARMZ 1,-5 CREN 1,1 DMEM 1
PARA
CRCT 0 CHPR L2
Exerccio casa: implementao de vetores
Linearizao dos elementos; reservar o
bloco, pois o tamanho conhecido em
tempo de compilao
Instruo AMEM pode ser usada
Analisem a necessidade de novas
instrues para os casos:
Elementos usados nas expresses
Elementos como variveis
Vetor na passagem de parmetro por valor e
por referncia
No trataremos (captulo 9)

Rtulos e Comandos de DESVIO


Passagem de procedimento e funo
como parmetro
Passagem por nome (corresponde a uma
funo sem parmetro)
Blocos com declaraes locais