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

A arquitetura ARM v4 as instruções para leitura e escrita STR e LDR. Essas podem trabalhar como os tipos Byte, Halfword e Word. Essas instruções são utilizadas para entrada e saída de dados via registradores mapeados em memória.

Os tipos de dados Byte e Halfwords mencionados podem ser sinalizados ou não-sinalizados. No sinalizado, quando armazenado em registradores, são estendidos para 32-bits.

Essa arquitetura também define as instruções LDM e STM que manipulam múltiplos valores para leitura e escrita em memória. Essas instruções não trabalham com valores sinalizados podendo ser utilizada para armazenar dados na pilha.

Quando uma instrução, indepedente do grupo, utiliza dois operando ou argumentos, a leitura da operação pode ser feita como abaixo.

Sintaxe
MNEMÔNICO{<cond>}{S} destino, origem
MNEMÔNICO{<cond>} origem, destino

As instruções são executadas de acordo com a condição <cond> utilizada. As flags de status N, Z, C, e V são alteradas quando o sufixo S é utilizado em uma instrução.

Sintaxe
MNEMÔNICO{<cond>} destino, origem
MNEMÔNICO{<cond>} origem, destino

Mais informações sobre registradores, flags e condições, podem ser vistas em Registradores e CPSR e Formato: Condições.

Notação utilizada
opcode instrução
<- Atribuição
Rd Registrador de destino
Rn, Rm, Rs Registrador operando
[] Conteúdo/Conteúdo de memória
MEM Memória
cond Condição
B Byte
SB Byte Sinalizado
H Halfword
SH Halfword sinalizado

A instrução LDR é utilizada para ler um valor Byte, Halfword e Word, de um endereço de memória informado por um modo de endereçamento, e armazená-lo em um registrador de destino.

Tanto Byte quanto Halfword podem ser sinalizados ou não-sinalizados, sendo estendidos para 32-bits antes de serem armazenados no destino. Para valores sinalizados, o sinal é mantido com o uso da extensão.

Sintaxe
LDM{<cond>} Rd, <endereçamento> ;Word
LDM{<cond>} B Rd, <endereçamento> ;Byte
LDM{<cond>}SB Rd, <endereçamento> ;Byte sinalizado
LDM{<cond>} H Rd, <endereçamento> ;Halfword
LDM{<cond>}SH Rd, <endereçamento> ;Halfword sinalizado
                                    
Operação
Rd <- MEM[<endereçamento>] ;Word
RdH  <- MEM[<endereçamento>] ;Halfword
RdSH <- MEM[<endereçamento>] ;Halfword sinalizado
RdB  <- MEM[<endereçamento>] ;Byte
RdSB <- MEM[<endereçamento>] ;Byte sinalizado
Endereçamento:
Rd, [Rn, #+/-<12_bit_offset>]
Rd, [Rn, +/-Rm]
Rd, [Rn, +/-Rm, <shift> #<shift_imm>]
Rd, [Rn, #+/-<12_bit_offset>]!
Rd, [Rn, +/-Rm]!
Rd, [Rn, +/-Rm, <shift> #<shift_imm>]!
Rd, [Rn], #+/-<12_bit_offset>
Rd, [Rn], +/-Rm
Rd, [Rn], +/-Rm, <shift> #<shift_imm>
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R0, #AABBCCDD   ;valor
MOV R1, #FF000000   ;ram
MOV R2, #0
LDRSB R0, [R1, R2]   ; R0 <- 000000DD
LDRSH R0, [R1, R2]   ; R0 <- 0000CCDD
LDR R0, [R1, R2]    ; R0 <- AABBCCDD

A instrução STR é utilizada para escrever um valor Byte, Halfword e Word em um endereço de memória informado por um modo de endereçamento. Diferente de LDR, STR não trabalha com valores sinalizados/estendidos.

Sintaxe
STR{<cond>} Rd, <endereçamento> ;Word
STR{<cond>}B Rd, <endereçamento> ;Byte
STR{<cond>}H Rd, <endereçamento> ;Halfword
Operação
MEM[<endereçamento>] <- (Word)Rd
MEM[<endereçamento>] <- (Halfword)Rd 
MEM[<endereçamento>] <- (Byte)Rd
Endereçamento:
Rd, [Rn, #+/-<12_bit_offset>]
Rd, [Rn, +/-Rm]
Rd, [Rn, +/-Rm, <shift> #<shift_imm>]
Rd, [Rn, #+/-<12_bit_offset>]!
Rd, [Rn, +/-Rm]!
Rd, [Rn, +/-Rm, <shift> #<shift_imm>]!
Rd, [Rn], #+/-<12_bit_offset>
Rd, [Rn], +/-Rm
Rd, [Rn], +/-Rm, <shift> #<shift_imm>
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R1, #FF000000   ;[FF000000] = DDCCBBAA
MOV R2, #0
STRB R0, [R1, R2]   ; MEM[FF000000] <- DD
STRH R0, [R1, R2]   ; MEM[FF000000] <- DDCC
STR R0, [R1, R2]    ; MEM[FF000000] <- DDCCBBAA

A instrução LDM é utilizada para ler múltiplos dados de 32-bits, sequencialmente, de um endereço de memória que informado por um modo de endereçamento/sufixo, e armazená-los em uma lista de registradores.

Essa instrução pode ser utilizada tanto para carregamento de dados quanto para recuperar dados na pilha.

Sintaxe
LDM{<cond>}<sufixo> Rn{!}, <register_list>{^}
LDM{<cond>}<sufixo> Rn{!}, <registers>
LDM{<cond>}<sufixo> Rn, <registers>^
LDM{<cond>}<sufixo> Rn{!}, <registers_and_pc>^
Sufixos
Tab. 1: Sufixos LDM
Sufixo Descrição Endereço Inicial Endereço Final Rn!
IA Increment After Rn Rn + 4*N - 4 Rn + 4*N
IB Increment Before Rn + 4 Rn + 4*N Rn + 4*N
DA Decrement After Rn - 4*N Rn Rn - 4*N
DB Increment Before Rn - 4*N Rn - 4 Rn - 4*N
CPSR
N: -
Z: -
C: -
V: -
Ex:
LDMIA R3!, {R0,R1,R2}
LDMIA R3!, {R0-R2}

A instrução STM é utilizada para escrever ou armazenar os valores contidos em uma lista de registradores em um endereço de memória de destino de acordo com um endereçamento/sufixo.

Essa instrução pode ser utilizada tanto para transferência de dados quanto para armazenar dados na pilha. O incremento e decremento dos registradores é feito de acordo com o sufixo.

Sintaxe
STM{<cond>}<sufixo> Rn{!}, <register_list>{^}
STM{<cond>}<sufixo> Rn{!}, <registers>
STM{<cond>}<sufixo> Rn, <registers>^
STM{<cond>}<sufixo> Rn{!}, <registers_and_pc>^
Sufixos
Tab. 2: Sufixos STM
Sufixo Descrição Endereço Inicial Endereço Final Rn!
IA Increment After Rn Rn + 4*N - 4 Rn + 4*N
IB Increment Before Rn + 4 Rn + 4*N Rn + 4*N
DA Decrement After Rn - 4*N Rn Rn - 4*N
DB Increment Before Rn - 4*N Rn - 4 Rn - 4*N
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R0, #AA
MOV R1, #BB   
MOV R2, #CC   
MOV R3, #FFFF0000
STMIA R2!, {R0,R1,R2}
  1. 11/02/2025 - versão inicial