Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ifndef ??version
- ?debug macro
- endm
- publicdll macro name
- public name
- endm
- endif
- ?debug V 300h
- ?debug S "4.C"
- 4_TEXT segment byte public use16 'CODE'
- 4_TEXT ends
- DGROUP group _DATA,_BSS
- assume cs:4_TEXT,ds:DGROUP
- _DATA segment word public 'DATA'
- d@ label byte
- d@w label word
- _DATA ends
- _BSS segment word public 'BSS'
- b@ label byte
- b@w label word
- _BSS ends
- 4_TEXT segment byte public 'CODE'
- ;
- ; unsigned int silnia(int n)
- ;
- assume cs:4_TEXT
- _silnia proc far
- push bp //bp na stos
- mov bp,sp
- push si //si(n) na stos
- mov si,word ptr [bp+6]
- ;
- ; if (n<0) return -1;
- ;
- or si,si
- jge short @1@86
- mov ax,-1
- pop si
- pop bp
- ret
- @1@86:
- ;
- ; else if (n==0) return 1;
- ;
- or si,si
- jne short @1@142
- mov ax,1
- pop si
- pop bp
- ret
- @1@142:
- ;
- ; else return n * silnia(n-1);
- ;
- mov ax,si
- dec ax
- push ax //ax (n-1) na stos
- push cs //cs na stos
- call near ptr _silnia //ip na stos
- add sp,2
- imul si //ax * si = n * silnia(n-1)
- ;
- ; }
- ;
- pop si //pop n
- pop bp
- ret
- _silnia endp
- ;
- ; void main(void)
- ;
- assume cs:4_TEXT
- _main proc far
- push bp
- mov bp,sp
- sub sp,2
- ;
- ; {
- ; int i=3;
- ;
- ;
- ; i=silnia(i);
- ;
- mov ax,3
- push ax
- push cs
- call near ptr _silnia
- add sp,2
- mov word ptr [bp-2],ax
- ;
- ; printf("%d",i);
- ;
- push ax
- push ds
- mov ax,offset DGROUP:s@
- push ax
- call far ptr _printf
- add sp,6
- ;
- ; }
- ;
- mov sp,bp
- pop bp
- ret
- _main endp
- ?debug C E9
- ?debug C FA10030000
- 4_TEXT ends
- _DATA segment word public 'DATA'
- s@ label byte
- db '%d'
- db 0
- _DATA ends
- 4_TEXT segment byte public 'CODE'
- 4_TEXT ends
- public _main
- public _silnia
- extrn _printf:far
- _s@ equ s@
- End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement