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