Aula 4 – Sumário
Linguagem
assembly do MAC-1:
Funções e procedimentos
A
Processador MAC-1
pilha
Invocação
Variáveis
Retorno
de funções e procedimentos
locais e argumentos
e devolução de valores
Instruções
Exemplos
Funções e procedimentos
assembly envolvidas
de programas
2
1
A pilha
A pilha
Durante a execução de um programa são invocadas
funções e procedimentos (ou métodos)
Cada função ou procedimento pode ter:
Variáveis locais
Variáveis que só são válidas dentro do procedimento
Argumentos
Valores ou referências passados ao procedimento
Estrutura de dados muito simples
Todos estes dados são guardados num espaço
da memória designado por pilha (ou stack)
0
1
2
...
Utiliza-se para guardar:
Quando um procedimento retorna, o CPU necessita de
saber qual o ponto do programa para onde se volta
Memória
Ocupa posições de memória consecutivas
Cresce no sentido decrescente dos
endereços
Inserem-se e retiram-se elementos a partir
do seu topo
Variáveis locais e argumentos
Pontos de retorno dos procedimentos
Outros dados de natureza temporária
O CPU guarda a posição do topo da
pilha no registo Stack Pointer (SP)
3
Assembly MAC-1
Funções e procedimentos
Invocação e retorno de procedimentos
Instrução call – invocar
Instrução retn – retornar
Mnemónica Descrição
4
Mecanismo de retorno
Quando se invoca um procedimento (call), o valor de
Program Counter (PC) é copiado para pilha.
Esse valor é o endereço de retorno – ponto para
onde o programa volta após o procedimento retornar
Para a rotina retornar, o endereço de retorno é
transferido da pilha para PC (retn).
Significado
call x
SP ← SP – 1; M[SP] ← PC; PC ← x Call function or procedure
retn
PC ← M[SP]; SP ← SP + 1
Return
x é um endereço entre 0 e 4095, ou uma label que represente esse endereço.
Corresponde à posição do programa onde começa a rotina.
Devolução de valores
5
Quando se pretende devolver um valor, coloca-se
esse valor no Acumulador (AC), antes da função
retornar
6
1
Funções e procedimentos
Assembly MAC-1
Do lado da invocação:
Colocar os argumentos na pilha
Invocar a função ou procedimento usando call
Retirar os argumentos da pilha
Manipulação básica da pilha
Colocar e retirar os argumentos da pilha
Criar e descartar as variáveis locais (ou outros dados
de carácter local ou temporário)
Mnemónica
Dentro do procedimento ou função:
Criar as variáveis locais, reservando espaço na pilha
Executar o código do procedimento
“Destruir” as variáveis locais, descartando-as da pilha
Deixar em AC o valor a devolver
Retornar, usando retn
Descrição
Significado
push
SP ← SP – 1; M[SP] ← AC
Push onto stack
pop
AC ← M[SP]; SP ← SP + 1
Pop from stack
desp n
SP ← SP – n
Decrement SP
insp n
SP ← SP + n
Increment SP
n é um valor entre 0 e 255, e especifica o número de posições que
se querem acrescentar ou retirar à pilha.
7
Assembly MAC-1
8
Assembly MAC-1
Endereçamento local
Exemplo:
uma função que calcula a soma de dois números
Acesso a dados guardados na pilha, com destaque
para as variáveis locais e argumentos dos
procedimentos
Mnemónica
lodl n
Descrição
Significado
AC ← M[SP + n]
Load local
stol n
M[SP + n] ← AC
Store local
addl n
AC ← AC + M[SP + n]
Add local
subl n
AC ← AC – M[SP + n]
Subtract local
public class Exemplo
{
public static int s = 0;
// s – variável global
public static int soma( final int x, final int y)
{
return x + y;
}
public static void main(String[] args)
{
s = soma(10, 15);
}
n designa a posição relativa a SP.
Será portanto a n-ésima posição da pilha a contar do topo.
}
9
10
Assembly MAC-1
Assembly MAC-1
Código MAC-1
Exemplo: evolução da pilha
Logo após o ‘call’
jump main
s:
jump
s:
0
main: loco
push
loco
push
call
insp
stod
halt
0
main: loco
push
loco
push
call
insp
stod
halt
10
# colocar os argumentos no stack:
# passar o 10 (1º argumento)
15
soma
2
s
soma: lodl 2
addl 1
retn
#
#
#
#
passar o 15 (2º argumento)
chamar a rotina
descartar os argumentos
guardar o valor em s
main
15
soma
2
s
soma: lodl 2
addl 1
retn
# carregar x (da pilha)
# somar a y (da pilha)
# retornar (em AC está x+y)
Argumentos a
passar a ‘soma’.
Colocados na
pilha antes de se
fazer ‘call’.
10
SP
7 (end. ret.)
SP
15
10
SP
Logo após ‘retn’
Depois de ‘insp 2’
...
início
11
12
2
Programação MAC-1
Programação MAC-1
jump main
Exemplo: soma dos n primeiros naturais
Pretende-se implementar uma função que devolve a
soma dos n primeiros números inteiros naturais.
# soma_n(int n)
n:
10
main:
lodd n
push
call soma_n # soma_n(10)
insp 1
halt
# exemplo
soma_n: loco 0
push
loco 1
push
ciclo:
// Possível código da função (em Java)
public static int soma_n( final int n )
{
int soma = 0;
Organização da pilha dentro de ‘soma_n’
for (int i=1; i<=n; i++)
soma = soma + i;
SP
i
soma
return soma;
}
variáveis
locais
end. ret.
n
ret:
lodl
subl
jneg
lodl
addl
stol
loco
addl
stol
jump
# int soma=0
# int i=1
3
0
#
ret #
1
0
1
#
1
0
0
#
ciclo
lodl 1
insp 2
retn
argumento
D é o dividendo
d é o divisor
q é o quociente
14
Possível solução:
utilizar o método das subtracções sucessivas:
Pretende-se implementar função que devolve o
quociente da divisão inteira entre dois números inteiros
positivos D e d.
i=i+1
Programação MAC-1
Exemplo: divisão inteira
soma=soma+i
# AC=soma
13
Programação MAC-1
n-i
while n-i>=0
// Possível código da função (em Java)
public static int div( int D, final int d )
{
int q = 0;
while (D >= d)
{
q++;
D = D - d;
}
Nota: Esta função pode ser útil, pois na linguagem assembly do
processador MAC-1 não existe nenhuma instrução para dividir…
return q;
}
15
16
Programação MAC-1
jump main
main: loco
push
loco
push
call
insp
halt
# div(int D, int d)
11
div:
div
2
# div(11,5)
Organização da pilha dentro de ‘div’
SP
loco 0
push
# int q=0
5
q
variável local
end. ret.
d
argumentos
ciclo: lodl
subl
jneg
loco
addl
stol
lodl
subl
stol
jump
ret:
3
2
ret # while D>=d
1
0
0
# q++
3
2
3
# D=D-d
ciclo
lodl 0
insp 1
retn
# AC=q
D
17
3
Download

Aula 4 – Sumário Processador MAC