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(Stack Pointer) é 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.
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.
Como 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 erros no software.
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.