Привіт, я працював над проектом, використовуючи 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;
}
Наскільки я бачу, Ardenino IDE використовує компілятор AVR gcc, що надається системою версії 6.2.0-1.fc24. Обидва встановлені через керування пакетами, тому вони повинні бути оновленими.
avr-objdump
файл ельфів ... Що, здається, не відповідає?
data >>= 1;