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

Os modos de endereçamento representam as formas com as quais os operandos necessários para processamento de uma instrução são acessados.

Por padrão, todos os modos de endereçamento, com operandos, trabalham como o registrador de segmento DS, exceto pelo uso do registrador BP. Quando esse é usado, o registrador de segmento SS é utilizado no lugar do DS.

Os modos de endereçamento indexados são utilizados para acessar variáveis, arrays, estruturas de dados e semelhantes.

É possível forçar o uso de registradores de segmento. Nesse caso, um registrador de segmento que é utilizado como padrão é substituído por outro de forma explícita em uma instrução.

Nos modos de endereçamento abaixo, em que dois operandos separador por vírgula são utilizados, a leitura é feita da esquerda para a direita quando há movimentação de dados. O operando à direita é a origem e o operando à esquerda é o destino.

Sintaxe:
MNEMÔNICO Operando1, Operando2
Notação utilizada:
MNEMÔNICO Nome da instrução
v8 valor 8-bits
v16 Valor 16-bits
[] Conteúdo de memória
-> Atribuição
R1, R2, REG Registradores 8/16-bits
SEG Registrador de segmento
OFFSET Endereço

Para facilitar a compreensão nos exemplos abaixo, a instrução básica MOV será utilizada. Essa instrução movimenta dados entre registradores e/ou memória.

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 implícitas necessárias para execução.

Sintaxe:
MNEMÔNICO
Ex:
;não faz nada
NOP
CLC
CLD

No modo Registrador, dois registradores são definidos como os operandos de onde os valores necessários para execução da instrução estão armazenados.

Sintaxe:
MNEMÔNICO R1, R2
Ex:
MOV BX, CX

No imediato, um valor byte ou word, sinalizado ou não, é um dos operandos da instrução. Esse valor é obtido e utilizado pela instrução para realizar operações.

Sintaxe:
MNEMÔNICO v8
MNEMÔNICO v16
Ex:
MOV AL, 015h
MOV AX, 0FFFFh

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

Sintaxe:
MNEMÔNICO RX, [endereço_absoluto]
Ex:
MOV AX, [0FFFh]

O modo registrador indireto utiliza o endereço, ou offset, contido em um dos registradores DI, SI ou BX para acessar valores em memória.

Sintaxe:
MNEMÔNICO RX, [BX]
MNEMÔNICO RX, [SI]
MNEMÔNICO RX, [DI]
Ex:
MOV AX, [DI]
MOV BX, [SI] 
MOV CX, [BX] 

Nesse modo de endereçamento, os registradores BX ou BP são adicionados ao conteúdo de DI ou SI para formar um endereço para acessar um valor em memória.

Sintaxe:
MNEMONICO R1, [endereço_base]
Ex:
MOV CL, [BX + SI]
MOV CH, [BP + DI]

No modo indexado, os registradores DI e SI são adicionados a um valor de deslocamento, sinalizado, para formar um endereço de memória.

Sintaxe:
MNEMÔNICO RX, [RI + (+/-)valor8]
MNEMÔNICO RX, [RI + valor16]
Ex:
MOV AL, [SI + 1000]
MOV AH, [DI + 2000]

Nesse modo, semelhante ao Indexed, o registrador BP é utilizado e adicionado a um valor de deslocamento, sinalizado, para formar um endereço de memória.

Sintaxe:
MNEMÔNICO R1, [BP + (+/-)valor8]
MNEMÔNICO R1, [BP + valor16]
Ex:
MOV AL, [BP + 3000]

O modo base indexado, os registradores de indexação, base e um valor de deslocamento, sinalizado, são adicionados para formar um endereço de memória.

Sintaxe:
MNEMÔNICO R1, [DI + BP + (+/-)valor8]
MNEMÔNICO R1, [SI + BP + (+/-)valor16]
Ex:
MOV AX, [BX + SI + 1000] 
MOV CX, [DI +BP + 2000]

No modo I/O, o registrador AX ou AL são utilizados para armazenar um endereço ou valor de porta(0~255) para comunicação com algum periférico ligado ao 8086. Caso seja uma porta maior que 255, o registrador DX deve ser utilizado.

Sintaxe:
IN   AL, valor_imediato
IN   AX, valor_imediato
OUT  valor_imediato, AL
OUT  valor_imediato, AX
Ex:
OUT #$10, AL
OUT #$10, AX
IN AL, #$10
IN AX, #$10

No modo relativo, um byte ou word imediato é utilizado para realizar um cálculo e desviar o fluxo de execução de código sendo somado ao conteúdo de CS:IP.

Esse valor imediato é sinalizado permitindo que o desvio do fluxo possa ser feito "para frente" ou "para trás".

Sintaxe:
IP + (+/-)v8
IP + (+/-)v16
Ex:
MOV CX, -2
funcao:
;(...)
LOOP funcao

Devido a quantidade de registradores de indexação e base e os vários modos de endereçamento, torna o estudo um tanto quanto complexo. Em uma forma resumida, temos as possíveis combinações abaixo:

Tab. 1: Tabela resumo
[BX + SI] [BP + SI] [SI] [DI] [BX] [BP + v8]
[BX + SI] [BP + DI] [SI + v8] [DI + v8] [BX + SI + v8] [BP + v16]
-- -- [SI + v16] [DI + v16] [BX + DI + v8] [BP + SI + v8]
-- -- -- -- [BX + v8] [BP + SI + v16]
-- -- -- -- [BX + SI + v16] [BP + DI + v8]
-- -- -- -- [BX + DI + v16] [BP + DI + v16]
-- -- -- -- [BX + v16] --
-- -- -- -- -- --

É importante relembrar que o registrador de segmento de dados DS é usado com todas as combinações abaixo, exceto quando o registrador BP é utilizado. Nessa exceção, o registrador SS é utilizado.

Para resumir mais ainda, podemos utilizar a tabela abaixo que reduz todas as combinações acima para facilitar mais ainda a memorização:

Tab. 2: Tabela resumo
BX SI + v8/16
BP DI

O registrador BX pode ser utilizado sozinho, combinado com SI ou DI, ou combinado com SI ou DI e com a coluna 3.

O registrador BP pode ser utilizado sozinho, combinado com SI ou DI, ou combinado com SI ou DI e com a coluna 3.

O registradores BP e BX não podem ser utilizados combinados. Um erro de compilação será gerado na tentativa de usá-los.

Em Tipos de Dados vimos os tipos de dados byte e word suportados pelo 8086. Nesta parte vimos como acessar dados em memória. Porém, não vimos como acessar esses tipos de dados em memória.

Quando usamos os registradores de 8 e 16-bits, o tamanho dos dados são implícitos. Porém, em algumas situações precisamos informar o tipo de dado ao o compilador com o uso dos prefixos abaixo:

Sintaxe:
MNEMONICO byte ptr modo_endereçamento
MNEMONICO word ptr modo_endereçamento

O prefixo byte ptr, significa um que byte será lido ou escrito em memória. O segundo prefixo, word ptr, significa que uma word será lida ou escrita em memória.

Dependendo do compilador, em alguns casos, que o prefixo pode ser automaticamente definido.

Ex: Acessando estrutura de dados
MOV word ptr DX, [BX] 
MOV byte ptr AL, [BX + 2]
  1. 18/02/2025 - revisão 1 - ajustes pontuais
  2. 29/10/2024 - versão inicial