1 / 17

Aula 4 – Sumário

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 :

will
Download Presentation

Aula 4 – Sumário

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Processador MAC-1 Programação em linguagem assembly: A pilha Funções e procedimentos

  3. 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)

  4. 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

  5. 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.

  6. 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

  7. 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

  8. 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.

  9. 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.

  10. 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); } }

  11. 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

  12. 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

  13. 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; }

  14. 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

  15. 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…

  16. 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; }

  17. 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

More Related