Asembler. Leksykon kieszonkowy

Table of contents :
1. Podstawowe informacje (7)

1.1. Słowem wstępu (7)
1.2. Architektura x86 - podstawowe informacje (10)
1.3. Budowa programu dla podsystemu DOS (16-bitowego) (13)
1.4. Budowa programu dla systemu Windows (32-bitowego) (15)
2. Podstawowe instrukcje procesora (18)

2.1. Instrukcja kopiowania i instrukcje arytmetyczne (18)
2.2. Instrukcje logiczne i przesunięć bitowych (20)
2.3. Instrukcje wywołania procedury i powrotu (26)
2.4. Instrukcja porównania i instrukcje skoku (29)
2.5. Instrukcje do operacji na łańcuchach znaków (30)
3. Makroinstrukcje (35)

3.1. Makroinstrukcje kontroli przepływu (35)
3.2. Makroinstrukcje do tworzenia pętli (36)
4. Praca z danymi (39)

4.1. Adresowanie i wskaźniki (39)
4.2. Zmienne i stałe (41)
4.3. Praca ze strukturami (42)
5. Programowanie w systemie Windows (45)

5.1. Konsola w systemie Windows (45)
5.2. Proste okno dialogowe (47)
5.3. Odczyt myszki i klawiatury (51)
5.4. Operacje na plikach i alokacja bloków pamięci (52)
5.5. Tworzenie menu (55)
5.6. Kontrolka przycisku (Button) (56)
5.7. Kontrolka pola tekstowego (Edit) (57)
5.8. Kontrolka wielokrotnego wyboru (CheckBox) (60)
5.9. Kontrolka pojedynczego wyboru (RadioButton) (62)
5.10. Kontrolka listy rozwijanej (ComboBox) (62)
5.11. Kontrolka listy (ListBox) (64)
5.12. Kontrolka paska postępu (ProgressBar) (65)
5.13. Kontrolka widoku drzewa (TreeView) (66)
5.14. Kontrolka widoku listy (ListView) (68)
5.15. Kontrolka suwaka (TrackBar) (70)
5.16. Kontrolka podpowiedzi (Tooltip) (71)
5.17. Kontrolka do wprowadzania adresu IP (IPAddress) (78)
5.18. Kontrolka tekstu o bogatym formatowaniu (RichEdit) (83)
5.19. Kontrolki w nowym stylu (pliki .manifest) (85)
5.20. Podpięcia do systemu Windows (Hooks) (87)
5.21. Ekran powitalny (Splashscreen) (89)
5.22. Ikona w zasobniku systemowym (Tray) (91)
5.23. Podmiana procedury obsługi okna (93)
5.24. Programowanie aplikacji wielowątkowych (95)
5.25. Tworzenie bibliotek DLL (97)
5.26. Pliki odwzorowane w pamięci (99)
5.27. Pobieranie adresu IP lokalnego komputera (99)
6. Dodatkowe zestawy instrukcji (102)

6.1. Korzystanie z instrukcji koprocesora (FPU) (102)
6.2. Korzystanie z rozszerzeń MMX i SSE (110)
6.3. Nowe rozszerzenie - Advanced Vector Extensions (AVX) (118)
7. Asembler 64-bitowy (x86-64) (120)

7.1. Wstęp do Asemblera dla architektury 64-bitowej (120)
8. Opis rozkazów procesorów z rodziny 80x86 (125)

8.1. Instrukcje na literę A (125)
8.2. Instrukcje na literę B (128)
8.3. Instrukcje na literę C (132)
8.4. Instrukcje na literę D (137)
8.5. Instrukcje na literę E (139)
8.6. Instrukcje na literę H (139)
8.7. Instrukcje na literę I (140)
8.8. Instrukcje na literę J (143)
8.9. Instrukcje na literę L (144)
8.10. Instrukcje na literę M (148)
8.11. Instrukcje na literę N (151)
8.12. Instrukcje na literę O (152)
8.13. Instrukcje na literę P (154)
8.14. Instrukcje na literę R (156)
8.15. Instrukcje na literę S (160)
8.16. Instrukcje na literę T (168)
8.17. Instrukcje na literę V (169)
8.18. Instrukcje na literę W (169)
8.19. Instrukcje na literę X (170)
9. Dyrektywy asemblera MASM (172)

9.1. Etykiety kodu (172)
9.2. Warunkowa kontrola przepływu (173)
9.3. Alokacja danych (175)
9.4. Przyrównania (177)
9.5. Makra (177)
9.6. Procedury (178)
9.7. Rodzaj zestawu instrukcji procesora (179)
9.8. Bloki powtórzeń (182)
9.9. Zakres (183)
9.10. Segmenty (184)
9.11. Uproszczone segmenty (185)
9.12. Łańcuchy znaków (187)
9.13. Struktury i rekordy (188)
9.14. Różne (189)
Dodatki (192)

A. Tablica kodów ASCII (192)

B. Potęgi liczby dwa (193)

C. Lista opkodów procesora 80x86 (196)

Skorowidz (202)

Citation preview

Poznaj A sem blera i do łącz do elity program istów D o w ie d z się, ja k je st z b u d o w a n y i ja k d z iała p ro c e s o r Po z n a j ję z y k A se m b le r i n a rz ę d z ia u m o ż liw ia ją c e tw o rz e n ie w nim p ro g ra m ó w N a u c z s ię p is a ć w y d a jn y k o d d z ia ła ją c y w s y s te m a c h D O S i W in d o w s

D A W ID F A R B A N I E C

551. £

Spis treści

1.

2.

3.

4.

5.

Podstawowe informacje

7

1.1. Słowem wstępu 1.2. Architektura x86 — podstawowe informacje 1.3. Budowa programu dla podsystemu DOS (16-bitowego) 1.4. Budowa programu dla systemu Windows (32-bitowego)

7 10 13 15

Podstawowe instrukcje procesora

18

2.1. Instrukcja kopiowania i instrukcje arytmetyczne 2.2. Instrukcje logiczne i przesunięć bitowych 2.3. Instrukcje wywołania procedury i powrotu 2.4. Instrukcja porównania i instrukcje skoku 2.5. Instrukcje do operacji na łańcuchach znaków

18 20 26 29 30

M akroinstrukcje

35

3.1. Makroinstrukcje kontroli przepływu 3.2. Makroinstrukcje do tworzenia pętli

35 36

Praca z danymi

39

4.1. Adresowanie i wskaźniki 4.2. Zmienne i stałe 4.3. Praca ze strukturami

39 41 42

Programowanie w systemie W indows

45

5.1. Konsola w systemie Windows 5.2. Proste okno dialogowe 5.3. Odczyt myszki i klawiatury 5.4. Operacje na plikach i alokacja bloków pamięci 5.5. Tworzenie menu 5.6. Kontrolka przycisku (Button) 5.7. Kontrolka pola tekstowego (Edit) 5.8. Kontrolka wielokrotnego wyboru (CheckBox)

45 47 51 52 55 56 57 60

3

5.9. Kontrolka pojedynczego wyboru (RadioButton) 5.10. Kontrolka listy rozwijanej (ComboBox) 5.11. Kontrolka listy (ListBox) 5.12. Kontrolka paska postępu (ProgressBar) 5.13. Kontrolka widoku drzewa (TreeView) 5.14. Kontrolka widoku listy (ListView) 5.15. Kontrolka suwaka (TrackBar) 5.16. Kontrolka podpowiedzi (Tooltip) 5.17. Kontrolka do wprowadzania adresu IP (IPAddress) 5.18. Kontrolka tekstu o bogatym formatowaniu (RichEdit) 5.19. Kontrolki w nowym stylu (pliki .manifest) 5.20. Podpięcia do systemu Windows (Hooks) 5.21. Ekran powitalny (Splashscreen) 5.22. Ikona w zasobniku systemowym (Tray) 5.23. Podmiana procedury obsługi okna 5.24. Programowanie aplikacji wielowątkowych 5.25. Tworzenie bibliotek DLL 5.26. Pliki odwzorowane w pamięci 5.27. Pobieranie adresu IP lokalnego komputera 6.

7.

8.

4

|

62 62 64 65 66 68 70 71 78 83 85 87 89 91 93 95 97 99 99

Dodatkowe zestaw y instrukcji

102

6.1. Korzystanie z instrukcji koprocesora (FPU) 6.2. Korzystanie z rozszerzeń MMX i SSE 6.3. Nowe rozszerzenie —Advanced Vector Extensions (AVX)

102 110 118

Asembler 64 -bitow y (x86-64)

120

7.1. Wstęp do Asemblera dla architektury 64-bitowej

120

Opis rozkazów procesorów z rodziny 80x86

125

8.1. Instrukcje na literę A 8.2. Instrukcje na literę B 8.3. Instrukcje na literę C 8.4. Instrukcje na literę D 8.5. Instrukcje na literę E 8.6. Instrukcje na literę H 8.7. Instrukcje na literę I 8.8. Instrukcje na literę J 8.9. Instrukcje na literę L 8.10. Instrukcje na literę M 8.11. Instrukcje na literę N

125 128 132 137 139 139 140 143 144 148 151

Asembler. Leksykon k eszonkowy

8.12. 8.13. 8.14. 8.15. 8.16. 8.17. 8.18. 8.19. 9.

Instrukcje na literę O Instrukcje na literę P Instrukcje na literę R Instrukcje na literę S Instrukcje na literę T Instrukcje na literę V Instrukcje na literę W Instrukcje na literę X

152 154 156 160 168 169 169 170

Dyrektywy asemblera M A SM

172

9.1. Etykiety kodu 9.2. Warunkowa kontrola przepływu 9.3. Alokacja danych 9.4. Przyrównania 9.5. Makra 9.6. Procedury 9.7. Rodzaj zestawu instrukcji procesora 9.8. Bloki powtórzeń 9.9. Zakres 9.10. Segmenty 9.11. Uproszczone segmenty 9.12. Łańcuchy znaków 9.13. Struktury i rekordy 9.14. Różne

172 173 175 177 177 178 179 182 183 184 185 187 188 189

Dodatki

192

A.

Tablica kodów ASCII

192

B.

Potęgi liczby dw a

193

C.

Lista opkodów procesora 80x86

196

Skorow idz

202

Sp s treśc

|

5

6

j

Asem bler. Leksykon k eszonkow y

Rozdział 1. Podstawowe informacje 1.1. Słowem wstępu Witaj! Zapraszam do lektury leksykonu języka Asembler. N iektórzy z pewnością się zastanawiają, dlaczego warto poznać właśnie Asembler. M ówi się, że program y pisane w tym języku są znane z tego, iż są m ałe i szybkie. I rzeczywiście takie właśnie są, a to dlatego, że m ają taki kod, jaki m y sami stworzym y, a nie taki, jaki zostanie przetłu­ maczony przez kompilator. Co ważne, nie posiadają również zbędnych bibliotek. Na jednym z wykładów z programowania niskopoziomowego usłyszałem kiedyś istotną uwagę: programista piszący w językach wysokiego poziomu żyje w swoim własnym świecie i nie ma pojęcia, co się tak naprawdę dzieje w środku. Dzięki programowaniu w Asemblerze m ożem y zrozumieć, jak działa procesor czy jak jest zbudow any pro­ gram, i nauczyć się w y k orzy sty w ać jeszcze inne aspekty niskopoziom owego program owania, o których program ista zajm ujący się je­ dynie pisaniem na przykład w Javie nie m a w ogóle pojęcia. Dlatego każdy szanujący się programista powinien poznać przynajmniej pod­ stawy Asemblera.

Podstawowe pojęcia Asem bler (wielką literą) — niskopoziom ow y język programowania. asem bler (małą literą) — program przeprow adzający proces asemblacji, po którym otrzym ujem y plik *.obj. Konsolidator (ang. linker) — program , który po przeprow ad zeniu wcześniejszej asemblacji dokonuje konsolidacji, czyli łączenia. W wyni­ ku jego działania otrzym ujem y plik w ykonyw alny *.exe. Odpluskwiacz (ang. debugger) — program do w yszukiw ania błędów w programach. Przedstaw ia kod program u w Asem blerze i pozwala w ykonyw ać go instrukcja po instru k cji, co u łatw ia analizę aplikacji i w ykryw anie błędów.

7

Potrzebne narzędzia Podczas pisania leksykonu używałem asemblera MASM, który można pobrać za darmo ze strony http://masm32.com/, oraz środow iska pro­ gram istycznego W inAsm , które również jest dostępne bezpłatnie na stronie http://w inasm .net/. Do szukania błędów i analizy naszych pro­ gramów m oże się przydać debugger — ja polecam Olly Debugger (http://ollydbg.de/). N a początku należy zainstalow ać pakiet M ASM 32, następnie środo­ wisko W inAsm (przy czym kolejność jest tu istotna), a później można jeszcze doinstalow ać w ym ieniony wcześniej Olly Debugger. W ażne jest, aby w środowisku W inAsm odpowiednio ustawić ścieżki. Aby to zrobić, n ależy w y b rać w górnym m enu Tools/Options/Files & Paths. Przykładow e ścieżki przedstawiam na rysunku 1.1.

Options General [ Files & Paths pEditor

Intellisense | KeyWords

Binary Path

V*1asm32^in

Indude Path

yiasm32\[ndude

Library Path

Wasm32\Jb

Keyword File

^WinASM\>24) & 0 x ff ) ((a>>16) & 0 x ff) ((a>>8) & 0 x ff) (a & 0 x ff )

N a powyższym listingu w idać zdefiniow ane makra, które m ożemy łatwo przepisać na Asembler:

78

|

Asembler. Leksykon k eszonkowy

.d a ta dwAddr dword 0 F i r s t dword 0 Second dword 0 T h ird dword 0 Fo urth dword 0 .d a ta ? s t r F i r s t db ? strSe co n d db ? s t r T h ir d db ? s tr F o u r th db ? (...)

; p ierw sza część adresu IP mov eax, dwAddr s h r eax, 24 mov [ F i r s t ] , eax invo ke dwtoa, eax, addr s t r F i r s t

; druga część adresu IP mov eax, dwAddr s h r eax, 16 and eax, 255 mov [S e c o n d ], eax invo ke dwtoa, eax, addr strSe co n d

; trzecia część adresu IP mov eax, dwAddr s h r eax, 8 and eax, 255 mov [ T h i r d ] , eax invo ke dwtoa, eax, addr s t r T h ir d

; czw arta część adresu IP mov eax, dwAddr and eax, 255 mov [ F o u r t h ] , eax invo ke dwtoa, eax, addr s tr F o u r th

Krótko mówiąc, do rejestru EAX kopiujemy wartość DWORD z adresem IP (dwAddr). Następnie wykonujemy odpowiednie operacje. Potem kopiu­ jemy zm ienioną w artość z EAX do zmiennej DWORD. W reszcie, za pom o­ cą funkcji dwtoa, zam ieniam y przekształconą w artość w rejestrze EAX na tekst i kopiujem y do zmiennej. Teraz w zm iennych F irst, Second, Third i Fourth m am y poszczególne części adresu IP w postaci liczby, a w zm iennych s trF irs t, strSecond, strThird i strFourth znajdują się poszczególne części adresu IP jako tekst.

Rozdz ał 5. Programowan e w system e W ndows

|

79

Ustawianie nowego adresu IP w kontrolce Do tej czynności posłuży nam kom unikat IPM_SETADDRESS. N ajpierw jednak m usim y w jakiś sposób połączyć poszczególne części adresu IP i zapisać je jako w artość typu DWORD (czynność odw rotna do om ó­ wionej powyżej). W plikach nagłów kow ych C + + m ożem y znaleźć zadeklarow ane makro: # d e fin e MAKEIPADDRESS(b1, b2, b3, b4) ( (LPARAM)( ((DWORD)(b1)