A Stack(Pilha) do 6502, diferente de outros processadores, possui um região de memória pré-definida e fixa.
A pilha reside na página 1 de memória que compreende o intervalo entre 0x100
e 0x1FF e cresce a partir do limite superior em direção ao inferior, permitindo
armazenar 256 bytes.
O registrador SP(8-bits) é responsável por armazenar o endereço/ponteiro do topo da pilha,
e através dele as instruções podem armazenar e recuperar dados na pilha. O cálculo é feito como
na fórmula abaixo:
Fórmula:
endereço_pilha <- 0x0100 + SP
As instruções do tipo PUSH e PULL são
responsáveis pelo armazenamento e remoção de dados na pilha respectivamente. O SP é decrementado
no PUSH e incrementado no PULL de acordo com o tamanho do dado. Esses dados podem ser vistos como
argumentos para subrotinas.
Tab. 1: Pilha
|
Pilha |
PUSH |
PULL |
↑
Circular
↓ |
$01FF |
SP-
↓ |
SP+
↑ |
|
|
|
|
|
| $0100 |
Ex 1:
PHA ;push
PLA ;pull
O armazenamento e remoção de dados na pilha funciona de forma circular, ultrapassando
o limite mínimo, 0x0100, o registrador SP irá "dar a volta" e apontar para 0xFF. O mesmo
acontece em relação ao valor máximo 0xFF, que irá apontar para 0x00 ao ser ultrapassado.
Os valores contidos na página 1 não são "limpos" após o uso das instruções de PUSH/PULL. O
registrador SP é incrementado para informar que o espaço anteriormente utilizado esteja disponível para uso.
A pilha é usada tanto para backup de valores quanto para passagem de argumentos para subrotinas.
Ver Intruções: Controle de Fluxo > JSR em instruções.
Ex 2:
PHA ;push
JSR subrotina
A manipulação da pilha pode ser feita utilizando instruções de transferência e aritméticas. Essas
podem ser vistas em
Instruções: Transferência e
Instruções: Aritméticas.
Ex 3:
TSX ;SP -> X
INX ; SP + 1
;uso da pilha