Academia ISCTE – Arquitectura de Computadores
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
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
0
1
2
...
Pro
gram
aP
ilha
I/O
A pilha
Estrutura de dados muito simples 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 Utiliza-se para guardar:
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)
Memória
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 10 # colocar os argumentos no stack:push # passar o 10 (1º argumento)loco 15push # passar o 15 (2º argumento)call soma # chamar a rotina insp 2 # descartar os argumentosstod s # guardar o valor em shalt
soma: lodl 2 # carregar o arg. x (da pilha)addl 1 # somar a arg. y (da pilha)retn # retornar com o resultado em AC
Academia ISCTE – Arquitectura de Computadores
Assembly MAC-1
Exemplo: evolução da pilha
...SP
10
15
7 (end. ret.)
SP
SP
Argumentos a passar a ‘soma’.
Colocados na pilha antes de se
fazer ‘call’.
Logo após o ‘call’
início
Logo após ‘retn’
Depois de ‘insp 2’
jump mains: 0main: loco 10
pushloco 15pushcall somainsp 2stod shalt
soma: lodl 2addl 1retn
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
jump main
n: 10 # exemplo
main: lodd n push call soma_n # soma_n(10) insp 1 halt
# soma_n(int n)
soma_n: loco 0 push # int soma=0 loco 1 push # int i=1
ciclo: lodl 3 subl 0 # n-i jneg ret # while n-i>=0 lodl 1 addl 0 stol 1 # soma=soma+i loco 1 addl 0 stol 0 # i=i+1 jump ciclo
ret: lodl 1 # AC=soma insp 2 retn
n
end. ret.
soma
iSP
Organização da pilha dentro de ‘soma_n’
variáveis locais
argumento
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 11 push loco 5 push call div # div(11,5) insp 2 halt
# div(int D, int d)
div: loco 0 push # int q=0
ciclo: lodl 3 subl 2 jneg ret # while D>=d loco 1 addl 0 stol 0 # q++ lodl 3 subl 2 stol 3 # D=D-d jump ciclo
ret: lodl 0 # AC=q insp 1 retn
D
d
end. ret.
qSP
Organização da pilha dentro de ‘div’
argumentos
variável local