;algoritmo de multiplicacion de numeros negativos con complemento a la base
;los numeros a multiplicar son de maximo 8 bits, y el resultado de 16 bits
;autor Santiago Passalacqua
;version 1.0 28/09/2014
%include "asm_io.inc"
segment .data
;se declaran los numeros a multiplicar
MULTIPLICADOR db 11111001b
MULTIPLICANDO db 11111101b
N db 8
segment .text
global asm_main
asm_main:
;inicializo
enter 0,0
mov eax, 0
mov al, [MULTIPLICADOR]
mov ah, 0
mov ebx, 0
;inicio del ciclo
while:
cmp bl, [N]
je fin_while
shr al, 1
jnc primero_cero
;si el primer numero es 1 lo restauro y pongo a su derecha el multiplicando
stc ;seteo el carry en 1
rcl al, 1 ;restauro el 1 original que se cayo con el shifteo
clc ;limpio el carry
add ah, [MULTIPLICANDO] ; sumo el multiplicando
stc ;seteo el carry en 1
rcr ax, 1 ;shifteo con el carry desde la izquierda
clc ;limpio el carry
jmp fin_if
primero_cero:
shl al,1 ;restauro el 0 que se cayo
stc ;seteo el carry en 1
rcr ax, 1 ;shifteo con 1 desde la izquierda
clc ;limpio el carry
fin_if:
inc bl ;incremento el contador
jmp while
fin_while:
;sumo el complemento a la base del multiplicando
mov ecx, 0
mov cl, [MULTIPLICANDO]
not cl
inc cl
add ah, cl
dump_regs 1
mov eax, 0
leave
ret