Aula 4 – Sumário
 Linguagem
assembly do MAC-1:
Funções e procedimentos
A
pilha
 Invocação
 Variáveis
 Retorno
de funções e procedimentos
locais e argumentos
e devolução de valores
 Instruções
 Exemplos
assembly envolvidas
de programas
1
Processador MAC-1
Funções e procedimentos
2
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
Quando um procedimento retorna, o CPU necessita de
saber qual o ponto do programa para onde se volta
Todos estes dados são guardados num espaço
da memória designado por pilha (ou stack)
3
A pilha


0
1
2
...


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)
Pilha
Utiliza-se para guardar:


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
Programa


Memória
Estrutura de dados muito simples
I/O

4
Assembly MAC-1

Invocação e retorno de procedimentos

Instrução call – invocar

Instrução retn – retornar
Mnemónica Descrição
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.
5
Funções e procedimentos


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).
Devolução de valores

Quando se pretende devolver um valor, coloca-se
esse valor no Acumulador (AC), antes da função
retornar
6
Funções e procedimentos

Do lado da invocação:




Colocar os argumentos na pilha
Invocar a função ou procedimento usando call
Retirar os argumentos da pilha
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
7
Assembly MAC-1

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
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.
8
Assembly MAC-1

Endereçamento local

Acesso a dados guardados na pilha, com destaque
para as variáveis locais e argumentos dos
procedimentos
Mnemónica
Descrição
Significado
lodl n
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
n designa a posição relativa a SP.
Será portanto a n-ésima posição da pilha a contar do topo.
9
Assembly MAC-1
Exemplo:
uma função que calcula a soma de dois números
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);
}
}
10
Assembly MAC-1
Código MAC-1
jump main
s:
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
# carregar x (da pilha)
# somar a y (da pilha)
# retornar (em AC está x+y)
11
Assembly MAC-1
Exemplo: evolução da pilha
Logo após o ‘call’
jump
s:
0
main: loco
push
loco
push
call
insp
stod
halt
main
Argumentos a
passar a ‘soma’.
Colocados na
pilha antes de se
fazer ‘call’.
10
15
soma
2
s
soma: lodl 2
addl 1
retn
SP
7 (end. ret.)
SP
15
10
SP
Logo após ‘retn’
Depois de ‘insp 2’
...
início
12
Programação MAC-1

Exemplo: soma dos n primeiros naturais
Pretende-se implementar uma função que devolve a
soma dos n primeiros números inteiros naturais.
// Possível código da função (em Java)
public static int soma_n( final int n )
{
int soma = 0;
for (int i=1; i<=n; i++)
soma = soma + i;
return soma;
}
13
Programação MAC-1
# soma_n(int n)
jump main
n:
10
# exemplo
main:
lodd n
push
call soma_n # soma_n(10)
insp 1
halt
soma_n: loco 0
push
loco 1
push
ciclo:
Organização da pilha dentro de ‘soma_n’
SP
i
soma
variáveis
locais
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
n-i
while n-i>=0
soma=soma+i
i=i+1
# AC=soma
end. ret.
n
argumento
14
Programação MAC-1

Exemplo: divisão inteira
Pretende-se implementar função que devolve o
quociente da divisão inteira entre dois números inteiros
positivos D e d.

D é o dividendo

d é o divisor

q é o quociente
Nota: Esta função pode ser útil, pois na linguagem assembly do
processador MAC-1 não existe nenhuma instrução para dividir…
15
Programação MAC-1
Possível solução:
utilizar o método das subtracções sucessivas:
// 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;
}
return q;
}
16
Programação MAC-1
main:
jump main
# div(int D, int d)
loco
push
loco
push
call
insp
halt
div:
11
# int q=0
5
div
2
# div(11,5)
Organização da pilha dentro de ‘div’
SP
loco 0
push
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
Download

em formato ppt