Привет, я работал над проектом с использованием Arduino Uno (так что ATmega328p), где время очень важно, и поэтому я хотел посмотреть, в какие инструкции компилятор преобразовывал мой код. И там у меня есть, uint8_t
который я сдвигаю один бит вправо на каждой итерации, используя, data >>= 1
и кажется, что компилятор перевел это в 5 инструкций ( data
находится в r24
):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Но если я загляну в документацию по набору инструкций, то увижу инструкцию, которая делает именно это: lsr r24
Я что-то упускаю из виду или почему компилятор тоже не использует это? Регистры r18
и r19
больше нигде не используются.
Я использую Ardunio, но если я прав, он просто использует обычный avr-gcc
компилятор. Это код (обрезанный), который генерирует последовательность:
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;
}
Насколько я вижу, в Ardunino IDE используется компилятор gcc AVR, предоставляемый системой версии 6.2.0-1.fc24. Оба устанавливаются через менеджер пакетов, поэтому должны быть обновлены.
avr-objdump
в файле elf ... Что это, похоже, не соответствует?
data >>= 1;