1 / 17

Aula 4 – Sumário

Aula 4 – Sumário. Linguagem assembly do MAC-1: Funções e procedimentos A pilha Invocação de funções e procedimentos Variáveis locais e argumentos Retorno e devolução de valores Instruções assembly envolvidas Exemplos de programas. Processador MAC-1. Funções e procedimentos. A pilha.

berne
Télécharger la présentation

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:Funções e procedimentos • A pilha • Invocação de funções e procedimentos • Variáveis locais e argumentos • Retorno e devolução de valores • Instruções assembly envolvidas • Exemplos de programas

  2. Processador MAC-1 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 (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). • 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, com destaque 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 publicclassExemplo { public static int s = 0; // s – variável global publicstaticint soma( finalint x, finalint y) { return x + y; } publicstaticvoidmain(String[]args) { s = soma(10, 15); } }

  11. 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 15 push # passar o 15 (2º argumento) call soma# chamar a rotina insp 2 # descartar os argumentos stod s # guardar o valor em s halt soma: lodl 2 # carregar x (da pilha) addl 1 # somar a y (da pilha) retn # retornar (em AC está x+y)

  12. SP SP SP Assembly MAC-1 Exemplo: evolução da pilha Logo após o ‘call’ jump main s: 0 main: loco 10 push loco 15 push call soma 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) publicstaticint soma_n(finalint 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: 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 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) publicstaticint div(int D, finalint d ) { int q = 0; while (D >= d) { q++; D = D - d; } return q; }

  17. Programação MAC-1 jump main 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 Organização da pilha dentro de ‘div’ q SP variável local end. ret. d argumentos D

More Related