%macro scall 4;
common macro for input/output
mov rax, %1
mov
rdi,%2
mov
rsi,%3
mov
rdx,%4
syscall
%end macro
section
.data
num db
00h
msg db"Factorial is:"
msglen equ $-msg
msg1 db "*****Program to find factorial of a number*****",0AH db "Enter the
number:",
msg1len equ $-msg1
zerofact db "00000001"
zerofactlen equ $-zerofact
section .bss
dispnum resb 16
result resb 4
temp resb 3
section
.text
global
_start
_start:
scall 1,1,msg1,msg1len
scall 0,0,temp,3;
accept number from user
call convert;
convert number from ascii to hex mov
[num],dl
scall 1,1,msg.
mov al,[num];
store number in accumulator cmp al,01h
jbe endfact
mov rbx,0;
RMD mov bl,01h
call factr;
call factorial procedure call display
call exit endfact:
scall 1,1,zerofact,zerofactlen call exit
factr:
;recursive procedure cmp rax,01h
je recton1 push rax dec rax
call factr retcon:
pop rbx
mul ebx jmp endpr
retcon1; if rax=1 return pop rbx
jmp retcon endpr:
ret
display: ;procedure to convert hex to acci
mov
rsi,dispnum+15
mov rcx,0
;R
MD mov cl,16
cont:
mov rdx,0; RMD
mov rbx,0
;
RMD mov
bl,10h
div ebx
cmp
dl,09h
jbe
skip
add
dl,07h
skip:
add
dl,30h
mov
[rsi],dl
dec rsi
loop count
scall
1,1,dispnum,16
ret
convert: ;procedure to convery ascii to hex
mov rsi,temp
mov cl.02h
MOV rax,0 ;RMD
mov rdx,0
;
RMD countc:
rol
dl,04h
mov
al,[rsi]
cmp
al,39h
jbe
skipc
sub
al,07h
skipc:
sub
al,30 h
add
dl,al
inc rsi
dec cl knz cont ret
exit:
;exit system call
mov
rax,60
mov
rdi,0
syscall
ret