Você está na página 1de 2

MAT A 56 Paradigmas de Linguagens de Programação

Aluno:

Questão 1 (2,5 pontos) Registros de Ativação


Escreva a pilha de registros de ativação para o programa abaixo no momento em que WRITELN(A,B,C,D) é chamado
na linha 7. Considere que o escopo das referências é estático e os links para as variáveis não locais também são feitos
de forma estática. Assuma que as informações salvas durante a chamada às rotinas são o link dinâmico - LD, o
endereço de retorno - ER, o link estático – LE, os parâmetros e os valores locais (variáveis e rotinas), como visto em
sala de aula. Note que o parâmetro D é passado por referência.
1. PROGRAM MAIN()
2. VAR A: INTEGER;
3. VAR B: INTEGER;
4. VAR C: INTEGER;
5. PROCEDURE U(VAR D:INTEGER) % passagem por referência
6. BEGIN {U}
7. D := D + 1;
8. WRITELN(A,B,C,D); % <<<<<<<<<<<<<<<<<<<<<
9. END {U}
10. PROCEDURE R
11. VAR A;
12. PROCEDURE S(B:INTEGER)
13. BEGIN {S}
14. IF (C>0) THEN
15. BEGIN
16. A := A + B + C;
17. C := C – 1;
18. S(3*B);
19. END
20. ELSE
21. BEGIN
22. C := A*A;
23. U(C);
24. END
25. END {S}
26. BEGIN {R}
27. A := C*C;
28. B := B+1;
29. S(1);
30. END {R}
31. BEGIN {MAIN}
32. A:= 4;
33. B:= 1;
34. C:= 2;
35. R();
36. END {MAIN}

Questão 2 (1 ponto) Miscelânea


(A - 0,5) Quais os valores impressos na linha 7 da Questão 1 para o escopo estático.
(B - 0,5) Quais os valores impressos na linha 7 da Questão 1, se o escopo das variáveis fosse dinâmico.

Questão 3 (2,5 pontos) Geração de código, acesso a variáveis e otimização de código


Assumindo o escopo estático utilizando a notação dada em sala de aula e sabendo que o topo do registro de ativação
atual está apontado pelo registrador FP, o código por PC e fim da pilha por SP.
(A - 0,5) Escreva o código assembler para a declaração <A:=A+B+C> da linha 15 do programa dado na questão 1.
(B - 0,5) Escreva o código assembler para a declaração <C:=C-1> da linha 16 do programa dado na questão 1.
(C - 0,5) Escreva a melhor versão que você pode conceber para o código combinado das declarações <A:=A+B+C> e
<C:=C-1> das linhas 15 e 16.
(D - 1,0) Escreva o código assembler para a declaração <S(3*B)> da linha 17 do programa dado na questão 1. A
pré-chamada deve incluir atribuição dos valores do LD, ER, LE, do parâmetro B do S chamado, e a atualização do
FP e do SP para o seu registro de ativação. A chamada deve ser feita com o comando CALL endereço de S.
Para todas as respostas, favor usar o seguinte assembler:
• LD reg, (Mem+N) – carrega no registrador o endereço de memória apontado por Mem mais o N.
• ST reg, (Mem+N) – armazena o conteúdo do registrador no endereço de memória apontado por Mem + N.
• MOV regA, regB – move o valor do registrador regA para o registrador regB. O FP e o SP são registradores.
• DEC reg ou INC reg – decrementa ou incrementa o valor de reg.
• ADD regA, regB – soma ao conteúdo de regB ao conteúdo de regA e armazena o resultado em regA.
• ADD regA, N – soma o valor N ao conteúdo de regA.
• PUSH N – coloca o valor N no endereço apontado por SP e incrementa SP.
• PUSH reg – coloca o valor em reg no endereço apontado por SP e incrementa SP. O FP e o SP são registradores.
• CALL Mem – Faz o PC pular para a rotina no endereço de memória Mem.

Questão 4 (2 pontos) Passagem de Parâmetros


Quais valores serão impressos pelo programa teste1 se a passagem de parâmetros for:

(A - 0,5) por valor Program teste1


var x,y,z;
(B - 0,5) por referência procedure bar(a,b,c)
(C – 0,5) por valor resultado begin
x:=a+3;
Quais valores serão impressos pelo programa teste2 se a passagem de a:=a+1;
parâmetros for: b:=2*b;
Program teste2 c:=c*x;
(C – 0,5) por nome var x,y; y:=b+2;
procedure bar(a,b) end;
begin begin
x:=a*3; x:= 1;
y:=b**2; y:= 4;
end; z:= 5;
begin bar(x,y,z);
x:= 3; writeln(x,y,z);
y:= 5; end;
bar(2+x,3*y);
writeln(x,y);
end;

Questão 5 (2 pontos) Tempo de vida e escopo de variáveis


Considerando o fragmento de código C abaixo, desenhe a linha de tempo de sua execução, listando a ativação de
cada rotina, e o tempo de vida, os valores e o escopo de cada variável (conforme visto em aula).

int m, z, w;

void T(int n) {
w = w+n;
}

void S(int m) {
z = z + 3*m;
}

void R(int n) {
if (n>0) {
R(n-1);
m = m+2;
S(n);
T(m);
} else T(m);
}

int main() {
m = 2;
z = 0;
w = 0;
R(m);
return 1;
}

Você também pode gostar