Os modos de endereçamento representam a forma como os operando ou dados são recuperados pelo processador para execução de uma instrução.

Ao todo, o 6502 possui ao todo 12 modos de endereçamento que serão vistos nesta parte do tutorial. A compreensão é importante para continuar os estudos do assembly do processador.

Para cada um dos modos de endereçamento apresentados, uma tabela contendo PC e Byte onde o opcode e seus operandos estão localizados.

Notação utilizada:
#$NN Valor hexadecimal imediato
#$NNNN; Endereço hexadecimal imediato
$NNNN Endereço hexadecimal
$NN ou h Valor hexadecimal
MNEMÔNICO Abreviação do nome de uma instrução
; Comentário
| Concatenação
<- Atribuição
Byte Valor com 8-bits
Word Valor com 16-bits
HH Byte mais significativo
LL Byte menos significativo
PC Contador de Programa

No ME implícito, o mais básico dos endereçamentos, não há operandos para buscar. A própria instrução contém as informações necessárias sobre os operandos utilizados.

PC
Byte 1
opcode
Fórmula:
-
Sintaxe:
MNEMÔNICO
Ex:
;Limpa flag Carry
CLC

No modo imediato, um byte parte da instrução. Esse valor é obtido e utilizado pela instrução para realizar operações de carga, aritméticas, lógicas e outras.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
-
Sintaxe:
MNEMÔNICO #$NN
Ex:
;Ou lógico com A
ORA #$FF

No modo relativo, um byte imediato é utilizado para realizar um cálculo e desviar o fluxo de execução de código sendo somado ao conteúdo do PC. Esse byte imediato é sinalizado tendo o intervalo de -128 até 127 permitindo que o desvio do fluxo possa ser feito "para frente" ou "para trás". Esse modo é utilizado em instrução de branch.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
PC <- PC + (-/+)valor_imediato
Sintaxe:
MNEMÔNICO $NN
Ex:
;Desvio de fluxo de execução
BCC nome_funcao ; Desvia se Carry = 0

No endereçamento absoluto, um valor imediato de 16-bits é utilizado como endereço de origem ou destino onde um valor será lido ou escrito.

Utilizando o modo de endereçamento nas páginas 0 e 1 não terá o funcionamento circular.

PC + 1 + 2
Byte 1 Byte 2 Byte 3
opcode LL HH
Sintaxe:
MNEMÔNICO $HHLL
Ex:
;Armazena A em memória
STA $0200

O modo Absolute indexed(Absoluto Indexado) utiliza um valor imediato de 16-bits que é adicionado ao registrador de índice X para calcular o endereço final para leitura ou escrita de um valor. Utilizando o modo de endereçamento na página 0 ou 1 não terá o funcionamento circular.

Utilizando o modo de endereçamento nas páginas 0 e 1 não terá o funcionamento circular.

PC + 1 + 2
Byte 1 Byte 2 Byte 3
opcode LL HH
Fórmula:
endereço_final <- #$HHLL + X
Sintaxe:
MNEMÔNICO $HHLL, X
Ex:
; X = 4
LDA $0400,X ; $0400 + 4 = $0404

BUG: Um valor é lido e descartado do endereço $HHLL antes da leitura do valor correto no endereço final $HHLL + X. Essa leitura pode gerar bugs no software na região de registradores de I/O.

O modo Absolute indexed(Absoluto Indexado) utiliza um valor imediato de 16-bits que é adicionado aos registrador Y para calcular o endereço final para leitura ou escrita de um valor.

Utilizando o modo de endereçamento nas páginas 0 e 1 não terá o funcionamento circular.

PC + 1 + 2
Byte 1 Byte 2 Byte 3
opcode LL HH
Fórmula:
endereço_final <- #$HHLL + Y
Sintaxe:
MNEMÔNICO $HHLL, Y
Ex:
; X = 4
LDA $0400,X ; $0400 + 4 = $0404

BUG: Um valor é lido e descartado do endereço $HHLL antes da leitura do valor correto no endereço final $HHLL + Y. Essa leitura pode gerar bugs no software na região de registradores de I/O.

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB, byte mais significativo do endereço, é sempre 00h e um valor imediato de 8-bits armazena o LSB, byte menos significativo do endereço final de 16-bits que é utilizando.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
endereço_final <- $00|$NN
Sintaxe:
MNEMÔNICO $NN
Ex:
 LDA $01 ; 00 + 01 = $0001

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB do endereço é sempre 00h, um valor imediato de 8-bits é adicionado ao registrador X gerando assim o endereço final de 16-bits que é utilizando pela instrução.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
endereço_final <- $00|$NN + X

Ao somar $NN + X, o valor do "vai-um" é sempre desprezado formando um endereço de página zero.

Sintaxe:
MNEMÔNICO $NN, X
Ex:
; X = 4
;RAM[0004] = 0xff
LDA $00,X ; 00 + 04 = $0004

Nesse modo de endereçamento um valor pode ser lido ou escrito na página zero da memória do 6502. O MSB do endereço é sempre 00h, um valor imediato de 8-bits é adicionado ao registrador Y gerando assim o endereço final de 16-bits que é utilizando.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
 endereço_final <- $00|$NN + Y

Ao somar $NN + X, o valor do "vai-um" é sempre desprezado formando um endereço de página zero/Zero Page.

Sintaxe:
MNEMÔNICO $NN, Y
Ex:
; Y = 4
;RAM[0004] = 0xff
LDA $00,Y ; 00 + 04 = $0004

No modo absoluto indireto um valor pode ser lido ou escrito na memória do 6502 de forma indireta. Um valor absoluto imediato armazena um endereço de memória que contém um endereço 16-bits que é utilizado. Apenas a instrução JM utiliza esse modo.

PC + 1 + 2
Byte 1 Byte 2 Byte 3
opcode LL HH
Fórmula:
endereço_final <- ($HHLL)
Sintaxe:
MNEMÔNICO ($HHLL)
Ex:

$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
JMP ($0000) ; desvio de código
Temos:

O endereço indireto contido nos bytes LSB($04) e MSB($00) contidos $0000 formam um endereço indireto $0004 em tem os bytes LSB($05) e o MSB($00) formando o endereço final $0005 que é carregado no registrador PC.

BUG: O 6502 possui um bug quando um JMP indireto é executado. Quando o endereço indireto atravessa uma pagina de memória, exemplo 0x01FF, o byte menos significativo do endereço indireto e recuperado de 0x01FF e o byte mais significativo é recuperado de 0x0100 ao invés de 0x0200.

Neste modo de endereçamento que utiliza os conceitos da Página Zero, um byte imediato é somado ao conteúdo do registrador X para formar um endereço de 16-bits onde o endereço final, indireto, é obtido.

Esse modo de endereçamento possui o mesmo comportamento circular já discutido acima.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
endereço <- (00$NN + X + 1)(00$NN + X)
endereço_final <- (endereço)
Onde:
(): conteúdo de memória
$NN: valor imediato página zero.
Sintaxe:
MNEMÔNICO ($NN,X)
Ex:

X contém $00
$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
 ADC ($00,X) ; adição
Temos:

O endereços $00 + X + 1 e $00 + X contém os valores $04 e $00 resultando formando o endereço $0004. Os bytes $05 e $00 contidos em $0004 e $0005 formam o endereço indireto $0005 que é local de onde um byte é lido para realizar a adição.

Neste modo de endereçamento que também utiliza os conceitos da Página Zero, um byte imediato é utilizado para gerar um endereço para a página zero que contém um endereço de 16-bits. Esse endereço contém um endereço indireto que é somado ao registrador Y para formar um endereço indireto final que será utilizado.

Esse modo de endereçamento possui o mesmo comportamento circular já discutido acima.

PC + 1
Byte 1 Byte 2
opcode NN
Fórmula:
endereço <- (00$NN + 1)(00$NN)
endereço_indireto <- (endereço)
endereço_final <- endereço_indireto + Y
Onde:
(): conteúdo de memória
$NN: valor imediato página zero.
Sintaxe:
MNEMÔNICO ($NN),Y
Ex:

Y contém $04
$0000: contém o valor $0400(LE)
$0004: contém o valor $0500(LE)

Ao executar:
ADC ($00),Y ; adição
Temos:

Os bytes contidos em $00 + 1 e $00 formam o endereço $0004. Os bytes $05 e $00 contidos $0004 e $0005 formam o endereço indireto $0005 que adicionado ao registrador Y formando o endereço final $0009 que é local de onde um byte é recuperado para realizar a adição.

  1. 12/01/2026 - revisão 5 - Ajustes: pontuais; Adiçao: tabela opcode/bytes e bugs nos modos absoluto,x e y
  2. 11/03/2025 - revisão 4 - Correções em absoluto X/Y, Indireto X/Y;Adição de bug JMP indireto;
  3. 11/09/2024 - revisão 3 - Correção em descrição de modos indexados e fórmulas
  4. 30/08/2024 - revisão 2 - Correção em links de objetivos
  5. 04/10/2023 - revisão 1 - adição de links, correção em layout, navegação e erros gramaticais
  6. 28/04/2023 - versão inicial