Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: integeroverflow en 4 Marzo 2017, 15:27 pm



Título: [DUDA] Pares de registros
Publicado por: integeroverflow en 4 Marzo 2017, 15:27 pm
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.

Código:
    mov al, 5
    mul 5
    ; ahora ax = 25

para hacer una multiplicacion con un WORD, deberia mover el valor a AX:

Código:
    mov ax, 5
    mul 25
    ; ahora DX:AX vale 125

trabajando con DWORDS, seria:

Código:
     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.



Título: Re: [DUDA] Pares de registros
Publicado por: xv0 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.


Título: Re: [DUDA] Pares de registros
Publicado por: integeroverflow en 6 Marzo 2017, 00:49 am
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?=




Título: Re: [DUDA] Pares de registros
Publicado por: xv0 en 6 Marzo 2017, 13:31 pm
Citar
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?=/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.


Título: Re: [DUDA] Pares de registros
Publicado por: integeroverflow en 6 Marzo 2017, 14:47 pm
seria correcto mover el valor de dx a ecx,  shifteando a la izquierda 16 bits y efectuando AND con ax?


Título: Re: [DUDA] Pares de registros
Publicado por: xv0 en 6 Marzo 2017, 17:34 pm
Si no tambien podrias moverlos directamente al stack.

Saludos.