आधुनिक कंप्यूटर के लिए रजिस्टरों की न्यूनतम न्यूनतम संख्या?


10

मैंने अपने स्नातक अध्ययनों में संकलकों पर एक पाठ्यक्रम लिया, जिसमें हमने एक संकलक लिखा जो एक खिलौना जावा भाषा में एक खिलौना विधानसभा भाषा के लिए स्रोत कार्यक्रम संकलित करता है (जिसके लिए हमारे पास एक दुभाषिया था)। परियोजना में हमने लक्ष्य मशीन के बारे में कुछ धारणाएँ बनाईं, जिनमें "वास्तविक" मूल निष्पादक शामिल हैं, जिनमें शामिल हैं:

  • एक रन-टाइम स्टैक, एक समर्पित स्टैक पॉइंटर ("एसपी") रजिस्टर द्वारा ट्रैक किया गया
  • गतिशील ऑब्जेक्ट आवंटन के लिए एक ढेर, एक समर्पित हीप पॉइंटर ("एचपी") रजिस्टर द्वारा ट्रैक किया गया
  • एक समर्पित कार्यक्रम काउंटर रजिस्टर ("पीसी")
  • लक्ष्य मशीन में 16 रजिस्टर हैं
  • डेटा पर परिचालन (जैसे, विरोध, कूदता है) रजिस्टर-टू-रजिस्टर ऑपरेशन हैं

जब हम ऑप्टिमाइज़ेशन के रूप में रजिस्टर आवंटन का उपयोग करने के लिए यूनिट में गए, तो यह मुझे आश्चर्यचकित कर गया: ऐसी मशीन के लिए रजिस्टरों की सैद्धांतिक न्यूनतम संख्या क्या है? आप हमारी मान्यताओं द्वारा देख सकते हैं कि हमने अपने कंपाइलर में पाँच रजिस्टरों (एसपी, एचपी, पीसी, प्लस टू बाइनरी ऑपरेशंस के रूप में उपयोग के लिए) का उपयोग किया है। हालांकि रजिस्टर आवंटन जैसी अनुकूलन निश्चित रूप से अधिक रजिस्टरों का उपयोग कर सकते हैं , क्या स्टैक और ढेर जैसी संरचनाओं को बनाए रखते हुए कम से कम प्राप्त करने का एक तरीका है? मुझे लगता है कि रजिस्टर एड्रेसिंग (रजिस्टर-टू-रजिस्टर ऑपरेशंस) के लिए हमें कम से कम दो रजिस्टरों की आवश्यकता है, लेकिन क्या हमें दो से अधिक की आवश्यकता है?


एक "हीप पॉइंटर" एक अजीब विचार लगता है। क्योंकि स्टैक के विपरीत, ढेर LIFO नहीं है और पुश / पॉप शब्दार्थ को कम नहीं करता है। आपको मॉलॉक / फ्री रूटीन पर कॉल के रूप में गतिशील मेमोरी आवंटन देखना चाहिए।
यवस डेवेट सेप

जवाबों:


14

यदि आप मेमोरी एड्रेस द्वारा सीधे मेमोरी एक्सेस की अनुमति देते हैं, तो आपको किसी भी "रजिस्टर" की आवश्यकता नहीं है क्योंकि आप इसके बजाय मेमोरी स्थानों का उपयोग कर सकते हैं। उदाहरण के लिए, स्थान 0 पर मेमोरी प्रोग्राम काउंटर हो सकती है, स्थान 1 पर हमारे पास स्टैक पॉइंटर आदि हैं, लेकिन यह धोखा है।

इसलिए खुद को धोखा देने से रोकने के लिए, हमें मान लेना चाहिए कि कोई प्रत्यक्ष मेमोरी एक्सेस नहीं है, क्योंकि हम निश्चित मेमोरी स्थानों को रजिस्टरों के रूप में उपयोग कर सकते हैं। तब हम दो रजिस्टर, एक प्रोग्राम काउंटर और स्टैक पॉइंटर के साथ भाग सकते हैं, जैसा कि स्टैक मशीनों पर विकिपीडिया लेख में बताया गया है । स्टैक केवल पॉइंटर पॉइंटर के माध्यम से पहुंच योग्य है, और प्रोग्राम केवल प्रोग्राम काउंटर के माध्यम से पहुंच योग्य है।

एक और संभावना काउंटर मशीनों का उपयोग करने की है। एक दो-काउंटर मशीन ट्यूरिंग पूर्ण है, अर्थात, यह जो भी ट्यूरिंग मशीन कर सकता है उसकी गणना कर सकता है। काउंटर मशीनों पर विकिपीडिया लेख में इसे फिर से अच्छी तरह से समझाया गया है ।


जवाब देने के लिए धन्यवाद! हालांकि, स्टैक मशीनों के लेख में उल्लेख किया गया है कि मशीन प्रत्यक्ष मेमोरी एक्सेस (सबसे ऊपरी स्टैक तत्वों पर संचालन करने और परिणाम को वापस धकेलने में सक्षम है), ताकि वह अभी भी धोखा दे रहा है, है ना? काउंटर मशीन के लिए, मैंने वह लेख पढ़ा। मैंने 2-सीएम की टीसी का एक समान प्रमाण भी पढ़ा है, लेकिन दोनों प्रभावी रूप से दो रजिस्टरों में रैम को संग्रहीत करते हैं, जो मुझे धोखा देने के लिए और भी अधिक लगता है।
ब्लूबॉम्बर

खैर, किसी समय यह धोखा नहीं है। स्टैक ऑपरेशन धोखा नहीं दे रहे हैं, जब तक कि वे मेमोरी में एक निश्चित स्थान तक सीधी पहुंच को बाधित नहीं करते हैं। स्टैक के तीन सबसे ऊपरी तत्वों को घुमाने में सक्षम होना, कहना, ठीक है। आपका सवाल थोड़ा अजीब है, किसी भी तरह, इसलिए यह इस बात पर ध्यान नहीं देता है कि क्या है और धोखा नहीं है।
बाउर

उत्तर देने के लिए पुनः धन्यवाद। कभी भी विषय सैद्धांतिक सीमा से संबंधित है, धोखा भी कम स्वीकार्य है! हालांकि इसका मतलब यह नहीं है कि यह शिक्षाप्रद है। जब यह धोखा नहीं दे रहा है, तब, जब कोई धोखा नहीं है, तो मुझे लगता है। मुझे आपका प्रारंभिक उत्तर जानकारीपूर्ण लगा, लेकिन समस्या यह है कि हमारा मॉडल ट्यूरिंग मशीन, काउंटर मशीन, और स्टैक मशीन के सभी मॉडलों को ओवरलैप करता है, और हमारी मान्यताओं को देखते हुए (जिसमें कई परिमित रजिस्टर और कोई प्रत्यक्ष मेमोरी एक्सेस शामिल नहीं है), क्या हम प्राप्त कर सकते हैं केवल दो रजिस्टरों के साथ?
ब्लूबॉम्बर

1
मुझे सवाल अजीब लगता है क्योंकि वास्तविक दुनिया की अवधारणाओं जैसे कि प्रोसेसर, रजिस्टर, मेमोरी एक्सेस आदि को पिन करना मुश्किल है, लेकिन आपको कुछ भी साबित करने में सक्षम होने के लिए उन पिन की आवश्यकता है। तो अंतिम परिणाम यह होगा कि आप जो कुछ भी साबित करते हैं उसे साबित करना आसान है, लेकिन यह बहुत हद तक इस बात पर निर्भर करता है कि आप प्रश्न को कैसे औपचारिक बनाते हैं (आपकी "प्रोसेसर" की सैद्धांतिक धारणा, "रजिस्टर", "मेमोरी", आदि) क्या है)।
लेडी बाउर

1
एक संकलक पाठ्यपुस्तक हमें "साबित" शब्द के गणितीय अर्थ में कम से कम, बहुत कुछ साबित करने की अनुमति नहीं देता है। आपको कुछ ऐसा करने के लिए हार्डवेयर के औपचारिककरण में एक कदम और आगे बढ़ना होगा जो सबूत की अनुमति देगा । किसी भी तरह, हम बालों को विभाजित कर रहे हैं, और मैंने पहले ही आपको अपना सर्वश्रेष्ठ जवाब दिया है।
लेडी बाउर

1

PIC आर्किटेक्चर जो कि 1970 के दशक में जनरल इंस्ट्रूमेंट्स द्वारा पेश किया गया था और आज भी उपयोग में है, में निम्नलिखित रजिस्टर थे:

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

एक विशिष्ट निर्देश एक रजिस्टर को पढ़ेगा, मूल्य रीड और डब्ल्यू का उपयोग करके एक संगणना का प्रदर्शन करेगा, और फिर गणना के परिणाम को डब्ल्यू या फिर पढ़े गए रजिस्टर पर संग्रहीत करेगा। उपलब्ध संगणनाओं में से एक "W को अनदेखा करते हुए मूल्य पढ़ा"; एक और "ले डब्ल्यू, मूल्य पढ़ने की अनदेखी" है। बिट पैटर्न जो "XX को पढ़ने, फिर डब्ल्यू को लेने, मूल्य पढ़ने को अनदेखा करने, और डब्ल्यू में परिणाम को संग्रहीत करने" के अनुरूप होगा, का उपयोग एनओपी के साथ-साथ कई विशेष निर्देशों के लिए किया जाता है।

पते की गणना की अनुमति देने के लिए, प्रोसेसर की निष्पादन इकाई उन निर्देशों के लिए देखेगी जो 00 के पते को एन्कोड करते हैं, और पते के लिए फ़ाइल चयन रजिस्टर की सामग्री को प्रतिस्थापित करते हैं।

हालांकि डब्ल्यू रजिस्टर के माध्यम से सभी मूल्यों को खिलाने के लिए एक अड़चन हो सकती है, पीआईसी वास्तुकला में समान लंबाई निर्देश शब्द का उपयोग करते हुए अन्य आर्किटेक्चर की तुलना में एक बड़ा काम सेट है। PIC16C54 पर (आज भी बना है, और 1970 के PIC के समान) निर्देश 12 बिट लंबे हैं। कई अन्य 16Cxx या 16Fxx भागों पर, निर्देश 14 बिट लंबे होते हैं और सीधे 128-बाइट एड्रेस स्पेस तक पहुंच सकते हैं। यदि किसी प्रोग्राम का वर्किंग सेट इंस्ट्रक्शन सेट के वर्किंग सेट के साथ अच्छी तरह से फिट बैठता है, तो "टोटल + = वैल्यू" जैसा स्टेटमेंट, जहां "टोटल" और "वैल्यू" टाइप होते हैं unsigned char, को कंपाइल करेगा:

movf  value,w
addwf total,f

एआरएम जैसी किसी चीज पर, भले ही किसी के पास चर के आधार पते के साथ एक रजिस्टर पहले से लोड हो, कोड अधिक पसंद होगा:

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

कई मामलों में, एक कंपाइलर हर ऑपरेशन के साथ लोड और स्टोर करने से बचने में सक्षम होगा, लेकिन PIC जैसी किसी चीज पर, बड़े कामकाजी सेट के लाभ कभी-कभी W से गुजरने की सीमाओं से बाहर निकल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.