**************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
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