OneCompiler

ASSIGNMENT NO 9

211

%macro scall 4 ;common macro for input/output
mov rax,%1
mov rdi,%2
mov rsi,%3
mov rdx,%4
syscall
%endmacro
section .data
num db 00h
msg db "Factorial is : "
msglen equ
βˆ’
π‘š
𝑠
𝑔
π‘š
𝑠
𝑔
1
𝑑
𝑏
"
βˆ—
βˆ—
βˆ—
βˆ—
βˆ—
𝑃
π‘Ÿ
π‘œ
𝑔
π‘Ÿ
π‘Ž
π‘š
𝑑
π‘œ
𝑓
𝑖
𝑛
𝑑
𝐹
π‘Ž
𝑐
𝑑
π‘œ
π‘Ÿ
𝑖
π‘Ž
𝑙
π‘œ
𝑓
π‘Ž
𝑛
𝑒
π‘š
𝑏
𝑒
π‘Ÿ
βˆ—
βˆ—
βˆ—
βˆ—
βˆ—
"
,
0
𝐴
β„Ž
𝑑
𝑏
"
𝐸
𝑛
𝑑
𝑒
π‘Ÿ
𝑑
β„Ž
𝑒
𝑛
𝑒
π‘š
𝑏
𝑒
π‘Ÿ
:
"
,
π‘š
𝑠
𝑔
1
𝑙
𝑒
𝑛
𝑒
π‘ž
𝑒
βˆ’msgmsg1db"βˆ—βˆ—βˆ—βˆ—βˆ—ProgramtofindFactorialofanumberβˆ—βˆ—βˆ—βˆ—βˆ—",0Ahdb"Enterthenumber:",msg1lenequ-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,msglen
xor rdx,rdx
xor rax,rax
mov al,[num] ;store number in accumulator
cmp al,01h
jbe endfact
xor rbx,rbx
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 retcon1
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 ascii

mov rsi,dispnum+15
xor rcx,rcx
mov cl,16
cont:
xor rdx,rdx
xor rbx,rbx
mov bl,10h
div ebx
cmp dl,09h
jbe skip
add dl,07h
skip:
add dl,30h
mov [rsi],dl
dec rsi
loop cont
scall 1,1,dispnum,16

ret

convert: ;procedure to convert ascii to hex

mov rsi,temp
mov cl,02h
xor rax,rax
xor rdx,rdx
contc:
rol dl,04h
mov al,[rsi]
cmp al,39h
jbe skipc
sub al,07h
skipc:
sub al,30h
add dl,al
inc rsi
dec cl
jnz contc

ret
exit: ;exit system call

mov rax,60
mov rdi,0
syscall

ret