2010-09-29 22 views
10

मैं रन-टाइम डीबगर का उपयोग कर रहा हूं।imul असेंबली निर्देश - एक ऑपरेंड?

EAX: 0000 0023 EDX: 5555 5556

imul edx 

EAX: aaaa aac2 EDX: 0000 000b

मैं पूरी तरह से उलझन में हूँ, और कैसे इस गुणा काम कर रहा है पता नहीं कर सकते हैं। यहाँ क्या हो रहा है? मैं एक ऐसी ही question here कि imul ebx ; result in EDX:EAX में नोटिस मैं EDX समझ में नहीं आता: EAX अंकन हालांकि:/

उत्तर

21

जब imul में से एक-संकार्य प्रपत्र एक 32 बिट तर्क पारित हो जाता है (EDX के साथ अपने मामले में) यह प्रभावी रूप से इसका मतलब है EAX * EDX जहां EAX और EDX दोनों 32 बिट रजिस्ट्रार हैं।

दो 32 बिट मानों का उत्पाद 32 बिट्स में आवश्यक नहीं है: पूर्ण गुणा परिणाम 64 बिट तक ले सकता है। उत्तर के उच्च 32 बिट EDX रजिस्टर और EAX रजिस्टर में कम 32 बिट्स पर लिखे जाएंगे; यह EDX:EAX नोटेशन के साथ दर्शाया गया है।


आप केवल परिणाम की कम 32 बिट चाहते हैं, imul की 2-संकार्य प्रपत्र का उपयोग करते हैं; यह तेजी से चलता है और इसमें कोई अंतर्निहित ऑपरेशन नहीं होता है (इसलिए आप जो भी रजिस्टरों का सबसे सुविधाजनक उपयोग कर सकते हैं)। जैसे आपकी अपेक्षा से कम

imul ecx, esiecx *= esi करता है, EAX या EDX बिना छुए। यह सी की तरह है जहां unsigned x=...;x *= y; इनपुट के रूप में परिणाम के लिए समान चौड़ाई है।

imul का एक तत्काल रूप भी है: imul ecx, ebx, 1234ecx = ebx * 1234 करता है। कई असेंबलर imul ecx, 1234 को imul ecx, ecx, 1234 के लिए संक्षिप्त हाथ के रूप में स्वीकार करेंगे। ठीक प्रकार से हस्ताक्षरित या अहस्ताक्षरित के लिए imul काम के


ये 32x32 => 32-बिट रूपों; एक-ऑपरेंड mul और imul के परिणाम केवल ऊपरी आधे (EDX में) में भिन्न होते हैं, न कि EAX आउटपुट।

Intel's instruction reference manual entry for imul देखें।

+0

क्या होता है जब 'imul' को दिया गया रजिस्टर 'eax' है? क्या यह अभी भी वही काम करता है? क्या होगा यदि आप इसे 'eax' या 'edx' के अलावा कुछ और दें, उदाहरण के लिए' eax' '? –

+2

इमुल निर्देश के कई रूप हैं। एक ऐसा 32 बिट तर्क (स्मृति या पंजीकरण) लेता है जो फॉर्म हमेशा EDX: EAX जोड़ी में परिणाम देता है। –

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