जब imul
में से एक-संकार्य प्रपत्र एक 32 बिट तर्क पारित हो जाता है (EDX
के साथ अपने मामले में) यह प्रभावी रूप से इसका मतलब है EAX * EDX
जहां EAX
और EDX
दोनों 32 बिट रजिस्ट्रार हैं।
दो 32 बिट मानों का उत्पाद 32 बिट्स में आवश्यक नहीं है: पूर्ण गुणा परिणाम 64 बिट तक ले सकता है। उत्तर के उच्च 32 बिट EDX
रजिस्टर और EAX
रजिस्टर में कम 32 बिट्स पर लिखे जाएंगे; यह EDX:EAX
नोटेशन के साथ दर्शाया गया है।
आप केवल परिणाम की कम 32 बिट चाहते हैं, imul
की 2-संकार्य प्रपत्र का उपयोग करते हैं; यह तेजी से चलता है और इसमें कोई अंतर्निहित ऑपरेशन नहीं होता है (इसलिए आप जो भी रजिस्टरों का सबसे सुविधाजनक उपयोग कर सकते हैं)। जैसे आपकी अपेक्षा से कम
imul ecx, esi
ecx *= esi
करता है, EAX
या EDX
बिना छुए। यह सी की तरह है जहां unsigned x=...;
x *= y;
इनपुट के रूप में परिणाम के लिए समान चौड़ाई है।
imul
का एक तत्काल रूप भी है: imul ecx, ebx, 1234
ecx = ebx * 1234
करता है। कई असेंबलर imul ecx, 1234
को imul ecx, ecx, 1234
के लिए संक्षिप्त हाथ के रूप में स्वीकार करेंगे। ठीक प्रकार से हस्ताक्षरित या अहस्ताक्षरित के लिए imul
काम के
ये 32x32 => 32-बिट रूपों; एक-ऑपरेंड mul
और imul
के परिणाम केवल ऊपरी आधे (EDX
में) में भिन्न होते हैं, न कि EAX
आउटपुट।
Intel's instruction reference manual entry for imul
देखें।
स्रोत
2010-09-29 04:41:35
क्या होता है जब 'imul' को दिया गया रजिस्टर 'eax' है? क्या यह अभी भी वही काम करता है? क्या होगा यदि आप इसे 'eax' या 'edx' के अलावा कुछ और दें, उदाहरण के लिए' eax' '? –
इमुल निर्देश के कई रूप हैं। एक ऐसा 32 बिट तर्क (स्मृति या पंजीकरण) लेता है जो फॉर्म हमेशा EDX: EAX जोड़ी में परिणाम देता है। –