170 likes | 270 Views
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. Processador MAC-1. Programação em linguagem assembly :
E N D
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
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 (oumétodos) • Cada função ou procedimento pode ter: • Variáveis locaisVariáveis que só são válidas dentro do procedimento • ArgumentosValores 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)
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
Assembly MAC-1 • Invocação e retorno de procedimentos • Instrução call – invocar • Instrução retn – retornar 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.
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
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
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) n é um valor entre 0 e 255, e especifica o número de posições que se querem acrescentar ou retirar à pilha.
Assembly MAC-1 • Endereçamento local • Acesso a dados guardados na pilha, em particular para as variáveis locais e argumentos dos procedimentos n designa a posição relativa a SP.Será portanto a n-ésima posição da pilha a contar do topo.
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); } }
Assembly MAC-1 Código MAC-1 jumpmain s:0 main:loco 10 # colocar os argumentos no stack: push# passar o 10 (1º argumento) loco 15 push# passar o 15 (2º argumento) callsoma# chamar a rotina insp 2 # descartar os argumentos stods# guardar o valor em s halt soma:lodl 2 # carregar o arg. x (da pilha) addl 1 # somar a arg. y (da pilha) retn# retornar com o resultado em AC
SP SP SP Assembly MAC-1 Exemplo: evolução da pilha Logo após o ‘call’ jumpmain s: 0 main:loco 10 push loco 15 push callsoma insp 2 stod s halt soma:lodl 2 addl 1 retn Argumentos a passar a ‘soma’. Colocados na pilha antes de se fazer ‘call’. Logo após ‘retn’ 7 (end. ret.) 15 Depois de ‘insp 2’ 10 ... início
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; }
Programação MAC-1 jump main n:10 # exemplo main:loddn push callsoma_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 jnegret # while n-i>=0 lodl 1 addl 0 stol 1 # soma=soma+i loco 1 addl 0 stol 0 # i=i+1 jumpciclo ret:lodl 1 # AC=soma insp 2 retn Organização da pilha dentro de ‘soma_n’ i SP variáveis locais soma end. ret. n argumento
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…
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; }
Programação MAC-1 # div(int D, int d) div:loco 0 push# int q=0 ciclo:lodl 3 subl 2 jnegret# while D>=d loco 1 addl 0 stol 0 # q++ lodl 3 subl 2 stol 3 # D=D-d jumpciclo ret:lodl 0 # AC=q insp 1 retn main:loco 11 push loco 5 push calldiv# div(11,5) insp 2 halt Organização da pilha dentro de ‘div’ q SP variável local end. ret. d argumentos D