factorial.asm
and follow along -
global _start ; must be declared for linker
section .data
input_prompt db "Enter an integer " ; input_prompt="Enter an integer "
len_input_prompt equ $ - input_prompt ; len_input_prompt equals size of input_prompt
disp_prompt db "Factorial is " ; disp_prompt="Factorial is "
len_disp_prompt equ $ - disp_prompt ; len_disp_prompt equals size of disp_prompt
section .bss
data resb 5 ; Unitialized data variable data
ans resb 5 ; Unitialized data variable ans
section .text
_start: ; start label
mov eax, 4 ; sys_write system call
mov ebx, 1 ; stdout file descriptor
mov ecx, input_prompt ; ecx=input_prompt
mov edx, len_input_prompt ; edx=len_input_prompt
int 0x80 ; Calling interrupt handler to exit program
mov eax, 3 ; sys_read system call
mov ebx, 2 ; stdin file descriptor
mov ecx, data ; Read input value in data
mov edx, 5 ; 5 bytes (numeric, 1 for sign) of that data value
int 0x80 ; Calling interrupt handler to exit program
mov eax, 4 ; sys_write system call
mov ebx, 1 ; stdout file descriptor
mov ecx, disp_prompt ; ecx=disp_prompt
mov edx, len_disp_prompt ; edx=len_disp_prompt
int 0x80 ; Perform the system call
mov eax, 1 ; eax=1
mov ecx, [count] ; eac equal to value in count
sub eax, '0' ; Converting to ASCII
label:
mul ecx, 1 ; multiply eax with ecx
dec ecx ; ecx=ecx-1
mov [ans], ecx ; ans value equal to ecx
add eax, '0' ; Converting to ASCII
cmp ecx, 1 ; Comparing ecx with 1
jg label ; if greater than 1 jump to label
mov eax, 4 ; sys_write system call
mov ebx, 1 ; stdout file descriptor
mov ecx, ans ; ecx=ans
mov edx, 5 ; 5 bytes (numeric, 1 for sign) of that data value
int 0x80 ; Perform the system call
mov eax , 1 ; sys_exit system call
mov ebx , 0 ; setting exit status
int 0x80 ; Calling interrupt handler to exit program
>> nasm -f elf32 factorial.asm -o factorial.o
>> ld -m elf_i386 factorial.o -o factorial
>> ./factorial
>> echo $?
>> Enter an integer 3
>> Factorial is 6
>> 0