; Template for console application
         .586
         .MODEL  flat, stdcall
         OPTION CASEMAP:NONE

Include kernel32.inc
Include masm32.inc

FRAME    STRUCT                                                            
   SAVE_EBP    DD   ?
   SAVE_EIP    DD   ?
   n           DW   ?
   result_addr DD   ?
FRAME    ENDS

IncludeLib kernel32.lib
IncludeLib masm32.lib

         .CONST
MsgExit  DB    "Press Enter to Exit",0AH,0DH,0

         .DATA
n        DW     5   ;   N для которого вычисляется факториал 

         .DATA?
inbuf    DB     100 DUP (?)
result   DD     ?     ;  поле  результата
         .CODE
Start:  
         push   offset result; сохранение в стеке  адреса результата 
         push   n   ;  сохранение в стеке  N, факториал которого вычисляем 
         call   fact

         XOR    EAX,EAX
         Invoke StdOut,ADDR MsgExit
         Invoke StdIn,ADDR inbuf,LengthOf inbuf
         Invoke ExitProcess,0	

fact     PROC 
         push   EBP
         mov    EBP,ESP
         push   EBX
         push   AX
; извлечение из стека адреса результата
         mov    EBX,FRAME.result_addr[EBP]  
         mov    AX,FRAME.n[EBP]   ; извлечение из стека текущего N
         cmp    AX,0
         je     done   ;  выход из рекурсии
         push   EBX    ; сохранение в стеке  адреса результата 
         dec    AX            ;   N=N-1
         push   AX            ;  сохранение в стеке  текущего N 
         call   fact          ; рекурсивный вызов 
; извлечение из стека адреса результата
         mov    EBX,FRAME.result_addr[EBP] 
 ; запись результата активации в регистр ax 
         mov    AX,[EBX]   
         mul    FRAME.n[EBP]  ; вычисление текущего результата               
         jmp    short return
done:    mov    EAX,1          ; если  ax=0 , то результат 1  
; запоминаем  результат активации                                                     
return:  mov    [EBX],AX   
         pop    AX                                                                           
         pop    EBX
         pop    EBP
         ret    6
fact     ENDP
         
         End    Start

