नमस्ते मैं एक 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कहीं और उपयोग नहीं किया जाता है।
मैं एक आर्दूनियो का उपयोग कर रहा हूं लेकिन अगर मैं सही हूं तो यह सामान्य 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;
}
जहां तक मैं देख सकता हूं कि अर्दीनिनो आईडीई सिस्टम द्वारा प्रदान की गई AVR gcc कंपाइलर का उपयोग कर रहा है जो कि संस्करण 6.2.0-1.fc24 है। दोनों पैकेज मैनर के माध्यम से स्थापित किए गए हैं इसलिए अद्यतित होना चाहिए।
avr-objdumpयोगिनी फ़ाइल पर उपयोग किया है ... यह क्या है जो मेल नहीं खाता है?
data >>= 1;