Objetivos
Pilha
A Stack(Pilha) do 65816 é semelhante à stack dos seus antecessor, exceto pelo tamanho. Na pilha
se localiza de forma fixa na mesma Página 1, porém contendo 64KB de tamanho. O banco de dados
da stack é sempre 01h.
Tab. 1: Stack
| Banco |
Endereço |
Uso |
| 0 |
000000-00FFF9h |
Direct Page |
|
00FFFA-00FFFFh |
VDI |
| 1 |
010000-01FFFF |
Stack |
| 2 |
020000-02FFFF |
Uso geral |
| (...) |
(...) |
(...) |
| FF |
FF0000-FFFFFF |
Uso geral |
O S(SP) pode ser configurado para qualquer endereço dentro do página um utilizando instruções de
LOAD e TRANSFER.
Ex:
LDX $FFFF ; stack
TXS ;configuração
O manual do hardware onde o 65816 é usado deve ser consultado para mais informações de
inicialização do sistema em que o programa será executado para evitar erros.
PUSH e PULL
As instruções da stack PUSH e PULL são responsáveis por armazenar e
recuperar de dados na pilha.
Sintaxe:
PHA ;push
PLA ;pop
A pilha do 65816 possui o wrap-around ou efeito circular caso os dados sejam salvos e
recuperados em seus limites superior ou inferior.
Os dados 16/24-bits salvos na stack, são armazenados com seu byte menos significativo seguido
do bytes mais significativos. Esses bytes são restaurados na ordem inversa.
| Pilha |
|
| 34h |
|
| 12h |
|
| (...) |
|
| 56h |
|
| 34h |
|
| 12h |
|
| ?? |
SP |
A ordem recuperação dos dados da pilha, o PULL, deve ser inversa a a
ordem de do PUSH. Caso os dados da pilha sejam recuperados de forma errada, ocorrerá
erro no funcionamento do software.
Ex:
PHA ;A
PHX ;X
PHY ;Y
PLY ;Y
PLX ;X
PLA ;A
Stack Pointer
O registrador S(SP) é responsável por armazenar o endereço/ponteiro do topo da pilha, e através
dele as instruções para armazenar e recuperar dados da pilha são feitas.
O SP é decrementado, de acordo o tamanho do dado, quando a instruções PUSH é executada e
incrementado quando a instrução PULL é executada.
Tab. 2: Pilha e PUSH/PULL
| Pilha |
PUSH |
POP |
| $FFFF (Topo) |
SP-2
↓ |
SP+2
↑ |
|
|
|
|
|
| $XXXX (Base) |
Os valores dos registradores A(C), X e Y e ponteiros armazenados na stack dependem do modo
que o 65816 está operando: nativo ou emulação.
Antes de iniciar algum tipo de interrupção
NMI ou IRQ, por exemplo, dados são salvos e
restaurados automaticamente ao iniciar e finalizar a interrupção.
Os valores contidos na pilha não são destruídos após o uso da instrução PULL. O registrador
SP é incrementado para informar que o espaço anteriormente utilizado está disponível para uso.
Pilha e Subrotina
A pilha do 65816 também é utilizada para a passagem de argumentos para subrotinas. O
registrador SP é manipulado para recuperar esses argumentos e também armazenar
valores de retorno.
Tab. 3: Argumentos na pilha
| SP |
Argumentos |
Descrição |
| +6 |
$aabb |
arg 1 |
| +4 |
$ccdd |
arg 2 |
| +2 |
$eeff |
arg 3 |
| SP |
- |
- |
Para armazenar espaço para valores de retorno, a stack deve ser decrementada de acordo com os
valores de retorno.
Tab. 4: Espaço para retorno
| SP |
Retorno |
Descrição |
| +6 |
- |
retorno 1 |
| +4 |
- |
retorno 2 |
| +2 |
- |
retorno 3 |
| SP |
- |
- |
Tanto quanto argumentos quanto espaço para retorno, após o retorno da subrotina o
registrador SP deve ter seu valor restaurado para manter a consistência.
É possível a manipulação do SP utilizando instruções de Aritméticas, Transferência
e Movimentação e outras para manipulações mais complexas que envolvam parâmetros/argumentos.
O 65816 não possui instruções para criação de stack frame como no
68k. Isso deve ser feito
manualmente via manipulação do SP.
Histórico de atualizações
- 26/02/2026 - versão inicial: Pilha, Push e Pop, Stack Pointer e Subrotina
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.