Merhaba ben zamanlama oldukça önemli bir Arduino Uno (böylece ATmega328p) kullanarak bir proje üzerinde çalışıyorum ve bu yüzden derleyici kodumu dönüştürmek hangi talimatları içine görmek istedim. Ve orada uint8_t
kullanarak her yineleme üzerinde bir bit sağa biraz kaydırmak var data >>= 1
ve derleyici 5 talimatları ( data
içinde r24
) tercüme gibi görünüyor :
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Ancak talimat kümesi belgelerine bakarsanız, tam olarak bunu yapan bir talimat görüyorum: lsr r24
Bir şeyi gözden kaçırıyor muyum veya derleyici bunu neden kullanmıyor? Kayıtlar r18
ve r19
başka hiçbir yerde kullanılmaz.
Bir Ardunio kullanıyorum ama eğer doğruysam normal avr-gcc
derleyiciyi kullanıyor. Diziyi oluşturan kod (kesilmiş):
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;
}
Görebildiğim kadarıyla Ardunino IDE, 6.2.0-1.fc24 sürümü olan sistem tarafından sağlanan AVR gcc derleyicisini kullanıyor. Her ikisi de paket yöneticisi aracılığıyla kurulur, bu nedenle güncel olmalıdır.
avr-objdump
elf dosyasında kullandım… Karşılık gelen gibi değil mi?
data >>= 1;