संक्षिप्त उत्तर : आप संकलित, लिंक किए गए निष्पादन योग्य का अनुवाद नहीं कर सकते। जबकि तकनीकी रूप से संभव है, यह पूरा करने के लिए बेहद असंभव है (नीचे देखें)। हालाँकि , यदि आपके पास असेंबली सोर्स फाइल (निर्देश और लेबल युक्त) है, तो ऐसा करना बहुत संभव है (हालाँकि यदि आप किसी तरह असेंबली सोर्स प्राप्त करते हैं, जब तक कि असेंबली में प्रोग्राम नहीं लिखा जाता है, तो आपके पास मूल प्रोग्राम सोर्स कोड होना चाहिए। ठीक है, इसलिए आप अलग-अलग आर्किटेक्चर के साथ शुरू करने के लिए इसे संकलित करना बेहतर होगा)।
लंबे उत्तर :
QEMU और अन्य एमुलेटर मक्खी पर निर्देशों का अनुवाद कर सकते हैं, और इसलिए एक कंप्यूटर पर एक निष्पादन योग्य चलाते हैं जिसे इसके लिए संकलित नहीं किया गया था। प्रक्रिया को गति देने के लिए इस अनुवाद को समय से पहले उड़ान भरने के बजाय क्यों नहीं किया जाता है?
मुझे पता है कि सिद्धांत रूप में यह आसान लग सकता है, लेकिन व्यवहार में, यह कुछ मुख्य कारणों के लिए लगभग असंभव है। शुरू करने के लिए, अलग-अलग निर्देश सेट बड़े पैमाने पर अलग-अलग एड्रेसिंग मोड, अलग-अलग ओपकोड संरचना, अलग-अलग शब्द आकार और कुछ ऐसे निर्देशों का उपयोग करते हैं जिनकी आपको जरूरत नहीं है।
मान लीजिए कि आपको निर्देश XYZ
को दो और निर्देशों के साथ प्रतिस्थापित करने की आवश्यकता है , ABC
और DEF
। अब आप उस बिंदु से पूरे कार्यक्रम में सभी रिश्तेदार / ऑफसेट पते को प्रभावी ढंग से स्थानांतरित कर चुके हैं, इसलिए आपको विश्लेषण करने और पूरे कार्यक्रम से गुजरने और ऑफ़सेट्स (परिवर्तन से पहले और बाद दोनों) को अपडेट करने की आवश्यकता होगी। अब, मान लें कि ऑफ़सेट्स में से एक महत्वपूर्ण रूप से बदलता है - अब आपको एड्रेसिंग मोड बदलने की ज़रूरत है, जिससे एड्रेस का आकार बदल सकता है। यह फिर से आपको पूरी फाइल को फिर से स्कैन करने और सभी पतों को फिर से गणना करने के लिए मजबूर करेगा, और इसी तरह और चौथा।
जब आप असेंबली प्रोग्राम लिखते हैं, तो आप लेबल का उपयोग कर सकते हैं, लेकिन सीपीयू - जब फ़ाइल को इकट्ठा नहीं किया जाता है, तो सभी लेबल को सापेक्ष, निरपेक्ष या ऑफसेट स्थानों की गणना की जाती है। आप देख सकते हैं कि यह जल्दी से एक गैर-तुच्छ कार्य क्यों बन जाता है, और असंभव के बगल में। किसी एकल निर्देश को बदलने से आपको आगे बढ़ने से पहले पूरे कार्यक्रम से सैकड़ों बार गुजरना पड़ सकता है।
विधानसभा के मेरे कुछ सीमित ज्ञान से, MOV, ADD और अन्य जैसे अधिकांश निर्देश आर्किटेक्चर में पोर्टेबल होने चाहिए।
हां, लेकिन उन मुद्दों को देखें जिन्हें मैंने ऊपर उल्लिखित किया था। मशीन के शब्द आकार के बारे में क्या? पता लंबाई? यह भी एक ही संबोधित मोड है? फिर से, आप निर्देशों को "ढूंढ और प्रतिस्थापित" नहीं कर सकते। कार्यक्रम के प्रत्येक खंड में एक विशेष रूप से परिभाषित पता होता है। जब किसी प्रोग्राम को असेम्बल किया जाता है तो जंपर्स को अन्य लेबलों में बदल दिया जाता है।
कुछ भी नहीं है कि एक प्रत्यक्ष मानचित्रण निर्देश के कुछ अन्य सेट करने के लिए मैप किया जा सकता है, क्योंकि सभी मशीनें ट्यूरिंग पूर्ण हैं। क्या यह करना बहुत जटिल होगा? क्या मैं किसी ऐसे कारण से काम नहीं करूँगा जिससे मैं अपरिचित हूँ? क्या यह काम करेगा, लेकिन एमुलेटर का उपयोग करने से बेहतर परिणाम नहीं मिलेगा?
आप 100% सही हैं कि यह दोनों संभव है , और बहुत तेज़ होगा । हालांकि, इसे पूरा करने के लिए एक कार्यक्रम लिखना अविश्वसनीय रूप से कठिन और अत्यधिक अनुचित है, अगर ऊपर उल्लिखित मुद्दों को छोड़कर किसी भी चीज के लिए नहीं।
यदि आपके पास वास्तविक असेंबली स्रोत कोड है, तो मशीन कोड को किसी अन्य अनुदेश सेट आर्किटेक्चर में अनुवाद करना तुच्छ होगा। मशीन कोड ही, हालांकि, इकट्ठा किया जाता है , इसलिए विधानसभा स्रोत के बिना (जिसमें मेमोरी एड्रेस की गणना करने के लिए उपयोग किए जाने वाले विभिन्न लेबल होते हैं), यह अविश्वसनीय रूप से मुश्किल हो जाता है। फिर से, एक एकल निर्देश बदलने से पूरे कार्यक्रम में मेमोरी ऑफ़सेट बदल सकते हैं, और पतों को फिर से गणना करने के लिए सैकड़ों पास की आवश्यकता होती है।
कुछ हजार निर्देशों के साथ एक कार्यक्रम के लिए ऐसा करने के लिए दसियों की आवश्यकता होगी यदि सैकड़ों हजारों पास नहीं होंगे। अपेक्षाकृत छोटे कार्यक्रमों के लिए, यह संभव हो सकता है, लेकिन याद रखें कि कार्यक्रम में मशीन निर्देशों की संख्या के साथ पास की संख्या तेजी से बढ़ेगी। एक सभ्य पर्याप्त आकार के किसी भी कार्यक्रम के लिए, यह असंभव के पास है।