La escritura de datos a la dirección absoluta
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.
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.