হাই, আমি একটি আরডুইনো ইউনো (তাই এটিমেগা 328 পি) ব্যবহার করে এমন একটি প্রকল্পে কাজ করছি যেখানে টাইমিং বেশ গুরুত্বপূর্ণ এবং তাই সংকলকটি আমার কোডটি রূপান্তর করছে কি নির্দেশাবলী তা দেখতে চেয়েছিলাম। এবং সেখানে আমার একটি রয়েছে 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 জিসিসি সংকলক ব্যবহার করছে যা সংস্করণ 6.2.0-1.fc24। উভয়ই প্যাকেজ ব্যবস্থার মাধ্যমে ইনস্টল করা আছে তাই আপডেট হওয়া উচিত।
avr-objdump
এলফ ফাইলটিতে ব্যবহার করেছি … এটি কী বলে যা মনে হয় না?
data >>= 1;