Assembly - Recursion


A recursive procedure is one that calls itself. There are two kinds of recursion: direct and indirect. In direct recursion, the procedure calls itself and in indirect recursion, the first procedure calls a second procedure, which in turn calls the first procedure.

Recursion could be observed in numerous mathematical algorithms. For example, consider the case of calculating the factorial of a number. Factorial of a number is given by the equation:

Fact (n) = n * fact (n-1) for n > 0

For example: factorial of 5 is 1 x 2 x 3 x 4 x 5 = 5 x factorial of 4 and this can be a good example of showing a recursive procedure. Every recursive algorithm must have an ending condition, i.e., the recursive calling of the program should be stopped when a condition is fulfilled. In the case of factorial algorithm, the end condition is reached when n is 0.

The following program shows how factorial n is implemented in assembly language. To keep the program simple, we will calculate factorial 3.

section	.text
    global _start         ;must be declared for using gcc
_start:    ;tell linker entry point

    mov bx, 3       ;for calculating factorial 3
    call  proc_fact
    add   ax, 30h
    mov  [fact], ax
    mov	  edx,len   ;message length
    mov	  ecx,msg   ;message to write
    mov	  ebx,1     ;file descriptor (stdout)
    mov	  eax,4     ;system call number (sys_write)
    int	  0x80      ;call kernel

    mov   edx,1     ;message length
    mov	  ecx,fact  ;message to write
    mov	  ebx,1     ;file descriptor (stdout)
    mov	  eax,4     ;system call number (sys_write)
    int	  0x80      ;call kernel
    mov	  eax,1     ;system call number (sys_exit)
    int	  0x80      ;call kernel
    cmp   bl, 1
    jg    do_calculation
    mov   ax, 1
    dec   bl
    call  proc_fact
    inc   bl
    mul   bl        ;ax = al * bl

section	.data
msg db 'Factorial 3 is:',0xa	
len equ $ - msg			

section .bss
fact resb 1

When the above code is compiled and executed, it produces the following result:

Factorial 3 is: