2014-11-26 6 views
5

siamo dentro write_four_registers_and_readback() e istruzione successiva è quella di chiamare delay(10):.n suffisso all'istruzione di ramo?

004002a4: b.n 0x4002f4 <write_four_registers_and_readback+172> 
78    delay(10); 

Dal ARM Instruction Set si apprende che b è ramo, seguita da una di due lettere mnemoniche

Esempio:

CMP R1,#0 ; Compare R1 with zero and branch to fred 
      ; if R1 was zero, otherwise continue 
BEQ fred ; to next instruction. 

Ma questo .n non sembra essere incluso nella tabella dei mnemonici a due lettere ... francamente non è un mnemo di due lettere Neanche Cosa significa.

Inoltre, cosa significa il numero 0x4002f4? E 'solo una rappresentazione assoluta dell'indirizzo inserito in <>? O qualcos'altro - il punto 4.4.3 Assembler syntax non sembra spiegare.

Il dispositivo è SAM4S e la cassetta degli attrezzi è arm-none-eabi-gcc.

+2

'0x4002f4' è l'indirizzo di destinazione, e il testo in' <> 'è lo sforzo migliore del disassemblatore per convertirlo in forma simbolica. –

risposta

7

Hai materiale di riferimento piuttosto antico, ma una moderna cassetta degli attrezzi. Quando è stato introdotto Thumb-2, ARM ha anche introdotto un nuovo Unified Assembler Language che consente di scrivere codice che può essere assemblato su ARM o Thumb con (potenzialmente) nessuna modifica. La maggior parte, se non tutte, le recenti toolchain predefinite su UAL (anche se molte supportano ancora le sintassi legacy in qualche modo).

In UAL, le .n e .w suffissi applicano a mnemonica che hanno sia un pollice a 16 bit ("stretta") e 32-bit Thumb-2 ("larghezza") codifica *. Se non specificato, l'assemblatore sceglierà automaticamente una codifica appropriata, ma se si desidera una particolare codifica (ad esempio forzando una codifica a 32 bit in cui l'assemblatore sceglierebbe la versione a 16 bit per eseguire il pad code per l'allineamento della cache), quindi il suffisso può essere specificato

I disassemblatori generalmente emetteranno i suffissi per garantire che l'output, se restituito attraverso un assemblatore, risulti esattamente nello stesso codice oggetto.

Quindi, ciò che si ha è un'istruzione branch di 16 bit per l'indirizzo 0x4002f4, che risulta essere 172 byte dopo il simbolo write_four_registers_and_readback.

* Tecnicamente, tutte le codifiche ARM sono anche "larghe" e pertanto possono richiedere un suffisso .w, ma in questo caso è completamente ridondante.