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

As instruções que manipulam a pilha são responsáveis por escrever e recuperar dados da pilha do 68k. Normalmente utilizadas para realizar backup de registradores. Nenhuma flag é afetada pelas instruções de pilha.

Não há instruções de PUSH e PULL/POP no 68k( exceto PEA), como em processadores 6502, 8080 e outros que utilizam os mesmos conceitos. As instruções MOVE e MOVEM são utilizada para salvar e recuperar dados da pilha.

Além das instruções mencionadas acima, podemos salvar endereços utilizando a instrução PEA e também criar e destruir stackframes utilizando LINK e UNLINK.

As intruções MOVE e MOVEM foram vistas em Movimentação e o funcionamento da pilha do 68k foi vista em Pilha.

Abaixo, a notação utilizada ao longo dos tópicos abordados nesta parte do tutorial:

Tab. 1: Notação utilizada
Símbolo Descrição
-> Atribuição
i Registrador Início
f Registrador Fim
| Ou
; Comentário
CCR
- Não sofre alteração

Para informações sobre registradores visite Registradores. Para mais informações sobre modos de endereçamento visite Modos de Endereçamento.

Como mencionado, a instruções MOVE é utilizada para empilhar e desempilhar dados da pilha via SP/A7.

Operação
origem -> (SP|A7)
Endereçamento Origem
(Ax), (Ax)+, n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L, n(PC), n(PC,Dx[.W|.L]|Ax[.W|.L]) e #imediato
Endereçamento Destino
(SP)+, -(SP)
Tamanho do dado
Byte, Word e Longword
CCR
X: -
N: -
Z: - 
V: -
C: -
Sintaxe
MOVE.B Dx,-(SP) ; empilhar
MOVE.B Dx,(SP)+ ; desempilhar
MOVE.L #$imediato,-(SP)
Exemplo:
; D0 = 123456FF SP= FFFFFFFF
MOVE.L D0, -(SP);
; D0 = 123456FF SP = FFFFFFFB

De forma semelhante a MOVE, podemos utilizar a instrução MOVEM para armazenar múltiplos regitradores na pilha.

Operação
Di-Df -> (SP|A7)
Ai-Af -> (SP|A7)
Di-Df/Ai-Af -> (SP|A7)
Dx/Dy/Ax/Ay -> (SP|A7)
Endereçamento Origem
Dx, Ax, (Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L, n(PC), n(PC,Dx[.W|.L]|Ax[.W|.L])
Endereçamento Destino
(SP|A7)+, -(SP|A7)
Tamanho do dado
Byte, Word e Longword
CCR
X: -
N: -
Z: - 
V: -
C: -
Sintaxe
MOVEM.L Di-Df,-(SP)
MOVEM.L (SP)+,Di-Df; 
Exemplo:
MOVEM.L D0-D1,-(SP)
MOVE (SP)+,D0-D1

A instrução PEA, calcula o endereço Longword partir de algum identificador como variável ou outro, e armazena esse endereço na pilha do 68K.

Operação
SP <- SP - 4
(SP) <- endereco_afetivo
Endereçamento Origem
(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L, n(PC), n(PC,Dx[.W|.L]|Ax[.W|.L])
Tamanho do dado
Longword
CCR
X: -
N: -
Z: - 
V: -
C: -
Sintaxe
PEA nome_identificador 
Exemplo:
PEA vetor
.
.
vetor:
db 0x0,0x1,0x2,0x3,0x4;

Com a instrução LINK podemos criar um stackframe com base no registradores A0-6 (A6 aconselhado), ou seja, reservar/alocar um espaço na pilha para uso local em subrotinas. Um valor Word sinalizado imediato que representa o espaço de alocação é usado como argumento.

Operação
SP <- SP - 4
(SP) <- Ax
Ax <- SP   
SP <- SP + #word_sinalizada

O registrador Ax é salvo na pilha. Ax então é atualizado com o valor atual de SP(A7). O valor imediato é adicionado ao SP para finalizar a operação.

No fim da operação, o registrador Ax(frame pointer) aponta para a base do stackframe e o registrador SP aponta para o top.

O registrador SP é usado normalmente para armazenar dados na pilha e o registrador Ax é utilizado para acessar variáveis no espaço alocado.

Endereçamento
-
Tamanho do dado
-
CCR
X: -
N: -
Z: - 
V: -
C: -
Sintaxe
LINK Ax,#(+/-)imediato
Exemplo:
;Stackframe com 10 bytes de alocação
LINK A6, #-10

A instrução UNLINK desfaz a operação feita pela instrução LINK, ou seja, desaloca o espaço alocado pelo stackframe e restaura o conteúdo do registrador A0-6(A6 aconselhado) utilizado e também o SP(A7).

Operação
SP <- Ax
Ax <- (SP)
SP <- SP + 4

O registrador SP é restaurado com o valor de Ax que é a base do stackframe. Ax então é restaurado com o valor seu valor salvo anteriormente na pilh e por fim SP é restaurado para seu valor anterior a instrução LINK.

Endereçamento
-
Tamanho do dado
-
CCR
X: -
N: -
Z: - 
V: -
C: -
Sintaxe
UNLINK Ax
Exemplo:
;chamada da rotina
JSR subrotina

; omitido

subrotina:
;alocação
LINK A6, #-10

; uso do stackframe

;desalocação
UNLINK A6;
  1. 05/09/2024 - revisão 2 - Correção em erros gramaticais
  2. 30/08/2024 - revisão 1 - Correção em link MOVE e MOVEM
  3. 03/04/2024 - versão inicial