1 / 8

Programação MAC-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)

robert
Download Presentation

Programação MAC-1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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)

  2. Programação MAC-1 jump main A: 6 4 3 5 7 B: 0 0 0 0 0 n: 5 main: lodd n push loco A push loco B push call copia insp 3 halt copia: loco 0 push # int i=0 ciclo: lodl 0 subl 4 jzer fim # i-n == 0? lodl 3 addl 0 pshi # A[i] no topo da pilha lodl 3 addl 1 popi # B[i] = A[i] loco 1 addl 0 stol 0 # i=i+1 jump ciclo fim: insp 1 retn Organização da pilha em ‘copia’ i SP End. Ret. B (ref.) A (ref.) n

  3. Processador MAC-1 Recursividade

  4. Programação MAC-1 • Recursividade • Existem situações em que uma rotina se invoca a si própria... • Diz-se que a rotina é recursivaou 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”)

  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; else return 2*U(n-1) + 1; }

  6. Programação MAC-1 jump main C1: 1 main: loco 4 push call U# U(4) insp 1 halt # int U(int n) U: lodl 1 subd C1# AC = n-1 jzer ret1# if n-1==0 return 1 push # call U # U(n-1) insp 1 # push # temp = U(n-1) addl 0 # AC = 2*temp insp 1 # descarta temp addd C1 # AC = 2*U(n-1)+1 retn ret1: loco 1 # AC = 1 retn

  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: int fibo(int n) { if (n==1 || n==0) return 1; else return fibo(n-1) + fibo(n-2); }

  8. Programação MAC-1 fibo: lodl 1 subd C1# AC = n-1 jzer ret1# if n-1==0 return 1 lodl 1 jzerret1 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)+tmp insp 1 # descarta tmp retn ret1: loco 1 # AC = 1 retn jump main C1: 1 C2: 2 main: loco 4 push call fibo# fibo(4) insp 1 halt Organização da pilha em ‘fibo’ End. Ret. SP n tmp SP End. Ret. n

More Related