2012-11-11 19 views
5

मैं x86/x64 CPU निर्देशों के लिए एक कंपाइलर लिख रहा हूं और मुझे यह पता लगाना प्रतीत नहीं होता कि लोगों का 'विस्थापन' पता क्या है। उदाहरण के लिए जोड़ें निर्देश यहां विस्तृत किया गया है: http://www.c-jump.com/CIS77/CPU/x86/X77_0150_encoding_add_edx_displacement.htmx86/x64 विस्थापन एड्रेसिंग

मैं केवल उस एड निर्देश को लागू करने की कोशिश कर रहा हूं जहां एक सामान्य स्मृति पते में एक रजिस्टर जोड़ा जाता है। समस्या यह है कि पता एक 'विस्थापन पता' है। क्या इसका मतलब यह है कि पता एक हस्ताक्षरित मान है जो निर्देश स्थान से ऑफसेट है?

+3

क्या आप असेंबली कोड उत्पन्न कर रहे हैं? क्या आप सी कोड उत्पन्न नहीं कर सकते हैं, या एलएलवीएम का उपयोग नहीं कर सकते? या http://code.google.com/p/asmjit/ या अन्य पुस्तकालयों के साथ मशीन कोड उत्सर्जित करें? क्या आप x86/64 निर्देश सेट को अच्छी तरह से समझते हैं? क्या आपने http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html –

उत्तर

9

वहाँ 86 में अप्रत्यक्ष ऑपरेंड के कुछ अलग प्रकार हैं:

  1. [reg]
  2. [reg + विस्थापन]
  3. [विस्थापन]
  4. [reg * निरंतर + reg ]
  5. [reg * निरंतर + reg + विस्थापन]

"विस्थापन" केवल एक स्थिर है जो शेष पते में जोड़ा जाता है। ऐसे मामलों में जहां निरंतर के अलावा पते का कोई घटक नहीं है, इसे अभी भी "विस्थापन" कहा जाता है।यह मुख्य रूप से अन्य एड्रेसिंग फॉर्मों के साथ स्थिरता के लिए है।

एक और तरीका है इस पर गौर करने के लिए है कि सभी पते के रूप में हैं

[reg * निरंतर + reg + विस्थापन]

घटकों 0.

के एक मूल्य के लिए अनुमति देता में से प्रत्येक के साथ [विस्थापन] फ़ॉर्म केवल एन्कोडिंग है जहां विस्थापन के अलावा सभी घटक शून्य हैं।

एक कंपाइलर लेखक के रूप में अंतिम 2 रूप विशेष रूप से दिलचस्प हैं। वे एक ही निर्देश में pArray[index]->field + 1 जैसी चीज़ों को एन्कोड करना आसान बनाते हैं।

+0

काम करेगा ठीक है तो कैसे [reg * निरंतर + reg + विस्थापन] मशीन निर्देश में एन्कोड किया जाता है? मान लें कि मेरे पास स्मृति स्थान 0x00000001 पर एक सरणी है और मैं इसके सूचकांक तक पहुंच बनाना चाहता हूं जो AL है। मुझे लगता है कि मैं चाल निर्देश का उपयोग करना चाहता हूं और एमओवी एएच 0x00000001 [AL] करना चाहता हूं। मुझे लगता है कि यह सिर्फ [reg + विस्थापन] है। इस पृष्ठ की धारा 6 आर/एम बाइट एन्कोडिंग दिखाती है लेकिन यह वास्तव में भ्रमित है: http://www.c-jump.com/CIS77/CPU/x86/lecture.html –

+0

इंटेल मैनुअल के वॉल्यूम 2 ​​पर एक नज़र डालें। प्रत्येक निर्देश अपने एन्कोडिंग रूपों को निर्दिष्ट करता है। एन्कोडिंग फॉर्म जो आर/एम ऑपरेंड सूचीबद्ध करते हैं, वे मोड/आरएम बाइट में रजिस्टर या मेमोरी ऑपरेंड स्वीकार करते हैं। –

+0

इंटेल मैनुअल के वॉल्यूम 2 ​​पर एक नज़र डालें। प्रत्येक निर्देश अपने एन्कोडिंग रूपों को निर्दिष्ट करता है। एन्कोडिंग फॉर्म जो आर/एम ऑपरेंड सूचीबद्ध करते हैं, वे मोड/आरएम बाइट में रजिस्टर या मेमोरी ऑपरेंड स्वीकार करते हैं। वॉल्यूम 2 ​​के अध्याय 2 में, खंड 2.1 में एक सारणी है जो mod r/m बाइट का अर्थ दिखाती है। जिन रूपों में [-] [-] सूचीबद्ध है, वे एसआईबी बाइट का उपयोग करने वाले एन्कोडिंग को दर्शाते हैं। एसआईबी एड्रेसिंग फॉर्म रेग * निरंतर + रेग का है। मॉड/आरएम बाइट के कुछ रूपों से संकेत मिलता है कि एसआईबी बाइट एक विस्थापन के बाद होता है। वे reg * निरंतर + reg + निरंतर रूप देता है। एसआईबी समझाते हुए एक टेबल भी है। –

3

कोई "विशेष ऐड जो विस्थापन लेता है" नहीं है, यह पृष्ठ अनावश्यक रूप से भ्रमित हो रहा है - यह सामान्य मेमोरी ऑपरेंड एन्कोडिंग का हिस्सा है। , al गंतव्य के रूप में और स्रोत (04 ib) के रूप में एक तत्काल का उपयोग कर ax/eax/rax गंतव्य के रूप में उपयोग करते हुए और के लिए एक विशेष मामला है:

add एक काफी मानक अनुदेश कि सभी ALU-ऑप्स की तरह ही एन्कोड किया गया है कर रहे हैं स्रोत के रूप में तत्काल (+ 05 imm), add r/m, imm के तीन संस्करण (8 बिट गंतव्यों के लिए एक, व्यापक स्थलों के लिए एक और एक साइन-विस्तारित 8 बिट स्रोत, व्यापक गंतव्यों और व्यापक स्रोत के लिए एक), और निश्चित रूप से add r, r/m और add r/m, r

यह add r, r/m का एक विशेष मामला है, जहां r/m विस्थापन का रूप लेता है: ModRM encoding का नोट # 1 देखें।

तो उनका मतलब सिर्फ add edx, [sdword] है। (लेकिन उन्होंने रेग फील्ड को गलत तरीके से गलत किया, edx010 से संबंधित नहीं है, 011 नहीं)

+0

का अध्ययन किया था ताकि स्मृति स्थान 0x00000000 पर AL (8 बिट रजिस्टर 0) कहें, सीपीयू 00x 00000000 स्वीकार करेगा (हेक्स में)? –

+0

@RyanBrown हाँ, यह – harold

4

वह पृष्ठ सटीक नहीं है। "जो विस्थापन लेता है" जो कि इसके बारे में बात कर रहा है, add r[16|32], r/m[16|32] या add edx, [0xdisp] को संदर्भित करता है क्योंकि आप इसे डिस्सेबलर के आउटपुट में देख सकते हैं। मान लिया जाये कि यह, opcode 0x03 साथ जोड़ें अनुदेश के बारे में बात कर रहा है

  • edx रजिस्टर गंतव्य एन्कोडिंग और ModR/एम बाइट में प्रभावी पता यह 0x15 का मूल्य देना होगा के रूप में एक 32-बिट विस्थापन को निर्दिष्ट (इंटेल का उल्लेख ® 64 और आईए -32 आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल वॉल्यूम 2, पृष्ठ 41, तालिका 2-2)।
  • इस निर्देश का प्रभाव स्मृति पते disp पर edx की सामग्री में जोड़ें।
  • निर्देश के वास्तविक एन्कोडिंग इस प्रकार होगा: \x03\x15\x00\x00\x00\x01, 1 बाइट के विस्थापन के लिए।
संबंधित मुद्दे