Salut, je travaille sur un projet utilisant un Arduino Uno (donc ATmega328p) où le timing est assez important et je voulais donc voir dans quelles instructions le compilateur convertissait mon code. Et là, j'en ai un uint8_tque je décale d'un bit vers la droite à chaque itération en utilisant data >>= 1et il semble que le compilateur ait traduit cela en 5 instructions ( dataen r24):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Mais si je regarde dans la documentation du jeu d'instructions, je vois une instruction qui fait exactement ceci: lsr r24
Dois-je ignorer quelque chose ou pourquoi le compilateur ne l'utilise-t-il pas également? Les registres r18et r19ne sont utilisés nulle part ailleurs.
J'utilise un Ardunio mais si j'ai raison, il utilise simplement le avr-gcccompilateur normal . C'est le code (découpé) qui génère la séquence:
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;
}
Autant que je puisse voir, l'IDE Ardunino utilise le compilateur AVR gcc fourni par le système qui est la version 6.2.0-1.fc24. Les deux sont installés via le gestionnaire de packages et doivent donc être à jour.
avr-objdumpsur le fichier elf… Qu'est-ce qui ne semble pas correspondre?
data >>= 1;