Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SECTION .data
- cyferka dw 5; definuje slowo (16 bitow) o wartosci 00 05 hex
- JoString db "Pozdrawiam mirko tego typu %d",0Ah,0; napis,enter, nullbyte
- SECTION .text
- global sum ;sum jest adresem na początek naszej funkcji
- global lazly_sum_call; inna funkcja globalna
- global wielkie_jo;
- extern lazly_sum;
- extern printf
- sum:
- PUSH EBP; wrzucamy na stos ramkę stosu porzedniej funkcji
- MOV EBP,ESP ; i uzupelniamy ja na swoje potrzeby, ten przyklad jest prozaiczny ale pozniej zobaczysz ze to ma sens
- MOV EAX,[EBP+8] ;przed wywyłaniem sum z poziomu kodu w C na stos odłożono wartości a i b
- ADD EAX,[EBP+12]; te 2 linijki zanczą tyle co EAX=a;EAX=EAX+b;
- POP EBP; zdejmujemy ramkę ze stosu, jak widać jej wrzucanie tu nie ma sensu, ale szanujemy "prolog" i "epilog" funckji.
- RET ; zdejmij ze stosu gdzie masz wrócić i tam wróć
- lazly_sum_call:
- PUSH EBP;
- MOV EBP,ESP; prolog
- MOV EAX,[EBP+8];
- 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
- MOV EAX,[EBP+12]; Bez prologu był by burdel
- PUSH EAX; zaladowalismy na stos 2 zmienne
- CALL lazly_sum ; i wołamy kod zdefiniowanyw w C
- ADD ESP,8; sprytnie przenosimy stos o 2 pozycje do góry czyszcząc go tym samym
- POP EBP ; epilog
- RET
- wielkie_jo:
- PUSH EBP;
- MOV EBP,ESP;
- MOVSX EAX,WORD[cyferka]; pobierz cyferke
- INC EAX; zwiększ eax o 1
- 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
- PUSH EAX; i na stos z cyferka
- PUSH JoString; wrzuć na stos adres początku napisu dla printfa
- ;zwróć uwagę że wygląda: prinft(format,dane); a my wrzucamy w odwrotnej kolejnosci
- CALL printf;
- ADD ESP,8; sprzątanie stosu
- POP EBP;
- RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement