I need to make a program how pick two number between 0 and 9 and multiply they but I can only use SHL, SHR or ROR,ROL commands
;I find this code here on stackoverflow but a don´t really undusted
; ax = x
mov bl, al ; bx = x
shl bl, 3 ; bx = 8 * x
add al, bl ; ax = 9 * x
shl bl, 2 ; bx = 32 * x
add al, bl ; ax = 41 * x
CodePudding user response:
Performing multiplication without using the mul instruction is clear enough, but saying you can only use shl, shr, rol, and ror instructions is not sufficient to solve this task.
As an example see the below subroutine that manages to multiply without the use of the mul instruction:
; IN (al=first number [0,9], ah=second number [0,9]) OUT (ax=product [0,81])
SmallMul:
mov [$ 6], al ; This overwrites the default operand of AAD
mov al, 0
aad ; -> AX is product
ret
and using
addandsubit is possible to make this program ?
Yes, using repeated addition
example: 5 * 3 --> 0 5 5 5
<--- 3x --->
; IN (al=first number [0,9], bl=second number [0,9]) OUT (cl=product [0,81])
SmallMul:
sub cl, cl ; Sets CL=0
.a: add cl, al
sub bl, 1
jnz .a ; Jumps BL-1 times
ret
- If ever the second number in BL were zero, then this simple code will fail!
- As an optimization we can choose the smallest of the two numbers to control the loop. Less iterations is a good thing.
; IN (al=first number [0,9], bl=second number [0,9]) OUT (cl=product [0,81])
SmallMul:
sub cl, cl ; Sets CL=0
cmp bl, al
jbe .b
xchg bl, al
jmp .b
.a: add cl, al
.b: sub bl, 1
jns .a ; Jumps BL times
ret
A simple version of the shift and add algorithm:
; IN (al=first number [0,9], bl=second number [0,9]) OUT (cl=product [0,81])
SmallMul:
sub cl, cl ; Sets CL=0
jmp .c
.a: add cl, al
.b: shl al, 1 ; Doubles AL, same as `ADD AL, AL`
.c: shr bl, 1 ; Halves BL
jc .a ; Shifted out a 1 bit, so go ADD
jnz .b ; Jumps for as long as BL has non-zero bits
ret
- There's no problem with the second number in BL being zero.
- As an optimization we can choose the smallest of the two numbers to control the loop. Less iterations is a good thing.
; IN (al=first number [0,9], bl=second number [0,9]) OUT (cl=product [0,81])
SmallMul:
sub cl, cl ; Sets CL=0
cmp bl, al
jbe .c
xchg bl, al
jmp .c
.a: add cl, al
.b: shl al, 1 ; Doubles AL, same as `ADD AL, AL`
.c: shr bl, 1 ; Halves BL
jc .a ; Shifted out a 1 bit, so go ADD
jnz .b ; Jumps for as long as BL has non-zero bits
ret
