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_t
yang saya menggeser satu bit ke kanan pada setiap iterasi menggunakan data >>= 1
dan tampaknya kompiler menerjemahkan ini ke dalam 5 instruksi ( data
ada 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 r18
dan r19
tidak digunakan di tempat lain.
Saya menggunakan Ardunio tetapi jika saya benar itu hanya menggunakan avr-gcc
kompiler 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-objdump
pada file elf ... Apa yang tampaknya tidak sesuai?
data >>= 1;