Aula 4 – Sumário

Linguagem assembly do MAC-1

A pilha


Instruções para manipulação da pilha
Funções e procedimentos




Invocação de funções e procedimentos
Variáveis locais e argumentos
Retorno e devolução de valores
Exemplos
Academia ISCTE – Arquitectura de Computadores
Processador MAC-1
Programação em linguagem assembly:
 A pilha
 Funções e procedimentos
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)
Academia ISCTE – Arquitectura de Computadores
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

Academia ISCTE – Arquitectura de Computadores
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.
Academia ISCTE – Arquitectura de Computadores
Funções e procedimentos

Mecanismo de retorno




Quando se invoca um procedimento (call), o valor de
Program Counter (incrementado) é 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
Academia ISCTE – Arquitectura de Computadores
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
Academia ISCTE – Arquitectura de Computadores
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.
Academia ISCTE – Arquitectura de Computadores
Assembly MAC-1

Endereçamento local

Acesso a dados guardados na pilha, em particular 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.
Academia ISCTE – Arquitectura de Computadores
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(int x, int y)
{
return x + y;
}
public static void main(String[] args)
{
s = soma(10, 15);
}
}
Academia ISCTE – Arquitectura de Computadores
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 o arg. x (da pilha)
# somar a arg. y (da pilha)
# retornar com o resultado em AC
Academia ISCTE – Arquitectura de Computadores
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
Academia ISCTE – Arquitectura de Computadores
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;
}
Academia ISCTE – Arquitectura de Computadores
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
end. ret.
n
argumento
ret:
lodl
subl
jneg
lodl
addl
stol
loco
addl
stol
jump
3
0
ret
1
0
1
1
0
0
ciclo
lodl 1
insp 2
retn
# int soma=0
# int i=1
# n-i
# while n-i>=0
# soma=soma+i
# i=i+1
# AC=soma
Academia ISCTE – Arquitectura de Computadores
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…
Academia ISCTE – Arquitectura de Computadores
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;
}
Academia ISCTE – Arquitectura de Computadores
Programação MAC-1
main: loco
push
loco
push
call
insp
halt
11
# div(int D, int d)
5
div:
div
2
# div(11,5)
Organização da pilha dentro de ‘div’
SP
q
variável local
end. ret.
d
D
argumentos
loco 0
push
ciclo: lodl
subl
jneg
loco
addl
stol
lodl
subl
stol
jump
ret:
# int q=0
3
2
ret # while D>=d
1
0
0
# q++
3
2
3
# D=D-d
ciclo
lodl 0
insp 1
retn
# AC=q
Academia ISCTE – Arquitectura de Computadores
Download

da pilha