A Stack(Pilha) do 8086, é utilizada para armazenar dados 16-Bits apenas. A pilha cresce a partir do
limite superior, definido pelo usuário, em direção ao limite inferior.
O registrador SP é responsável por armazenar o endereço/ponteiro do topo da pilha e o registrador de
segmento SS, a base da pilha.
Sintaxe
SS:SP
Através do endereço formato por ambos registradores apresentados na sintaxe acima, as instruções podem
trabalhar com os dados na stack.
Quando argumentos são passados para subrotinas, esses podem ser armazenados na pilha e recuperador
com uso do registrador BP.
Sintaxe
SS:[BP + 2]
SS:[BP + 4]
SS:[BP + 8]
Internamente, as interrupções e chamadas de subrotinas também utilizam a pilha para armazenar dados
essenciais para transferência e retorno de fluxo de execução.
Exemplo
PUSH AX
POP AX
INT $10
IRET
CALL funcao
RET
As instruções do tipo PUSH e POP são responsáveis pelo armazenamento e remoção de dados na pilha
respectivamente. O SP é decrementado, em 2 bytes, no PUSH e incrementado no POP em 2 bytes.
Tab. 1: Pilha 8086
Pilha |
PUSH |
POP |
$FFFFFF |
SP - 2
↓ |
SP + 2
↑ |
|
... |
|
... |
|
$000000 |
Os valores contidos na pilha não são "limpos" após a recuperação. O registrador SP é incrementado,
de acordo o tamanho do dado, para informar que o espaço anteriormente utilizado está
disponível para uso.
Os dados são empilhados na forma LIFO, Last In-First OUT, a recuperação deve ser na ordem inversa
para que não ocorram problemas.
Exemplo
PUSH AX
PUSH SI
PUSH DI
(…)
POP DI
POP SI
POP AX
É de total responsabilidade do usuário salvar e recuperar dados da pilha de forma correta, bem
como alterar seus dados.