Pilhas

download Pilhas

If you can't read please download the document

Transcript of Pilhas

  • 1. Pilhas
    • Voc j deve saber que uma pilha
  • uma estrutura de dados que
  • consiste em um amontoado de valo-
  • res (empilhados, da o nome)
  • Pilhas sero importantes na execuo
  • de programas. Veremos a seguir como
  • elas so utilizadas

2.

  • Toda pilha possui duas operaes bsicas: PUSH, que consiste em adicionar um valor
  • na pilha; e POP, que retira da pilha o
  • valor presente no topo
  • Para a nossa arquitetura, pilhas sero
  • blocos contguos presentes na mem-
  • ria principal que contero dados a serem processados, com um ponteiro SP ( Stack Pointer ) que indicar o endereo onde est o topo da pilha
  • medida que descemos pela memria, os endereos aumentam. Ou seja, sempre que adicionarmos um valor na pilha (PUSH), o ponteiro SP apontar para o endereo atual 1, um endereo acima
  • O contrrio acontece para a operao POP

3.

  • A pilha do exemplo a seguir comea no endereo 1000 da memria, e seu topo est em 996

. . . . . . . . . . . 1000 999 998 997 996 4 9 7 2 5 SP 4.

  • Fazendo PUSH 3, o valor 3 ser acrescentado na pilha, e o topo ser o endereo 996 1 = 995

. . . . . . . . . . . 1000 999 998 997 996 4 9 7 2 5 SP 995 3 5.

  • Por outro lado, se tivssemos feito POP, o valor 9 passaria a ser lixo e o novo topo estaria em 996 + 1 = 997

. . . . . . . . . . . 1000 999 998 997 996 4 9 7 2 5 SP 6.

  • Algumas linguagens de programao so organizadas em blocos (escopos)
  • Em Java, por exemplo, o escopo de uma classe so todos os procedimentos existentes naquela classe, e no escopo de cada procedimento existem todas as operaes realizadas por ele, inclusive eventuais chamadas a outros procedimentos

7.

  • Para essas linguagens, interessante utilizar pilhas durante a execuo de um programa para liberar o espao ocupado pelasvariveis locaisde um procedimento, quando ele finalizado
  • Variveis locais so variveis utilizadas e conhecidas exclusivamente nos procedimentos onde foram inicializadas, e no nvel de macroprogramao so geralmente carregadas nas pilhas
  • J asvariveis globaisso variveis conhecidas em todo o programa e a princpio esto presentes em endereos da memria que no fazem parte da pilha de um procedimento em particular

8.

  • Alm das operaes PUSH e POP, outra operao til para pilhas mover arbitrariamente o ponteiro SP, sem inserir dados inicialmente
  • Isto til para quando a execuo entrar em um procedimento que utilizar variveis locais, de maneira que SP ser decrementado (topo subir) para reservar espao para essas variveis
  • Em Pascal, isso fica fcil de ser visto, j que as variveis locais so inicializadas antes da palavrabegin , que indica o comeo do procedimento
  • O exemplo a seguir mostra o comeo do mtodo de ordenaoBubbleSort , em Pascal

9.

  • procedure BubbleSort(var A: ArrayType);
  • var i, j: integer;
  • begin
  • .
  • .
  • .
  • Repare que as variveisiejso inicializadas. Em seguida, a palavrabeginindica o comeo das operaes do procedimento neste ponto onde SP decrementado em 2
  • A pilha agora ocupa mais 2 espaos: os espaos deiej , que eventualmente recebero valores durante a execuo do procedimento
  • E se o topo da pilha atingir endereos que j esto sendo usados pelo programa?

10.

  • Familiar?
  • Agora vamos supor uma funo, tambm em Pascal, que recebe duas entradas e retorna como resultado o produto entre elas
  • Perceba como fica sua pilha de execuo

11.

      • function produto(a, b: integer): integer;
      • var p, j: integer;
      • begin
      • if (a = 0) or (b = 0) then
      • produto := 0
      • else
      • begin
      • p := 0;
      • for j := 1 to a do
      • p := p + b;
      • produto := p;
      • end
      • end;

a b

  • Quando a funo chamada no programa, j temos na pilha as variveis de entrada, e precisamos tambm do endereo de retorno, para que o processador saiba para onde voltar quando a funo terminar

end. ret. SP 12.

      • function produto(a, b: integer): integer;
      • var p, j: integer;
      • begin
      • if (a = 0) or (b = 0) then
      • produto := 0
      • else
      • begin
      • p := 0;
      • for j := 1 to a do
      • p := p + b;
      • produto := p;
      • end
      • end;

a b end. ret. p j

  • J ao final desta linha, precisamos de mais 2 para as variveis locaispej

SP 13.

      • function produto(a, b: integer): integer;
      • var p, j: integer;
      • begin
      • if (a = 0) or (b = 0) then
      • produto := 0
      • else
      • begin
      • p := 0;
      • for j := 1 to a do
      • p := p + b;
      • produto := p;
      • end
      • end;

a b end. ret.

  • Quando a funo termina, os espaos das variveis locais so liberados. Em outras palavras, SP incrementado em 2, voltando a ser o endereo de retorno. Este endereo dir onde a execuo estava quando chamou a funoproduto , e ela continuar a partir daquele ponto

SP 14.

  • Com apenas estas descries, fica a
  • impresso de que a funo foi intil,
  • j que a pilha guardou apenas seus
  • valores de entrada e manipulou as variveis locais
  • Mas bvio que isto no verdade. De que maneira ento foram usadas as variveis
  • aebpara chegar at o resultado final,
  • e onde ele foi parar?
  • Todos os resultados de operaes intermedirias foram sendo armazenados no nosso registrador AC (Accumulator). O mesmo vale para o resultado final da funo, que pode ser apenas um valor intermedirio para o resto do programa

15.

  • O endereo de retorno est relacionado a outro registrador, o Program Counter
  • Quando a funoprodutotermina, o endereo de retorno desempilhado e salvo em PC
  • Caso voc no se lembre, AC e PC so dois dos nossos 16 registradores conectados aos barramentos A, B e C em N0
  • Isso nos d bagagem suficiente para falar sobre o nvel demacroprogramao