Hai Saya sudah mengerjakan proyek menggunakan Arduino Uno (jadi ATmega328p) di mana waktunya cukup penting dan jadi saya ingin melihat ke dalam instruksi mana kompiler mengubah kode saya. Dan di sana saya memiliki uint8_tyang saya menggeser satu bit ke kanan pada setiap iterasi menggunakan data >>= 1dan tampaknya kompiler menerjemahkan ini ke dalam 5 instruksi ( dataada di r24):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Tetapi jika saya melihat dokumentasi set instruksi saya melihat instruksi yang melakukan hal ini: lsr r24
Apakah saya mengabaikan sesuatu atau mengapa kompiler tidak menggunakan ini juga? Register r18dan r19tidak digunakan di tempat lain.
Saya menggunakan Ardunio tetapi jika saya benar itu hanya menggunakan avr-gcckompiler normal . Ini adalah kode (dipangkas) yang menghasilkan urutan:
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;
}
Sejauh yang saya bisa lihat, Ardunino IDE menggunakan kompiler gcc AVR yang disediakan oleh sistem yang merupakan versi 6.2.0-1.fc24. Keduanya dipasang melalui palungan paket sehingga harus diperbarui.
avr-objdumppada file elf ... Apa yang tampaknya tidak sesuai?
data >>= 1;