2010-05-03 14 views
12

प्रश्न86 सीएमपी निर्देश अंतर

(गैर तुच्छ) के बाद दो x86 निर्देश के बीच क्या अंतर है?

39 /r CMP r/m32,r32 Compare r32 with r/m32 
3B /r CMP r32,r/m32 Compare r/m32 with r32 

पृष्ठभूमि

मैं एक जावा कोडांतरक है, जो मेरी संकलक के मध्यवर्ती भाषा द्वारा उपयोग किया जाएगा Windows-32 निष्पादनयोग्य का निर्माण करने के निर्माण कर रहा हूँ।

वर्तमान में मैं निम्नलिखित कोड है:

final ModelBase mb = new ModelBase(); // create new memory model 
mb.addCode(new Compare(Register.ECX, Register.EAX)); // add code 
mb.addCode(new Compare(Register.EAX, Register.ECX)); // add code 

final FileOutputStream fos = new FileOutputStream(new File("test.exe")); 
mb.writeToFile(fos); 
fos.close(); 

उत्पादन करने के लिए एक वैध निष्पादन योग्य फ़ाइल है, जो एक पाठ-खंड में दो सीएमपी अनुदेश शामिल हैं। "Text.exe" पर निष्पादित निष्पादन योग्य कुछ भी दिलचस्प नहीं होगा, लेकिन यह बात नहीं है। कक्षा CompareCMP निर्देश के आसपास एक रैपर है।

उपरोक्त कोड का उत्पादन (OllyDbg साथ निरीक्षण):

Address Hex dump     Command 
0040101F |. 3BC8     CMP ECX,EAX 
00401021 |. 3BC1     CMP EAX,ECX 

अंतर सूक्ष्म है:

Address Hex dump     Command 
0040101F |. 39C1     CMP ECX,EAX 
00401021 |. 39C8     CMP EAX,ECX 

कौन सा मुझे अपने synonymity और के बारे में चिंता करता है: अगर मैं 39 बाइट-opcode का उपयोग यह भी क्यों मौजूद है।

उत्तर

18

इससे कोई फर्क नहीं पड़ता कि आप दो रजिस्टरों की तुलना करते हैं तो आप किस ऑपोड का उपयोग करते हैं। एकमात्र अंतर यह है कि एक मेमोरी ऑपरेंड के साथ एक रजिस्टर की तुलना करते समय, जैसा कि ओपोड इस्तेमाल करता है निर्धारित करता है कि किस से घटाया जाएगा।

यह क्यों मौजूद है: x86 निर्देश प्रारूप किसी स्मृति पते या रजिस्टर को इंगित करने के लिए ModR/M बाइट का उपयोग करता है। प्रत्येक निर्देश में केवल एक मॉडआर/एम मान हो सकता है, जिसका अर्थ है कि यह केवल एक मेमोरी पता तक पहुंच सकता है (एमओवीएसबी जैसे विशेष निर्देशों सहित)। तो इसका मतलब है कि सामान्य cmp r/m32, r/m32 निर्देश नहीं हो सकता है, और हमें दो अलग-अलग ऑपकोड की आवश्यकता है: cmp r/m32, r32 और cmp r32, r/m32। एक दुष्प्रभाव के रूप में, यह दो रजिस्टरों की तुलना करते समय कुछ अनावश्यकता पैदा करता है।

+7

ये 1-बिट डिग्री आजादी भी "फोन घर" के लिए कंपाइलर्स के लिए एक गुप्त चैनल प्रदान करती है - वे जो बाइनरी उत्पन्न करते हैं, वे "वॉटरमार्क" कर सकते हैं, और संकलक विक्रेता आपको यह बताने के लिए कह सकता है कि क्या वे आपके सॉफ़्टवेयर को अपने वॉटरमार्क के साथ ढूंढते हैं, लेकिन फ़ाइल पर कोई लाइसेंस नहीं है। –

2

सीएमपी ईसीएक्स, ईएक्स ईसीएक्स-ईएक्स और सीएमपी ईएक्स है, ईसीएक्स ईएक्स-ईसीएक्स है। झंडे अलग-अलग सेट होते हैं, इस पर निर्भर करता है कि किस ऑपरेंड की तुलना की जाती है। बेशक आप शायद उनमें से केवल एक के साथ दूर हो सकते हैं अगर यह x86 निर्देशों के mod/r-m संरचना के लिए नहीं थे।

+1

मुद्दा यह है कि आप 'सीएमपी आर/मीटर, आर के लिए एक अलग opcode है क्योंकि वहाँ दो अलग अलग तरीकों से एक ही स्मरक सांकेतिक शब्दों में बदलना कर सकते हैं उपयोग करने के लिए" .s "संलग्न कर सकते हैं 'और' सीएमपी आर, आर/एम'। सवाल यह है कि यदि एमओडी/आरएम में ऑपरेंड मेमोरी ऑपरेंड हो सकता है तो src1 या src2 है, और यह ऑपोड पर निर्भर करता है। –

3

यह redundancy of x86 है। इस तरह के कई मामले हैं। एक कंपाइलर/असेंबलर किसी वैध ओपोड्स का उपयोग करने के लिए स्वतंत्र है

कुछ असेंबलर आपको यह चुनने की अनुमति देता है कि कौन से ऑपोड को उत्सर्जित किया जाए। गैस पर उदाहरण के लिए यदि आप अन्य अनुदेश एन्कोडिंग

10 de adcb %bl,%dh 
12 f3 adcb.s %bl,%dh 
संबंधित मुद्दे