2013-12-10 6 views
6

मैं डॉसबॉक्स एमुलेटर का उपयोग कर x86 के लिए असेंबली सीख रहा हूं। मैं गुणा करने की कोशिश कर रहा हूँ। मुझे नहीं लगता कि यह कैसे काम करता है। जब मैं निम्नलिखित कोड लिखता हूं:क्या x86 असेंबली में mul के साथ तत्काल गुणा करना संभव है?

mov al, 3 
mul 2 

मुझे एक त्रुटि मिलती है। हालांकि, संदर्भ मैं उपयोग कर रहा हूँ, यह गुणन में कहते हैं, यह मान लिया गया कुल्हाड़ी हमेशा जगह धारक है, इसलिए, अगर मैं लिखना:

mul, 2 

यह 2. द्वारा al मूल्य गुणा लेकिन यह मेरे साथ काम नहीं करता है ।

जब मैं निम्न प्रयास करें:

mov al, 3 
mul al,2 
int 3 

मैं कुल्हाड़ी में परिणाम 9 मिलता है। स्पष्टीकरण के लिए यह तस्वीर देखें: enter image description here

एक और प्रश्न: क्या मैं सीधे स्मृति स्थान का उपयोग कर गुणा कर सकता हूं? उदाहरण:

mov si,100 
mul [si],5 

उत्तर

11

कि एक तत्काल संकार्य स्वीकार करता MUL का कोई रूप नहीं है।

या तो कार्य करें:

mov al,3 
mov bl,2 
mul bl  ; the product is in ax 

या:

mov ax,3 
imul ax,2 ; imul is for signed multiplication, but that doesn't matter here 
      ; the product is in ax 

या:

mov al,3 
add al,al ; same thing as multiplying by 2 

या:

mov al,3 
shl al,1 ; same thing as multiplying by 2 
+1

आपके दूसरे कोड स्निपेट में टिप्पणी गलत है। 'Imul ax के बाद, 2' उत्पाद एएक्स में है (डीएक्स: एएक्स में नहीं)। –

+1

यह भी ध्यान दें कि 'imul'- तत्काल एक 3-ऑपरेंड निर्देश है। तो आप इसे गैर-विनाशकारी रूप से उपयोग कर सकते हैं, जैसे 'imul cx, si, 1234'।यानी जब डीएसटी =: अधिकांश अस्सेम्ब्लेर्स आप लिखते हैं 'imul cx, 1234'' imul cx, cx, 1234', 'vaddps ymm0, ymm1' बजाय' vaddps ymm0, ymm0, ymm1' लिखने के समान के लिए एक छोटी हाथ के रूप में करते हैं src1। –

2

इंटेल मैनुअल

Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015 अनुभाग "एमयूएल - अहस्ताक्षरित गुणा" कॉलम Instruction केवल शामिल हैं:

MUL r/m8 
MUL r/m8* 
MUL r/m16 
MUL r/m32 
MUL r/m64 

r/mXX साधन रजिस्टर या स्मृति: तो immediates (immXX) mul 2 तरह से किसी में अनुमति नहीं है रूप: प्रोसेसर बस उस ऑपरेशन का समर्थन नहीं करता है।

यह भी दूसरे सवाल का जवाब: यह स्मृति से गुणा करना संभव है:

x: dd 0x12341234 
mov eax, 2 
mul dword [x] 
; eax == 0x24682468 

और यह भी पता चलता है कि क्यों mul al,2 तरह बातें काम नहीं करेगा: वहाँ कोई रूप है कि दो तर्क लेता है।

हालांकि माइकल ने उल्लेख किया है, imul कि mul नहीं है IMUL r32, r/m32, imm32 की तरह तत्काल रूपों और कई अन्य लोगों के है।

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