Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.

  1. Pilha(Stack)
  2. Push e Pull
  3. Stack Pointer
  4. Pilha e Subrotina

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.

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

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.

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.

  1. 26/02/2026 - versão inicial: Pilha, Push e Pop, Stack Pointer e Subrotina