어셈블리-재귀

재귀 프로시 저는 자신을 호출하는 프로 시저입니다. 재귀에는 직접 및 간접의 두 가지 종류가 있습니다. 직접 재귀에서 프로시 저는 자신을 호출하고 간접 재귀에서는 첫 번째 프로 시저가 두 번째 프로 시저를 호출하고 차례로 첫 번째 프로 시저를 호출합니다.

재귀는 수많은 수학적 알고리즘에서 관찰 될 수 있습니다. 예를 들어 숫자의 계승을 계산하는 경우를 생각해보십시오. 숫자의 계승은 방정식으로 주어집니다-

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

예를 들어, 5의 계승은 1 x 2 x 3 x 4 x 5 = 5 x 계승 4이며 이는 재귀 절차를 보여주는 좋은 예가 될 수 있습니다. 모든 재귀 알고리즘에는 종료 조건이 있어야합니다. 즉, 조건이 충족되면 프로그램의 재귀 호출을 중지해야합니다. 계승 알고리즘의 경우 n이 0 일 때 종료 조건에 도달합니다.

다음 프로그램은 팩토리얼 n이 어셈블리 언어로 구현되는 방법을 보여줍니다. 프로그램을 단순하게 유지하기 위해 계승 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
	
proc_fact:
   cmp   bl, 1
   jg    do_calculation
   mov   ax, 1
   ret
	
do_calculation:
   dec   bl
   call  proc_fact
   inc   bl
   mul   bl        ;ax = al * bl
   ret

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

section .bss
fact resb 1

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Factorial 3 is:
6