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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top