Advertisement
Guest User

sum.S

a guest
Apr 13th, 2017
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SECTION .data
  2. cyferka dw 5; definuje slowo (16 bitow) o wartosci 00 05 hex
  3. JoString db "Pozdrawiam mirko tego typu %d",0Ah,0; napis,enter, nullbyte
  4. SECTION .text
  5. global sum ;sum jest adresem na początek naszej funkcji
  6. global lazly_sum_call; inna funkcja globalna
  7. global wielkie_jo;
  8. extern lazly_sum;
  9. extern printf
  10. sum:
  11.         PUSH EBP; wrzucamy na stos ramkę stosu porzedniej funkcji
  12.         MOV EBP,ESP ; i uzupelniamy ja na swoje potrzeby, ten przyklad jest prozaiczny ale pozniej zobaczysz ze to ma sens
  13.         MOV EAX,[EBP+8] ;przed  wywyłaniem sum z poziomu kodu w C na stos odłożono wartości a i b
  14.         ADD EAX,[EBP+12]; te 2 linijki zanczą tyle co EAX=a;EAX=EAX+b;
  15.         POP EBP; zdejmujemy ramkę ze stosu, jak widać jej wrzucanie tu nie ma sensu, ale szanujemy "prolog" i "epilog" funckji.
  16.         RET ; zdejmij ze stosu gdzie masz wrócić i tam wróć
  17.  
  18. lazly_sum_call:
  19.         PUSH EBP;
  20.         MOV EBP,ESP; prolog
  21.         MOV EAX,[EBP+8];
  22.         PUSH EAX; dzieją tu się ważne rzeczy, wskaźnik ESP zmiejsza się o 4 po wrzuceniu na stos zawartości rejestru EAX, przez co niewygodne było by nie zastosowanie prologu
  23.         MOV EAX,[EBP+12]; Bez prologu był by burdel
  24.         PUSH EAX;       zaladowalismy na stos 2  zmienne
  25.         CALL lazly_sum ; i wołamy kod zdefiniowanyw w C
  26.         ADD ESP,8; sprytnie przenosimy stos o 2 pozycje do góry czyszcząc go tym samym
  27.         POP EBP ; epilog
  28.         RET
  29. wielkie_jo:
  30.         PUSH EBP;
  31.         MOV EBP,ESP;
  32.         MOVSX EAX,WORD[cyferka]; pobierz cyferke
  33.         INC EAX; zwiększ eax o 1
  34.         MOV [cyferka],AX; zwróc uwagę że nie mówie jakiej wielkości jest dana pod cyferka w prost, do tego służy rozmiar rejstru AX który ma 16 bitow
  35.         PUSH EAX; i na stos z cyferka
  36.         PUSH JoString; wrzuć na stos adres początku napisu dla printfa
  37.                 ;zwróć uwagę że wygląda: prinft(format,dane); a my wrzucamy w odwrotnej kolejnosci
  38.         CALL printf;
  39.         ADD ESP,8; sprzątanie stosu
  40.         POP EBP;
  41.         RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement