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 "LAB4.C"
- ?debug C E95A762E4A064C4142342E43
- ?debug C E94019CA1816433A5C4243335C494E434C5544455C535444494F2E+
- ?debug C 48
- ?debug C E94019CA1816433A5C4243335C494E434C5544455C5F444546532E+
- ?debug C 48
- ?debug C E94019CA1817433A5C4243335C494E434C5544455C5F4E46494C45+
- ?debug C 2E48
- ?debug C E94019CA1816433A5C4243335C494E434C5544455C5F4E554C4C2E+
- ?debug C 48
- _TEXT segment byte public 'CODE'
- _TEXT ends
- DGROUP group _DATA,_BSS
- assume cs:_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
- _TEXT segment byte public 'CODE'
- ?debug C E801064C4142342E435A762E4A
- ;
- ; unsigned int silnia(int n)
- ;
- ?debug L 3
- assume cs:_TEXT
- ; Początek funkcji silnia, bliski model pamięci.
- _silnia proc near
- ?debug B
- ; Odłożenie wartości rejestru bp na stos.
- push bp
- ; Przypisanie wartości rejestru sp do bp.
- mov bp,sp
- ; Odłożenie na stos wartości rejestru źródła.
- push si
- ?debug C E6016E040A040000
- ; Przypisanie do rejestru si wartości przekazywanej do funkcji.
- mov si,word ptr [bp+4]
- ?debug B
- ;
- ; {
- ; if (n<0) return -1;
- ;
- ?debug L 5
- ; cmp si,0 - porównanie si z wartością 0.
- or si,si
- ; Skok warunkowy, jeżeli si większe lub równe 0.
- jge short @1@86
- ; Przypisanie wartości -1 do rejestru ax.
- mov ax,-1
- ; Zdjęcie ze stosu wartości si.
- pop si
- ; Zdjęcie ze stosu wartości bp.
- pop bp
- ; Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
- ret
- @1@86:
- ;
- ; else if (n==0) return 1;
- ;
- ?debug L 6
- ; cmp si,0 - porównanie si z wartością 0.
- or si,si
- ; Skok warunkowy, jeżeli si nie jest równe 0.
- jne short @1@142
- ; Przypisanie wartości 0 do rejestru ax.
- mov ax,1
- ; Zdjęcie ze stosu wartości si.
- pop si
- ; Zdjęcie ze stosu wartości bp.
- pop bp
- ; Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
- ret
- @1@142:
- ;
- ; else return n * silnia(n-1);
- ;
- ?debug L 7
- ; Przypisanie do rejestru ax wartości si.
- mov ax,si
- ; Dekrementacja ax.
- dec ax
- ; Odłożenie na stos wartości ax.
- push ax
- ; Odłożenie na stos ip_silnia i wywołanie funkcji.
- call near ptr _silnia
- ; Przesunięcie wskaźnika stosu o 2 bajty w górę - o zmienną typu word.
- add sp,2
- ; Mnożenie ze znakiem rejestru ax oraz si.
- imul si
- ;
- ; }
- ;
- ?debug L 8
- ; Zdjęcie ze stosu wartości si.
- pop si
- ; Zdjęcie ze stosu wartości bp.
- pop bp
- ; Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
- ret
- ?debug C E6016E04080107002D000C0600
- ?debug E
- ?debug E
- _silnia endp
- ;
- ; void main(void)
- ;
- ?debug L 10
- assume cs:_TEXT
- ;
- ; Początek funkcji main, bliski model pamięci.
- ;
- _main proc near
- ?debug B
- ; Wywołanie funkcji main, na stos trafia ip_main.
- ; Odłożenie rejestru bp na stos.
- push bp
- ; Przypisanie wartość rejestru sp do rejestru bp.
- mov bp,sp
- ; Przesunięcie wskaźnika stosu o -2 - utworzone zostaje
- ; miejsce na stosie dla zmiennej automatycznej typu word (2 bajty),
- ; do której zapisany zostanie wynik funkcji silnia.
- sub sp,2
- ?debug B
- ;
- ; {
- ; int i=3;
- ;
- ?debug L 12
- ;
- ; i=silnia(i);
- ;
- ?debug L 13
- ; Przypisanie wartości 3 do rejestru ax.
- mov ax,3
- ; Odłożenie na stos wartości rejestru ax (ax = 3).
- push ax
- ; Wywołanie funkcji silnia - odłożenie na stos ip_silnia.
- call near ptr _silnia
- ; Przesunięcie wskaźnika stosu o 2, usuniecie miejsca na zmienna tymczasową.
- add sp,2
- ; Przypisanie wartości rejestru ax do miejsca na stosie gdzie znajduje sie wartość 3 (ax = 6).
- mov word ptr [bp-2],ax
- ;
- ; printf("%d",i);
- ;
- ?debug L 14
- ; Odłożenie wartości rejestru ax na stos (ax = 6).
- push ax
- ; Przypisanie do rejestru ax wskaźnika do danych zawierających napis '%d'.
- mov ax,offset DGROUP:s@
- ; Odłożenie wartości rejestru ax na stos
- push ax
- ; Wywołanie funkcji printf - funkcja przyjmuje zmienna liczbę parametrów,
- ; zależnie od tekstu do wyświetlenia. W tym przypadku 2 parametry.
- call near ptr _printf
- ; Przesunięcie wskaźnika sp na początek
- add sp,4
- ;
- ; }
- ;
- ?debug L 15
- ; Przypisanie wartosci rejestru bp do rejestru sp.
- mov sp,bp
- ; Zdjęcie bp ze stosu.
- pop bp
- ; Zdjęcie ip_main ze stosu i zakończenie programu.
- ret
- ?debug C E601690402FEFF010C00
- ?debug E
- ?debug E
- _main endp
- ?debug C E9
- ?debug C FA10030000
- _TEXT ends
- _DATA segment word public 'DATA'
- s@ label byte
- db '%d'
- db 0
- _DATA ends
- _TEXT segment byte public 'CODE'
- _TEXT ends
- public _main
- public _silnia
- extrn _printf:near
- _s@ equ s@
- ?debug C EA0109
- ?debug C E31800000023010000
- ?debug C EC055F6D61696E181800
- ?debug C E319000000230A0000
- ?debug C EC075F73696C6E6961191800
- ?debug C E31A00000023040001
- ?debug C EB075F7072696E74661A00
- ?debug C E60666706F735F740606021F000673697A655F74+
- ?debug C 0A06021A00
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement