Advertisement
bartek27210

1

Jan 24th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.     ifndef  ??version
  3. ?debug  macro
  4.     endm
  5. publicdll macro name
  6.     public  name
  7.     endm
  8.     endif
  9.     ?debug  V 300h
  10.     ?debug  S "4.C"
  11. 4_TEXT  segment byte public use16 'CODE'
  12. 4_TEXT  ends
  13. DGROUP  group   _DATA,_BSS
  14.     assume  cs:4_TEXT,ds:DGROUP
  15. _DATA   segment word public 'DATA'
  16. d@  label   byte
  17. d@w label   word
  18. _DATA   ends
  19. _BSS    segment word public 'BSS'
  20. b@  label   byte
  21. b@w label   word
  22. _BSS    ends
  23. 4_TEXT  segment byte public 'CODE'
  24.  
  25.    ;   
  26.    ;    unsigned int silnia(int n)
  27.    ;   
  28.     assume  cs:4_TEXT
  29. _silnia proc    far
  30.     push    bp              //bp na stos
  31.     mov bp,sp          
  32.     push    si              //si(n) na stos
  33.     mov si,word ptr [bp+6]
  34.    ;   
  35.    ;        if (n<0) return -1;
  36.    ;   
  37.     or      si,si              
  38.     jge     short @1@86  
  39.     mov ax,-1
  40.     pop si
  41.     pop bp
  42.     ret            
  43. @1@86:
  44.    ;   
  45.    ;        else if (n==0) return 1;
  46.    ;   
  47.     or      si,si              
  48.     jne     short @1@142   
  49.     mov ax,1           
  50.     pop     si
  51.     pop     bp
  52.     ret
  53. @1@142:
  54.    ;   
  55.    ;        else return n * silnia(n-1);
  56.    ;   
  57.     mov ax,si  
  58.     dec     ax     
  59.     push    ax              //ax (n-1) na stos
  60.     push    cs              //cs na stos
  61.     call        near ptr _silnia            //ip na stos
  62.     add     sp,2
  63.     imul    si              //ax * si = n * silnia(n-1)
  64.    ;   
  65.    ;    }
  66.    ;   
  67.     pop     si              //pop n
  68.     pop     bp 
  69.     ret
  70. _silnia endp
  71.  
  72.    ;   
  73.    ;    void main(void)
  74.    ;   
  75.     assume  cs:4_TEXT
  76. _main   proc    far    
  77.     push    bp
  78.     mov bp,sp      
  79.     sub     sp,2       
  80.    ;   
  81.    ;    {
  82.    ;        int i=3;
  83.    ;     
  84.    ;   
  85.    ;        i=silnia(i);
  86.    ;   
  87.     mov     ax,3
  88.     push    ax
  89.     push    cs
  90.     call        near ptr _silnia
  91.     add     sp,2
  92.     mov word ptr [bp-2],ax
  93.    ;   
  94.    ;        printf("%d",i);
  95.    ;   
  96.  
  97.     push    ax 
  98.     push    ds 
  99.     mov ax,offset DGROUP:s@
  100.     push    ax 
  101.     call        far ptr _printf
  102.     add     sp,6   
  103.    ;   
  104.    ;    }
  105.    ;   
  106.     mov sp,bp  
  107.     pop     bp
  108.     ret
  109. _main   endp
  110.     ?debug  C E9
  111.     ?debug  C FA10030000
  112. 4_TEXT  ends
  113. _DATA   segment word public 'DATA'
  114. s@  label   byte
  115.     db  '%d'
  116.     db  0
  117. _DATA   ends
  118. 4_TEXT  segment byte public 'CODE'
  119. 4_TEXT  ends
  120.     public  _main
  121.     public  _silnia
  122.     extrn   _printf:far
  123. _s@ equ s@
  124.     End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement