Ciao, ho lavorato su un progetto usando un Arduino Uno (quindi ATmega328p) in cui il tempismo è piuttosto importante e quindi volevo vedere in quali istruzioni il compilatore stava convertendo il mio codice. E lì ho un uint8_t
che sposto un po 'a destra su ogni iterazione usando data >>= 1
e sembra che il compilatore abbia tradotto questo in 5 istruzioni ( data
è in r24
):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Ma se guardo nella documentazione del set di istruzioni vedo un'istruzione che fa esattamente questo: lsr r24
Trascuro qualcosa o perché il compilatore non usa anche questo? I registri r18
e r19
non vengono utilizzati altrove.
Sto usando un Ardunio ma se ho ragione usa solo il normale avr-gcc
compilatore. Questo è il codice (tagliato) che genera la sequenza:
ISR(PCINT0_vect) {
uint8_t data = 0;
for (uint8_t i = 8; i > 0; --i) {
// asm volatile ("lsr %0": "+w" (data));
data >>= 1;
if (PINB & (1 << PB0))
data |= 0x80;
}
host_data = data;
}
Per quanto posso vedere, l'IDE di Ardunino sta usando il compilatore gcc AVR fornito dal sistema che è la versione 6.2.0-1.fc24. Entrambi sono installati tramite il gestore dei pacchetti, quindi dovrebbe essere aggiornato.
avr-objdump
sul file elf ... Cosa sembra non corrispondere?
data >>= 1;