1 / 13

Programação MAC-1

Programação MAC-1. Exemplo Implementar uma função que calcula 2 n : ‘n’ é o argumento passado à função. // Pseudo-código int power2( final int n) { int p=1; for ( int i=0, i!=n; i++) p=2*p; return p; }. Programação MAC-1. jump main n_ex: 10 # exemplo

eudora
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 Implementar uma função que calcula 2n: ‘n’ é o argumento passado à função. // Pseudo-código int power2(final int n) { int p=1; for (int i=0, i!=n; i++) p=2*p; return p; }

  2. Programação MAC-1 jump main n_ex:10 # exemplo power2: lodd n_ex push call power2 insp 1 halt # power2(final int n) power2: loco 1 # criar as var. locais push # p=1 loco 0 push # i=0 ciclo: lodl 0 subl 3 jzerret_p # i-n==0? lodl 1 addl 1 stol 1 # p=p+p (p=2*p) loco 1 addl 0 stol 0 # i=i+1 jump ciclo ret_p:lodl 1 # AC=p (valor a devolver) insp 2 # descartar as locais retn Organização da pilha em ‘power2’ i SP p End. Ret. n

  3. Processador MAC-1 Endereçamento indirecto

  4. Assembly MAC-1 • Endereçamento indirecto no MAC-1 • Serve para aceder a elementos de vectores ou matrizes • Basicamente acede-se à posição de memória indicada em AC Instruções:

  5. PSHI Assembly MAC-1: PSHI

  6. POPI Assembly MAC-1: POPI

  7. Assembly MAC-1: PSHI e POPI • Em suma: • PSHIcoloca no topo da pilha o valor que está na posição de memória indicada por AC • SP ← SP – 1 • M[SP] ← M[AC] • POPIcoloca na posição de memória indicada por AC o valor que está no topo da pilha • M[AC] ← M[SP] • SP ← SP + 1

  8. Programação MAC1 • Exemplo:calcular a soma de todos os elementos de um vector m // Pseudo-código int m[5] = {1, 2, 5, 7, 2}; voidmain() { inti=0, soma = 0; while( i!=5 ) { soma = soma + m[i]; i = i + 1; } }

  9. soma SP i m[i] SP soma i Programação MAC1 jump main m:1 2 5 7 2 # valores guardados no vector m n_elem:5 # numero de elementos main: loco 0 # criar as variáveis locais: push # i = 0 push # soma = 0 ciclo: lodd n_elem subl 1 jzerfim # 5-i=0? loco m # calcula a posição do i-ésimo elemento, addl 1 # em AC fica o endereço da posição m+i pshi # coloca na pilha o valor que está na posição m+i (m[i]) pop # tira m[i]da pilha e põe no AC addl 0 stol 0 # soma = soma + m[i] loco 1 addl 1 stol 1 # i=i+1 jump ciclo fim:lodl 0 # vai acabar com AC = soma insp 2 halt

  10. Programação MAC-1 • Passagem de argumentos • Como vimos atrás, as chamadas e retorno das rotinas são feitas através das instruções • call e retn • Consideram-se também duas formas diferentes de passagem de argumentos a uma rotina: • Passagem por valoro valor do argumento a passar à rotina é colocado na pilha • Qualquer alteração a esse valor só é válida dentro da rotina • Passagem por referênciaa posição de memória onde estão os dados é colocada na pilha e passada à rotina • Dentro da rotina, se forem alterados os dados referenciados nessa posição, essa alteração permanece válida após o retorno

  11. Programação MAC-1 • Exemplo: mostrar vector Fazer uma função que mostre no écran os elementos de um vector, assumindo que são valores inteiros entre 0 e 9 • Para aceder aos valores armazenados num vector, é conveniente a utilização de endereçamento indirecto O procedimento deverá receber como argumentos: • Uma referência para o primeiro elemento do vector • i.e., a posição do primeiro elemento • O comprimento do vector • i.e., o número de elementos do vector

  12. Programação MAC-1 • Exemplo: mostrar vector // Possível código Java public static void mostra(int[] vector,final intlength) { for (int i=0; i!=length; ++i) { System.out.println(vector[i]); } } Nota: em Java não seria necessário o comprimento do vector – poderia fazer vector.length. Só aparece aqui porque no MAC-1 é mesmo necessário!

  13. Programação MAC-1 jump main vector: 6 4 3 5 7 length: 5 char0: '0' main: loco vector push lodd length push call mostra insp 2 halt # mostra(int[] vector, final int length) mostra: loco 0 push # int i=0 ciclo: lodl 0 subl 2 jzer fim # i-length == 0? lodl 3 addl 0 pshi # vector[i] na pilha pop addd char0 stod 4094 loco ' ' stod 4094 # mostra no ecran loco 1 addl 0 stol 0 # i=i+1 jump ciclo fim: loco 10 # 10 é o código ascii stod 4094 # ‘fim de linha’ insp 1 retn Organização da pilha em ‘mostra’ i SP End. Ret. length matriz (ref.)

More Related