Pilhas
-
Upload
marcelle-guine -
Category
Documents
-
view
498 -
download
0
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