Programação MAC-1

8
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)

description

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) - PowerPoint PPT Presentation

Transcript of Programação MAC-1

Page 1: Programação MAC-1

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

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

3

Processador MAC-1

Recursividade

Page 4: Programação MAC-1

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

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

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

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

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