स्कूल में हम एक ऑपरेटिंग सिस्टम के बिना स्टैंड-अलोन प्रोग्राम चलाने के लिए बूटस्ट्रैप प्रोग्राम का उपयोग कर रहे हैं। मैं इस कार्यक्रम का अध्ययन कर रहा हूं और जब संरक्षित मोड सक्षम है, तो कार्यक्रम के भीतर डेटा के रूप में सीधे ऑपोड और ऑपरेंड को इकट्ठा करके निष्पादित एक बहुत ही कूद है। यह जीएनयू कोडांतरक के लिए किया गया था:क्या कोई इसे सीधे एकत्रित x86 जेएमपी ऑपोड समझा सकता है?
सभी की
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
सबसे पहले, क्यों एक (अनुदेश स्मरक के बजाय) ऐसा करना चाहते हैं?
मैं इंटेल मैनुअल देख रहा हूं, लेकिन अभी भी कोड द्वारा थोड़ा उलझन में हूं। विशेष रूप से वॉल्यूम 2 ए, पेज 3-549 में, ऑपकोड की एक तालिका है। प्रासंगिक प्रविष्टि:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in operand
वास्तविक ओपोड स्पष्ट है, लेकिन पहला बाइट, 0x66, मुझे उलझन में डाल दिया है। इंटेल मैनुअल में टेबल का जिक्र करते हुए, सीपी का स्पष्ट रूप से मतलब है कि एक 6 बाइट ऑपरेंड का पालन करेगा। और स्पष्ट रूप से अगले दो पंक्तियों में 6 बाइट्स का पालन करें। 0x66 एन्कोड करता है 'ऑपरेंड-साइज ओवरराइड उपसर्ग'। तालिका में सीपी के साथ इसका क्या संबंध है? मैं उम्मीद कर रहा था कि सीपी के लिए कुछ हेक्स वैल्यू हो, लेकिन इसके बजाय यह ओवरराइड उपसर्ग है। क्या कोई इसे मेरे लिए साफ़ कर सकता है?
यहाँ आयुध डिपो से एक डंप है:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS 0x00010000 के रूप में परिभाषित किया गया था।
मैं पिछले दो बाइट्स के महत्व से थोड़ा उलझन में हूं। हालांकि, यह एक और सवाल पूरी तरह से प्रतीत होता है। यह काफी देर हो रही है, और मैं घंटों के लिए कोड और इंटेल मैनुअल पर घूर रहा हूं, इसलिए मुझे उम्मीद है कि मुझे अपना अंक मिल जाएगा।
देखने के लिए धन्यवाद!
लोग 2 कारणों से ऑपकोड (निर्देशों के बजाए) का उपयोग करते हैं।पहला कारण यह है कि जब असेंबलर "पर्याप्त से कम" होता है और उसे आवश्यक निर्देश के लिए समर्थन प्रदान नहीं करता है (यह तब होता है जब नए निर्देश जोड़े जाते हैं और पुराने असेंबलर अभी तक उनका समर्थन नहीं करते हैं)। दूसरा कारण यह है कि जब असेंबलर निर्देश की सहायता करता है तो उन्हें आवश्यकता होती है लेकिन प्रोग्रामर यह नहीं जानता कि इसे उत्पन्न करने के लिए असेंबलर को कैसे मनाने के लिए। असल में, यह या तो खराब उपकरण है (पुराने उपकरण, भ्रमित वाक्यविन्यास और/या खराब दस्तावेज सहित) या खराब प्रोग्रामर। – Brendan
नोट: ऊपर मेरी टिप्पणी "सामान्य रूप से" है और सभी असेंबलरों पर लागू होती है। मैं जीएएस का उपयोग नहीं करता, और मुझे कोई जानकारी नहीं है कि यह "16-बिट कोड में 32-बिट दूर कूद" निर्देश का समर्थन करता है या नहीं (या दस्तावेज कितना अच्छा/बुरा है)। – Brendan