Assembly-programming-assembly-recursion

提供:Dev Guides
移動先:案内検索

アセンブリ-再帰

再帰プロシージャは、それ自体を呼び出すプロシージャです。 再帰には、直接と間接の2種類があります。 直接再帰では、プロシージャは自分自身を呼び出し、間接再帰では、最初のプロシージャは2番目のプロシージャを呼び出し、2番目のプロシージャは最初のプロシージャを呼び出します。

再帰は、多数の数学的アルゴリズムで観察される可能性があります。 たとえば、数値の階乗を計算する場合を考えます。 数の階乗は式で与えられます-

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