Pregunta

Actualmente estoy jugando un poco con ensamblador en un Cortex-M3 microcontrolador.No estoy seguro de si esto es importante, pero aquí vamos.

Necesito escribir un valor en una cierta dirección en la memoria.Aquí es lo que he intentado:

LDR     R4, =__cs3_interrupt_vector_cortex_m
STR     R4, [=VTOR]

Pero me parece que se necesita hacer referencia a la VTOR dirección relativa a la PC registrarse.La pregunta es si hay una manera de no hacer referencia a la dirección de relativismo y dejar que este haga de forma automática (por lo que básicamente se trataría de mirar como mi enfoque).

Estoy usando GNU Assembler.

¿Fue útil?

Solución

Usted necesita para cargar la dirección de destino a un registro.Supongo que VTOR es una dirección de memoria o 'C' puntero y __cs3_interrupt_vector_cortex_m es una constante.Es decir, desea escribir una de 32 bits constante en una dirección.Si este es el caso, entonces,

 ; 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.

El BRAZO/Pulgar/Thumb2 es un la carga de la tienda de la arquitectura.Usted no puede usar la memoria de los operandos en la carga y la tienda de instrucciones.Esto simplifica el diseño de la CPU, pero es diferente de M68K y ensamblador x86.

La sintaxis ldr rX, =val se explica en el Gnu assembler páginas info.Generalmente se va a convertir a los siguientes,

ldr   rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.

El pseudo-op .ltorg le dice al ensamblador para el volcado de los literales de la tabla;el offset porción de código anterior.Usted puede agregar un .ltorg en cualquier lugar entre las sub-rutinas, etc.

Usted no puede utilizar la sintaxis str r4,[=VTOR] como el es igual la sintaxis es sólo un atajo para su uso con ldr.Por ejemplo,

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.

Usted puede utilizar el ldr rX,=VTOR la sintaxis para obtener la dirección de un registro.A continuación, toma otra instrucción como str rY, [rX] para escribir a esa dirección.

Las constantes están codificados dentro de una instrucción de modo que la constante de alcance es muy limitado, especialmente en pulgar modo.Supongo que estás utilizando thumb2 que puede tener más variedad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top