Aula 5 – Sumário
 Revisão
da aula anterior
 Funções
e procedimentos
 Endereçamento
 Instruções
 Acesso
indirecto
pshi e popi
a vectores e matrizes
 Passagem
de referências
 Exemplos
1
Processador MAC-1
Revisão – funções e procedimentos
2
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;
}
3
Programação MAC-1
# power2(int n)
jump main
n_ex:
10
# exemplo
power2: lodd n_ex
push
call power2
insp 1
halt
power2: loco 1
push
loco 0
push
ciclo:
Organização da pilha em ‘power2’
SP
p
End. Ret.
n
ret_p:
# i=0
lodl 0
subl 3
jzer ret_p
# i-n==0?
lodl 1
addl 1
stol 1
# p=p+p
loco
addl
stol
jump
i
# criar as var. locais
# p=1
1
0
0
ciclo
lodl 1
insp 2
retn
(p=2*p)
# i=i+1
# AC=p (valor a devolver)
# descartar as locais
4
Processador MAC-1
Endereçamento indirecto
5
Assembly MAC-1

Endereçamento indirecto no MAC-1

Acesso aos elementos de vectores / matrizes
Mnemónica
pshi
popi
Descrição
SP = SP – 1;
M[SP] ← M[AC]
M[AC] ← M[SP];
SP = SP + 1
Significado
Push indirect
Pop indirect
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.
6
Assembly MAC-1: PSHI
0
1
2
3
4
5
6
SP
PSHI
x
10
6
12
27
x
x
SP
SP
x
x
x
x
10
6
12
27
x
x
12
x
x
x
x
Pilha
x
Pilha
x
AC
0
1
2
3
4
5
6
x
3
7
Assembly MAC-1: POPI
0
1
2
3
4
5
6
SP
POPI
x
10
6
12
27
x
x
SP
SP
50
x
x
x
x
10
6
12
50
27
x
x
50
x
x
x
x
Pilha
x
Pilha
x
AC
0
1
2
3
4
5
6
x
3
8
Assembly MAC-1: PSHI e POPI

Sintetizando:

PSHI
coloca no topo da pilha o valor que está na posição de
memória indicada por AC

POPI
coloca na posição de memória indicada por AC o valor
que está no topo da pilha
9
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};
void main()
{
int i=0, soma = 0;
while ( i!=5 )
{
soma = soma + m[i];
i = i + 1;
}
}
10
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
push
push
ciclo:
lodd n_elem
subl 1
jzer fim # 5-i=0?
fim:
# criar as variáveis locais:
# i = 0
# soma = 0
loco
addl
pshi
pop
addl
stol
m
1
loco
addl
stol
jump
1
1
1
# i=i+1
ciclo
0
0
lodl 0
insp 2
halt
#
#
#
#
SP
soma
i
calcula a posição do i-ésimo elemento,
em AC fica o endereço da posição m+i
coloca na pilha o valor que está na posição m+i (m[i])
tira m[i]da pilha e põe no AC
# soma = soma + m[i]
SP
m[i]
soma
i
# vai acabar com AC = soma
11
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
Referência
para A
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)
0
1
2
3
4
5
6
7
x
x
5
A[0]
7
A[1]
6
A[2]
8
A[3]
Vector A
x
x
...
12
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, int length)
{
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
13
Programação MAC-1
jump main
vec1:
6 4 3 5 7
length: 5
char0: '0'
main:
loco
push
lodd
push
call
insp
halt
vec1
length
# 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
pop
mostra_vec
2
addd
stod
loco
stod
char0
4094
' '
4094 # mostra no ecran
Organização da pilha em ‘mostra_vec’
loco 1
addl 0
stol 0
SP
jump ciclo
i
End. Ret.
length
vector (ref.)
fim:
# v[i] na pilha
# i=i+1
loco 10
# 10 é o código ascii
stod 4094 # ‘fim de linha’
insp 1
retn
14
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
15
Matrizes (arrays)
Exemplo:
Considere a matriz B, bidimensional
j
i
0
1
2
3
0
5
7
6
8
1
12
3
23
1
2
0
15
2
9
Qual será a posição de memória
correspondente a B[1][2]?
pos  ref. B  i  n _ cols  j
Referência
para B
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x
x
x
5
7
6
i=0
8
12
3
23
i=1
1
0
15
2
i=2
9
x
x
pos  3  1 4  2  9
...
16
Download

em formato ppt