2015-10-21 7 views
5

यह कैसे निम्न उदाहरण में विधानसभा अनुदेश MOVSX काम करता है:
ECX = 0000000F
EDX = 0012FD9FMOVSX असेंबली निर्देश कैसे काम करता है?

मैं क्या सोचा से,:

MOVSX ECX,BYTE PTR DS:[EDX]

इस मामले में, यहाँ रजिस्टरों की राज्य कर रहे हैं यह [ईडीएक्स] = 9 एफ के अंतिम बाइट लेता है, इसे ईसीएक्स में ले जाता है और फिर साइन 16 बिट्स = 0000009 एफ से मेल खाता है। हालांकि, वास्तविक परिणाम 00000016 है। क्या कोई यह समझाने में मदद कर सकता है कि मैं कहां गलत हूं?

उत्तर

4

यह आंशिक रूप से सही है। हालांकि:

BYTE PTR DS:[EDX]बाइट प्राप्त करता है जो EDX में दिए गए पते पर स्थित है। इस बाइट को कम से कम महत्वपूर्ण बाइट में ECX पर कॉपी किया गया है और शेष बाइट के संकेत से भरा हुआ है।

अपने अप्रत्याशित परिणाम के लिए, इसका मतलब है कि स्मृति पते पर 0x12FD9F बाइट 0x16 स्थित है।


नोट्स:

  • सेगमेंट अवहेलना उपसर्ग DS: यहाँ आवश्यक नहीं है। [EDX] स्वचालित रूप से DS को संदर्भित करता है।

"स्मृति पता" या तो आभासी या भौतिक स्मृति यहाँ

1

कई इंटेल/AMD x86 निर्देश "modrm" प्रारूप में उपलब्ध हैं को संदर्भित करता है - वे दो ऑपरेंड, है जिनमें से एक एक रजिस्टर होना चाहिए, जिसमें से दूसरा एक रजिस्टर हो सकता है, या एक स्मृति संदर्भ, जिसका पता निर्देश एन्कोडिंग के मॉडर बाइट द्वारा निर्धारित किया जाता है, और संभवतः निर्देश के बाद के बाइट्स द्वारा, जैसे कि सिब (स्केल इंडेक्स बाइट) , और तत्काल निरंतर/स्मृति ऑफ़सेट। और एक संभावित सेगमेंट उपसर्ग बाइट द्वारा भी।

आम तौर पर इन, रेग, पंजीकरण/मेम निर्देश दिए गए हैं प्रपत्र

rsrcdst += rsrc 
or 
    rsrcdst += Memory[ ... addressessing mode ...] 

लेकिन 86 विधानसभा कोड का अलग opcodes/रेग, रेग और रेग, इन निर्देशों का मेम रूपों के लिए अनुदेश स्मृति सहायकों नहीं है। चाहे एक ऑपरेंड एक रजिस्टर या स्मृति स्थान है, असेंबलर में, असेंबली सिंटैक्स द्वारा इंगित किया गया है।

इस मामले में, अपने विधानसभा कोड

MOVSX ECX, बाइट PTR डी एस है: [EDX]

अनुदेश opcode MOVSX है।

गंतव्य ऑपरेंड ईसीएक्स पंजीकृत है।

स्रोत ऑपरेंड "BYTE PTR DS: [EDX]" है। यह एक स्मृति संदर्भ कई चीजों से संकेतित है: (1) "[ईडीएक्स]" के चारों ओर वर्ग ब्रैकेट्स - स्क्वायर ब्रैकेट मेमोरी के लिए एक लघुरूप हैं [...पता ...]। (2) "डीएस:" उपसर्ग, जो इंगित करता है कि यह डेटा सेगमेंट में है। रजिस्टर ऑपरेंड में ऐसा सेगमेंट उपसर्ग नहीं है। (3) "BYTE पीटीआर" - जो कहता है "डीएस: [ईडीएक्स] 'द्वारा निर्दिष्ट स्मृति पता ले लो, और इसे स्मृति में 8-बिट बाइट संदर्भित करने के रूप में व्याख्या करें"।

मुझे लगता है कि क्या आप वास्तव में चाहते हैं

MOVSX ECX,DL 

"DL" 32-बिट का कम 8 बिट रजिस्टर EDX के लिए एक नाम है। अर्थात। डीएल = EDX.bits [7: 0]। दुर्भाग्य से, 86 अस्सेम्ब्लेर्स आमतौर पर डॉन टी की तरह वाक्य रचना स्वीकार "EDX.bits [7: 0]" (जब तक मैं उन्हें लिखा था), आप उप रजिस्टरों की ऐतिहासिक नाम जानना है तो:

AL = EAX.bits[7:0] 
AH = EAX.bits[15:8] 
AX = EAX.bits[15:0] 
EAX = 32 bit register that "covers" all of the above 

और इतने चालू: बीएल, सीएल, डीएल, डीआई, ...

संबंधित मुद्दे