Multiplicación en Ensamblador X86
Como multiplicar en ensamblador.
La instrucción MUL (multiplicación) permite realizar la operación de multiplicación entre un registro implícito y un operando fuente, siendo estos dos datos enteros sin signo. En tanto la instrucción IMUL se encarga de los datos que presentan signo. Ambas instrucciones modifican las banderas de acarreo y de desbordamiento.
MUL fuenteIMULT fuente
Los registros A y D participan de forma implícita en la operación, ambos con el mismo tamaño que el registro fuente, si el multiplicador es un registro de cuatro bytes (32 bits) el registro que se toma como multiplicando implícito será el registro EAX cuyo tamaño es de 32 bits, el resultado de la multiplicación se almacenara en el par de registros EDX para la parte alta y EAX para la parte baja, ambos de 32 bits.
El único caso en el que no es usado el registro D para almacenar la parte alta del resultado, es donde el multiplicador es de un byte (ocho bits) el registro que se toma como multiplicando implícito en este caso será el registro AL, el resultado de la operación será un dato que requerirá de 16 bits para ser almacenado por lo que la parte alta del número se guardara en el registro AH mientras que la parte baja lo hará en el registro AL.
Registro fuente de 8 bits
AL× fuente = AH : ALRegistro fuente de 16 bits
AX × fuente = DX : AXRegistro fuente de 32 bits
EAX × fuente = EDX : EAXRegistrofuente de 64 bits
RAX × f uente = RDX : RAXsegment .data
msg6 db 0xA,0xD,"el resultado es: "
len6 equ $- msg6segment .bss
res resb 1section .text
global _start
_start:
mov ebx, 3 ; en ebx que es un registro de 32 bits
; se almacena el número tres
mov eax, 2 ; en el registro eax se almacena el número dosmul ebx ; se realiza la multiplicacion (eax*ebx)
; en eax se almacenara la parte baja del resultado de la
; multiplicación (cuyo valor es 6)
; y en edx se almacenara la parte alta (cuyo valor es 0)add eax, 48
mov [res], eaxmov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, len6
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, res
mov edx, 1
int 0x80salir:
mov eax, 1
mov ebx, 0
int 0x80
la salida en pantalla de este programa es:
/code # nasm -f elf multiplicacion.asm/code # ld -m -o elf_i386 multiplicacion multiplicacion.o/code # ./multiplicacion
el resultado es: 6/code #
Si ha disfrutado de este artículo y siente que ha aprendido algo valioso, por favor compártalo.