- 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
2.
- Toda pilha possui duas operaes bsicas: PUSH, que consiste em
adicionar um valor
- na pilha; e POP, que retira da pilha o
- 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);
- 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.
- 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;
-
-
- if (a = 0) or (b = 0) then
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;
-
-
- if (a = 0) or (b = 0) then
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;
-
-
- if (a = 0) or (b = 0) then
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,
- 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