Thursday, 16 April 2015

Multiplication of two numbers using Assembly Language

**************PROGRAM*********************
MULTIPLICATION OF TWO NUMBERS
*************************************************

section .data
m0 db 10,"MENU",10
   db "1)Multiply two numbers by successive addition",10
   db "2)Multiply two numbers by shift-add method",10
   db "3)Exit",10
   db "Enter your choice",10
l0 equ $-m0
m1 db "Enter first number:",10
l1 equ $-m1
m2 db "Enter second number:",10
l2 equ $-m2
m3 db "Answer is:",10
l3 equ $-m3

section .bss
choice resb 2
num resb 17
fnum1 resb 8
fnum2 resb 8
cnt resq 1
result resq 1
ctr resq 1
temp resb 8
A resb 8
Q resb 8
N resb 8
M resb 8

%macro write 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro read 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov rax,60
mov rbx,0
syscall
%endmacro

section .text
global _start
_start:
write m0,l0
read choice,2
cmp byte[choice],31h
je mul1
cmp byte[choice],32h
je mul2
exit

mul1:
write m1,l1
read num,17
dec rax
mov qword[cnt],rax
call accept
mov qword[fnum1],rax

write m2,l2
read num,17
dec rax
mov qword[cnt],rax
call accept
mov qword[fnum2],rax

mov qword[result],00
again:
mov rax,qword[fnum1]
add qword[result],rax
dec qword[fnum2]
jnz again

write m3,l3
call display
exit

mul2:
write m1,l1
read num,17
dec rax
mov qword[cnt],rax
call accept
mov qword[fnum1],rax

write m2,l2
read num,17
dec rax
mov qword[cnt],rax
call accept
mov qword[fnum2],rax

mov qword[A],00
mov rax,qword[fnum1]
mov qword[Q],rax
mov rbx,qword[fnum2]
mov qword[M],rbx
mov qword[N],64

logic:
mov rax,qword[Q]
and rax,01h
cmp rax,01h
jne zero
mov rbx,00
mov rbx,qword[A]
add rbx,qword[M]
mov qword[A],rbx

zero:
mov rax,qword[A]
mov rbx,qword[Q]
shr rbx,01
and rax,01h
cmp rax,01h
jne label6
mov rdx,01
shl rdx,63
or rbx,rdx

label6:
mov rax,qword[A]
shr rax,01
mov qword[Q],rbx
mov qword[A],rax
dec qword[N]
cmp qword[N],00
jne logic

mov rax,qword[A]
mov qword[result],rax
call display

mov rax,qword[Q]
mov qword[result],rax
call display
exit

accept:
mov rax,00
mov rbx,00
mov rsi,num
oncemore:
shl rax,04
mov bl,byte[rsi]
cmp bl,39h
jle skip
sub bl,07h
skip:
sub bl,30h
add rax,rbx
inc rsi
dec qword[cnt]
jnz oncemore
ret

display:
mov rsi,result
add rsi,07h
mov qword[ctr],08

lab3:     mov al,byte[rsi]
        shr al,04
        cmp al,09h
        jle skip1
        add al,07h
skip1:  add al,30h
        mov byte[temp],al
        push rsi
        write temp,01
        pop rsi
        mov al,byte[rsi]
           and al,0Fh
        cmp al,09h
        jle skip2
        add al,07h
skip2:  add al,30h
        mov byte[temp],al
        push rsi
        write temp,01
        pop rsi
        dec rsi
        dec qword[ctr]
        jnz lab3
ret


******************OUTPUT********************
sourabh@ubuntu:~$ nasm -f elf64 mul.asm
sourabh@ubuntu:~$ ld -o mul mul.o
sourabh@ubuntu:~$ ./mul

MENU
1)Multiply two numbers by successive addition
2)Multiply two numbers by shift-add method
3)Exit
Enter your choice
1
Enter first number:
A
Enter second number:
A
Answer is:
0000000000000064

MENU
1)Multiply two numbers by successive addition
2)Multiply two numbers by shift-add method
3)Exit
Enter your choice
2
Enter first number:
A
Enter second number:
A
Answer is:
00000000000000000000000000000064

No comments:

Post a Comment