2013-02-19 32 views
8

उदाहरण के लिए, एक हेक्स दिया: 83 E4 F0x86 केवल हेक्स मशीन कोड दिए गए निर्देश के संचालन आकार का पता लगाएं?

इंटेल डेवलपर मैनुअल को देख कर, मैं पता लगा सकते हैं कि इसका मतलब है 83and और FO-16 का मतलब है। E4 पर देखकर, मैं डीकोड कर सकता हूं कि स्रोत/गंतव्य रजिस्टर या तो एसपी या ईएसपी है।

इसलिए, मैं निष्कर्ष निकाल सकता हूं कि हेक्स का मतलब and $-16, %ESP या and $-16, %SP है। हालांकि, मैनुअल में, उन दोनों को 83 /4 ib के रूप में सूचीबद्ध किया गया है।

मैं उन दोनों के बीच अंतर कैसे कर सकता हूं?

+2

यह निर्भर करता है। यदि वास्तविक मोड में या यदि मौजूदा सेगमेंट/चयनकर्ता का डिफ़ॉल्ट ऑपरेंड आकार 16 बिट पर सेट किया गया है, तो इसे 'और sp, -16' के रूप में निष्पादित किया जाएगा। "आम तौर पर" यह 32 बिट संस्करण होगा। – harold

उत्तर

7

जैसा कि हैरोल्ड कहते हैं, डिफ़ॉल्ट ऑपरेंड आकार निर्देश में एन्कोड नहीं किया गया है लेकिन वर्तमान प्रोसेसर मोड पर निर्भर करता है।

वास्तविक मोड और 16-बिट संरक्षित मोड में, डिफ़ॉल्ट ऑपरेंड आकार 16-बिट है, इसलिए 83 E4 F0 डीकोड and $-16, %sp पर।

32-बिट मोड ऑपरेंड आकार 32-बिट पर डिफ़ॉल्ट है, तो यह and $-16, %esp है।

x64 मोड में, अधिकांश निर्देश 32-बिट ऑपरेंड आकार (शाखाओं को छोड़कर और अप्रत्यक्ष रूप से ढेर, पॉप, कॉल और रिटर्न जैसे स्टैक का उपयोग करते हैं) को डिफ़ॉल्ट रूप से डिफ़ॉल्ट करते हैं, इसलिए यह फिर से and $-16, %esp पर डीकोड करता है।

उपसर्ग का उपयोग कर डिफ़ॉल्ट ऑपरेंड आकार को ओवरराइड करना संभव है। उदाहरण के लिए, 32-बिट और 16-बिट ऑपरेंड आकार के बीच 66h स्विच स्विच करता है, इसलिए 32-बिट या 64-बिट मोड में 66 83 E4 F0 डीकोड्स and $-16, %esp और and $-16, %sp में। 64-बिट ऑपरेंड आकार प्राप्त करने के लिए, आपको डब्ल्यू बिट सेट के साथ REX prefix का उपयोग करने की आवश्यकता है, इसलिए 48 83 E4 F0 डिकोड and $-16, %rsp (लेकिन केवल 64-बिट मोड में!)।

+0

क्या कोई तरीका है कि मैं जानता हूं कि प्रोसेसर किस मोड में काम कर रहा है? – Hery

+2

अधिक संदर्भ के बिना नहीं। बाइट कहां से आते हैं? याद? फ़ाइल? एक धोया हुआ बोतल में मिला? एक सपने में आप के लिए आया था? –

+0

हेक्स स्ट्रिंग एक फ़ाइल से है, लेकिन ASCII स्ट्रिंग के रूप में एन्कोड किया गया है (यह पूरी बात एक कोर्स प्रोजेक्ट है, इसलिए सरल प्रारूप)। क्या ऐसे रजिस्टर की तरह कुछ है जो प्रोसेसर के ऑपरेटिंग मोड को स्टोर करता है? – Hery

0

संरक्षित मोड के तहत, यह केवल 32 बिट संस्करण हो सकता है, दोनों 16 और 64 बिट संस्करणों को प्रीफ़िक्स्ड आकार ओवरराइड बाइट की आवश्यकता होती है, इस मामले में 16 बिट संस्करण को 0x66 उपसर्ग ओवरराइड की आवश्यकता होती है, इसलिए आपको 66:83 E4 F0 मिलता है। इंटेल स्पष्ट रूप से वर्णन करता है और

64-बिट मोड में, निर्देश का डिफ़ॉल्ट ऑपरेशन आकार 32 बिट्स है।

और 066H के लिए संदर्भ, अध्याय 2.2.1:

संकार्य आकार ओवरराइड उपसर्ग एक कार्यक्रम 16- और 32-बिट के बीच संकार्य आकार स्विच करने के लिए अनुमति देता है। या तो आकार डिफ़ॉल्ट हो सकता है; उपसर्ग का उपयोग गैर-डिफ़ॉल्ट आकार का चयन करता है।

+0

मैं डाउनवॉटर नहीं हूं लेकिन आपका जवाब हैरोल्ड की टिप्पणी के साथ थोड़े विरोधाभासी है ... – Hery

+0

@Hery: 32 बिट या 64 बिट संरक्षित मोड में hes hes (जो "मानक" है, पर विचार करते हुए hes ने इसके विपरीत कुछ भी नहीं बताया), एकमात्र तरीका उत्पन्न 16 या 64 बिट संस्करण ओवरराइड उपसर्ग के माध्यम से है। यह वास्तव में हैरॉल्ड का विरोध नहीं करता है, इसकी संरक्षित मोड की परिभाषा (जब तक वह 16 बिट CPU का उपयोग नहीं करता है, जो लगभग 30 वर्ष पुराना है ....)। – Necrolis

+1

असल में, 16-बिट संरक्षित मोड भी मौजूद है, 286 में पेश किया गया। –