hola, queria ver si alguien me podia aclarar esta duda.
estoy aprendiendo ASM x86, mas especificamente la sintaxis de intel. (utilizo NASM).
estuve viendo la instruccion MUL, que sirve para hacer operaciones de multiplicacion.
segun esta pagina: http://x86.renejeschke.de/html/file_module_x86_id_210.html
Opcode Mnemonic Description
F6 /4 MUL r/m8 Unsigned multiply (AX = AL * r/m8).
F7 /4 MUL r/m16 Unsigned multiply (DX:AX = AX * r/m16).
F7 /4 MUL r/m32 Unsigned multiply (EDX:EAX = EAX * r/m32).
para hacer una operacion de multiplicacion con un BYTE, tengo que mover el numero a multiplicar al registro AL, y me devuelve el resultado en AX.
mov al, 5
mul 5
; ahora ax = 25
para hacer una multiplicacion con un WORD, deberia mover el valor a AX:
mov ax, 5
mul 25
; ahora DX:AX vale 125
trabajando con DWORDS, seria:
mov eax, 5
mul 1000
; ahora EDX:EAX vale 5000
mi duda es, que significan esos pares de registros?
el resultado se aloja en el registro EDX o en el registro EAX?
o en ambos?
como hago para manipular el resultado, teniendo en cuenta que se guardan en pares de registros?
no logro entender cual es el significado de esas expresiones.
que seria un par de registros y cual es su utilidad?
si me podrian dar algun ejemplo.
gracias.
Tienes los pares por que al multiplicar por ejemplo el valor mas alto que puedes en un unsiged ejemplo con AL, 0xFF = 255 = 11111111
El resultado de este seria un unsigned de 16 bits, y este tendra que estar en un registro de 16 como AX.
Lo mismo cuando multiplicas un unsigned de 16 bits en AX este se puede tornar a 32 bits, hay el registro DX, el resto del resultado se gurarda en el otro.
Si el resultado no pasa del tamaño no tiene porque usar el registro concatenado.
Asi en todos. Saludos.
Cita de: cpu2 en 5 Marzo 2017, 22:40 PM
Tienes los pares por que al multiplicar por ejemplo el valor mas alto que puedes en un unsiged ejemplo con AL, 0xFF = 255 = 11111111
El resultado de este seria un unsigned de 16 bits, y este tendra que estar en un registro de 16 como AX.
Lo mismo cuando multiplicas un unsigned de 16 bits en AX este se puede tornar a 32 bits, hay el registro DX, el resto del resultado se gurarda en el otro.
Si el resultado no pasa del tamaño no tiene porque usar el registro concatenado.
Asi en todos. Saludos.
entonces suponiendo que el resultado sea 0110 1010 1110 0110
me quedarian los 2 primeros bytes en DX y los 2 ultimos en AX, asi?
DX:0110 1010
AX:1110 0110
entonces como haria para mover el resultado a un registro de 32 bits?
supongamos:
mov AX, 655
mul 321
;digamos que el resultado se torno en una DWORD, como hago para mover ese valor a ECX por ejemplo?=
Citarentonces como haria para mover el resultado a un registro de 32 bits?
supongamos:
mov AX, 655
mul 321
;digamos que el resultado se torno en una DWORD, como hago para mover ese valor a ECX por ejemplo?=/quote]
El resultado seria de 18 bits, 110011010101001111 los bits que no entren en AX pasaran a DX.
Tienes muchas formas de copiar el valor a ECX, primero mira el valor de ax y de dx para enterarte, luego puedes mover los bits con short o similar.
Saludos.
seria correcto mover el valor de dx a ecx, shifteando a la izquierda 16 bits y efectuando AND con ax?
Si no tambien podrias moverlos directamente al stack.
Saludos.