Witam ! Ten tekst pozwoli wam troszke lepiej zrozumiec kod assemblera, (nie nauczycie sie jak pisac w assemblerze, lecz zrozumiecie co sie dzieje w kodzie) Jest to zbior instrukcji itp. taka mala sciaga (sklecona z kilku tekstow, a takze dodane od siebie) co i jak, gdy zaczynalem bardzo mi sie przydawala, wiec i tobie nie zaszkodzi jak przeczytasz, a napweno kilka razy tu zagladniesz podczas analizowania kodu. Wiec jesli podczas sledzenia kodu nie bedziesz wiedzial co robi jakas instrukcja zagladnij tutaj, moze ja znajdziesz ! Jesli czegos nie rozumiesz, nie martw sie, przeczytaj to drugi raz i jescze raz, poszukaj, poprobuj i jak Ci dalej nie wychodzi to... masz pecha... zartowalem wy macie szczescie, bo macie NAS, a my postaramy sie wam wszystko wytlumaczyc, lub nakierowc co gdzie i jak ! {Tak na marginesie, mysle ze nie ma jako takich dobrych kursow w sieci czy to Asma, C, C++ itd. Bo po co ktos mialby pisac cos takiego, ani za to kasy nie dostanie, ani nic <bardzo powoli zaczyna sie wydawanie ksiazek w internecie> no chyba ze ktos zeskanuje ksiazke i umiesci ja w sieci wtedy jest to dobry material, ale najczesciej sa to ksiazki po angielsku. Wiec jesli chcesz sie czegos nauczyc, a w szczegolnosci jezyka programowania np. C++, czy assemblera to kup sobie ksiazke i sie ucz. Na pewno stracisz mniej czasu niz czytanie 10 tekstow z sucha teoria i kazda o tym samym} SPIS TRESCI: 1. [REJESTR] 2. [BUDOWA REJESTROW EAX, EBX, ECX, EDX] 3. [FLAGI] 4. [OPERACJE ARYTMETYCZNE] 5. [ADD] 6. [SUB] 7. [MUL] 8. [DIV] 9. [STOS i PUSH/POP] 10. [MOV] 11. [XOR] 12. [AND] 13. [CALL] 14. [CMP] 15. [TEST] 16. [LOOP] 17. [NOP] 18. [NOT] 19. [OR] 20. [ROL] 21. [ROR] 22. [RET] 23. [SHL] 24. [SHR] 25. [XCHG] 26. [BSWAP] 27. [MOV EAX, [ESI+1] itd] 28. [TABELKA SKOKOW] 29. [Komendy SI] 30. [FUNKCJE API] -------------------------------------------------------------------------------------------- [REJESTR] AX - G��wnie wykorzystywany do operacji logicznych i arytmetycznych. BX - Wykorzystywany przy adresowaniu pami�ci. CX - S�u�y jako licznik DX - Wykorzystywany do mno�enia i dzielenia lub do wysy�ania i odbierania danych z port�w. SI - Indeksuje pami�� oraz wskazuje obszar, z kt�rego przysy�ane s� dane. DI - Indeksuje pami�� oraz wskazuje obszar, do kt�rego wysy��my dane. SP - Wska�nik stosu. BP - S�u�y do adresowania pami�ci. S� to rejestry 16 bitowe. Pierwsze cztery dziel� sie na dwa 8 bitowe. np. AX - AL i AH. S� jeszcze cztery rejestry segmentowe : CS - Zawiera segment aktualnie wykonywanego rozkazu. DS - rejestr wskazujacy poczatek segmentu danych ES - rejestr dodatkowu wskazujacy dodatkowy segment danych SS - rejestr stosu wskazuje poczatek segmentu stosu Takze pary rejestrow: DS:SI ; Moze byc uzyta jako zrodlo do operacji na stringach ES:DI ; Uzywana jako cel przy operacjach na stringach ;) -------------------------------------------------------------------------------------------- [BUDOWA REJESTROW EAX, EBX, ECX, EDX] E AX =========================== | | AH | AL | =========================== tak wiec jesli np: w EAX=00123456 to: E AX ============ |0012|34|56| ============ AH AL (juz teraz bedziesz wiedzial jak wykona sie XCHG EAX {XCHG-opis w dalszej czesci}) -------------------------------------------------------------------------------------------- [FLAGI] Jest jeszcze rejestr znacznik�w. Jest to 9 bit�w, kt�re informuj� o stanie procesora. Niekt�re z nich mo�emy ustawi�, a niekt�re tylko odczytywa�. Te znaczniki (flagi) to : O - Jest ustawiany, gdy wyst�pi nadmiar w operacjach arytmetycznych. D - Okre�la czy dane b�d� przesy�ane w kolejno�ci adres�w malej�cych lub rosn�cych. I - Okre�la czy przewanie sprzetowe ma zosta� wykonane natychmiast, czy dopiero po sko�czeniu wykonywania programu. T - Znacznik pracy krokowej. S - Zawiera znak ostatnio wykonanej operacji arytmetycznej. Z - Zostaje ustawiony je�li wynik ostatniej operacji r�wny byl zero. A - Znacznik przeniesienia po��wkowego. P - Znacznik parzysto�ci. C - Znacznik przeniesienia. -------------------------------------------------------------------------------------------- [OPERACJE ARYTMETYCZNE] Do wykonywania operacji arytmetycznych w assemblerze s�u�� nast�puj�ce instrukcje: ADD rejestr,zmienna - Dodanie do rejestru zmiennej SUB rejestr,zmienna - Odj�cie od rejestru zmiennej MUL rejestr lub zmienna - Mno�enie DIV rejestr lub zmienna - Dzielenie INC rejestr - Zwi�kszenie rejestru o 1 DEC rejestr - Zmniejszenie rejestru o 1 W przypadku mno�enia drugi czynnik musi znajdowa� si� w rejestrze AL, natomiast wynik mno�enia b�dzie w AX. W przypadku dzielenia, dzielna powinna znajdowa� si� w rejestrze AX, natomiast wynik b�dzie w AH. -------------------------------------------------------------------------------------------- [ADD] dodawanie (do rejestru wartosci zmiennej) np: EAX=00000000 ADD EAX, 32 po wykonaniu EAX=00000032 -------------------------------------------------------------------------------------------- [SUB] odejmowanie (od rejestru wartosci zmiennej) EAX=00000009 SUB EAX, 2 EAX=00000007 -------------------------------------------------------------------------------------------- [MUL] skladnia MUL'a w przykladzie: MUL ma tylko jeden parametr, drugi przyjmuje domyslnie jako AL. Wiec np. MUL CL spowoduje dzialanie AL*CL, a wynik wyladuje w AX operacja mnozenia. Przykladzik (mamy taki kawalek kodu): MOV AL, 5 MOV AH, 20 MUL AH, AL Po takim ciagu instrukcji w AX znajdzie sie wartosc A0H. -------------------------------------------------------------------------------------------- [DIV] operacja dzielenia. Przykladzik (mamy taki kawalek kodu): MOV AX, 45 MOV DL, 4 DIV DL Po takim kawalku kodu w rejestrze AL bedzie 11 a w AH reszta z dzielenia czyli 1. -------------------------------------------------------------------------------------------- [STOS i PUSH/POP] Zanim jakakolwiek funkcja zostanie wywolana (call), program musi 'polozyc' kazdy parametr ktorego funkcja oczekuje, na stosie.Pomysl o tym jak o stosie kartek, pierwsza kartka (od dolu ;) bedzie podniesiona jako ostatnia - stos dziala tak samo.Musisz to zapamietac ta zasade 'pierwszy polozony/ostatni zdjety' , znaczy to ze parametry bede "polozone" w odwrotnej kolejnosci ... Jesli namieszalem Ci moim gadaniem to popatrz na przykald: Funkcja API - GetWindowText wymaga nastepujacych parametrow: (1) Uchwyt okna (2) Identyfikator editboxa (3) Adres bufora tekstowego (4) Maksymalna dlugosc tekstu W programie bedzie to wygladalo tak: MOV EDI,[ESP+00000220] ; Zachowaj uchwyt okna w EDI PUSH 00000100 ; PUSH (4) Maksymalna dlugosc tekstu PUSH 00406130 ; PUSH (3) Adres bufora tekstowego PUSH 00000405 ; PUSH (2) Identyfikator editboxa PUSH EDI ; PUSH (1) Uchwyt okna CALL GetWindowText ; CALL (wywolaj) funkcje Proste nie ? To jest najprostszy sposob na zlamanie proga ktory jest zabezpieczony serialem, Jesli znasz adres bufora dla (wpisanego) seriala, w tym przypadku 00406130, poprostu ustaw na nim pulapke, i czekaj az wyladujesz w procedurze generujacej prawdziwy serial :) POP jest uzywane do 'zdjecia' pierwszej wartosci ze stosu, zazwyczaj jest ich duzo w funkcjach -------------------------------------------------------------------------------------------- [MOV] MOV dest,src Kopiuje bajt lub slowo ze src do dest MOV EAX, 10 po wykonaniu EAX=00000010 -------------------------------------------------------------------------------------------- [XOR] XOR -alternatywa logiczna. Mysle ze dzialanie tej komendy najlepiej przedstawic na przykladzie. Ale najpierw tabelka z matematyki (logika i te sprawy :)) ==================================== | A | B | C == XOR A B | ==================================== | 1 | 1 | 0 | ==================================== | 1 | 0 | 1 | ==================================== | 0 | 1 | 1 | ==================================== | 0 | 0 | 0 | ==================================== Powinniscie juz skumac o co biega w xorowaniu. Ale na wszelki wypadek dam jeszcze z jeden przykladzik na xorowanie (tak zupelnie na wszelki wypadek ;)) Wiec zalozmy ze mamy przed soba taki kawalek kodu programu: MOV AL,0D2 (binarnie jest to: 11010010B) MOV BL,9B (binarnie jest to: 10011011B) ------------------------------------------ XOR AL,BL --------------> 01001001B wynik XOR'owanie umieszczony zostanie w AL (gdzyby bylo XOR BL,AL to wynik umieszczony zostalby w BL) a jest nim 01001001B. Mysle ze teraz juz wszystko jasne :) Ta instrukcja czesto uzywana jest do zerowania rejestrow, gdyz jak widzimy (tabelka powyzej) 1 XOR 1 lub 0 XOR 0 daje zawsze zero wiec: XOR EAX, EAX Zawsze po wykonaniu EAX=00000000 -------------------------------------------------------------------------------------------- [AND] iloczyn logiczny ... i tabelka z matmy (logika of kozzz :)) ==================================== | A | B | C == AND A B | ==================================== | 1 | 1 | 1 | ==================================== | 1 | 0 | 0 | ==================================== | 0 | 1 | 0 | ==================================== | 0 | 0 | 0 | ==================================== Dokladniejszy opis przy xorowaniu ... jak tamto skumacie to to tez powinniscie :> -------------------------------------------------------------------------------------------- [C...
Scorpik