Escrever dados para o endereço absoluto
Pergunta
Atualmente estou brincando um pouco com o montador em um Cortex-M3 microcontrolador.Eu não tenho certeza se isso é importante, mas aqui vai.
Eu preciso escrever um valor para um determinado endereço na memória.Aqui está o que eu tentei:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
Mas parece que eu preciso para fazer referência a VTOR endereço relativo ao registro PC.A questão é se existe uma maneira de não fazer referência a endereços relativamente e deixe esse de o fazer automaticamente, de modo que seria basicamente parecido com o meu abordagem).
Eu estou usando o GNU Assembler.
Solução
Você precisa carregar o endereço de destino de um registo.Eu suponho que VTOR
é um endereço de memória ou 'C' ponteiro e __cs3_interrupt_vector_cortex_m
é uma constante.Ou seja, você quer escrever uma constante de 32 bits de um endereço.Se este for o caso, então,
; Get value __cs3_interrupt_vector_cortex_m to r4
ldr r4, =__cs3_interrupt_vector_cortex_m
ldr r5, =VTOR ; address 'VTOR' to r5.
str r4, [r5] ; write the constant to 'VTOR' address.
O BRAÇO/Thumb/Thumb2 é um load-store arquitetura.Você não pode usar memória operandos na carga e armazenamento de instruções.Isso simplifica o design de CPU, mas é diferente de M68K e x86 assembler.
A sintaxe ldr rX, =val
é explicado na O Gnu assembler páginas de informações.Geralmente ele irá converter para o seguinte,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
O pseudo-op .ltorg
diz o montador de despejo literal tabela;o deslocamento parte do código acima.Você pode adicionar um .ltorg
em qualquer lugar entre as sub-rotinas, etc.
Você não pode usar a sintaxe de str r4,[=VTOR]
como o é igual a a sintaxe é apenas um curta de corte para uso com ldr
.Por exemplo,
ldr rX,=7 ; is really 'mov rx,#7' in all modes.
ldr rX,=0xff ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb.
ldr rx,=0x12345678 ; will use the [pc, #offset] for all modes.
Você pode usar o ldr rX,=VTOR
a sintaxe para obter o endereço de um registro.Em seguida, ele pega outra instrução como str rY, [rX]
para escrever para esse endereço.
Constantes são codificados dentro de uma instrução, de modo a constante de alcance é muito limitado, especialmente em polegar o modo.Eu acho que você está usando thumb2 o que pode ter mais variedade.