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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top