2012-03-20 8 views
9

Sono piuttosto confuso su come le operazioni di moltiplicazione e divisione funzionano nell'assemblaggio x86. Ad esempio, il codice sottostante non sembra troppo difficile dal momento che si occupa di 8 bit.l'assembly x86 si moltiplica e divide gli operandi dell'istruzione, 16-bit e superiore

8-Bit Moltiplicazione:

; 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 

Ma cosa succede quando si vuole moltiplicare due numeri a 16 bit? Come si possono moltiplicare due numeri a 16 bit nello stesso modo in cui è stato fatto con i numeri a 8 bit?

Sono confuso su cosa registri i valori in cui verrebbero memorizzati. Verranno memorizzati in AL e AH oppure memorizzerà semplicemente il numero a 16 bit in AX. Per mostrare cosa intendo:

; 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 

Qualcuno potrebbe elaborare un po 'su come il moltiplicatore e opere di divisione? (In particolare con i numeri 16 bit e 32 bit? Dovrei ruotare bit se i valori sono memorizzati nella inferiore AL e AH?

o si può semplicemente mov num1 e num2 in ax e bx rispettivamente e quindi le moltiplica per ottenere il prodotto in eax

+2

avete provato a leggere il [documenta zione] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

risposta

14

un rapido sguardo alla documentation mostra che ci sono 4 possibili dimensioni operandi per MUL Gli ingressi e le uscite sono riassunti in una tabella a portata di mano:?.

------------------------------------------------------ 
| 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

L'ho guardato ed ero consapevole di dove il valore è stato memorizzato dopo il 'mul'. Mi chiedo se, quando memorizzo il valore in 'eax' (prima di' mul'), se lo memorizza nei bit inferiori (AL e AH) piuttosto che nei bit più alti (AX). Se li memorizza nei bit inferiori, sono in grado di ruotarli su AXe quindi solo moltiplicare AX e BX e stampare la risposta (credo che sarebbe in EAX)? – StartingGroovy

+0

Se si memorizza un valore in 'eax' è in * all * di' eax'. Non sono sicuro di capire. Penso che potresti confondere le parti di 'eax' come' ah', 'al' e' ax'. Puoi vedere il grafico nel volume 1 della stessa documentazione. In particolare, 'ax' si riferisce agli stessi 16 bit di' ah: al', non al "superiore" 16 bit di 'eax'. –

+0

Ah, hai ragione, questo è quello di cui ero confuso. Quindi in sostanza quello che vorrei fare è moltiplicare 'AX' di' BX' e il mio prodotto dovrebbe essere in 'EAX'? – StartingGroovy

Problemi correlati