Программирование на Ассемблере


Составление рекурсивных функций на ассемблере


     Функция называется рекурсивной, если она обращается к  самой себе. Рассмотрим составление рекурсивной функции на  примере  вычисления факториала.

          Пример. Составить функцию вычисления Y = N!,

если

                         Y = 1, если N = 0,

                         Y = 1 * 2 ... * N, если N > 1

Если N < 0 функция должна возвращать -1, что говорит о неправильном аргументе.

          Соответствующая функция на языке С имеет вид:

          unsigned fact(int n){

                  if(n < 0) return -1;

                  if(n == 0)return 1

                  return (n * fact(n - 1));

          }

;Использование рекурсий в ассемблер программах



       

 ideal

        p586

        model flat

        extrn ExitProcess:proc

        dataseg

n       dd    4

x       dd    ?

        codeseg

       proc     fact

       push     ebp

       mov      ebp,esp; [ebp+8]-n

       push     ebx ecx edx

       mov      ebx, [ebp+8]

       test     ebx,ebx

       js       m1; <0

       jz       m2; ==0

       mov      ecx, ebx

       dec      ebx

       push     ebx

       call     fact

       mul      ecx

       jmp      short m3

m1:    mov      eax,0

       jmp      short m3

m2:    mov      eax,1

m3:    pop      edx ecx ebx

       pop      ebp

       ret      4

       endp     fact

begin:

       push     [n]

       call     fact

       call     ExitProcess

       end  begin

     "Прокрутите" программу, чтобы увидеть, как  изменяется  состояние стека. Вы увидите, что рекурсивные функции требуют,  чтобы размер стека был не меньше K * N, где  K-число  байт  стека,  используемых при каждом вызове, а N  -  число  вызовов  рекурсивной функции



Содержание раздела