Programação MAC-1
description
Transcript of Programação MAC-1
![Page 1: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/1.jpg)
1
Programação MAC-1
Exemplo: copiar vector
Implementar um procedimento que copie n elementos de um vector A para um vector B
O procedimento deverá receber como argumentos:
O número de elementos a copiar (n) O endereço do primeiro elemento do vector A (referência) O endereço do primeiro elemento do vector B (referência)
![Page 2: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/2.jpg)
2
Programação MAC-1
copia: loco 0push # int i=0
ciclo: lodl 0subl 4 jzer fim # i-n == 0?
lodl 3addl 0 pshi # A[i] no topo da pilha
lodl 3addl 1popi # B[i] = A[i]
loco 1addl 0stol 0 # i=i+1
jump ciclo
fim: insp 1retn
jump main
A: 6 4 3 5 7B: 0 0 0 0 0n: 5
main: lodd npushloco Apushloco Bpushcall copiainsp 3halt
A (ref.)
B (ref.)
End. Ret.
iSP
Organização da pilha em ‘copia’
n
![Page 3: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/3.jpg)
3
Processador MAC-1
Recursividade
![Page 4: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/4.jpg)
4
Programação MAC-1
Recursividade Existem situações em que uma rotina se invoca a si
própria... Diz-se que a rotina é recursiva ou recorrente Soluções recursivas podem ser úteis para resolver
alguns problemas, mas é preciso ter cuidado pois a pilha pode crescer muito…
cada chamada à função faz com que sejam colocados dados na pilha;
se a função se chamar demasiadas vezes a ela própria, a pilha pode ficar sem espaço para crescer (“stack overflow”)
![Page 5: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/5.jpg)
5
Programação MAC-1
Exemplo (recursividade)
Fazer uma função que calcule o termo de ordem n da seguinte sucessão (definida de forma recursiva):
// Pseudo-código
int U(int n) {
if (n==1)return 1;
elsereturn 2*U(n-1) + 1;
}
11
1 se , 112
U
nnUnU
![Page 6: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/6.jpg)
6
Programação MAC-1
# int U(int n)
U: lodl 1subd C1 # AC = n-1jzer ret1 # if n-1==0 return 1
push # call U # U(n-1)insp 1 #
push # temp = U(n-1)addl 0 # AC = 2*tempinsp 1 # descarta tempaddd C1 # AC = 2*U(n-1)+1retn
ret1: loco 1 # AC = 1 retn
jump main
C1: 1
main: loco 4pushcall U # U(4)insp 1halt
![Page 7: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/7.jpg)
7
Programação MAC-1
Exemplo (recursividade)
Fazer uma função que calcule o número de Fibonnaci de ordem n. O número de Fibonnaci de ordem n é dado por:
10
11
1 se, 21
F
F
nnFnFnF
int fibo(int n) {
if (n==1 || n==0)return 1;
elsereturn fibo(n-1) + fibo(n-2);
}
![Page 8: Programação MAC-1](https://reader036.fdocumentos.com/reader036/viewer/2022082612/568143eb550346895db07135/html5/thumbnails/8.jpg)
8
Programação MAC-1fibo: lodl 1
subd C1 # AC = n-1jzer ret1 # if n-1==0 return 1lodl 1jzer ret1
lodl 1 #subd C2 # push # call fibo # fibo(n-2)insp 1
push # tmp = fibo(n-2)
lodl 2 #subd C1 #push #call fibo # F(n-1)insp 1
addl 0 # AC=fibo(n-1)+tmpinsp 1 # descarta tmpretn
ret1: loco 1 # AC = 1 retn
jump main
C1: 1C2: 2
main: loco 4pushcall fibo # fibo(4)insp 1halt
n
End. Ret.SP
Organização da pilha em ‘fibo’
n
End. Ret.
SP tmp