पृष्ठभूमि जानकारी: आखिरकार, मैं मूल निंटेंडो या गेमबॉय जैसी वास्तविक मशीन का एक एमुलेटर लिखना चाहता हूं। हालांकि, मैंने फैसला किया कि मुझे कहीं और अधिक सरल, शुरू करने की आवश्यकता है। मेरे कंप्यूटर विज्ञान सलाहकार/प्रोफेसर ने मुझे एक बहुत ही सरल काल्पनिक प्रोसेसर के लिए विनिर्देश दिए जो उन्होंने पहले अनुकरण करने के लिए बनाए थे। एक रजिस्टर (संचयक) और 16 ऑपकोड हैं। प्रत्येक निर्देश में 16 बिट होते हैं, जिनमें से पहले 4 में ऑपोड होता है, जिनमें से बाकी ऑपरेंड होता है। निर्देश बाइनरी प्रारूप में स्ट्रिंग के रूप में दिए गए हैं, उदाहरण के लिए, "0101 0101 0000 1111"।एक साधारण सीपीयू एमुलेटर के कार्यान्वयन के संबंध में प्रश्न
मेरा प्रश्न: सी ++ में, प्रसंस्करण के लिए निर्देशों का विश्लेषण करने का सबसे अच्छा तरीका क्या है? कृपया मेरा अंतिम लक्ष्य दिमाग में रखें। यहाँ कुछ अंक मैं माना जाता है कर रहे हैं:
मैं सिर्फ प्रक्रिया नहीं कर सकते और क्योंकि कोड स्वयं संशोधित है के रूप में मैं उन्हें पढ़ने के निर्देशों पर अमल: एक अनुदेश एक बाद अनुदेश बदल सकते हैं। इस बारे में जानने के लिए मैं एकमात्र तरीका देख सकता हूं कि सभी परिवर्तनों को संग्रहित किया जाए और प्रत्येक निर्देश के लिए यह जांचने के लिए कि परिवर्तन को लागू करने की आवश्यकता है या नहीं। यह प्रत्येक निर्देश के निष्पादन के साथ तुलना की भारी मात्रा में हो सकता है, जो अच्छा नहीं है। और इसलिए, मुझे लगता है कि मुझे निर्देशों को एक और प्रारूप में दोबारा जोड़ना है।
हालांकि मैं ऑपोड को एक स्ट्रिंग के रूप में पार्स कर सकता हूं और इसे संसाधित कर सकता हूं, ऐसे कई उदाहरण हैं जहां संपूर्ण रूप से निर्देश को एक संख्या के रूप में लिया जाना चाहिए। वृद्धि के लिए ओपोड, उदाहरण के लिए, निर्देश के ओपोड अनुभाग को भी संशोधित कर सकता है।
यदि मैं निर्देशों को पूर्णांक में परिवर्तित करना था, तो मुझे यकीन नहीं है कि मैं केवल int के opcode या operand अनुभाग को कैसे पार्स कर सकता हूं। यहां तक कि अगर मैं प्रत्येक निर्देश को तीन भागों में पुन: संकलित करना चाहता था, तो एक इंट के रूप में संपूर्ण निर्देश, एक int के रूप में ओपोड, और एक int के रूप में ऑपरेंड, जो अभी भी समस्या का समाधान नहीं करेगा, क्योंकि मुझे एक संपूर्ण निर्देश में वृद्धि करना पड़ सकता है और बाद में प्रभावित ओपोड या ऑपरेंड पार्स। इसके अलावा, क्या मुझे यह रूपांतरण करने के लिए एक फ़ंक्शन लिखना होगा, या सी ++ के लिए कुछ लाइब्रेरी है जिसमें एक फ़ंक्शन "बाइनरी प्रारूप" में एक स्ट्रिंग को एक पूर्णांक में परिवर्तित करता है (जैसे जावा में Integer.parseInt (str1, 2))?
इसके अलावा, मैं शिफ्टिंग बिट्स जैसे संचालन करने में सक्षम होना चाहता हूं। मुझे यकीन नहीं है कि यह कैसे प्राप्त किया जा सकता है, लेकिन इससे प्रभावित हो सकता है कि मैं इस पुनर्मूल्यांकन को कैसे कार्यान्वित करता हूं।
आपकी सहायता या सलाह के लिए धन्यवाद!
मैं उम्मीद कर रहा था कि कोई इस तरह की अवधारणा का उल्लेख करेगा। मैंने पहले कभी इसका इस्तेमाल नहीं किया है, इसलिए मुझे और अधिक शोध करना होगा। धन्यवाद! –
आह, विश्वविद्यालय परियोजनाओं की यादें! – sdg
+1। यह मूल दृष्टिकोण है जिसे आपको लेना चाहिए। यहां मुख्य बिंदु, ब्रैंडन, आपके प्रश्न के सापेक्ष, यह है कि इसे सामान्य रूप से संपर्क करने के लिए, आपको "मशीन कोड" प्राप्त करने की आवश्यकता है जो आपके वर्चुअल कंप्यूटर के पता स्थान का प्रतिनिधित्व करने वाले सरणी में बाइट्स की सरणी होगी। फिर यदि निर्देश स्मृति (कोड) संपादित करते हैं, तो आप कुछ भी विशेष नहीं करते हैं, तो आप केवल निर्देशों का पालन करें और उन्हें आपकी बड़ी वर्चुअल मेमोरी सरणी के अंदर सही चीज़ करना चाहिए। आइओ, आपको असेंबलर (वह टूल जो टेक्स्ट स्ट्रिंग्स को निर्देश बाइट्स में अनुवाद करता है) और एमुलेटर की आवश्यकता है, जो चीज –