130 likes | 209 Views
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
E N D
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; }
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
Processador MAC-1 Endereçamento indirecto
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:
PSHI Assembly MAC-1: PSHI
POPI Assembly MAC-1: POPI
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
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; } }
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
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
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
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!
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.)