2012-03-20 20 views
9

Estoy bastante confundido acerca de cómo funcionan las operaciones de multiplicación y división en el ensamblaje x86. Por ejemplo, el código siguiente no parece demasiado difícil ya que se trata de 8 bits.x86 ensamblar multiplicar y dividir operandos de instrucción, 16 bits y superior

de 8 bits Multiplicación:

; 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 

¿Pero qué sucede cuando se quiere multiplicar dos números de 16 bits? ¿Cómo se podrían multiplicar dos números de 16 bits de la misma manera que se ha hecho con los números de 8 bits?

No estoy seguro de en qué registros se almacenarán los valores. ¿Se almacenarán en AL y AH o simplemente almacenaría el número de 16 bits en AX. Para mostrar lo que quiero decir:

; 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 

¿Podría alguien explicar un poco sobre cómo funciona la multiplicación y la división? (En concreto con números de 16 bits y 32 bits? ¿Me necesite girar bits de si los valores se almacenan en la AL inferior y AH?

O puedo uno simplemente mov num1 y num2 en ax y bx respectivamente y luego multiplicarlos para obtener el producto en eax

+2

¿usted intentó leer el [documenta ción] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)? –

Respuesta

14

un rápido vistazo a la documentation muestra que hay 4 posibles tamaños de operando para MUL las entradas y salidas se resumen en una tabla útil:?.

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

Miré eso, y estaba al tanto de dónde se almacena el valor después del 'mul'. Me pregunto si, cuando almaceno el valor en 'eax' (antes de' mul') si lo almacena en los bits más bajos (AL y AH) en lugar de los bits más altos (AX). Si los almacena en los bits más bajos, ¿puedo rotarlos a AX y luego simplemente multiplicar AX y BX e imprimir la respuesta (creo que sería en EAX)? – StartingGroovy

+0

Si almacena un valor en 'eax' está en * all * of' eax'. No estoy seguro de entender. Creo que podría estar confundiendo qué partes de 'eax' son' ah', 'al' y' ax', también. Puede ver el cuadro en el volumen 1 de la misma documentación. En particular, 'ax 'se refiere a los mismos 16 bits que' ah: al', no a los 16 bits "superiores" de 'eax'. –

+0

Ah, tienes razón, eso es lo que me confundió. Entonces, esencialmente, ¿qué me gustaría hacer es multiplicar 'AX' por' BX' y mi producto debería estar en 'EAX'? – StartingGroovy

Cuestiones relacionadas