2012-03-20 14 views
9

मैं इस बारे में उलझन में हूं कि गुणा और विभाजित संचालन x86 असेंबली में कैसे काम करते हैं। उदाहरण के लिए, 8-बिट के साथ सौदों के बाद नीचे दिया गया कोड बहुत मुश्किल प्रतीत नहीं होता है।x86 असेंबली गुणा और निर्देश निर्देशों को विभाजित करें, 16-बिट और उच्च

कि 8-बिट गुणा:

; User Input: 
; [num1], 20 
; [num2] , 15 

mov ax, [num1] ; moves the 8 bits into AL 
mov bx, [num2] ; moves the 8 bits into BL 

mul bl   ; product stored in AX 

print ax 

लेकिन क्या होता है जब आप दो 16-बिट संख्याओं को गुणा करना चाहते हैं? कैसे 8 बिट संख्याओं के साथ दो 16 बिट संख्याओं को एक साथ बढ़ाया जाएगा?

मैं उलझन में हूं कि मूल्यों को किस रजिस्टर्ड में संग्रहीत किया जाएगा। क्या उन्हें AL और AH में संग्रहीत किया जाएगा या यह केवल 16-बिट संख्या को AX में संग्रहीत करेगा। दिखाने के लिए मैं क्या मतलब है:

; User Input: 
; [num1], 20 
; [num2], 15 

mov eax, [num1] ; Does this store the 16-bit number in AL and AH or just in AX 
mov ebx, [num2] ; Does this store the 16-bit number in BL and BH or just in BX 

mul ???   ; this register relies on where the 16-bit numbers are stored 

print eax 

किसी पर थोड़ा विस्तार से बता सकता है कि कैसे गुणा और विभाजित काम करता है? (विशेष रूप से 16-बिट और 32-बिट संख्या के साथ? मैं बिट्स को घुमाने के लिए अगर मान कम अल में एएच संग्रहित कर रहे हैं और एक बस mov num1 और num2ax और bx में क्रमशः की जरूरत होगी?

या कर सकते हैं और फिर उन्हें गुणा eax में उत्पाद प्राप्त करने के लिए

+2

आप पढ़ कोशिश की [Documenta tion] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

उत्तर

14

documentation पर एक नज़र से पता चलता MUL के लिए 4 संभव संकार्य आकार क्यों हैं इनपुट और आउटपुट एक आसान तालिका में संक्षेप हैं:?।

------------------------------------------------------ 
| Operand Size | Source 1 | Source 2 | Destination | 
------------------------------------------------------ 
| Byte   | AL  | r/m8  | AX   | 
| Word   | AX  | r/m16  | DX:AX  | 
| Doubleword | EAX  | r/m32  | EDX:EAX  | 
| Quadword  | RAX  | r/m64  | RDX:RAX  | 
------------------------------------------------------ 
+0

मैंने उस पर ध्यान दिया, और यह पता था कि 'mul' के बाद मूल्य कहाँ संग्रहीत किया जाता है। मैं सोच रहा हूं कि, जब मैं 'eax' (' mul' से पहले) में मान संग्रहीत करता हूं, तो यह उच्च बिट्स (एएक्स) की बजाय इसे निम्न बिट्स (एएल और एएच) में संग्रहीत करता है। अगर यह उन्हें कम बिट्स में स्टोर करता है, तो क्या मैं उन्हें एएक्स में घुमाने में सक्षम हूं और फिर केवल एएक्स और बीएक्स को गुणा कर सकता हूं और जवाब प्रिंट कर सकता हूं (मुझे विश्वास है कि यह ईएक्स में होगा)? – StartingGroovy

+0

यदि आप 'eax' में कोई मान संग्रहीत करते हैं तो यह * eax' के सभी * में है। मुझे यकीन नहीं कि मैं समझा हूँ। मुझे लगता है कि आप भ्रमित हो सकते हैं कि 'ईएक्स' के कौन से हिस्से' आह ',' अल 'और' कुल्हाड़ी 'भी हैं। आप चार्ट को उसी दस्तावेज़ के वॉल्यूम 1 में देख सकते हैं। विशेष रूप से, 'कुल्हाड़ी' उसी 16 बिट्स को 'आह: अल' के रूप में संदर्भित करता है, न कि "ऊपरी" 16-बिट्स 'ईएक्स''। –

+0

आह आप सही हैं, यही वह है जो मैं उलझन में था। तो अनिवार्य रूप से मैं क्या करना चाहता हूं 'बीएक्स' द्वारा' एक्स 'गुणा करें और मेरा उत्पाद 'ईएक्स' में होना चाहिए? – StartingGroovy

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