प्रश्न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" पर निष्पादित निष्पादन योग्य कुछ भी दिलचस्प नहीं होगा, लेकिन यह बात नहीं है। कक्षा Compare
CMP
निर्देश के आसपास एक रैपर है।
उपरोक्त कोड का उत्पादन (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 का उपयोग यह भी क्यों मौजूद है।
ये 1-बिट डिग्री आजादी भी "फोन घर" के लिए कंपाइलर्स के लिए एक गुप्त चैनल प्रदान करती है - वे जो बाइनरी उत्पन्न करते हैं, वे "वॉटरमार्क" कर सकते हैं, और संकलक विक्रेता आपको यह बताने के लिए कह सकता है कि क्या वे आपके सॉफ़्टवेयर को अपने वॉटरमार्क के साथ ढूंढते हैं, लेकिन फ़ाइल पर कोई लाइसेंस नहीं है। –