সংকলক সরাসরি এলএসআর ব্যবহার করে না কেন


10

হাই, আমি একটি আরডুইনো ইউনো (তাই এটিমেগা 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। উভয়ই প্যাকেজ ব্যবস্থার মাধ্যমে ইনস্টল করা আছে তাই আপডেট হওয়া উচিত।


1
সমাবেশটি সি কোডের সাথে মিল বলে মনে হচ্ছে না।
ইউজিন শ।

আচ্ছা, আমি এটি আরডুনিও আইডিই ব্যবহার করে সংকলন করেছি এবং তারপরে avr-objdumpএলফ ফাইলটিতে ব্যবহার করেছি … এটি কী বলে যা মনে হয় না?
xZise

1
@Eugene Sh .: এটা করে সি কোড মিলা। এটি কেবল রেখার সাথে মিল রাখেdata >>= 1;
কর্ড

1
এটি এমন একটি ক্ষেত্রে যেখানে "বিভাগ পরিবর্তে শিফট ব্যবহার করুন" এটি ভুল পরামর্শ। আপনি যদি এর পরিবর্তে / = 2 করেন তবে সংকলকটি lsr r24 উত্পন্ন করবে; (টিপ:
এসএম

কি সংকলন? কি প্রসেসর? এটি সত্যই স্পষ্ট হওয়া উচিত এই প্রশ্নের অর্থবোধ করার জন্য এটি প্রয়োজনীয় তথ্য।
অলিন ল্যাথ্রপ

উত্তর:


18

কোনো মান যার আকার আকার কম সি ল্যাঙ্গুয়েজ স্পেসিফিকেশন অনুযায়ী int; (বিশেষ কম্পাইলার উপর নির্ভর করে আপনার ক্ষেত্রে intকোনো অপারেশন (আপনার ক্ষেত্রে জড়িত 16 বিট চওড়া) >>) একটি থেকে upCast হয় intঅপারেশন আগে।
সংকলকটির এই আচরণটিকে পূর্ণসংখ্যা প্রচার বলা হয় ।

এবং ঠিক এটিই সংকলকটি করেছিল:

  • r19 = 0 হল পূর্ণসংখ্যা প্রচারিত মানের MSByte data
  • (r19, R18) মোট পূর্ণসংখ্যা এর উন্নীত মান উপস্থাপন করে dataযে তারপর দ্বারা এক বিট দ্বারা অধিকার স্থানান্তরিত করা হয় asr r19এবং ror 18
  • এরপরে ফলটি তাত্ক্ষণিকভাবে আপনার uint8_tপরিবর্তনশীলটিতে ফেলা হয় data:
    mov r24, r18অর্থাত্, r19 এর এমএসবাইটটি ফেলে দেওয়া হয়।

সম্পাদনা করুন:
অবশ্যই সংযোজক কোডটি অনুকূল করতে পারে
সমস্যাটি পুনরুত্পাদন করার চেষ্টা করে আমি জানতে পেরেছিলাম যে কমপক্ষে এভিআর-জিসিসি সংস্করণ ৪.৯.২ সহ সমস্যাটি ঘটে না। এটি খুব দক্ষ কোড তৈরি করে, যেমন সি-লাইনটি data >>= 1;কেবল একটি একক lsr r24নির্দেশনায় সংকলিত হয়ে যায় । সুতরাং আপনি খুব পুরানো সংকলক সংস্করণ ব্যবহার করছেন are


2
এটি মোট বর্জ্য নয় কারণ কখনও কখনও এসেম্বলারের পর্যায়ে ডিবাগিংয়ের জন্য আপনার বিনা চাপিত কোডের প্রয়োজন হয়। তারপরে আপনার অবিরাম কোড থাকলে আপনি খুব খুশি হন।
দহ

3
যদি আমি সঠিকভাবে স্মরণ করি তবে -মিন্ট 8 হ'ল প্রতীকটি 8-বিট করা flag তবে এটির অনেকগুলি অযাচিত পার্শ্ব প্রতিক্রিয়া রয়েছে। দুঃখিত, তারা এখন কী ছিল তা পুরোপুরি মনে করতে পারে না, তবে আমি তাদের কারণে পতাকাটি কখনই ব্যবহার করি না। আমি বহু বছর আগে একটি বাণিজ্যিক সংকলকটির সাথে এভিআর-জিসিসি তুলনা করার জন্য অনেক সময় ব্যয় করেছি।
জন

1
ওহ, এটি ঠিক আছে, সি স্ট্যান্ডার্ডের জন্য কমপক্ষে 16-বিট হওয়া পূর্ণসংখ্যার প্রয়োজন হয়, তাই -মিন্ট 8 ব্যবহার করে সমস্ত লাইব্রেরি ভেঙে যায়।
জন

9
নাইজেল জোন্স "8-বিট মাইক্রোকন্ট্রোলারদের জন্য দক্ষ সি কোড" এর মতো কিছুতে বলেছেন: "... সি এর পূর্ণসংখ্যা প্রচারের বিধিগুলি সম্ভবত আমাদের মধ্যে যারা 8-বিট বিশ্বে শ্রম দিয়ে থাকে তাদের বিরুদ্ধে করা সবচেয়ে জঘন্য অপরাধ" ...
ডিরিসু রডরিগস জুনিয়র

1
@ জোনাস উইলিকি: সমস্যাটির সর্বোত্তম সমাধান হ'ল আরও ভাল সংকলক ব্যবহার করা। যেমন এভিআর-জিসিসি সংস্করণ ৪.৯.২ সহ আমি সমস্যাটি পুনরুত্পাদন করতে পারি না: সি কোড লাইনের জন্য d >>= 1;আমি কেবল একটি একক lsr r24নির্দেশ পাই । হতে পারে xZise একটি খুব পুরানো সংকলক সংস্করণ ব্যবহার করছে।
দহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.