Advertisement
ventress

lab4

Jan 17th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     ifndef  ??version
  2. ?debug  macro
  3.     endm
  4. publicdll macro name
  5.     public  name
  6.     endm
  7.     endif
  8.     ?debug  V 300h
  9.     ?debug  S "LAB4.C"
  10.     ?debug  C E95A762E4A064C4142342E43
  11.     ?debug  C E94019CA1816433A5C4243335C494E434C5544455C535444494F2E+
  12.     ?debug  C 48
  13.     ?debug  C E94019CA1816433A5C4243335C494E434C5544455C5F444546532E+
  14.     ?debug  C 48
  15.     ?debug  C E94019CA1817433A5C4243335C494E434C5544455C5F4E46494C45+
  16.     ?debug  C 2E48
  17.     ?debug  C E94019CA1816433A5C4243335C494E434C5544455C5F4E554C4C2E+
  18.     ?debug  C 48
  19. _TEXT   segment byte public 'CODE'
  20. _TEXT   ends
  21. DGROUP  group   _DATA,_BSS
  22.     assume  cs:_TEXT,ds:DGROUP
  23. _DATA   segment word public 'DATA'
  24. d@  label   byte
  25. d@w label   word
  26. _DATA   ends
  27. _BSS    segment word public 'BSS'
  28. b@  label   byte
  29. b@w label   word
  30. _BSS    ends
  31. _TEXT   segment byte public 'CODE'
  32.     ?debug  C E801064C4142342E435A762E4A
  33.    ;   
  34.    ;    unsigned int silnia(int n)
  35.    ;   
  36.     ?debug  L 3
  37.     assume  cs:_TEXT
  38.    ;    Początek funkcji silnia, bliski model pamięci.
  39. _silnia proc    near
  40.     ?debug  B
  41.    ;    Odłożenie wartości rejestru bp na stos.
  42.     push    bp
  43.    ;    Przypisanie wartości rejestru sp do bp.
  44.     mov bp,sp
  45.    ;    Odłożenie na stos wartości rejestru źródła.
  46.     push    si
  47.     ?debug  C E6016E040A040000
  48.    ;    Przypisanie do rejestru si wartości przekazywanej do funkcji.
  49.     mov si,word ptr [bp+4]
  50.     ?debug  B
  51.    ;   
  52.    ;    {
  53.    ;       if (n<0) return -1;
  54.    ;   
  55.     ?debug  L 5
  56.    ;    cmp si,0 - porównanie si z wartością 0.
  57.     or  si,si
  58.    ;    Skok warunkowy, jeżeli si większe lub równe 0.
  59.     jge short @1@86
  60.    ;    Przypisanie wartości -1 do rejestru ax.
  61.     mov ax,-1
  62.    ;    Zdjęcie ze stosu wartości si.
  63.     pop si
  64.    ;    Zdjęcie ze stosu wartości bp.
  65.     pop bp
  66.    ;    Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
  67.     ret
  68. @1@86:
  69.    ;   
  70.    ;          else if (n==0) return 1;
  71.    ;   
  72.     ?debug  L 6
  73.    ;    cmp si,0 - porównanie si z wartością 0.
  74.     or  si,si
  75.    ;    Skok warunkowy, jeżeli si nie jest równe 0.
  76.     jne short @1@142
  77.    ;    Przypisanie wartości 0 do rejestru ax.
  78.     mov ax,1
  79.    ;    Zdjęcie ze stosu wartości si.
  80.     pop si
  81.    ;    Zdjęcie ze stosu wartości bp.
  82.     pop bp
  83.    ;    Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
  84.     ret
  85. @1@142:
  86.    ;   
  87.    ;             else return n * silnia(n-1);
  88.    ;   
  89.     ?debug  L 7
  90.    ;    Przypisanie do rejestru ax wartości si.
  91.     mov ax,si
  92.    ;    Dekrementacja ax.
  93.     dec ax
  94.    ;    Odłożenie na stos wartości ax.
  95.     push    ax
  96.    ;    Odłożenie na stos ip_silnia i wywołanie funkcji.
  97.     call    near ptr _silnia
  98.    ;    Przesunięcie wskaźnika stosu o 2 bajty w górę - o zmienną typu word.
  99.     add sp,2
  100.    ;    Mnożenie ze znakiem rejestru ax oraz si.
  101.     imul    si
  102.    ;   
  103.    ;    }
  104.    ;   
  105.     ?debug  L 8
  106.    ;    Zdjęcie ze stosu wartości si.
  107.     pop si
  108.    ;    Zdjęcie ze stosu wartości bp.
  109.     pop bp
  110.    ;    Zdjęcie ze stosu adresu powrotu ip_silnia i koniec funkcji.
  111.     ret
  112.     ?debug  C E6016E04080107002D000C0600
  113.     ?debug  E
  114.     ?debug  E
  115. _silnia endp
  116.    ;   
  117.    ;    void main(void)
  118.    ;   
  119.     ?debug  L 10
  120.     assume  cs:_TEXT
  121.    ;   
  122.    ;    Początek funkcji main, bliski model pamięci.
  123.    ;
  124. _main   proc    near
  125.     ?debug  B
  126.    ;    Wywołanie funkcji main, na stos trafia ip_main.
  127.    ;    Odłożenie rejestru bp na stos.
  128.     push    bp
  129.    ;    Przypisanie wartość rejestru sp do rejestru bp.
  130.     mov bp,sp
  131.    ;    Przesunięcie wskaźnika stosu o -2 - utworzone zostaje
  132.    ;    miejsce na stosie dla zmiennej automatycznej typu word (2 bajty),
  133.    ;    do której zapisany zostanie wynik funkcji silnia.  
  134.     sub sp,2
  135.     ?debug  B
  136.    ;   
  137.    ;    {
  138.    ;       int i=3;
  139.    ;   
  140.     ?debug  L 12
  141.    ;   
  142.    ;       i=silnia(i);
  143.    ;   
  144.     ?debug  L 13
  145.    ;    Przypisanie wartości 3 do rejestru ax.
  146.     mov ax,3
  147.    ;    Odłożenie na stos wartości rejestru ax (ax = 3).
  148.     push    ax
  149.    ;    Wywołanie funkcji silnia - odłożenie na stos ip_silnia.
  150.     call    near ptr _silnia
  151.    ;    Przesunięcie wskaźnika stosu o 2, usuniecie miejsca na zmienna tymczasową.
  152.     add sp,2
  153.    ;    Przypisanie wartości rejestru ax do miejsca na stosie gdzie znajduje sie wartość 3 (ax = 6).
  154.     mov word ptr [bp-2],ax
  155.    ;   
  156.    ;       printf("%d",i);
  157.    ;   
  158.     ?debug  L 14
  159.    ;    Odłożenie wartości rejestru ax na stos (ax = 6).
  160.     push    ax
  161.    ;    Przypisanie do rejestru ax wskaźnika do danych zawierających napis '%d'.
  162.     mov ax,offset DGROUP:s@
  163.    ;    Odłożenie wartości rejestru ax na stos
  164.     push    ax
  165.    ;    Wywołanie funkcji printf - funkcja przyjmuje zmienna liczbę parametrów,
  166.    ;   zależnie od tekstu do wyświetlenia. W tym przypadku 2 parametry.
  167.     call    near ptr _printf
  168.    ;    Przesunięcie wskaźnika sp na początek  
  169.     add sp,4
  170.    ;   
  171.    ;    }
  172.    ;   
  173.     ?debug  L 15
  174.    ;    Przypisanie wartosci rejestru bp do rejestru sp.
  175.     mov sp,bp
  176.    ;    Zdjęcie bp ze stosu.
  177.     pop bp
  178.    ;    Zdjęcie ip_main ze stosu i zakończenie programu.
  179.     ret
  180.     ?debug  C E601690402FEFF010C00
  181.     ?debug  E
  182.     ?debug  E
  183. _main   endp
  184.     ?debug  C E9
  185.     ?debug  C FA10030000
  186. _TEXT   ends
  187. _DATA   segment word public 'DATA'
  188. s@  label   byte
  189.     db  '%d'
  190.     db  0
  191. _DATA   ends
  192. _TEXT   segment byte public 'CODE'
  193. _TEXT   ends
  194.     public  _main
  195.     public  _silnia
  196.     extrn   _printf:near
  197. _s@ equ s@
  198.     ?debug  C EA0109
  199.     ?debug  C E31800000023010000
  200.     ?debug  C EC055F6D61696E181800
  201.     ?debug  C E319000000230A0000
  202.     ?debug  C EC075F73696C6E6961191800
  203.     ?debug  C E31A00000023040001
  204.     ?debug  C EB075F7072696E74661A00
  205.     ?debug  C E60666706F735F740606021F000673697A655F74+
  206.     ?debug  C 0A06021A00
  207.     end
  208. 
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement