Os modos de endereçamento são os meios pelo quais os operandos de uma instrução são obtidos. Esses operandos compreendem registradores, endereço de memória, flags e outros.

A compreensão dos modos é necessária para um melhor aproveitamento do aprendizado da linguagem assembly ARM ao longo do tutorial.

Decorar os formatos, campos de bits, dos modos de endereçamento não é necessário para esse aprendizado, pois os assembler e/ou compiladores lidam com essas questões em baixo nível alertando sobre operandos usados, modos de endereçamento e outras questões relacionadas ao formato das instruções.

Notação utilizada:
mnemônico Nome da instrução
# valor imediato
R Registrador R0-15
Rd Operando Destino
Rn Segundo operando
Rm Terceiro operando
[] conteúdo de memória
MEM Memória
<- Atribuição

A ARMv4 define o grupo de modos de endereçamento explicados logo abaixo bem como seus formatos e exemplos básicos:

Nesse modo, um valor byte, halfword ou word imediato ao opcode da instrução é utilizado como operando.

Tab. 1: Exemplo de formato imediato
31..28 27 26 25 24..21 20 19..16 15..12 11..8 7..0
cond 0 0 1 opcode S Rn Rd rotate_imm 8_bit_imediate
Sintaxe:
#imediato
Operação:
-
Ex:
mnemônico Rd, #1	;Rd <- 1

Ao executar uma instrução no formato da instrução acima, o registrador Rd irá armazenar o valor 1.

No modo registrador, os operandos utilizados por um instrução são os registradores de uso geral, R0 a R12.

Tab. 2: Exemplo de formato Registrador
31..28 27 26 25 24..21 20 19..16 15..12 11..7 6..4 3..0
cond 0 0 0 opcode S Rn Rd 0 0 Rm
Sintaxe:
Rn
Operação:
-
Ex:
mnemônico Rd, Rn

O modo de endereçamento escalado utiliza instruções de deslocamento e rotação sobre o segundo operando de uma instrução.

Tab. 3: Exemplo de formato Escalado
31..28 27..25 24..21 20 19..16 15..12 11..7 6..4 3..0
cond 0 opcode S Rn Rd shift_imm 0 Rm
Sintaxe:
[Rn, Rm inst_desl_rot #imediato]
[Rn RRX Rm]
Operação:
-
Ex:
mnemônico Rd, [Rn, Rm inst_desl_rot #imediato]

Ao executar uma instrução no formato do exemplo acima, o registrador Rd irá armazenar o valor de Rn aplicando uma instrução de deslocamento ou rotação. #imediato contém a quantidade de bits para a operação.

As instruções de rotação e deslocamento podem ser vistas com mais detalhes em Instruções: Rotação e Deslocamento.

Nesse modo, um valor é utilizado como offset, deslocamento ou índice para formar um endereço de memória onde um valor será armazenado ou recuperado. Rn não é atualizado.

Tab. 4: Exemplo de formato Offset
31..28 27 26 25 24 23 22 21 20 19..16 15..12 11..0
cond 0 1 0 0 U B 0 L Rn Rd 12_bit_offset
Sintaxe:
[Rn, (+/-)offset]
Operação:
MEM[Rn + (+/-)offset]

O offset na sintaxe acima, pode ser um valor imediato sinalizado de 8/12 bits ou um registrador de uso geral R0-R12.

Ex:
mnemônico Rd, [Rn, #offset]

O modo imediato offset utiliza um valor imediato sinalizado de 8/12 bits, dependendo do grupo de instrução, como operando para calcular um endereço de memória tendo um registrador Rn como base. O registrador Rn não é atualizado.

Sintaxe:
[Rn, #(+/-)offset]
Operação:
MEM[Rn + (+/-)offset]
Ex:
mnemônico Rd, [Rn, #(+/-)offset]

Ao executar uma instrução no formato do exemplo acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn + (+/-)offset.

Esse modo é utilizado para acessar estruturas de dados, parâmetros de funções ou subrotinas e variáveis locais contidos no stack frame, se utilizado/criado.

Nesse modo, um registrador Rm é utilizado como offset sinalizado que é adicionado/subtraído para formar um endereço de memória. O registrador base Rn não é atualizado.

Sintaxe:
[Rn, +/- Rm]
Operação:
MEM[Rn + (+/-)Rm]
Ex:
mnemônico Rd, [Rn, +/- Rm]

Ao executar uma instrução no formato do exemplo acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn +/- Rm.

No registrador escalado offset, um registrador Rm é escalado e posteriormente adicionado/subtraído de um registrador base Rn para formar um endereço de memória. O registrador base Rn não é atualizado.

Sintaxe:
[Rn, +/-Rm, inst_desl_rot #imeditato]
[Rn, (+/-)Rm, RRX]
Operação:
MEM[Rn + (+/-Rm inst_desl_rot #imeditato)]
Ex:
mnemônico Rd, [Rn, +/-Rm, inst_desl_rot #imediato]

Ao executar uma instrução no formato do exemplo acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn que é adicionado/ ao valor de Rm aplicado à instrução de deslocamento ou rotação baseado no valor imediato.

O modo imediato pré-indexado utiliza um valor offset sinalizado de 8/12 bits, dependendo do grupo da instrução, em conjunto com um registrador base Rn para formar um endereço de memória. O registrador Rn é atualizado(!) com esse endereço após o acesso ao dado.

Sintaxe:
[Rn, #(+/-)8_12_bits_offset]!
Operação:
MEM[Rn + (+/-)offset]
Rn <- Rn + (+/-)offset
Ex:
mnemônico Rd, [Rn, #(+/-)offset]!

Ao executar a instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por (Rn +/- offset) que é atribuído ao registrador Rn após o acesso ao dado.

Nesse modo, um registrador Rm é utilizado como offset sinalizado que é adicionado/subtraído a um registrador base Rn para formar um endereço de memória. Após o acesso ao dado em memória, esse endereço é atribuído a Rn.

Sintaxe:
[Rn, +/- Rm]!
Operação:
MEM[Rn + (+/-)Rm]
Rn <- Rn + (+/-)Rm
Ex:
mnemônico Rd, [Rn, +/- Rm]!

Após a execução da instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn + (+/-)Rm. O conteúdo de Rn será atualizado com o esse endereço após o acesso ao dado.

No modo registrador escalado pré-indexado, um valor escalado sinalizado contido em Rm é usado para formar um endereço de memória. Esse endereço é usado para atualizar o registrador Rn após o acesso ao dado.

Sintaxe:
[Rn, +/-Rm, intr_desl_rot #imediato]!
[Rn, +/-Rm, RRX]!
Operação:
MEM[Rn + (+/-Rm inst_desl_rot #imeditato)]
Rn <-[Rn + (+/-)Rm inst_desl_rot #imeditato)
Ex:
mnemônico Rd, [Rn, +/-Rm, intr_desl_rot #imediato]!

Após a execução da instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rm escalado que é adicionado ou subtraído a Rn. O endereço de memória formado é atribuído ao Rn após acessar o dado.

O modo imediato pós-indexado utiliza um registrador base Rn como endereço de memória. Após o acesso ao dado, Rn é atualizado com um endereço de memória formado por seu valor que é adicionado ou subtraído ao/do offset sinalizado de 8/12 bits imediato, dependendo do grupo da instrução.

Sintaxe:
[Rn], #(+/-)offset_8_12_bits
Operação:
MEM[Rn]
Rn <- Rn + (+/-)offset_8_12_bits)
Ex:
mnemônico [Rd], Rn, #(+/-)offset_12_bits

Após a execução da instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn. Rn é atualizado com o valor Rn + (+/-offset_12_bits) após o acesso ao dado.

Nesse modo, um registrador base Rn é usado como endereço de memória. Após o acesso ao dado, o registrador Rn é atualizado com um endereço de memória formado pelo valor sinalizado Rm que é adicionado ou subtraído a/de Rn.

Sintaxe:
[Rn], +/-Rm
Operação:
MEM[Rn]
Rn <- Rn + (+/-)Rm
Ex:
mnemônico [Rd], Rn, (+/-)Rm

Após a execução da instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn. Rn então é atualizado com o valor Rn + (+/-Rm) após o acesso ao dado.

No modo um registrador escalado pós-indexado, um registrador base Rn é usado como endereço de memória. Após o acesso ao dado, o registrador Rn é atualizado com um endereço de memória formado valor escalado sinalizado em Rm é adicionado ou subtraído a/de Rn.

Sintaxe:
[Rn], +/-Rm, intr_desl_rot #imediato]
[Rn], +/-Rm, RRX]
Operação:
MEM[Rn]
Rn <- Rn +( (+/-)Rm intr_desl_rot #imediato
Ex:
mnemônico [Rd], Rn] +/-Rm, intr_desl_rot #imediato

Após a execução da instrução acima, o registrador Rd irá armazenar o valor contido no endereço de memória formado por Rn. Por sua vez, Rn é atualizado com o valor Rn + (Rm escalado) após o acesso ao dado.

Na próxima seção, serão estudadas as instruções fornecidas na arquitetura ARM V4 bem como seus formatos básicos, descrição e exemplos básicos.

  1. 28/01/2025 - versão inicial