170 likes | 355 Views
Aula 5 – Sumário. Revisão da aula anterior Funções e procedimentos Endereçamento indirecto Instruções pshi e popi Acesso a vectores e matrizes Passagem de referências Exemplos. Processador MAC-1. Revisão – funções e procedimentos. Revisão – funções e procedimentos.
E N D
Aula 5 – Sumário • Revisão da aula anterior • Funções e procedimentos • Endereçamento indirecto • Instruções pshi e popi • Acesso a vectores e matrizes • Passagem de referências • Exemplos
Processador MAC-1 Revisão – funções e procedimentos
Revisão – funções e procedimentos Exemplo: Potência natural de 2 Implementar uma função que calcula 2n. n é o valor do argumento que é passado à função. // Pseudo-código da função int power2(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(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 • Acesso aos elementos de vectores / matrizes Semelhantes a “push” e “pop”, mas as transferências de dados envolvem neste caso uma posição de memória que é indicada pelo registo AC.
PSHI Assembly MAC-1: PSHI
POPI Assembly MAC-1: POPI
Assembly MAC-1: PSHI e POPI • Sintetizando: • PSHIcoloca no topo da pilha o valor que está na posição de memória indicada por AC • POPIcoloca na posição de memória indicada por AC o valor que está no topo da pilha
Programação MAC-1 Exemplo:calcular a soma de todos os elementos de um vector // 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 MAC-1 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
Funções e vectores / matrizes • Para uma função usar um vector (ou uma matriz) passa-se uma referência à função • A referência não é mais do que a posição de memória do primeiro elemento do vector (ou da matriz) • Os restantes elementos são acedidos com base nessa posição de referência Memória Exemplo: Um vector A em memória. Acedem-se aos vários elementos a partir da referência (a posição de memória 2)
Programação MAC-1 Exemplo: Implementar um procedimento que mostre no ecrã os elementos de um vector (para simplificar, vamos assumir que são inteiros entre 0 e 9). // Pseudo-código void mostra_vec(int[] v,intlength) { for (int i=0; i!=length; ++i) { v[i] output; } } v é a referência para o vector a mostrar length é o número de elementos do vector
Programação MAC-1 jump main vec1: 6 4 3 5 7 length: 5 char0: '0' main: loco vec1 push lodd length push call mostra_vec insp 2 halt # mostra_vec(int[] v, int length) mostra_vec: loco 0 push # int i=0 ciclo: lodl 0 subl 2 jzer fim # i==length? lodl 3 addl 0 pshi # v[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_vec’ i SP End. Ret. length vector (ref.)
Matrizes (arrays) • Uma matriz é uma abstracção própria das linguagens de programação de alto nível • Uma estrutura regular de dados, com n dimensões, cujos elementos são acedidos através de índices (tantos índices quanto as dimensões) • Em geral, para um processador não existe o conceito de matriz com n dimensões • Para o CPU, uma matriz não é mais do que um conjunto de vectores em memória • A razão para tal é o facto da memória só ter uma dimensão
Matrizes (arrays) Exemplo: Considere a matriz B, bidimensional Qual será a posição de memória correspondente a B[1][2]?