Scrivere dati per l'indirizzo assoluto
Domanda
Attualmente sto giocando un po 'con assemblatore su un microcontrollore Cortex-M3.Non sono sicuro che sia importante, ma qui vai.
Ho bisogno di scrivere un valore in un determinato indirizzo in memoria.Ecco cosa ho provato:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
.
Ma sembra che io abbia bisogno di fare riferimento all'indirizzo VOR relativo al registro PC.La domanda è se c'è un modo per non fare riferimento all'indirizzo relativ e lasciare che questo faccia automaticamente (in modo da sembrare fondamentalmente il mio approccio).
Sto usando GNU Assembler.
Soluzione
È necessario caricare l'indirizzo di destinazione su un registro. Suppongo che VTOR
sia un indirizzo di memoria o un puntatore "C" e __cs3_interrupt_vector_cortex_m
è una costante. Cioè, desideri scrivere una costante a 32 bit per un indirizzo. Se questo è il caso,
; 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.
.
Il braccio / thumb / thumb2 è un architettura store-store . Non è possibile utilizzare gli operandi di memoria nelle istruzioni di carico e memorizzare. Questo semplifica il design della CPU, ma è diverso da M68K e X86 Assembler.
La sintassi ldr rX, =val
è spiegata in GNU Assembler Info Pagine . Generalmente convertirà al seguente,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
.
The pseudo-op .ltorg
dice all'Assembler di scaricare la tabella letterale; La parte offset del codice sopra. È possibile aggiungere un .ltorg
ovunque tra sub-routine, ecc.
Non è possibile utilizzare la sintassi str r4,[=VTOR]
come EQUALS Sintassi è solo un taglio breve per l'uso con ldr
. Ad esempio,
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.
.
È possibile utilizzare la sintassi ldr rX,=VTOR
per ottenere l'indirizzo a un registro. Quindi prende un'altra istruzione come str rY, [rX]
per scrivere effettivamente quell'indirizzo.
Le costanti sono codificate all'interno di un'istruzione in modo che la gamma costante sia molto limitata soprattutto in modalità thumb . Immagino che tu stia usando Thumb2 che potrebbe avere più gamma.