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\
API Functions
^WinASMV^piV^asmApiCall.vaa
API Structures
^WinAsm\APIV^asmApiStruct. vaa
API Constants
y
Help File
Vwlasm32\ielp\Win32. hip
Projects Path
y/VinAsm
Colors
Miscellaneous |
Li LI i LI LI L □ ]
|
OK
u L
[ Cancel |
Rysunek 1.1. Ścieżki do katalogów w środowisku WinAsm Najważniejsze jest to, aby po uruchomieniu środowiska WinAsm u góry znajdowały się takie przyciski jak na rysunku 1.2.
Rysunek 1.2. Przyciski asemblacji, konsolidacji i uruchamiania środowiska WinAsm
8
|
Asembler. Leksykon k eszonkowy
Idąc od lewej do praw ej, pierw szy przycisk dokonuje asemblacji, drugi linkowania, trzeci wykonuje obie te czynności naraz, czwarty urucham ia gotow y program , a piąty kończy działanie programu.
Systemy liczbowe Do program ow ania w A sem blerze na pew no p rzyd a się w iedza o d w óch dodatkow ych system ach liczbow ych (prócz dziesiętnego): dwójkowym (binarnym ) i szesnastkowym (heksadecym alnym ). Po niżej zam ieszczam skrótowy opis: • System binarny — podstawą systemu są dwie cyfry: 0 i 1. W sys temie binarnym działa kom puter i jest zap isy w an y kod pro gramu. Przyjęło się, że liczby są zapisyw ane z literą b na końcu (np. 10001011b). • System heksadecymalny — podstawą są tu cyfry od 0 do 9 i litery od A do F (w sumie szesnaście znaków). Dla człowieka jest on o wiele wygodniejszy od systemu binarnego. Liczby w tym syste mie przyjęło się zapisyw ać z literą h na końcu (np. 23E0B3h). To w szystko na tem at system ów liczbowych. W arto jednak doczytać informacje na ich temat, a także nau czyć się je ręcznie przeliczać. Jednak w trakcie program ow ania zdecydow anie szybciej i wygodniej jest przeliczać te system y za pom ocą kalkulatora system u W indows.
Jednostki informacji pamięci komputerowej Do program ow ania w języku Asem bler przyda się znajom ość jedno stek informacji pamięci kom puterow ej, które są zw iązane rów nież z rozmiarem rejestrów procesora czy zm iennych w pamięci. W arto je zatem znać i um ieć je przeliczać. Bit — najm niejsza ilość informacji. Przyjm uje w artość 0 lub 1. Półbajt (ang. nibble) — są to 4 bity. W arto znać to określenie (nibble), bo m ożna je spotkać w artykułach w języku angielskim. Bajt — jest to 8 bitów. Jego m aksym alna w artość to 255d. Słowo (ang. word) — 2 bajty, czyli 16 bitów. M aksym alna w artość to 0FFFFh (lub 65535d). Podwójne słowo (ang. double word) — dwa słowa, czyli 4 bajty (32 bity). M aksym alna w artość to 0FFFFFFFFh (lub 4294967295d).
Rozdz ał 1. Podstawowe nformacje
|
9
Poczw órne słow o (ang. quad w ord) — cztery słow a, czyli 8 bajtów (64 bity). Kilobajt — 1024 bajty. M egabajt — 1024 kilobajty, 1 048 576 bajtów.
1.2. Architektura x86 — podstawowe informacje Jeżeli chcesz programować w Asemblerze x86, musisz bliżej poznać tę architekturę. Poniżej zostaną opisane najważniejsze rejestry procesora. W ytłum aczę także, czym jest stos.
Rejestry procesora Rejestry to kom órki pam ięci w ew nątrz procesora służące m u do w y konyw ania różnych operacji. W arto wspom nieć, że operacje na reje strach są o wiele szybsze niż na zm iennych w pam ięci. Istnieją cztery rejestry ogólnego przeznaczenia (rysunek 1.3): EAX, EBX, ECX i EDX. M ają one po 32 bity (4 bajty). Każdy z nich dzieli się na dwie części po 16 bitów. Są to: „starsze słowo" (HIGH-WORD) i „młodsze słowo" (LOW-WORD). Przyjrzyjm y się temu na przykładzie rejestru EAX: m łodsze słowo to rejestr AX, który z kolei dzieli się na dwa rejestry 8-bitow e: AH i AL. W arto też wspom nieć, że m ożem y używ ać tych rejestrów do czego chcemy, ale każdy z nich m a swoje specjalne przeznaczenie. Bity numerujemy od zera, czyli najmłodszy jest bit zerowy. To jednak nie wszystkie rejestry. Są jeszcze dwa rejestry indeksowe: EDI (rejestr przeznaczenia) i ESI (rejestr źródła), które dzielą się na DI i SI. U żyw a się ich do operacji na łańcuchach (np. na tekście). ESI przechowuje źródło (ang. source), a EDI — miejsce docelowe (ang. destina tion). Z kolei EBP (w skaźnik bazowy) i ESP (w skaźnik stosu) to rejestry wskaźnikow e; pierwszy z nich służy do ad resow ania, a drugi prze chowuje w skaźnik wierzchołka stosu. Jeżeli modyfikujemy zawartość rejestrów ESI, EDI, EBP lub ESP, musimy je przywrócić, zanim wrócimy do systemu Windows.
10
|
Asembler. Leksykon k eszonkowy
EAX ( A k u m u la t o r ) AX II.
31
11111 1
11 1 1
AL
AH
i i i i i
15
-------- r7--------0
S t a r s z e s ło w o
M ło d s z e s ło w o
EBX ( R e j e s t r bazow y) BX i i i 31
ii iiiii
i i
BH
i i
L5
S t a r s z e s ło w o
BL iii
i i i i i 7
0
M ło d s z e s ło w o
ECX (L i c z n i k ) cx i
CH
;............... ¡ m m i i i
M M I I I
15
31
S t a r s z e s ło w o
7
CL iiiiiii
0
M ło d s z e s ło w o
EDX ( R e je s t r d an y ch ) DX II II 1 1 II 1 1 1 1 1 1 1 31
1
5
DH ......
,
S t a r s z e s ło w o
DL
7
Li i i 111 0
1--------
M ło d s z e s ło w o
Rysunek 1.3. Rejestry ogólnego przeznaczenia Pozostałe rejestry to: • Rejestry segmentowe (16-bitowe): CS (ang. Code Segment), DS (ang. Data Segment), ES (ang. Extra Segm ent), SS (ang. S tack Segment), FS, GS. • Rejestr flag — EFLAGS (flagi, inaczej znaczniki, będą nas intere sować, gdy będziem y debugow ać swoje programy): • CF (ang. C arry Flag) — znacznik przeniesienia. Flaga zostaje ustaw iona, gdy p odczas d ziałania nastąpiło przeniesien ie z bitu najbardziej znaczącego poza dostępny zakres zapisu. W przeciwnym wypadku znacznik m a w artość zero. • PF (ang. Parity Flag) — znacznik parzystości. Jest ustawiany, gdy w wyniku wykonania działania liczba bitów o wartości 1 w mniej znaczącym bajcie jest parzysta. • AF (ang. A uxillary Flag) — znacznik przeniesienia pom ocni czego. Jest ustawiany, gdy nastąpiło przeniesienie z bitu numer 3 na bit num er 4 lub pożyczenie z bitu num er 4. Rozdz ał 1. Podstawowe nformacje
|
11
• ZF (ang. Zero Flag) — znacznik zerow y. Przyjm uje w artość 1, gdy wynikiem ostatnio wykonanego działania było zero. • SF (ang. Sign Flag) — znacznik zm iany znaku. Jest ustawiany, gdy najbardziej znaczący bit (czyli najstarszy bit, nazyw any bitem znaku) w otrzymanym wyniku równa się jeden. • OF (ang. Overflow Flag) — znacznik nadm iaru/przepełnienia. Jest ustaw iany, gdy w danym działaniu nastąpiło przeniesie nie na najstarszy bit lub pożyczenie z tego bitu. • TF (ang. Trap Flag) — jest ustaw iany przy debugowaniu. Pro cesor wyw ołuje w tedy tylko jedną instrukcję, a następnie do chodzi do przerwania, co pozwala dołączonemu debuggerowi zbadać program. • IF (ang. Interrupt Flag) — zezw olenie na przerwanie. • DF (ang. Direction Flag) — znacznik kierunku. • IOPL (ang. I/O Privilege Level) — informuje o priorytecie dostępu do portów wejścia-w yjścia. CPL (ang. Current Priority Level) m usi być większe lub równe od tego znacznika, aby program miał dostęp do portów wejścia-wyjścia. Dostępny tylko w pro cesorach 286 i nowszych. • NT (ang. N ested Task) — dostępny tylko w pro ceso rach 286 i nowszych. • RF (ang. Resume Flag) — znacznik wznowienia; dostępny tylko w procesorach 386 i nowszych. • VM (ang. Virtual 8086 M ode) — włączenie trybu wirtualnego; dostępny tylko w procesorach 386 i nowszych. • AC (ang. Alignment Check) — dostępny tylko w procesorach 486SX i nowszych. • VIF (ang. Virtual Interrupt Flag) — dostępny tylko w procesorach Pentium i nowszych. • VIP (ang. Virtual Interrupt Pending) — dostępny tylko w pro cesorach Pentium i nowszych. • ID (ang. Identification) — odczyt rodzaju procesora; dostępny tylko w procesorach Pentium i nowszych.
12
|
Asembler. Leksykon k eszonkowy
• Rejestry koprocesora: ST0...ST7 — do operacji na liczbach zm ien noprzecinkowych. • Rejestry M M X (64-bitowe): mm0...mm7. • Rejestry SSE (128-bitowe): xmm0...xmm7. • EIP — rejestr zawierający adres aktualnie wykonywanej instrukcji. To już wszystkie rejestry, które będą nas interesowały. Umiejscowienie znaczników w rejestrze EFLAGS zostało zaprezentowane na rysunku 1.4.
3lbo|29|28|27|26|25|24|23|22|212019181716N 14i: 14um £■7 e.u m zy . Z - _ ¡f ZT £ £ £ 3 S B Rysunek 1.4. Umiejscowienie znaczników w rejestrze EFLAGS
Stos Jest to część pam ięci, w której m ożna przechow yw ać różne dane, aby później m óc z nich skorzystać. Jak sam a nazw a wskazuje, w artości są układane jak na stosie. O statnia odłożona w artość będzie zdjęta jako pierwsza. M ożesz to sobie w yobrazić jako pudełko, do którego kładziesz kartki papieru. Ostatnia kartka jest w yciągana jako pierw sza. Instru kcja PUSH od kłada wartość na stos, natomiast POP zd ejm u je i zapisuje do rejestru/pam ięci.
1.3. Budowa programu dla podsystemu DOS (16-bitowego) W program ow aniu dla podsystem u DOS korzystam y z rejestrów 16bitow ych oraz rejestrów segm entowych. Z kolei do wykonywania różnych czynności, takich jak na przykład wyśw ietlanie tekstu czy operacje na plikach, korzystam y z przerw ań DOS oraz BIOS. Istnieją tutaj dwa rodzaje programów: program y typu COM (zajmują jeden segment, tj. 64 kB) oraz programy typu EXE. Warto również zaznaczyć, że programy 16-bitowe (DOS-owe) nie uruchomią się już na nowych, 64-bitowych system ach operacyjnych. Rozdz ał 1. Podstawowe nformacje
|
13
Budowa programu dla podsystemu DOS Budowa program u typu COM jest następująca: .model t i n y ; m od el p am ięci .d a ta
; dane .code .s ta r tu p
; instrukcje . e x it end
Natom iast budowa programu typu EXE wygląda tak: .model
sm all ; m odel p am ięci
. s ta c k
100h ; stos
.d a ta
; dane .code sta rt: mov
a x , @data ; p o b ie r z ad res segm entu danych
mov
d s, ax ; um ieść g o w rejestrze D S (Data Segment)
; instrukcje end s t a r t
Gotowe szablony aplikacji DOS-owych zawiera środowisko WinAsm. W ystarczy w ybrać z górnego menu File/New Project i przejść na za kładkę DOS.
Przerwania Jak już wspom niałem w e wstępie, program ow anie dla DOS-a opiera się na przerwaniach. Ogólna zasada wywoływania przerwań polega na um ieszczeniu w odpowiednim rejestrze num eru funkcji, a następnie wywołaniu odpowiedniego przerw ania za pom ocą instrukcji INT. Dla przykładu poniżej zamieszczam program typu EXE wyświetlający tekst na konsoli: .model
sm all
.s ta c k
100h
.d a ta msg
db " H e llo W o r ld !" ,1 3 ,1 0 ," $ " ; napis musi s ię kończyć znakiem $
.code sta rt:
14
mov
ax, @data
mov
d s, ax
mov
dx, o f f s e t
|
; po b ierz ad res segm entu danych ; i um ieść g o w rejestrze DS msg
; p o b ie r z ad res napisu do rejestru D X
Asembler. Leksykon k eszonkowy
; fu n kcja 09h w rejestrze A H oznacza ”wypisz tekst na stan dardow e w yjście” ; w ywołanie przerw an ia DO S o numerze 21h
mov
ah, 9
in t
21h
mov
ax, 0C07h
in t
21h
mov
ax, 4C00h
in t
21h
; fu n kcja 0Ch = ”odśwież bufor i czytaj ze standardowego wejścia' ; czeka na n aciśn ięcie klaw isza ; fu n k c ja w yjścia ; w ywołanie przerw an ia DO S o numerze 21h
end s t a r t
Obecnie mało kto pisze program y dla DOS-a w Asem blerze, ale po stanow iłem o tym wspom nieć, gdyż czasem może się to przydać (choćby na zajęciach na niektórych uczelniach w Polsce).
1.4. Budowa programu dla systemu Windows (32-bitowego) Przy program ow aniu dla system u D O S korzysta się z rejestrów 16-bitow ych oraz przerw ań, natom iast w program owaniu dla sys temu W indow s (32-bitowego) będziem y korzystać z 32-bitow ych re jestrów procesora oraz funkcji WinAPI. Jeżeli chodzi o pamięć, w pod systemie DOS były segmenty, tutaj natomiast mamy jeden typ pamięci — płaski (ang. flat). O znacza to, że pam ięć tworzy dużą, ciągłą prze strzeń o rozmiarze 4 GB. Budow a program u dla system u W indows: .386 ; zestaw instrukcji s t d c a ll
; m odel p a m ięci i sp osób wywoływania fu n kcji
.model
fla t,
o p tio n
casemap:none ; rozróżnianie m ałych i dużych liter
; p liki nagłów kow e in c l ude
w indo w s.inc
i ncl ude
k e rn el3 2 . in c
in c lu d e
u s e r3 2 .in c
; b iblioteki in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
.d a ta
; dan e zainicjow ane .d a ta ?
; dan e niezainicjow ane .code
; p o c z ą tek etykiety głów n ej ; instrukcje end s t a r t ; k o n iec etykiety głów n ej s ta rt:
Rozdz ał 1. Podstawowe nformacje
|
15
Program „Witaj, świecie!" Poniżej przedstawiam kod program u wyśw ietlającego okno infor macyjne poprzez w yw ołanie funkcji MessageBox. .386 .model
fla t,
o p tio n
casemap:none
i n clu d e
s t d c a ll
w indows.i nc
in c l ude
kernel 3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
kernel 3 2 . l i b
.d a ta MsgCaption db "In fo r m a c ja ",0 MsgBoxText db " W i t a j , ś w i e c i e ! " , 0 .d a ta ? .code s ta rt: invo ke MessageBox, NULL, addr MsgBoxText, addr M sgCaption, MB_OK invo ke E x itP r o c e s s ,
NULL
end s t a r t
W powyższym kodzie najpierw m am y określony zestaw instrukcji (.386), następnie model pam ięci i sposób w yw oływ ania funkcji, póź niej zaś dyrektywę rozkazującą asem blerowi odróżniać małe i duże litery. Dalej zostają dołączone odpowiednie pliki nagłówkowe i bibliote ki. Niżej w sekcji danych zostały zadeklarow ane dw a ciągi znaków zakończone zerem (w DOS-ie znakiem kończącym był znak $, tutaj jest to zero). W sekcji kodu pojawiło się wyw ołanie funkcji MessageBox wraz z podaną listą argumentów, która wyświetla okno informacyjne (funkcja pochodzi z biblioteki user32dll). Niżej znajduje się wywołanie funkcji ExitProcess, która kończy pracę program u (funkcja pochodzi z biblioteki kernel32.dll). Zapewne zadajesz sobie teraz pytanie, skąd wziąć opisy tych wszystkich funkcji oraz informacje, z jakich bibliotek pochodzą. Dokładną doku mentację m ożna znaleźć na stronach M SDN oraz w pliku W IN32.HLP (Win32 Programmer's Reference), który m ożna znaleźć w sieci. Funkcje WinAPI zawsze zwracają wartość w rejestrze EAX. Funkcje, których wyniki są 64-bitowe, w 32-bitowym systemie zwracają w parze EDX: EAX.
16
|
Asembler. Leksykon k eszonkowy
Szablon aplikacji dla system u W indow s zawiera nasze środowisko WinAsm. Wystarczy wybrać z górnego m enu File/New Project, przejść na zakładkę Bare Bone i w skazać E X E.
Pseudoinstrukcja INVOKE N a koniec kilka słów o pseudoinstrukcji INVOKE. Jak zapew ne zauw a żyłeś, w powyższym kodzie wyw oływ aliśm y funkcję, podając jej na zw ę i argum enty po przecinku. Standardowo w Asem blerze się tak nie robi — przeważnie odkłada się argum enty na stos przy użyciu instrukcji PUSH i wyw ołuje funkcję za pom ocą instrukcji CALL. Jednak m akroasem bler M A SM m a pseudoinstrukcję, która pozw ala w yw o ływ ać funkcję w ten prosty i czytelny sposób. Dla porów nania poni żej przedstaw ię wyw ołanie tej samej funkcji z użyciem INVOKE i bez. W yw ołanie funkcji MessageBox z użyciem pseudoinstrukcji INVOKE: invo ke MessageBox, NULL, addr MsgText, addr M sgCaption, MB_OK
W yw ołanie tej samej funkcji bez użycia pseudoinstrukcji INVOKE: push MB_OK push o f f s e t MsgCaption push o f f s e t MsgText push NULL c a ll
MessageBox
Korzystanie z INVOKE jest w arte polecenia, gdyż dzięki temu kod jest bardziej przejrzysty i łatwiej się ustrzec błędu przy podaw aniu ar gum entów funkcji. Ten rozdział był małym wprowadzeniem do programowania w Asem blerze dla system u W indows. Poznałeś w nim budow ę prostego pro gramu. W dalszych rozdziałach opiszę najważniejsze instrukcje, gdyż programowanie w Asemblerze to przede w szystkim instrukcje pro cesora, a nie tylko w yw oływanie funkcji W inAPI.
Rozdz ał 1. Podstawowe nformacje
|
17
Rozdział 2. Podstawowe instrukcje procesora 2.1. Instrukcja kopiowania i instrukcje arytmetyczne Instrukcja kopiowania (MOV) Zacznijm y od najczęściej spotykanej instrukcji — MOV. Składnia: MOV ce l, źródło To chyba najczęściej spotykana instrukcja. Kopiuje wartość z operandu źródłowego do operandu celu, przy czym pierwsza w artość pozostaje niezm ieniona. Na przykład: mov eax, 25 ; EA X przyjm uje w artość 25 mov ecx, eax ; skopiuj do E C X w artość z EAX mov zmienna, eax ; skopiuj do zm iennej w artość z EAX
Dlaczego nie jest MOV zmienna, zmienna? Ponieważ procesor nie potrafi wykonać czegoś takiego. Musimy posłużyć się rejestrem pomocniczym (najpierw skopiować wartość do rejestru, a potem do zmiennej) lub odłożyć wartość na stos (instrukcja PUSH), po czym przy użyciu instrukcji POP zdjąć ją ze stosu i umiejscowić w drugiej zmiennej. Oprócz kopiow ania wartości stałej do rejestru/zm iennej czy kopio wania w artości między rejestrami m ożemy skopiow ać w artość z da nego miejsca w pam ięci. W ykonujem y to w następujący sposób: mov eax, dword p t r [ebx]
Rejestr EBX zaw iera adres, pod którym znajduje się w artość — zosta nie ona skopiow ana do rejestru EAX.
Instrukcje arytmetyczne Instrukcje arytmetyczne służą do wykonywania podstawowych działań m atem atycznych, takich ja k dod aw anie, od ejm ow anie, m nożenie i dzielenie.
18
|
Asembler. Leksykon k eszonkowy
ADD (dodawanie)
Składnia: ADD operand1, operand2 Instrukcja ADD dodaje w artość do rejestru lub kom órki pamięci. Przykładow e użycie: add eax,
124 ; d od a je 124 do w artości w rejestrze EAX
add ecx, ebx ; d od a je w artość z E B X d o w artości w EC X add zmienna, 25 ; d od a je 25 do w artości w zm iennej ”zm ienna”
SUB (odejmowanie)
Składnia: SUB operand1, operand2 Odejmuje wartość drugiego operandu od pierwszego i zapisuje wynik w pierwszym. MUL (mnożenie)
Składnia: MUL operand1 Mnoży rejestr EAX (lub AX, lub AL) przez podaną wartość. M noży liczby bez znaku. W ynik znajduje się w rejestrze EAX/AX/AL. IMUL (mnożenie ze znakiem)
Składnia: IMUL wartość IMUL wynik, wartość, wartość IMUL wynik, wartość M noży w artość z EAX z podaną wartością (IMUL wartość) lub mnoży dwie wartości i wynik zachowuje w pierwszym operandzie (IMUL wynik, wartość, wartość), lub m noży rejestr z wartością (IMUL wynik, wartość). DIV (dzielenie bez znaku)
Składnia: DIV dzielnik Instrukcja ta dzieli wartość w rejestrze EAX przez wartość podaną jako dzielnik. Dzielona jest zaw sze w artość w EAX. Także w ynik zostanie um ieszczony w tym rejestrze, natom iast reszta z dzielenia — w EDX. mov eax, 32 ; EA X przyjm uje w artość 32 mov ecx, 2 ; EC X przyjm uje w artość 2 d iv ecx ; p od z iel E A X przez E C X
Rozdz ał 2. Podstawowe nstrukcje procesora
|
19
IDIV (dzielenie ze znakiem)
Składnia: IDIV dzielnik Działa podobnie jak instrukcja DIV, tyle że dzieli ze znakiem . INC (inkrementacja)
Składnia: INC re je s tr lub zmienna Zwiększa w artość rejestru lub zmiennej o 1. DEC (dekrementacja)
Składnia: DEC re je s tr lub zmienna Działa odw rotnie do instrukcji INC. Zm niejsza podaną w artość o 1 (zmi enna=zmienna-l). Przykład: dec eax ; zm niejsza w artość w EA X o 1 dec [zmienna] ; zm niejsza w artość zm iennej o 1
2.2. Instrukcje logiczne i przesunięć bitowych Instrukcje logiczne Instrukcje logiczne służą do wykonywania operacji logicznych na bitach, takich jak koniunkcja (iloczyn logiczny), alternatywa (suma logiczna), alternatywa wykluczająca i negacja (zaprzeczenie). AND (koniunkcja)
Składnia: AND operand1, operand2 1 1 0 0
and and and and
1 0 1 0
= = = =
1 0 0 0
Dla przykładu w ykonam y koniunkcję dla dwóch liczb binarnych: 11101010100 and 01010110000 = 01000010000 Przy ręcznym liczeniu najwygodniej napisać je jedna pod drugą i spraw dzać według tabelki poszczególne bity.
20
|
Asembler. Leksykon k eszonkowy
OR (alternatywa)
Składnia: OR operand1, operand2 1 1 0 0
or or or or
1 0 1 0
= = = =
1 1 1 0
Dla przykładu m am y dwie liczby binarne: 10100011100 or 01110010010 = 11110011110 A zatem bierzem y po kolei dwa odpowiadające sobie bity i spraw dzamy według tabelki, jaki będzie dla nich wynik. XOR (alternatyw a wykluczająca)
Składnia: XOR operand1, operand2 1 1 0 0
xor xor xor xor
1 0 1 0
= = = =
0 1 1 0
Będziem y często używ ać tej instrukcji do czyszczenia zaw artości ja kiegoś rejestru (gdyż w ynik operacji xor dla dwóch tych samych wartości daje zero). NOT (zaprzeczenie)
Składnia: NOT operand1 not 1 = 0 not 0 = 1 Krótko m ów iąc, odw raca w szystkie b ity w podanym operandzie (zam iast 1 daje 0, zam iast 0 daje 1).
Instrukcje przesunięć bitowych Instrukcje przesunięć bitowych służą do wykonywania operacji, które zm ieniają m iejsce bitów w rejestrze. Ujm ując to prościej, bity są prze suwane w praw o lub lewo. SAL/SHL (przesunięcie arytm etyczne/logiczne w lewo)
Składnia: SAL operand1, operand2 SHL operand1, operand2 Rozdz ał 2. Podstawowe nstrukcje procesora
|
21
Przesuwa w lewo bity pierwszego operandu o podaną liczbę bitów w operandzie drugim . Starszy przesunięty bit zostaje zachow any w fladze CF (ang. Carry Flag), a m łodsze bity są wypełniane zerami. Sposób przesuw ania się bitów dla instrukcji SAL/SHL w 32-bitowym rejestrze prezentuje rysunek 2.1. Dla przykładu przesuniem y w artość w EAX o 1 bit w lewo: mov eax,
1 ; do EA X dajem y w artość 1
eax, 1 ; E A X będzie równy 2 (10 binarnie),
shl
; gdyż jed y n ka s ię przem ieściła, ; a na j e j m iejscu mamy zero, ; c o d a je w artość 10b (2h).
N ajm łodszy bit je s t zerow any
E A X (32 bity)
1 < Carry Flag
n 31
(znacznik Starsze bity przeniesienia)
15
1
0
Młodsze bity
Rysunek 2.1. Rysunek prezentujący, jak przesuwają się bity dla instrukcji SAL/SHL SAR/SHR (przesunięcie arytm etyczne/logiczne w prawo)
Składnia: SAR operand1, operand2 SHR operand1, operand2 Instrukcja SAR przesuw a w praw o bity pierwszego operandu o poda ną liczbę bitów w operandzie drugim. Najm łodszy przesunięty bit zostaje zachow any w fladze CF, a najstarszy bit zostaje zachowany. Instrukcja SHR działa podobnie, różni się tylko tym, że zeruje najstarszy bit (nazywany również bitem znaku). Sposób przesuw ania się bitów dla instrukcji SAR został zaprezentow any na rysunku 2.2, a dla in strukcji SHR — na rysunku 2.3. Dla przykładu przesuniem y w artość w EAX o 1 bit w prawo: mov eax, 1 ; do EA X idzie w artość 1 sh r eax, 1 ; E A X będzie równy 0, ; fl a g a C F zostanie ustawiona.
22
|
Asembler. Leksykon k eszonkowy
Rysunek 2.2. Rysunek prezentujący, jak przesuwają się hity dla instrukcji SAR
Rysunek 2.3. Rysunek prezentujący, jak przesuwają się hity dla instrukcji SHR ROL/RCL (rotacja w lew o bez użycia flagi CF/z użyciem flagi CF)
Składnia: ROL operand1, operand2 RCL operand1, operand2 Pierwsza instrukcja przesuw a logiczn ie w lew o p ierw szy operand o liczbę bitów podaną w operandzie drugim. Nie używa flagi CF, więc najm łodszy bit przyjm uje w artość najstarszego bitu. Druga instrukcja przeprowadza tę samą czynność, ale przy użyciu flagi CF. Najmłodszy bit przyjmuje wartość, która była w CF, a znacznik CF przyjmuje wartość najstarszego bitu. Sposób obracania się bitów dla instrukcji ROL w 32bitowym rejestrze został przedstawiony na rysunku 2.4, a dla instrukcji RCL — na rysunku 2.5.
Rysunek 2.4. Rysunek prezentujący, jak obracają się hity dla instrukcji ROL
Rozdz ał 2. Podstawowe nstrukcje procesora
|
23
E A X (32 bity) 31 Starsze bity
15
---
7 0 Młodsze bity
-------
Carry Flag (znacznik przeniesienia)
Rysunek 2.5. Rysunek prezentujący, jak obracają się bity dla instrukcji RCL ROR/RCR (rotacja w prawo bez użycia flagi CF/z użyciem flagi CF)
Składnia: ROR operandl, operand2 RCR operandl, operand2 Pierwsza instrukcja przesuw a logicznie w prawo pierw szy operand o liczbę bitów podaną w operandzie drugim. N ie używ a flagi CF, w ięc najstarszy bit przyjm uje w artość najmłodszego bitu. Druga in strukcja przeprow adza tę samą czynność, ale przy użyciu flagi CF. N ajstarszy b it przyjm u je w artość, która była w CF, a zn acznik CF przyjm u je w artość najm łod szego bitu. Sposób obracania się bitów w 32-bitowym rejestrze dla instrukcji ROR został zaprezentow any na rysunku 2.6, a dla instrukcji RCR — na rysunku 2.7.
EAX (32 bity) 31 Starsze bity
15
7 0 Młodsze bity
■<--------------------
Carry Flag (znacznik przeniesienia)
Rysunek 2.6. Rysunek prezentujący, jak obracają się bity dla instrukcji ROR SHLD/SHRD (przesunięcie logiczne w le w o /w praw o podwójnego rejestru)
Składnia: SHLD operandl, operand2, operand3 SHRD operandl, operand2, operand3
24
|
Asembler. Leksykon k eszonkowy
EAX (32 bity) 31
7
15
Starsze bity
0
Młodsze bity
------ — Carry Flag (znacznik przeniesienia) Rysunek 2 7 . Rysunek prezentujący, jak obracają się hity dla instrukcji RCR Pierwsza instrukcja (SHLD) przesuwa w lewo bity w operandzie pierw szym o liczbę bitów podaną w operandzie trzecim . N ajstarsze bity pierwszego operandu zostają wyrzucone (flaga CF przyjm uje w artość ostatniego wyrzuconego bitu), a najm łodsze bity przyjm ują wartości najstarszych bitów z drugiego operandu. Uwaga! Bity drugiego operandu pozostają niezm ienione. SHRD przesuwa natom iast bity pierw szego operandu o liczbę bitów podaną w operandzie trzecim. N aj m łodsze bity pierwszego operandu zostają w yrzucone, a najstarsze bity przyjm ują w artość najm łodszych bitów z operandu drugiego. Bity drugiego operandu pozostają niezmienione. Sposób przesuwania się bitów dla instrukcji SHLD został zaprezentow any na rysunku 2.8, a dla instrukcji SHRD — na rysunku 2.9. Przykład dla instrukcji SHLD: mov ecx, 0 ; zerujem y EC X mov eax, OFFFFFFFFh ; do E A X w artość O F F FF F FF F h s h ld ecx, e a x , 2 ; E A X będ zie równy O FFFFFFFCh, gdyż ; dw a j e g o najm łodsze bity zostały zastąpione ; przez dw a najstarsze bity rejestru ECX, ; które miały w artość zero.
Przykład dla instrukcji SHRD: mov ecx, 0 ; zerujem y EC X mov eax, OFFFFFFFFh ; do E A X w artość O F F FF F FF F h shrd ecx, eax, 2 ; E A X będ zie równy 3F F F F F F F h , gdyż ; dw a j e g o najstarsze bity zostały ; zastąpion e dw om a najm łodszym i bitam i ; z rejestru ECX, które miały w artość zero.
Rozdz ał 2. Podstawowe nstrukcje procesora
|
25
Rysunek 2.8. Rysunek prezentujący, jak przesuwają się bity dla instrukcji SHLD
Rysunek 2.9. Rysunek prezentujący, jak przesuwają się bity dla instrukcji SHRD
2.3. Instrukcje wywołania procedury i powrotu Instrukcje związane z procedurami Procedury to wydzielone części programu, które mogą być wielokrotnie wyw oływ ane, bez potrzeby kopiow ania tego samego kodu w różne miejsca. Tworzenie takich procedur (nazywanych też podprogramami) jest m ożliwe przy użyciu instrukcji związanych z procedurami. CALL (w yw ołanie funkcji/podprogram u)
Składnia: CALL nazwa_funkcji
26
|
Asembler. Leksykon k eszonkowy
Służy do w yw ołania jakiejś funkcji. Poniżej przedstawiam przykład użycia tej instrukcji: push 0 c a ll
E x itP ro c e s s
A zatem , jak widać, odkładam y na stos w artość zero i wyw ołujem y funkcję, która zakończy program . Przed instrukcją CALL odkładam y na stos argum enty funkcji za pom ocą znanej już nam instrukcji PUSH. Pam iętajmy, żeby odkładać argum enty w odpowiedniej kolejności, więc jeśli funkcja przedstawia się tak: JakasFunkcja(argument1, argument2, argument3), to jej wyw ołanie będzie następujące (zaczynam y od koń cowego argumentu): push argument3 push argument2 push argumentl c a ll
Ja k a s F u n k c ja
RET (powrót)
Składnia: RET Wychodzi z danej funkcji/procedury i wraca do miejsca jej wywołania. Będziem y używ ać tej instrukcji na końcu procedur.
Tworzenie procedur/funkcji Procedury tw orzym y za pom ocą dyrektyw PROC i ENDP. Przykładow y program z procedurą w ygląda następująco: .386 .model
fla t,
o p tio n
casemap: none
i ncl ude
s t d c a ll
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
kernel 3 2 . l i b
.d a ta MsgCaption
db
"In fo r m a c ja ", 0
MsgText
db
"W it a j!" , 0
.d a ta ? .code s ta rt:
Rozdz ał 2. Podstawowe nstrukcje procesora
|
27
c a ll
S a y H e llo
invo ke E x itP r o c e s s , NULL S a y H e llo proc invo ke MessageBox, NULL, addr MsgText, addr M sgCaption, MB_OK R et S a y H e llo EndP end s t a r t
Jak widać, początek procedury to jej nazwa, po niej zaś jest umieszczone słowo proc. Dalej znajduje się kod procedury i instrukcja RET wracająca do miejsca, z którego p roced u ra została w yw ołana. N a końcu po now nie pojaw ia się nazw a procedury i słowo EndP, które kończy de klarację. Możemy również tworzyć funkcje, którym przekazuje się jakieś argu menty służące do operowania na nich. A rgum enty wypisujem y po słowie proc, podając najpierw nazwę argumentu i jego typ po dwukrop ku. Jeżeli m am y więcej argum entów , rozdzielam y je przecinkiem. Poniżej zam ieszczam przykład fu nk cji, która jako argum ent przyj m uje adres tekstu do wyświetlenia: .386 .model
fla t,
o p tio n
casemap: none
in c lu d e
s t d c a ll
w indo w s.inc
in c lu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
.d a ta MsgCaption
db " In f o r m a c ja " ,
MsgText1
db " W i t a j ! " , 0
MsgText2
db "W ita j 2 ! " ,
0
.d a ta ? .code s ta rt: push o f f s e t MsgText1 ; ad res tekstu odkładam y na stos c a ll
S a y H e llo ; wywołujemy fu n kcję S ayH ello
push o f f s e t MsgText2 ; ad res tekstu odkładam y na stos c a ll
S a y H e llo ; pon ow n ie wywołujemy fu n kcję SayH ello z innym argumentem
invo ke E x itP r o c e s s , NULL S a y H e llo proc szT ext: DWORD invo ke MessageBox, NULL, sz T ext, addr M sgCaption, MB_OK Ret S a y H e llo EndP end s t a r t
28
|
Asembler. Leksykon k eszonkowy
2.4. Instrukcja porównania i instrukcje skoku Często jest konieczne, aby — w zależności od wartości w rejestrze/ zmiennej — w ykonać odpowiedni fragm ent kodu. W tej części po znasz instrukcje, które pozw olą Ci to wykonać. Posłużym y się następującym przykładem : .386 .model
fla t,
o p tio n
casemap: none
in c lu d e
s t d c a ll
w indo w s.inc
in c lu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
.d a ta MsgCaption
db " In fo r m a c ja ", 0
MsgBoxText
db "EAX >= EC X ", 0
.d a ta ? .code s ta rt: mov eax,
10
mov ecx, 9 cmp eax, ecx jg e _ge invo ke E x itP r o c e s s ,
NULL
_g e: invo ke MessageBox, NULL, addr MsgBoxText, addr M sgCaption, MB_OK invo ke E x itP r o c e s s ,
NULL
end s t a r t
W powyższym przykładzie najpierw kopiujem y w artość 10 do reje stru EAX, po czym kopiujem y w artość 9 do rejestru ECX. Dalej poja wiają się dwie now e instrukcje: CMP oraz JGE. Instrukcja CMP porów nuje dwie wartości, odejm ując drugą w artość od pierwszej, i ustaw ia odpowiednie flagi w rejestrze znaczników. N atom iast instrukcja JGE jest skrótem angielskiego w yrażenia jum p if greater or equal, oznaczającego: „Skocz, jeżeli w iększe lub rów ne". Zatem jeżeli pierwszy operand jest w iększy od drugiego lub jest je mu równy, nastąpi skok do etykiety _ge. Jeżeli pierwszy operand jest m niejszy od drugiego, to skok jest pom ijany i wykonyw ane są kolej ne linie kodu.
Rozdz ał 2. Podstawowe nstrukcje procesora
|
29
Poniżej przedstawię najczęściej używ ane instrukcje skoku: • JA — skocz, jeżeli powyżej (flagi CF=0 i ZF=0); • JAE — skocz, jeżeli powyżej lub równe (flaga CF=0); • JB — skocz, jeżeli poniżej (flaga CF=1); • JBE — skocz, jeżeli poniżej lub równe (CF=1 lub ZF=1); • JE — skocz, jeżeli równe (ZF=1); • JG — skocz, jeżeli w iększe (ZF=0 i SF=OF); • JGE — skocz, jeżeli w iększe lub równe (SF=OF); • JL — skocz, jeżeli m niejsze (SF! =O F); • JLE — skocz, jeżeli m niejsze lub równe (ZF=1 lub SF!=O F); • JNE — skocz, jeżeli różne (flaga ZF=0); • JNZ — skocz, jeżeli nie zero (ZF!=0); • JZ — skocz, jeżeli zero (ZF=0). M yślę, że na początek to wystarczy. W ięcej inform acji na ten temat m ożna znaleźć w Intel 64 and IA-32 Architectures Software Developer's M anual: Volume 2A & 2B.
2.5. Instrukcje do operacji na łańcuchach znaków Opisane poniżej instrukcje operują na ciągach znaków spod rejestru źródła SI/ESI oraz rejestru docelowego DI/EDI. In stru kcje te w ystępu ją w czterech formatach: *B, *W , *D (32-bitowe) oraz *Q (64-bitowe). M odyfikacją rejestrów SI/ESI i DI/EDI steruje flaga kierunku (DF; ang. Direction Flag). Jeśli flaga jest równa zero, oba rejestry są zwiększane o odpowiednią liczbę, a jeśli flaga jest rów na jeden, oba rejestry są zm niejszane o odpow iednią liczbę. Flagę m ożna w yczyścić instruk cją CLD, a ustaw ić za pom ocą STD.
MOVS Instrukcje MOVS* służą do przeniesienia odpowiedniej liczby bajtów spod rejestru źródła (SI/ESI) do rejestru docelowego (DI/EDI).
30
|
Asembler. Leksykon k eszonkowy
Oto przykład dla instrukcji MOVSB: .386 .model
fla t,
o p tio n
casemap: none
i ncl ude
s t d c a ll
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
.d a ta z ro d lo
db " W i t a j " , 0 ; 6-bajtow y c ią g znaków
cel
db 6 dup(0)
; pusty c ią g 6 bajtów
.code s ta rt: mov
e s i , o f f s e t z ro d lo ; d o E S I ad res źródła
mov
e d i, o f f s e t cel
; d o ED I ad res docelow y ; wyczyszczenie fla g i kierunku (D irection F lag ) ; do rejestru licznika dajem y 6 (liczba kopiow an ych bajtów ) ; pow tarzaj instrukcję M OVSB E C X razy (6 razy)
c ld mov ecx, 6 rep movsb
invo ke MessageBox, NULL, addr c e l , 0, MB_OK ; wyświetl skopiow any ciąg znaków invo ke E x itP r o c e s s ,
NULL
end s t a r t
CMPS Instrukcje CMPS* porów nują od pow ied nią liczbę bajtów z rejestrów SI/ESI oraz DI/EDI. Oto przykład: .386 .model
fla t,
o p tion
casemap: none
in c lu d e
s t d c a ll
w indow s.inc
in c lu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
kernel 3 2 . l i b
.d a ta n a p is l
db " a s d f g h j k l" , 0 ; <
napi s2
db "a s d fg h z k l" , 0 ; t
Rowne
db "C ią g i znaków są
Nierowne db "C ią g i znaków są
0
.code
Rozdz ał 2. Podstawowe nstrukcje procesora
|
31
s ta rt: mov
e s i, o ffs e t
napis1 ; d o rejestru źródła ad res pierw szego napisu
mov
e d i, o f f s e t
napis2 ; d o rejestru d ocelow eg o ad res drugiego napisu
mov
ecx, 10
; pow tarzaj porów nyw anie E C X razy (10 razy) ; wyczyść fla g ę kierunku (D F =0) ; porów nuj, dopóki napisy s ą rów ne ; je ż e li nie s ą równe, skocz d o etykiety nierów ne ; je ż e li równe, wyświetl w iadom ość o tym
c ld repz cmpsb jn z nierow ne rowne:
invo ke MessageBox, NULL, addr Rowne, 0, MB_OK invo ke E x itP r o c e s s , NULL n ierow ne: ; je ż e li nie s ą równe, wyświetl w iadom ość o tym invo ke MessageBox, NULL, addr Nierowne, 0, MB_OK invo ke E x itP r o c e s s , NULL end s t a r t
LODS Instrukcje LODS* pobierają do rejestru AL/AX/EAX odpowiednią liczbę bajtów spod SI/ESI. In stru kcja ta m oże zostać w ykorzystana na przykład do pobierania kolejnych znaków do porównywania. Oto przykład: .386 .model o p tion
f l a t , s t d c a ll casemap: none
in c lu d e in c lu d e
w indo w s.inc k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib in c l u d e lib
u s e r 3 2 .lib k e r n e l3 2 .lib
.d a ta n a p is db " a s d f g h j k l" , 0 ; nasz napis d o przeszukania MsgText db " L i t e r a
'h '
z n a le z io n a ." , 0 ; in form acja o znalezieniu litery 'h'
.code sta rt: mov e s i , o f f s e t n a p is ; d o ES I ad res napisu
; do E C X dłu gość napisu/liczba pow tórzeń ; czyścimy znacznik kierunku (DF) ; etykieta pętli lodsb ; załadu j d o AL b a jt sp o d adresu z ESI cmp a l , 'h ' ; porów n aj b a jt z AL z literą 'h' je lite r a _ h ; je ż e li równe, skocz d o etykiety litera_h dec ecx ; zmniejsz licznik o je d e n cmp e c x , 0 ; sprawdź, czy licznik je s t równy zero jn e p e t la ; je ż e li nie je s t równy zero, to wykonuj p ętlę invo ke E x itP r o c e s s , NULL ; ko n iec program u
mov
ecx,
10
c ld p e t la :
lite ra _ h : invoke MessageBox, NULL, addr MsgText, 0, MB_OK ; informacja o znalezionej literze invo ke E x itP r o c e s s , end s t a r t
32
j
NULL ; ko n iec program u
Asembler. Leksykon k eszonkowy
STOS Instrukcje STOS* umieszczają odpowiednią liczbę bajtów spod AL/AX/EAX w rejestrze DI/EDI. Oto przykład: .see .model
fla t,
o p tio n
casemap: none
i ncl ude
s t d c a ll
w indows.i nc
i n clu d e
k e r n e ^ 2 .in c
in c lu d e
u s e rô 2 .in c
in c l u d e lib
u s e r ô 2 .lib
in c l u d e lib
k e r n e ls 2 .lib
.d a ta t a b l i c a dd 100 dup(0) ; tab lica 100 podw ójnych słów (DWORD) .code s ta rt:
; ; ; mov ecx, 100 ; c ld ; rep sto sd invo ke E x itP r o c e s s , NULL ; mov e d i, o f f s e t t a b l i c a mov eax,
12345678h
ad res tablicy d o ED I wartość, która wypełni tablicę d o EAX licznik ustawiamy na 100 pow tórzeń czyścimy znacznik kierunku (DF) pow tarzam y kopiow an ie E C X razy (100 razy) kończymy p rogram
end s t a r t
SCAS Instrukcje te przeszukują łańcuch znaków spod DI/EDI w poszuki waniu odpowiedniej liczby bajtów z AL/AX/EAX. Poniżej został zaprezentowany przykład kodu wyszukującego pierwsze wystąpienie litery „z" w podanym ciągu znaków: .see .model
fla t,
o p tio n
casemap: none
i ncl ude
s t d c a ll
w indows.i nc
i n clu d e
k e r n e ^ 2 .in c
in c lu d e
u s e rs 2 .in c
in c l u d e lib
u s e r ô 2 .lib
in c l u d e lib
k e r n e ls 2 .lib
.d a ta n a p is db " a s d f g z j k l " , Q ; lG -bajtow y ciąg znaków
Rozdz ał 2. Podstawowe nstrukcje procesora
I
33
.code s ta rt: mov a l ,
'z '
; b a jt 'z' do rejestru AL
mov e d i, o f f s e t na p is ; ad res napisu d o ED I mov ecx,
10
c ld repnz scasb j e zn a lezio no mov e d i,
FALSE
jmp koniec
; dłu gość napisu/liczba pow tórzeń do E C X ; czyścimy fla g ę kierunku (DF) ; dopóki nie znajdziem y litery, pow tarzaj instrukcję SCASB ; je ż e li znaleziono, sk o k do etykiety ”zn aleziono ” ; je ż e li nie znaleziono, d o E D I dajem y w artość FALSE ; skaczem y na ko n iec program u
zn a lez io n o : sub e d i, o f f s e t na p is ; je ż e li znaleziono, E D I zaw iera pozycję litery 'z' ko n iec: invo ke E x itP r o c e s s , NULL ; ko n iec program u end s t a r t
Poznałeś kilka instrukcji do operacji na łańcuchach znaków. Co praw da zm ienne w asem blerze M ASM zostaną opisane nieco póź niej, ale ze względu na wspom niane instrukcje m usiałem tu w pro w adzić pojęcie tablicy. N ajprościej rzecz ujm ując, tablica to po prostu ciąg bajtów — to powinno wystarczyć, aby zrozumieć powyższe pro gramy. Jeżeli chcesz je dokładnie przeanalizować, otwórz je w debuggerze Olly Debugger i, w ciskając klawisz F7, obserw uj w prawej górnej części okna zm iany w rejestrach.
34
|
Asembler. Leksykon k eszonkowy
Rozdział 3. Makroinstrukcje M akroinstrukcje to instrukcje podobne do tych z języków wysokiego poziom u, takie jak na przykład instrukcja warunkowa czy instrukcje do tworzenia pętli.
3.1. Makroinstrukcje kontroli przepływu Instrukcje te — odpow iednio dla spełnionego lub niespełn ionego warunku — przekazują sterow anie program u w dane m iejsce kodu.
Makroinstrukcja warunkowa .IF Asem bler M ASM dostarcza nam kilka przydatnych makroinstrukcji. Jedną z nich jest instrukcja w arunkow a .IF. Jej składnia jest następująca: .if
zmienna == w artość ; je ż e li zm ienna = w artość
; k o d do wykonania .e n d if
lub bardziej rozbudowana, z w iększą liczbą warunków: .if
zmienna == w artość ; je ż e li zm ienna = w artość
; ja k iś ko d . e l s e i f inna_zm ienna != in n a _w a rto ś ć ; je ż e li inna_zm ienna je s t różna o d inna_w artość
; ja k iś inny k o d . e l s e ; w przeciwnym wypadku
; jesz c z e inny k o d .e n d if
M ożna też użyć operatorów logicznych, na przykład && (oznaczają cego „i"): .if
zmienna > 50 && zmienna < 100
; num er m ieści s ię w p rzedziale .e ls e
; num er je s t p o z a przedziałem .e n d if
W tabeli 3.1 została zam ieszczona lista operatorów używ anych przy porównaniach.
Rozdz ał 3. Makro nstrukcje
|
35
Tabela 3.1. Operatory używane przy porównaniach Operator
Znaczen e
==
Równe
!=
Nie ó w n e
>
W iększe
>=
W iększe lub ów ne
<
Mniejsze
<=
Mniejsze lub ó w n e
&
Bit test (fo m at w yra ż en ie & numer b it u )
!
Negacja logiczna (N O T )
&&
Koniunkcja logiczna (A N D )
||
Alte n atyw a logiczna (O R )
CARRY?
U staw iona flaga p zeniesienia (Carry)
OVERFLOW?
U staw iona flaga p zepełnienia (O verflow )
PARITY?
U staw iona flaga pa zystości (Parity)
SIGN?
U staw iona flaga znaku (Sign)
ZERO?
U staw iona flaga ze o w a (Z ero)
3.2. Makroinstrukcje do tworzenia pętli Instrukcje te pozw alają nam tw orzyć pętle za pom ocą w ysokopoziomowej składni.
Makroinstrukcja .WHILE Ta m akroinstrukcja pozw ala na tworzenie pętli z warunkiem spraw dzanym na początku. Jej składnia jest następująca: .w h ile warunek
; instrukcje .endw
D odatkow o wykonyw anie pętli WHILE m ożem y przerw ać instrukcją .BREAK .IF warunek. N a przykład: mov ebx, 5 .w h ile TRUE
; k o d w ykona się tutaj 5 razy dec ebx .b rea k . i f
ebx == 0
.endw
36
|
Asembler. Leksykon k eszonkowy
A oto przykład użycia tej pętli do kilkukrotnego w yśw ietlenia okienka inform acyjnego: .386 .model
fla t,
o p tio n
s t d c a ll
casemap: none
i ncl ude
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
.d a ta MsgText db "Ten komunikat w y ś w ie tli
s ię 5 r a z y . " , 0
.code s ta rt: mov ebx, 5 ; d o E B X skopiuj w artość 5 .w h ile ebx > 0 ; dopóki E B X je s t w iększe o d zera invo ke MessageBox, NULL, addr MsgText, NULL, NULL ; wyświetl kom unikat sub ebx, 1 ; zm niejsz E B X o je d e n .endw ; ko n iec p ętli WHILE invo ke E x itP r o c e s s , NULL ; ko n iec program u end s t a r t
Makroinstrukcja .REPEAT Ta makroinstrukcja pozwala na utworzenie takiej pętli jak w językach wysokiego poziom u — z warunkiem spraw dzanym na końcu. Jej składnia jest następująca: .re p e a t
; ja k iś ko d .u n t i l
warunek
A oto przykład kilkukrotnego wyśw ietlenia kom unikatu przy użyciu tej składni: .386 .model
fla t,
o p tio n
casemap: none
i ncl ude
s t d c a ll
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c l u d e lib
u s e r 3 2 .lib
Rozdz ał 3. Makro nstrukcje
j
37
in c l u d e lib
k e r n e l3 2 .lib
.d a ta MsgText db "Ten komunikat w y ś w ie tli
s ię 5 r a z y . " , 0
.code s ta rt: mov ebx, 5 ; d o E B X skopiuj w artość 5 . rep e a t ; pow tarzaj invo ke MessageBox, NULL, addr MsgText, NULL, NULL ; wyświetl kom unikat sub ebx, 1 ; zm niejsz E B X o je d e n .u n til
ebx < 1 ; dopóki E B X nie b ęd z ie mniejszy o d je d e n
invo ke E x itP r o c e s s , NULL ; ko n iec program u end s t a r t
38
|
Asembler. Leksykon k eszonkowy
Rozdział 4. Praca z danymi W tym rozdziale nauczysz się, jak pracow ać z danym i, takimi jak na przykład zm ienne czy struktury. Dowiesz się też, czym je st adres danych w pamięci i jak go pobierać.
4.1. Adresowanie i wskaźniki W Asem blerze bardzo w ażne jest to, aby wiedzieć, czym różni się adres zmiennej (OFFSET) od jej wartości. Adres to miejsce, gdzie znaj duje się zm ienna, natom iast wartością są dane um ieszczone pod tym adresem.
Operator OFFSET O perator OFFSET służy do pobierania adresu zmiennej. Oto przykład jego użycia: .386 .model o p tio n
f l a t , s t d c a ll casemap: none
i ncl ude
w indows.i nc
i n clu d e in c lu d e
k e rn e l3 2 .in c u s e r3 2 .in c
in c l u d e lib in c l u d e lib
u s e r 3 2 .lib k e r n e l3 2 .lib
.d a ta zmienna db " W i t a j ! " , 0 .code s ta rt: mov eax, o f f s e t zmienna ; d o rejestru EAX skopiuj ad res zm iennej invo ke MessageBox, NULL, eax, NULL, NULL ; wyświetl kom unikat invo ke E x itP r o c e s s , end s t a r t
NULL ; ko n iec program u
Operatora OFFSET używ am y również, gdy pobieram y adres zmiennej, odkładając ją na stos przed wyw ołaniem procedury, na przykład: push NULL push NULL push o f f s e t zmienna ; p ob ieram y ad res zm iennej i odkładam y na stos push NULL c a ll
MessageBox
Rozdz ał 4. Praca z danym
|
39
Warto zaznaczyć, że operator OFFSET nie działa na zmiennych lokalnych.
Zmienne lokalne Zm ienne lokalne m ożem y zadeklarow ać na przykład wew nątrz ja kiejś procedury. Aby to zrobić, podajem y najpierw słowo LOCAL, dalej nazw ę zm iennej, a po dwukropku jej rodzaj. N a przykład: myProc proc LOCAL zm iennal: DWORD ; d ekla ra cja zm iennej lokaln ej o rozm iarze p od w ójn eg o słow a
; ja k iś k o d Ret ; p ow rót myProc EndP
Operator ADDR O peratora ADDR używ am y najczęściej przy przekazywaniu argum en tów do funkcji wywoływanej za pomocą składni INVOKE, na przykład: invo ke MessageBox, NULL, addr MsgText, addr M sgCaption, NULL
Dereferencja (operator [ ]) Posłużym y się tutaj prostym przykładem : mov eax, lp v a r mov eax, [eax] mov n u va r, eax
; skopiuj ad res d o EAX ; d ereferen cja ; skopiuj EAX d o now ej zm iennej
Nawiasy kwadratowe służą do wydobycia wartości spod adresu w EAX. Operacja ta jest nazywana dereferencją.
Instrukcja LEA Instrukcja ta jest skrótem angielskiego wyrażenia: Load Effective Address. Służy ona do pobierania adresu i kopiow ania go do pierwszego operandu, na przykład: le a eax, zmienna invo ke MessageBox, NULL, eax, NULL, NULL
40
|
Asembler. Leksykon k eszonkowy
4.2. Zmienne i stałe W języku Asem bler prócz operacji na rejestrach m ożem y definiow ać zm ienne oraz stałe, by w ykonyw ać na nich różne operacje.
Stałe Stałe um ieszczam y w sekcji .CONST. Posłużę się tutaj prostym przykładem: .c o n s t ; stałe j eden equ 1 ; defin icja stałej osiem equ 2*4 ; w artość w yliczona
Zmienne Zm ienne m ożem y podzielić na zainicjow ane jakąś wartością oraz niezainicjow ane. Zm ienne zainicjow ane deklarujemy z wartością po czątkową z prawej strony, niezainicjow ane natom iast m ają z prawej strony znak zapytania. Zm ienne zainicjow ane deklarujem y w sekcji .DATA, a niezainicjow ane w — .DATA?. Obie te sekcje występują przed sekcją kodu (. CODE). Zmienne o rozm iarze jednego bajtu/ciągu bajtów
Zmienne te deklarujemy dyrektywą BYTE (lub krótko: DB; ang. Define Byte). .d a ta ; dan e zain icjow an e w artością p o d a n ą z p ra w ej strony b1 BYTE
0 ; je d e n b ajt
b2 db
0 ; rów nież je d e n b ajt
b3 db
100 dup(0) ; sto bajtów
b4 db
" a s d ", 0 ; cztery bajty (ciąg znaków A SCII zakończony zerem )
b5 SBYTE 0 ; je d e n b a jt ze znakiem t1 d t
0 ; dziesięć bajtów
Zmienne o rozm iarze jednego słowa
Zm ienne te deklarujem y przy użyciu dyrektywy WORD (lub krótko: DW; ang. Define Word). w1 word
0 ; słow o
w2 dw
0 ; rów nież słow o
Zmienne o rozm iarze podwójnego słowa
Zm ienne te deklarujemy za pom ocą dyrektywy DWORD (lub krótko: DD; ang. Define Double Word). Rozdz ał 4. Praca z danym
|
41
d l dword 0 ; podw ójn e słow o 0 ; rów nież podw ójn e słow o
d2 dd
d3 sdword 0 ; p od w ójn e słow o ze znakiem
Zmienne o rozm iarze poczwórnego słowa
Zm ienne te deklarujemy za pom ocą dyrektywy QWORD (lub krótko: DQ; ang. Define Quad Word). q l qword 0 ; poczw órn e słow o 0 ; rów nież poczw órn e słow o
q2 dq
q3 sqword 0 ; poczw órn e słow o ze znakiem
Zmienne o rozm iarze 6 bajtów
Zm ienne te deklarujem y przy użyciu dyrektywy FWORD (lub krótko: DF; ang. Define Fword). fl
fword 0 ; zm ienna 6-bajtow a 0 ; rów nież zm ienna 6-bajtow a
f2 d f
Zmienne używane w instrukcjach M M X i SSE
Zmienne te deklarujemy za pomocą dyrektyw: MMWORDi XMMWORD. Pierwsza ma 64 bity, a druga — 128. ml mmword 0 .0 ; 64-bitow a zm ienna używana w in stru kcjachM M X i SSE x l xmmword 0 .0 ; 128-bitow a zm ienna używana w in stru kcjachM M X i SSE
Zmienne do przechow yw ania liczb rzeczywistych
Zm ienne te deklarujem y przy użyciu dyrektyw: REAL4, REAL8 i REALl0. n l r e a l4 0 .0 ; liczba zm iennoprzecinkow a pojedyn czej precyzji (4 bajty) n2 r e a l8 0 .0 ; liczba zm iennoprzecinkow a podw ójn ej precyzji (8 bajtów ) n3 r e a l l 0 0 .0 ; liczba zm iennoprzecinkow a 10-bajtow a
4.3. Praca ze strukturami W poprzednim rozdziale była mowa o zm iennych i stałych. Teraz opiszę typ danych, jakim jest struktura. D eklaracja przykładowej struktury dla asem blera M ASM wygląda następująco (deklarację tę um ieszczam y PRZED SEKCJĄ .DATA): R ect STRUCT le f t
dword
?
top
dword
?
r ig h t
dword
?
bottom
dword
?
R ect ENDS
42
|
Asembler. Leksykon k eszonkowy
Najpierw pojawia się nazwa struktury (Rect), po niej słowo STRUCT, a ni żej są umieszczone pola struktury. Każde z nich jest podwójnym sło wem (DWORD), niezainicjow anym żadną wartością (znak ?). N a końcu m am y znów nazw ę struktury i słowo kończące deklarację ENDS. Teraz utwórzm y zm ienną typu Rect. Robim y to w ten sposób: .d a ta R ct R ect <>
Do pól struktury odwołujemy się, pisząc nazw ę struktury i po kropce jej pole, na przykład: mov R c t . l e f t ,
12
mov R c t .t o p ,
24
mov R c t . r i g h t ,
31
mov R ct.b o tto m ,
10
Jeżeli jakaś funkcja wym aga od nas adresu struktury jako argum en tu, używ am y operatora ADDR, na przykład: invo ke F u n c l, param i, param2, addr R ct
Możemy również tworzyć struktury zawierające w sobie inne struktury, na przykład: R ect STRUCT le f t
dword ?
top
dword ?
r ig h t
dword ?
bottom
dword ?
R ect ENDS P o in t STRUCT x dword ? y dword ? P o in t ENDS M yStru ct STRUCT ite m i R ect <> ; struktura R ect item2 P o in t <> ; struktura Point M yStru ct ENDS .d a ta S tr u c t1 M yStru ct <>
W tedy do pól odw ołujem y się w następujący sposób: mov S t r u c t 1 . it e m 1 . l e f t ,
10
Do pól struktury m ożem y się także odnosić poprzez adres w reje strze z dodanym przesunięciem , na przykład:
Rozdz ał 4. Praca z danym
|
43
mov eax, lp R c t ; ad res struktury do EAX mov
[e a x ],
DWORD PTR lQ
mov
[eax+ 4],
DWORD PTR l2
mov
[eax+ 8],
DWORD PTR l4
mov
[e a x + l2 ],
DWORD PTR l6
M ożna to również zrobić przy użyciu dyrektywy ASSUME: ASSUME eax:PTR RECT mov eax, lp R c t mov [eax] . l e f t ,
lQ
mov [eax] .to p ,
l2
mov [eax] . r i g h t ,
l4
mov [eax] .bottom ,
l6
ASSUME eax: n o thing
44
I
Asembler. Leksykon k eszonkowy
Rozdział 5. Programowanie w systemie W indows 5.1. Konsola w systemie Windows Konsola w systemie Windows to inaczej interfejs tekstowy, na pewno znany użytkownikom systemu MS-DOS. Jego obsługa polega na wpro wadzaniu danych w postaci ciągu znaków , a program po przetwo rzeniu danych wyprow adza je na konsolę.
Tworzenie aplikacji konsolowej Aby utw orzyć aplikację konsolową, uruchom środowisko W inAsm i z górnego m enu wybierz File/New Project, przejdź na zakładkę Bare Bone, wybierz Console i kliknij OK.
Wyświetlanie danych Dane na konsoli wyśw ietlam y przy użyciu tej samej funkcji, którą zapisujem y dane do pliku — WriteFile. Jedyna różnica polega na tym, że zamiast uchwytu pliku podajemy uchwyt do strumienia wyj ściowego konsoli pobrany za pom ocą funkcji GetStdHandl e. (...) .d a ta hOutPut
dd 0
b R ead W ritte n dd 0 s z T e x tl
db " Ja k masz na im ię ? " , 0
(... ) invo ke G e tStd H an d le , STD_OUTPUT_HANDLE mov hO utPut, eax invo ke l s t r l e n ,
addr sz T e x tl
invo ke W r i t e F i l e , hO utPut, addr s z T e x t l, eax, ADDR b R ea d W ritte n , NULL (... )
Pobieranie danych Dane od użytkow nika pobieram y, jak pew nie zdążyłeś się domyślić, przy użyciu funkcji do czytania z plików — ReadFile, tyle że zam iast uchwytu do pliku podajem y uchw yt do wejścia konsoli pobrany za pom ocą funkcji GetStdHandle.
Rozdz ał 5. Programowan e w system e W ndows
I
45
(...) .d a ta h In P u t
dd 0
b R ead W ritte n dd 0 s z In p u t
db 128 dup(0)
(... ) invo ke R e a d F ile , h In P u t, addr s z In p u t,
128, ADDR b R ea d W ritte n , 0
(... )
Kolory Kolory w konsoli ustawiamy za pomocą funkcji SetConsoleTextAttribute, w pierwszym argumencie podając uchwyt do wyjścia konsoli, a w dru gim stałą reprezentującą dany kolor. Stałe reprezentujące poszczególne kolory: .co n st c lG re y
= 0 = FOREGROUND_INTENSITY
c l B l ack c lL ig h t G r e y
=
c lW h ite
=
c l B l ue
=
FOREGROUND BLUE
clG reen
=
FOREGROUND GREEN
clC yan
FOREGROUND GREEN or FOREGROUND_BLUE
clR ed
= =
c lP u r p l e
=
FOREGROUND RED
c lL ig h t B lu e
=
FOREGROUND BLUE
or FOREGROUND_ INTENSITY
c lL ig h tG re e n
=
FOREGROUND GREEN
or FOREGROUND_ INTENSITY
c lL ig h tC y a n
=
FOREGROUND GREEN
or FOREGROUND_BLUE
FOREGROUND_RED FOREGROUND_RED
or FOREGROUND_GREEN o r FOREGROUND or FOREGROUND_GREEN o r FOREGROUND
^FOREGROUND INTENSITY
FOREGROUND RED or FOREGROUND_BLUE
or
^FOREGROUND INTENSITY = FOREGROUND_RED c lL ig h t P u r p le = FOREGROUND_RED c lL ig h tR e d
or FOREGROUND_ INTENSITY or FOREGROUND_BLUE
or
^FOREGROUND INTENSITY = FOREGROUND_RED = FOREGROUND_RED
clO range c lY e llo w
or FOREGROUND_GREEN or FOREGROUND_GREEN or
►FOREGROUND INTENSITY
A tak wygląda w yw ołanie funkcji SetConsol eTextAttribute: .d a ta hOutPut
dd 0
C o lo r
dw 0
(... ) invo ke G e tStd H an d le , STD_OUTPUT_HANDLE mov hO utPut, eax mov C o lo r, c lL ig h t B lu e invo ke S e tC o n s o le T e x tA ttr ib u te , hO utPut, C o lo r (... )
46
|
Asembler. Leksykon k eszonkowy
Przykładowy program N a rysunku 5.1 w idać konsolę przykładowego program u, który pyta o imię użytkow nika, a następnie wita go słowami: „Witaj < im ię> ".
-
C:\Documents and Settings\D aw id\Pulpit\console\Console.exe
J a k m asa n a W i t a j D a w id
im ię ?
D a w id
Rysunek 5.1. Wyjście z konsoli przykładowego programu Przykład o nazwie console jest dostępny pod adresem : ftp://ftp.helion.pl/ przyklady/asem lk.zip.
5.2. Proste okno dialogowe Zajm iem y się teraz przez pew ien czas pisaniem aplikacji okienko wych. Za chw ilę pokażę Ci, jak utw orzyć proste okno, oraz postaram się wytłum aczyć, czym są kom unikaty wysyłane do okna i jak je ob sługiwać. Skorzystamy tutaj z gotowego szablonu, jaki oferuje nam środowisko WinAsm. Kliknij w górnym menu File/New Project, przejdź na zakładkę D ialog, w ybierz B ones i kliknij O K . Pow inieneś zob aczy ć szkielet aplikacji okienkowej z użyciem okna dialogowego. Jeżeli miałeś styczność z kursem autorstwa Iczeliona, pewnie zauważy łeś, że rozpoczął on od przedstaw ienia dynam icznego sposobu two rzenia okna oraz kontrolek. Ja postanowiłem pom inąć ten temat, gdyż kod jest w tedy bardzo długi i w rzeczyw istości byw a rzadko stosowany w praktyce. N ajpierw opiszę okienko Explorer, które zostało zaprezentow ane na rysunku 5.2. W tym okienku w idzim y części, z jakich składa się nasz projekt. Jest to plik z kodem źródłow ym bones.asm, plik z m iejscem na nagłówki, prototypy funkcji i zm ienne, czyli bones.inc, oraz plik zasobów, który zawiera skrypt naszego okna.
Rozdz ał 5. Programowan e w system e W ndows
|
47
Explorer
_________________ Ą
[m ] bones £]■■(& ASM Files i 1 ¡fj bones.asm B - & Indude Files i = bones.inc Ö - Ö Resource Files L # bones.rc
Rysunek 5.2. Okienko Explorer Teraz kliknij nazw ę pliku bon es.rc w okienku E xplorer i na dole przejdź na zakładkę Resources (rysunek 5.3). Pow inieneś zobaczyć wszystkie informacje o naszym oknie, takie jak nazw a, ID, położenie, rozmiary, styl, tytuł itp.
H Hit c i Rb ||§! ł ć r l X Dialogs
O th ers |
~ ES2LLJ : _ i I j0 _ & r
Name
IDD_MAIN
ID
1000
L e ft
10
Top
10
W idth
237
H eight
89
S tyle
0 x9 0 c80 8 04
E xStyle
0 x00000000
Visible
TRUE
Caption
F o rm l
Class Menu F on t
Tahoma
Project . Blochs j R esources
Rysunek 5.3. Wyświetlanie właściwości okna dialogowego 48
|
Asembler. Leksykon k eszonkowy
Teraz spójrz na górny pasek na rysunku 5.4.
Rysunek 5.4. Przycisk służący do przełączania się między trybem wizualnym a kodem Zawiera on przycisk (ten z lupą, obok przycisku z zieloną strzałką), który pozw ala przełączać się pom iędzy wizualnym projektow aniem a skryptem zasobów. Do skryptu zasobów będziem y się przełączać, gdy będziem y chcieli dodać do naszej aplikacji na przykład ikonę, kursor, bitm apę czy jakieś inne zasoby. Teraz w okienku Explorer z prawej strony przejdź na zakładkę Project i kliknij nazw ę pliku bones.asm. Powinieneś zobaczyć taki kod: .386 .model
fla t,
o p tio n
s t d c a ll
casemap: none
in c lu d e
b o n e s.in c
.code s ta rt: invoke
GetM oduleHandle, NULL
mov
h In s ta n c e , eax
invoke
InitComm onControls
invoke
DialogBoxParam , h In s ta n c e ,
invoke
E x itP r o c e s s , eax
IDD_MAIN, Q, o f f s e t D lg P ro c , Q
D lg Proc proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam : DWORD mov .if
eax, uMsg eax == WM_INITDIALOG invo ke
LoadIcon ,h In s ta n c e , 2QQ
invo ke
SendMessage, hWin, WM_SETICON, l ,
eax
. e l s e i f eax == WM COMMAND
Rozdz ał 5. Programowan e w system e W ndows
I
49
mov
eax, wParam
.if
eax == IDB EX IT invo ke
SendMessage, hWin, WM_CLOSE, 0, 0
. e n d if .e ls e if invo ke
eax == WM_CLOSE EndD ialog , hWin, 0
.e n d if xor
eax, eax
re t D lg Proc endp end s t a r t
Pierwsze trzy wiersze już znasz, ale przypom nę, że jest to zestaw używ anych instrukcji (.386), model pam ięci (fla t), sposób w yw oły w ania procedur (std call) oraz opcja nakazująca asem blerowi odróż niać m ałe i duże litery (option casemap :none). Kolejna linijka to dołączony plik bonesinc z nagłówkami, prototypami i zm iennym i. Dalej rozpoczyna się sekcja kodu (.CODE), a w niej funkcja pobierająca uchw yt do modułu naszej aplikacji (GetModuleHandle) i zachow anie te go uchwytu w zmiennej hInstance. Później mamy inicjację typowych kontrolek przy użyciu funkcji InitCommonControls oraz funkcję wyświe tlającą nasze okno dialogowe (DialogBoxParam). D alej została um iesz czona funkcja kończąca pracę program u (ExitProcess). Zapewne zaciekaw iło Cię, czym jest procedura um ieszczona poniżej kodu programu. To procedura obsługi okna. Ujm ując to prościej, do okna są w ysyłane kom unikaty, a ta procedura je obsługuje. Komuni katy zaczynają się od znaków WM_*. Jeżeli na przykład do okna na dejdzie kom unikat WM_INITDIALOG, zostanie w ykonany kod ładujący ikonę (Loadlcon) i ustaw iający ją jako ikonę okna. Doszliśm y w ten sposób do najważniejszej części, czyli obsługi w ia domości WM_COMMAND. Tego typu w iadom ość jest wysyłana między in nymi wtedy, gdy zostanie kliknięty przycisk w oknie. Parametr wParam zawiera num er identyfikacyjny kontrolki i pozwala nam obsłużyć to zdarzenie. W tym kodzie, jeżeli klikniem y p rzy cisk znajd u jący się w oknie, do okna zostanie wysłany komunikat o zamknięciu (WM_CLOSE). Niżej widzimy, co robi okno, gdy dostanie ten komunikat — wywołuje ono funkcję EndDialog, która zam yka okno i kończy pracę funkcji obsługi okna.
50
|
Asembler. Leksykon k eszonkowy
5.3. Odczyt myszki i klawiatury Odczyt myszki W poprzedniej części dowiedziałeś się, czym są komunikaty wysyłane do okna przez system W indows. Teraz poznasz kilka innych kom u nikatów , które dotyczą akcji w ykonyw anych przy użyciu m yszki lub klawiatury. Jeżeli zostanie w ciśnięty lewy przycisk m yszy, okno otrzym uje w ia dom ość WM_LBUTTONDOWN, natom iast jeżeli zostanie on zw olniony, do okna jest w ysyłana w iadom ość WM_LBUTTONUP. Dla praw ego przycisku m yszy jest podobnie, tyle że wysyłane wiadom ości to WM_RBUTTONDOWN i WM_RBUTTONUP. Jest jeszcze kom unikat, który jest wysyłany, gdy poru szamy kursorem w obszarze okna — WM_MOUSEMOVE. Istnieją także ko m unikaty informujące o podw ójnym kliknięciu (M_LBUTTONDBCLK lub WM_RBUTTONDBCLK) oraz wciśnięciu i zwolnieniu środkow ego przycisku myszy dla myszek o trzech przyciskach (WM_MBUTTONDOWNi WM_MBUTTONUP). Dla przykładu napisałem aplikację, która sprawdza, czy lewy przycisk m yszy został w ciśnięty, czy zw olniony, oraz pobiera w spółrzęd ne kursora, obsługując kom unikat WM_MOUSEMOVE. Oto kod procedury obsługi okna dialogowego: D lg Proc proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam : DWORD mov
eax, uMsg
.if
eax == WM_INITDIALOG invo ke
L oadIco n, h In s ta n c e , 2OO
invo ke
SendMessage, hWin, WM_SETICON, 1, eax
. e l s e i f eax == WM_LBUTTONDOWN ; gdy w ciśnięto lewy przycisk myszy invo ke S e tD lg Ite m T e x t, hWin,
1OO1, addr Msgi
. e l s e i f eax == WM_LBUTTONUP ; gdy zw olniono lew y przycisk myszy invo ke S e tD lg Ite m T e x t, hWin,
1OO1, addr Msg2
. e l s e i f eax == WM_MOUSEMOVE xor ecx, ecx ; zerujem y r e je s tr E C X mov cx, WORD PTR lParam ; do rejestru C X kopiujem y m łodsze słow o lP aram invo ke S e tD lg Ite m In t, hWin, 1OO2, ecx, FALSE ; ustawiamy liczbę w kon trolce xor ecx, ecx ; zerujem y r e je s tr E C X mov cx, WORD PTR lParam+2 ; d o rejestru C X kopiujem y starsze słow o lP aram invo ke S e tD lg Ite m In t, hWin, 1OO3, ecx, FALSE ; ustawiamy liczbę w kon trolce .e ls e if invo ke
eax == WM_CLOSE EndD ialog , hWin, O
.e n d if xor
eax, eax
re t D lg Proc endp
Rozdz ał 5. Programowan e w system e W ndows
j
51
Zrzut ekranu powyższego kodu podczas działania został zaprezen towany na rysunku 5.5.
Przykładowy program N a rysunku 5.5 w idać działanie program u pobierającego aktualne pozycje kursora m yszy oraz obsługującego kliknięcia lewym przyci skiem myszy.
Rysunek 5.5. Okno przykładowego programu obsługującego mysz komputerową Przykład o nazw ie m ouse_test je s t dostępny pod adresem : ftp ://ftp . helion.pl/przyklady/asem lk.zip.
Odczyt klawiatury Teraz przejdziemy do omówienia odczytu klawiatury. Wszystko wy gląda podobnie jak w przypadku odczytu myszki — system Windows w ysyła do okna odpowiednie kom unikaty. W przypadku wciśnięcia klawisza do okna dialogowego jest w ysyłany kom unikat WM_KEYDOWN, a w przypadku zwolnienia — WM_KEYUP. Oba te komunikaty są tłuma czone przez funkcję TranslateMessage na kom unikat WM_CHAR.
5.4. Operacje na plikach i alokacja bloków pamięci W tym podrozdziale nauczysz się otw ierać pliki i odczytyw ać z nich dane oraz alokow ać bloki pamięci. Uruchom środowisko WinAsm. Następnie kliknij w górnym menu File/ N ew Project. Przejdź na zakładkę Dialog, wybierz Bones i kliknij OK. Będziem y korzystać z gotowego okna do w yboru pliku , d latego do załączonych plików nagłów kow ych dopisz:
52
|
Asembler. Leksykon k eszonkowy
include
comdlg32.inc
i ncl u d e lib
comdl g 3 2 .lib
Teraz przejdź do pliku bones.rc i zm ień nazw ę przycisku z Exit na Otwórz plik. Dodaj również do formularza kontrolkę Edit (z lewej strony jest okienko Toolbox z kontrolkami). Zadeklarujm y potrzebne zmienne: .d a ta ofn
OPENFILENAME
F ilte r S t r in g
db
FileNam e
<>
"W szystkie p l i k i
db
" P lik i
db
MAX PATH DUP(0)
; struktura OPENFILENAME ( * . * ) " , 0, " * . * " , 0
teksto w e ( * . t x t ) " ,
0,
;filtr rozszerzeń plików
" * . t x t " , 0, 0
; zm ienna na nazwę pliku
.d a ta ? h In s ta n c e
?
dd
h F il e
HANDLE
hMemory
HANDLE
pMemory
dd
BytesRead
dd
; uchwyt d o pliku ; uchwyt do bloku p am ięci ? ; w skaźnik do bloku pam ięci ; liczba bajtów odczytanych przez R ead F ile ?
?
?
Teraz w kodzie obsługującym kom unikat WM_INITDIALOG dodaj: ; w ypełnij strukturę OPENFILENAME mov
o f n . l S t r u c t S i z e , SIZEO F ofn
push
hWin
pop
ofn.hWndOwner
push
h In sta n c e
pop
o fn .h In s ta n c e
mov
o fn .lp s tr F ilte r ,
mov
o fn .lp s tr F ile ,
mov
o fn .n M a x F ile , MAX PATH
o ffs e t F ilt e r S t r in g
o f f s e t FileNam e
W kodzie obsługującym przycisk Otwórz plik (id = 1001) dopisz: ; w ypełnij p o le F lag s mov o fn .F la g s , OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST o r \ OFN_LONGNAMES or \ OFN_EXPLORER o r \ OFN_HIDEREADONLY invo ke GetOpenFileNam e, addr ofn ; wyświetl okn o wyboru pliku . i f eax == TRUE
; otw órz p lik za p o m o c ą fu n kcji C reateF ile invo ke C r e a t e F ile , addr F ileN am e,\ GENERIC_READ or GENERIC_W RITE,\ FILE_SHARE_READ or FILE_SH A RE_W RITE,\ NULL, OPEN_EXISTING ,\ FILE_ATTRIBUTE_ARCHIVE, NULL
; uchwyt zachow aj w zm iennej hF ile mov
h F ile ,
eax
; zaaloku j b lo k p am ięci o rozm iarze 65 535 bajtów invo ke G lo b a lA llo c , GMEM_MOVEABLE o r GMEM_ZEROINIT, 65535
; zachow aj uchwyt d o bloku w zm iennej hM emory
Rozdz ał 5. Programowan e w system e W ndows
|
53
mov
hMemory, eax
; zam ień uchwyt na wskaźnik invo ke G lo b a lL o ck , hMemory
; zachow aj w skaźnik w zm iennej pM em ory mov
pMemory, eax
; odczytaj dan e z pliku (maks. 65 535 bajtów ) invo ke R e a d F ile , h F i l e , pMemory, 65535-1, addr BytesR ead , NULL
; wyświetl odczytany tekst w kon trolce Edit invo ke S e tD lg lte m T e x t, hWin, 1002, pMemory
; zam knij uchwyt d o pliku invo ke C loseH an dle, h F i l e
; zw olnij p am ięć invo ke G lo b a lU n lo c k , pMemory invo ke G lo b a lF re e , hMemory .e n d if
To ju ż w szystko! Kod je st skom entow any, w ięc nie pow inno być problem ów z jego zrozum ieniem .
Przykładowy program N a rysunku 5.6 w idać okno program u działającego na plikach i blo kach pamięci. Program otwiera plik, alokuje potrzebną pam ięć, a na stępnie wyśw ietla zaw artość pliku w kontrolce tekstowej.
( 3 Operacje na plikach i alokacja bloków pamięci
Otwórz plik |
Rysunek 5.6. Okno przykładowego programu operującego na plikach Przykład o nazwie files_m em ory jest dostępny pod adresem: ft p / f t p . helion.pl/przyklady/asemlk.zip.
54
|
Asembler. Leksykon k eszonkowy
5.5. Tworzenie menu W tym podrozdziale pokażę Ci, jak stw orzyć w swojej aplikacji m e nu. Dużym ułatw ieniem jest to, że środow isko W inAsm m a wizual ny edytor do tw orzenia takiego menu. Uruchom swoje środow isko i wybierz z górnego m enu File/New Project, przejdź na zakładkę Dialog, wybierz Bones i kliknij OK. Teraz z praw ej strony, w oknie E xplorer, w ybierz dolną zakładkę o nazwie Resources. Następnie kliknij przycisk na górze, który utworzy now e m enu (rysunek 5.7).
Rysunek 5 7 . Przycisk tworzący nowe menu Powinieneś zobaczyć okno edytora menu przedstawione na rysunku 5.8.
Rysunek 5.8. Okno edytora menu Rozdz ał 5. Programowan e w system e W ndows
|
55
Pole Caption to tekst, jaki będzie m iała dana pozycja menu. Name to nazw a tej pozycji w pliku zasobów, a ItemID to num er identyfikacyj ny tej pozycji, którego będziem y używ ać do obsługi kliknięcia danej pozycji. State to stan; może to być pozycja do zaznaczenia (MF_CHECKED), pozycja szara (MF_GRAYED) lub zablokow ana (MF_DISABLED). Type to typ; m oże to b y ć tekst (MF_STRING), bitm ap a (MF_BITMAP), w łasny typ (MF_OWNERDRAW) albo przełamanie (MF_MENUBREAK). Żółte strzałki pozwalają ustaw ić kolejność oraz zagnieżdżenie. Strzałki w górę i w dół zmie niają kolejność, a strzałki w praw o i lewo — zagnieżdżenie. Przyciski Insert i Delete służą do dodawania i usuw ania pozycji. Jeżeli chcesz edytow ać sw oje m enu, p rzejd ź na dole na zakładkę R esources i kliknij na górze przycisk Others. Poprzez podw ójne kliknięcie na liście nazw y swojego m enu przej dziesz do jego edycji. Obsługa kliknięcia danej pozycji w menu przebie ga tak jak w przypadku przycisku. Parametr wParam zawiera num er ID klikniętej pozycji menu.
Przykładowy program A oto przykładow a aplikacja z prostym m enu i obsługą kliknięć (ry sunek 5.9):
Form 3 1 M enul
Menu 2 | Pozycja 1 Pozycja 2
►
Pozycja 3
Exit -------------------------------------
J
Rysunek 5.9. Okno przykładowej aplikacji z menu Przykład o nazw ie menu jest dostępny pod adresem: ftp://ftp.helion.pl/ przyklady/asemlk.zip.
5.6. Kontrolka przycisku (Button) Przycisk pojaw iał się już we wcześniejszych częściach tego kursu, ale do tej pory kontrolka ta nie została jeszcze dokładnie opisana. 56
|
Asembler. Leksykon k eszonkowy
Przypom nę tylko, że podczas odbierania przez okno wiadom ości WM_COMMAND num er ID klikniętego przycisku znajduje się w param e trze wParam. Porównując w artość param etru wParam z numerem kon trolki, m ożem y obsłużyć zdarzenie, jakim jest kliknięcie. Kolejną rzeczą, jaką chcę tutaj opisać, są style kontrolki. N a załączonych rysunkach zam ieszczono kilka wybranych stylów zmieniających wygląd kontrolki przycisku.
Button
Rysunek 5.10. Przycisk ze stylem BS_FLAT
Button
Rysunek 5.11. Przycisk ze stylem WS_EX_CLIENTEDGE
Button
Rysunek 5.12. Przycisk ze stylem WS_EX_STATICEDGE
B u tto n
Rysunek 5.13. Przycisk ze stylem WS_EX_DLGMODALFRAME N a koniec dodam , że opisyw ane w d alszych częściach kontrolki CheckBox i RadioButton, mim o że w środow isku W inAsm są osobnymi kontrolkami, należą do jednej klasy Button, m ają tylko ustaw iony odpowiedni styl.
5.7. Kontrolka pola tekstowego (Edit) Pole tekstow e służy do wprow adzania danych. W tej części opiszę, jak pobrać tekst z kontrolki oraz jak ustawić w niej tekst, oraz wskażę kilka stylów, jakie może m ieć ta kontrolka. Rozdz ał 5. Programowan e w system e W ndows
|
57
Pobieranie tekstu z kontrolki Do pobierania tekstu z kontrolki służy funkcja GetDlgItemText. Jej składnia jest następująca: UINT WINAPI G e tD lg Item T ex t( in HWND hDlg, in i n t n ID D lgItem , out LPTSTR l p S t r in g , _ _ in
i n t nMaxCount
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nIDDlgItem — num er ID kontrolki, lpString — w skaźnik do bufora na tekst, nMaxCount — m aksym alna liczba pobranych znaków. W przypadku powodzenia funkcja zwróci liczbę znaków skopiowanych do bufora. W przeciwnym w ypadku zw raca 0.
Pobieranie liczby z kontrolki Natomiast do pobierania liczb z kontrolki służy funkcja GetDlgItemInt. Jej składnia jest następująca: UINT WINAPI G e tD lg Ite m In t( in HWND hDlg, _ _ in out_o pt _ _ in
i n t n ID D lgItem , BOOL * lp T ra n s la te d , BOOL bSigned
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nIDDlgItem — num er ID kontrolki, lpTranslated — jeżeli zwróci TRUE, wykonanie się powiodło; FALSE — nie powiodło, bSigned — jeżeli TRUE, liczba ze znakiem ; FALSE — bez znaku. Jeżeli funkcja się powiedzie, zmienna wskazywana przez lpTranslated jest ustaw iana na TRUE i w artość zw rócona przez funkcję jest liczbą pobraną z kontrolki. Jeżeli funkcja się nie pow iedzie, w artość w ska zywana przez lpTranslated zostaje ustaw iona na FALSE, a zwrócona w artość to zero. 58
|
Asembler. Leksykon k eszonkowy
Ustawianie tekstu w kontrolce Do ustawienia tekstu w kontrolce służy funkcja SetDlgItemText. Jej skład nia jest następująca: BOOL WINAPI S e tD lg Ite m T e x t( in
HWND hDlg,
in
i n t n ID D lgItem ,
in
LPCTSTR lp S t r in g
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nIDDlgItem — num er ID kontrolki, lpString — w skaźnik do tekstu, który m a zostać ustaw iony w kontrolce. Jeżeli funkcja się powiedzie, zwrócona wartość jest niezerowa, w prze ciwnym wypadku zw rócona w artość to zero.
Ustawianie liczby w kontrolce Do ustaw iania liczby w kontrolce służy fu nkcja SetDlgItemInt. Jej składnia je st następująca: BOOL WINAPI S e tD lg Ite m In t( in
HWND hDlg,
in
i n t n ID D lgItem ,
in
UINT uV alue,
in
BOOL bSigned
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nIDDlgItem — num er ID kontrolki, uValue — wartość, która będzie ustaw iona w kontrolce, bSigned — jeżeli TRUE, to w artość uValue jest liczbą ze znakiem , jeśli FALSE — jest to liczba bez znaku. Jeżeli funkcja się powiedzie, zwrócona wartość jest niezerowa, w prze ciwnym wypadku jest to zero.
Rozdz ał 5. Programowan e w system e W ndows
|
59
Przykładowy program Na rysunku 5.14 widać okno przykładowego program u, który pobiera i ustaw ia tekst oraz liczbę w kontrolce tekstowej.
Rysunek 5.14. Okno przykładowego programu dla kontrolki Edit Przykład o nazw ie edit_con trol je s t dostępny pod adresem : ftp://ftp. helion.pl/przyklady/asemlk.zip.
5.8. Kontrolka wielokrotnego wyboru (CheckBox) Kontrolka o nazw ie CheckBox jest kontrolką wielokrotnego wyboru. N a pewno widziałeś takie kontrolki w różnych program ach. W tej części opiszę, jak spraw dzić stan tej kontrolki.
Sprawdzanie stanu kontrolki CheckBox Do sprawdzania stanu kontrolki CheckBox służy funkcja WinAPI o na zw ie IsDlgButtonChecked. Jej składnia jest następująca: UINT IsD lg Butto nC h ecked ( in
HWND hDlg,
in
i n t n lD Butto n
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nlDButton — num er ID kontrolki CheckBox. Funkcja zwraca BST_CHECKED, jeżeli kontrolka je st zaznaczon a. Jeżeli kontrolka jest w stanie nieokreślonym (tylko przy stylach BS_3STATE lub BS_AUTO3STATE), funkcja zwraca BST_INDETERMINATE. Jeżeli kontrolka nie jest zaznaczona, zw racana jest w artość BST_UNCHECKED.
60
|
Asembler. Leksykon k eszonkowy
Ustawianie odpowiedniego stanu kontrolki Do ustaw iania pożądanego przez nas stanu kontrolki CheckBox służy funkcja CheckDlgButton. Jej składnia jest następująca: BOOL C heckD lgButton( in
HWND hDlg,
_ _ in
i n t n ID B u tto n ,
_ _ in
UINT uCheck
);
Parametry: hDlg — uchw yt do okna nadrzędnego, nIDButton — num er ID kontrolki, uCheck — stan kontrolki (BST_CHECKED, BST_INDETERMINATE lub BSTJJNCHECKED). Jeżeli funkcja się pow iedzie, zwraca w artość niezerow ą, w przeciw nym wypadku zw raca zero.
Przykładowy program N a rysunku 5.15 w id ać program z u żytą kontrolką w ielokrotnego w yboru w w ersjach dwu- i trójstanowej.
Q) Sprawdzanie stanu kontrolki CheckBox P CheckBox
j- CheckBox 3-stanowy
Zaznacz
|
Zaznacz
Odznacz
|
Stan nieokreślony
Sprawdź stan
j
Odznacz Sprawdź stan
J
|
Rysunek 5.15. Okno przykładowego programu dla kontrolki CheckBox Przykład o nazwie checkbox_control jest dostępny pod adresem : ftp://ftp. helion.pl/przyklady/asemlk.zip.
Rozdz ał 5. Programowan e w system e W ndows
|
61
5.9. Kontrolka pojedynczego wyboru (RadioButton) Zaznaczanie i spraw dzanie kontrolki RadioButton przebiega tak samo jak w przypadku omówionej w poprzedniej części kursu kontrolki CheckBox. W arte uw agi je st n ato m iast grupow anie kontrolek typu RadioButton. Kontrolki te grupuje się, ustaw iając w pierwszej kontrolce z grupy styl WS_GROUP. D odatkow o za pom ocą GroupBox m ożna pogrupow ać kontrolki wizualnie.
Przykładowy program Na rysunku 5.16 widać program z pogrupowanymi kontrolkami poje dynczego wyboru.
Rysunek 5.16. Okno przykładowego programu z grupowaniem kontrolek RadioButton Przykład o nazwie radiobutton_control jest dostępny pod adresem: ftp :// ftp.helion.pl/przyklady/asem lk.zip.
5.10. Kontrolka listy rozwijanej (ComboBox) Kontrolkę ComboBox, jak w iększość w indow sowych kontrolek, obsłu gujemy, wysyłając do niej wiadom ości za pom ocą funkcji SendMessage. Składnia tej funkcji jest następująca: LRESULT WINAPI SendMessage( in
HWND hWnd,
in
UINT Msg,
in
WPARAM wParam,
in
LPARAM lParam
);
62
|
Asembler. Leksykon k eszonkowy
Parametry: hWnd — uchw yt do kontrolki, Msg — kom unikat, wParam — param etr wParam, l Param — param etr lParam. W artość zwracana przez funkcję informuje o przetw arzaniu kom u nikatu i zależy od rodzaju wysłanej wiadomości.
Najważniejsze komunikaty • CB_ADDSTRING — dodaje now ą pozycję do listy z zmiennej w ska zywanej przez param etr lParam. • CB_DELETESTRING — usu w a pozycję z listy o indeksie podanym w param etrze wParam. • CB_GETCOUNT — zwraca liczbę elementów na liście. • CB_GETCURSEL — zwraca indeks aktualnie zaznaczonego elementu listy. • CB_SETCURSEL — zaznacza element o indeksie podanym w para metrze wParam.
Przykładowy program N a rysunku 5.17 w idać okno program u z kontrolką listy rozwijanej. Przykładow y program zawiera kod um ożliw iający dodawanie pozy cji do listy, usuw anie danej p ozycji oraz pobieran ie i ustaw ianie in deksu zaznaczonego elementu. Przykład o nazwie combobox_control jest dostępny pod adresem: ftp://ftp. helion.pl/przyklady/asemlk.zip. Więcej informacji o kontrolce oraz komunikatach, które m ożna do niej wysłać, m ożna znaleźć na stronach MSDN.
Rozdz ał 5. Programowan e w system e W ndows
|
63
t j j Kontrolka ComboBox Tekst: [I
Dodaj
|
jDawid Usuń zaznaczone | Indeks zaznaczonego elementu: f° Pobierz indeks zaznaczonego elementu Ustaw indeks zaznaczonego elementu
|
Rysunek 5.17. Okno przykładowego programu dla kontrolki ComboBox
5.11. Kontrolka listy (ListBox) W tym podrozdziale opiszę kontrolkę listy — ListBox. Obsługujem y ją, podobnie jak opisywaną wcześniej kontrolkę ComboBox, wysyłając do niej komunikaty.
Najważniejsze komunikaty • LB_ADDSTRING — dodaje elem ent do listy. W param etrze lParam podajem y w skaźnik do dodawanego tekstu. • LB_GETCOUNT — pobiera liczbę elem entów na liście. Z w racan a w artość to w łaśnie liczba elementów. • LB_GETCURSEL — zw racana w artość to indeks aktualnie zazna czonego elementu. • LB_SETCURSEL — ustaw ia zaznaczenie po podaniu indeksu w pa ram etrze wParam.
Przykładowy program N a rysunku 5.18 w idać okno program u obsługującego kontrolkę li sty. Przykładow y program pozwala na dodawanie now ych pozycji do listy, pobieranie liczby elem entów na liście oraz zaznaczanie da nego elementu i pobieranie indeksu zaznaczonego elementu.
64
|
Asembler. Leksykon k eszonkowy
Q
Kontrolka Listbox
1
Dodaj |
Listbox: http://Odfri.opx.pl/
Pobierz ilość elementów na liśde Indeks zaznaczonego elementu: 0 Pobierz
|
Ustaw
Rysunek 5.18. Okno przykładowego programu dla kontrolki listy Przykład o nazw ie listbox_control jest dostępny pod adresem: ftp ://ftp . helion.pl/przyklady/asemlk.zip. Więcej informacji o kontrolce oraz komunikatach, które można do niej wysłać, m ożna znaleźć na stronach MSDN.
5.12. Kontrolka paska postępu (ProgressBar) Kontrolkę obsługujem y, podobnie jak poprzednie, w ysyłając do niej kom unikaty za pom ocą funkcji SendMessage.
Najważniejsze komunikaty • PBM_GETPOS — zw raca aktualną pozycję paska postępu. • PBM_GETRANGE — zwraca m inim alną i m aksym alną w artość paska postępu. Gdy w parametrze wParam podamy TRUE, zostanie zwróco na w artość m inim alna, natom iast gdy podam y FALSE, zostanie zw rócona w artość maksym alna. W param etrze lParam podaje m y w skaźnik do struktury PBRANGE. • PBM_GETSTEP — zw raca w artość pojedynczego kroku. Domyślna w artość to 10. • PBM_SETPOS — ustawia nową pozycję paska postępu. Nową w artość podajem y w param etrze wParam. • PBM_SETRANGE — ustaw ia m inim alną i m aksym alną w artość pa ska postępu. Mniej znaczące słowo (LOWORD) param etru l Param oznacza w artość m inim alną, bardziej znaczące słowo (HIWORD) — w artość maksymalną.
Rozdz ał 5. Programowan e w system e W ndows
|
65
• PBM_SETSTEP — ustaw ia w artość dla pojedynczego kroku paska postępu. Now ą w artość podajem y w param etrze wParam. • PBM_STEPIT — pow oduje wykonanie jednego kroku paska postę pu. Zw raca poprzednią pozycję przed wykonaniem kroku.
Przykładowy program Na rysunku 5.19 widać przykładowy program dla kontrolki ProgressBar. Program działa bardzo prosto. Po kliknięciu przycisku Start pasek postępu zwiększa się, aż osiągnie m aksym alną wartość.
[ 3 Kontrolka ProgressBar
Start
Rysunek 5.19. Okno przykładowego programu dla kontrolki paska postępu Przykład o nazw ie progressbar_con trol je st dostępny pod adresem : ftp://ftp.helion .pl/przyklady/asemlk.zip. Więcej informacji o kontrolce oraz komunikatach, które można do niej wysłać, można znaleźć na stronach MSDN.
5.13. Kontrolka widoku drzewa (TreeView) Kontrolka ta jest przydatna na przykład do w yśw ietlania drzewa katalogów lub tw orzenia m enu w programie.
Dodawanie elementów Elem enty do kontrolki w idoku drzewa dodajem y, w ysyłając do niej wiadomość TVM_INSERTITEM i podając zero w parametrze wParam, a w lParam — w skaźnik do struktury TV_INSERTSTRUCT. Struktura TV_INSERTSTRUCT m a następujące pola: • hParent — uchwyt do elementu nadrzędnego. Jeżeli podamy TVI_ ^•ROOT lub NULL, wstawiany element będzie elementem nadrzędnym. • hInsertAfter — po podaniu TVI_FIRST element będzie wstawiony na początku , a po TVI_LAST będ zie w staw ion y na końcu. Jeśli 66
|
Asembler. Leksykon k eszonkowy
podamy TVI_ROOT, będzie wstawiony jako element główny, a jeśli TVI_SORT, elem ent zostanie w staw iony do listy w porządku alfa betycznym . • item — struktura TVITEM.
Sprawdzanie klikniętego elementu Spraw dzanie zaznaczonego elementu w kontrolce przeprow adzam y poprzez obsłużenie wiadom ości WM_NOTIFY oraz w ysłanie po niej w ia domości TVN_SELCHANGED. . e l s e i f eax == WM_NOTIFY mov e d i, lParam ; do ED I w artość param etru lP aram assume e d i: p t r NMHDR ; d o E D I w skaźnik na strukturę NMHDR mov e a x , [ e d i] . c o d e ; do EA X k o d w iadom ości (NM HDR.code) . i f eax == TVN_SELCHANGED ; je ż e li EAX = = TVN_SELCHANGED,
; p o b ierz uchwyt zazn aczon ego elementu invo ke SendMessage, hT reeView , TVM_GETNEXTITEM, TVGN_CARET, hPa ren t
; spraw dzanie otrzym anego uchwytu d o elementu z uchwytami elem entów O o
addr szP a re n t
o o
addr szC h ild1
o o
hWin,
addr szC h ild2
o o
eax == hParent invo ke SetD lgItem T ex
addr szC h ild3
o o
.if
addr szC h ild4
. e l s e i f eax == hChild1 invo ke SetD lgItem T ex
hWin,
. e l s e i f eax == hChild2 invo ke SetD lgItem T ex
hWin,
. e l s e i f eax == hChild3 invo ke SetD lgItem T ex
hWin,
. e l s e i f eax == hChild4 invo ke SetD lgItem T ex
hWin,
.e n d if .e n d if
Przykładowy program N a rysunku 5.20 w idać okno przykładowego program u dla kontro lki widoku drzewa. Program po kliknięciu danego elementu kon trolki wyśw ietla inform ację, który elem ent został zaznaczony. Przykład o nazwie treeview_control jest dostępny pod adresem : ftp:/fftp. helion.pl/przyklady/asemlk.zip. Więcej informacji o kontrolce oraz komunikatach, które m ożna do niej wysłać, m ożna znaleźć na stronach MSDN.
Rozdz ał 5. Programowan e w system e W ndows
|
67
Q
Kontrolka TreeView
1 l a l Element atàv.'iv; ïodei:'Element potomny 1 Element potomny 2 Element potomny 3 Element potomny 4
Zaznaczony element: Ëement główny (rodzic)
Rysunek 5.20. Okno przykładowego programu dla kontrolki TreeView
5.14. Kontrolka widoku listy (ListView) W tym podrozdziale opiszę, ja k korzystać z kontrolki w id oku listy (ListView). Skupię się tylko na w idoku raportu (styl LVS_REPORT), gdyż w tedy wyśw ietlanych jest najwięcej informacji o elemencie.
Kolumny Kolumny do kontrolki widoku listy dodajemy, wysyłając do niej wia domość LVM_INSERTCOLUMN. W parametrze wParam podajemy indeks nowej kolumny, a w parametrze lParam — wskaźnik do struktury LVCOLUMN. Pola struktury LVCOLUMN przedstaw iają się następująco: • imask — znaczniki określające, które pola będą aktywne: • LVCF_FMT — aktyw ne jest pole fmt, • LVCF_SUBITEM — aktyw ne jest pole iSubItem, • LVCF_TEXT — aktyw ne jest pole pszText, • LVCF_WIDTH — aktyw ne jest pole lx; • fmt — określa wyrów nanie elem entów /podelem entów : • LVCFMT_CENTER — tekst zostanie wyśrodkowany, • LVCFMT_LEFT — tekst zostanie w yrów nany do lewej, • LVCFMT_RIGHT — tekst zostanie wyrów nany do praw ej;
68
|
Asembler. Leksykon k eszonkowy
• lx — szerokość kolum ny w pikselach; • pszT ext — w skaźnik do tekstu nagłów ka kolum ny; • cchTextMax — rozm iar w b ajtach bufora z tekstem nagłów ka kolum ny; • i SubItem — indeks elementu związanego z kolumną.
Elementy i podelementy Elem enty do kontrolki dodajem y poprzez wysłanie do niej wiado m ości LVM_INSERTITEM. W param etrze wParam podajem y zero, a w lParam — w skaźnik do struktury LVITEM. Najw ażniejsze pola struktury LVITEM przedstaw iają się następująco: • imask — znaczniki określające, które pola będą aktywne: • LVIF_TEXT — pole pszText jest aktywne, • LVIF_IMAGE — pole iImage jest aktywne, • LVIF_PARAM — pole lParam jest aktywne, • LVIF_STATE — pole state jest aktywne; • i Item — indeks elementu (od zera); • i SubItem — indeks podelem entu (od zera); • pszText — w skaźnik na tekst elementu; • cchTextMax — rozm iar bufora tekstow ego elementu. Podelem enty wstaw iam y poprzez w ysłanie do kontrolki wiadom ości LVM_SETITEM. W parametrze wParam podajemy zero, a w lParam — wskaź nik do struktury LVITEM.
Przykładowy program N a rysunku 5.21 w idać program z kontrolką w idoku listy ze stylem raportu. Dla przykładu um ieściłem tam trzy pola tekstowe i przy cisk, który dodaje now ą pozycję do kontrolki. Przykład ten m oże być dobrym szablonem programu korzystającego z bazy danych (w kontrol ce ListView z ustaw ionym stylem raportu bardzo ładnie wyśw ietlają się dane pobrane z bazy danych).
Rozdz ał 5. Programowan e w system e W ndows
|
69
3
Kontrolka ListView
Imię i nazwisko:
Ulica i nr domu:
1
1
Miejscowość:
Dodaj wpis | Imię i nazwisko
| Ulica i nr domu
| Miejscowość
Usuń zaznaczone
Rysunek 5.21. Okno przykładowego programu dla kontrolki widoku listy Przykład o nazw ie listview _con trol je st dostępny pod adresem : ftp://ftp.helion.pl/przyklady/asem lk.zip. W ięcej informacji o kontrolce oraz kom unikatach, które m ożna do niej wysłać, m ożna znaleźć na stronach MSDN.
5.15. Kontrolka suwaka (TrackBar) Tę kontrolkę obsługuje się — podobnie jak inne kontrolki — poprzez w ysłanie do niej wiadom ości przy użyciu funkcji SendMessage.
Ustawianie zakresu Wartość minimalną ustawiamy, wysyłając w iad om ość TBM_SETRANGEMIN i podając w parametrze wParam TRUE — jeżeli kontrolka ma być przeryso wana, lub FALSE w przeciwnym wypadku, a w param etrze lParam — w artość m inim alną, która m a być ustawiona. W artość m aksym alną ustaw iam y, w ysyłając do kontrolki w iadom ość TBM_SETRANGEMAX i podając w param etrze wParam TRUE — jeżeli kontrolka m a być przerysow ana, lub FALSE w przeciw nym wypadku, a w pa rametrze lParam — w artość maksymalną, która ma być ustawiona.
70
|
Asembler. Leksykon k eszonkowy
Pobieranie pozycji suwaka Pozycję suw aka pobieram y, w ysyłając do kontrolki w iadom ość TBM_GETPOS i podając w param etrach wParam oraz lParam zero. Po w y w ołaniu funkcji SendMessage z tą wiadom ością w rejestrze EAX będzie um ieszczona pozycja suwaka.
Przykładowy program N a rysunku 5.22 w idać okno p rogram u , który zaw iera kontrolkę suw aka oraz tekst statyczny. Po przesunięciu suwaka w kontrolce tekstu statycznego jest wyśw ietlana aktualna pozycja suwaka.
( 3 Kontrolka TrackBar
I :---------------) ---------
m "|~ a
Rysunek 5.22. Okno przykładowego programu dla kontrolki suwaka Przykład o nazw ie trackbar_con trol je st dostępny pod adresem : ftp://ftp.helion.pl/przyklady/asem lk.zip. Więcej informacji o kontrolce oraz komunikatach, które m ożna do niej wysłać, m ożna znaleźć na stronach MSDN.
5.16. Kontrolka podpowiedzi (Tooltip) Efekt działania kontrolki podpow iedzi to niew ielki prostokąt zaw ie rający krótki tekst. Prostokąt ten jest wyśw ietlany po najechaniu kur sorem myszy na kontrolkę interfejsu użytkownika. W yśw ietlany tekst inform uje najczęściej o przeznaczeniu danej kontrolki. Jeżeli chcesz używ ać w swoim program ie kontrolki podpowiedzi, m usisz dołączyć następujące pliki: in c lu d e c o m ctl3 2 .in c i n c lu d e lib c o m c tl3 2 .lib
O czywiście, nie zapomnij w swoim program ie o wywołaniu: invo ke InitComm onControls
Rozdz ał 5. Programowan e w system e W ndows
|
71
Tworzenie prostej kontrolki podpowiedzi Najpierw musim y pobrać uchw yt do kontrolki, nad którą m a się pojaw iać podpow iedz (w tym przykładzie będzie to przycisk). Uchw yt do kontrolki, nad którą będziem y w yśw ietlać podpowiedz, pobieram y przy użyciu funkcji GetDlgItem, a następnie zachowujemy go w zmiennej. invo ke G e tD lg Item , hWin, 1001 mov [h B u t t o n ], eax
Teraz utw orzym y kontrolkę podpow iedzi za pom ocą funkcji Create ^WindowEx. W ygląda to tak: .d a ta c ls T o o lt ip db "T o o lt ip s _ c la s s 3 2 " , 0 Tool In fo TOOLINFO <> (... ) .d a ta ? h T o o ltip dd ? (... ) .code invo ke CreateWindowEx, NULL, addr c ls T o o l t i p , \ NULL, 0 ,\ CW_USEDEFAULT, CW_USEDEFAULT,\ CW_USEDEFAULT, CW_USEDEFAULT,\ NULL, NULL, h In s ta n c e , NULL mov [h T o o lt ip ],
eax
Jako pierwszy param etr funkcji podajem y NULL, gdyż nie używ am y tutaj stylu rozszerzonego (ExStyle). N astępnie podajem y nazw ę klasy kontrolki, jaką chcemy utw orzyć (Tooltips_class32). Kolejna jest na zw a okna — wpisujem y tu NULL. N astępny param etr to styl kontrolki — podaliśm y zero, w ięc zostanie utw orzona dom yślna kontrolka, ale m oglibyśm y w pisać tutaj inne w artości, które opiszę nieco dalej. N a stępne argum enty funkcji CreateWindowEx to położenie i rozm iar kon trolki — ustaw iam y dom yślne (CW_USEDEFAULT). Kolejny argum ent to uchwyt okna nadrzędnego — m ożem y podać NULL. W dalszej części znajduje się identyfikator kontrolki — m y ustaw iliśm y NULL, ale pod czas pisania jakiegoś program u należy w pisać liczbę, która będzie służyła do późniejszej identyfikacji kontrolki. N a końcu wpisujemy uchw yt hInstance oraz param etr l Param równy NULL. O statnia linijka zachow uje zw rócony uchwyt do utworzonej kon trolki w zmiennej hTool tip.
72
|
Asembler. Leksykon k eszonkowy
Pozostało nam już tylko w y p ełn ić stru kturę TOOLINFO i w ysłać do kontrolki w iadom ość TTM_ADDTOOL. Teraz m usim y w ypełnić strukturę TOOLINFO. N ajpierw deklarujem y ją w sekcji z danymi: .d a ta Tool In fo TOOLINFO <>
N astępnie w ypełniam y tę strukturę: mov T o o lIn f o .c b S iz e , SIZEO F TOOLINFO mov T o o lIn f o .u F la g s , TTF_SUBCLASS push [h Bu tto n ] pop Too lInfo.h W nd mov T o o lIn f o . u Id ,
1004
invo ke G e tC lie n tR e c t , h B u tto n , addr T o o lIn f o . r e c t mov T o o lIn f o .lp s z T e x t,
o f f s e t T o o ltip T e x t
invo ke SendMessage, h T o o ltip , TTM_ADDTOOL, 0, addr T o o lIn fo
Teraz krótko opiszę pow yższy kod. Pole cbSize musim y w ypełnić rozmiarem struktury. N astępnie podajem y flagi, po czym przy uży ciu PUSH odkładam y n a stos uchw yt do przycisku, nad którym m a być w yśw ietlana podpow iedź, i za pom ocą POP ściągam y go do pola hWnd. Robim y tak, gdyż nie m ożem y w ykorzystać tu instrukcji MOV. M oglibyśm y również skopiow ać najpierw uchw yt do jakiegoś reje stru i dopiero w tedy przenieść go do zmiennej. W kolejnym polu, czyli uId, będzie się znajdow ał num er służący do identyfikacji kon trolki podpowiedzi. N astępnie pobieram y obszar przycisku, nad którym m a być kontrolka, i um ieszczam y go w polu rect. Jeśli jed nak chcielibyśm y, by kontrolka Tooltip pojaw iała się n a dowolnym obszarze (niekoniecznie nad jak ąś inną kon trolką), m u sim y sami w ypełnić tę strukturę odpowiednim i wym iaram i. Kolejne pole to tekst, który m a być w yśw ietlony n a podpowiedzi. O statni w iersz to wiadom ość, która „rejestruje" kontrolkę podpowiedzi. Od tej pory będzie ona aktywna. Tak oto pow stała prosta (bez dodatkow ych stylów) kontrolka pod powiedzi.
Dostosowywanie wyglądu kontrolki Kolor tła i tekstu
O czywiście wygląd kontrolki podpowiedzi m ożem y dostosować. N a początek ustaw im y kolor tła i tekstu. Ustaw m y czarne tło i stalowo niebieski tekst. Rozdz ał 5. Programowan e w system e W ndows
|
73
invo ke SendMessage, h T o o ltip ,
TTM_SETTIPBKCOLOR, 0000000h, 0
invo ke SendMessage, h T o o ltip , TTM_SETTIPTEXTCOLOR, 0DEC4B0h, 0
Tytuł i ikona
Dla kontrolki Tool tip m ożem y także ustaw ić tytuł oraz ikonę. D ostępne są następujące ikony: • TTI_ERROR — błąd, • TTI_INFO — informacja, • TTI_WARNING — ostrzeżenie, • TTI_NONE — brak. Możesz też załadować własną ikonę. Tytuł deklarujemy jako zmienną. Ikonę i tytuł przyp isujem y, w y syłając do kontrolki w iad om ość TTM_SETTITLE. invo ke SendMessage, h T o o ltip , TTM_SETTITLE, T T I_IN FO , addr T o o lt ip T i t l e
Kształt chmurki i przycisk Zamknij
Dla kontrolki podpowiedzi możemy dodatkowo ustawić kształt chmur ki oraz dodać do niej przycisk Z am kn ij. A by to zro bić, w p isujem y w funkcji CreateWindowEx dodatkow e style: TTS_BALLOON i TTS_CLOSE. invo ke CreateWindowEx, NULL, addr c ls T o o l t i p , \ NULL, TTS_BALLOON o r TTS_CLOSE,\ CW_USEDEFAULT, CW_USEDEFAULT,\ CW_USEDEFAULT, CW_USEDEFAULT,\ NULL, NULL, h In s ta n c e , NULL
Zawijanie w ierszy
G dy um ieszczam y w k ontrolce długi tekst, dobrze by było, gdyby po przekroczeniu pew nej d łu gości został on p rzen iesiony do na stępnej linijki. U zyskam y to, w y sy łając do kontrolki w iad om ość TTM_SETMAXTIPWIDTH. invo ke SendMessage, h T o o ltip , TTM_SETMAXTIPWIDTH, 0, 200
Podmiana procedury obsługi okna Dom yślnie kontrolka podpow iedzi, kiedy na przykład najedziem y na nią kursorem m yszy, znika. A co, jeżeli chcemy, żeby po kliknię ciu kontrolki program wykonał pewną czynność (otworzył stronę 74
|
Asembler. Leksykon k eszonkowy
W W W , pokazał jakieś okienko dialogowe, etc.)? M usim y zam ienić procedurę obsługującą zdarzenia okna lub kontrolki. Zaprezentuję teraz, w jaki sposób odebrać w iadom ość kliknięcia kontrolki i w ykonać jak ąś czynność. Do tak zw anego subclassingu użyjem y funkcji SetWindowLong. Zadeklarujm y najpierw następujące dane: .d a ta T o o lt ip T i t l e db " T y t u ł" , 0 c ls T o o lt ip db "T o o lt ip s _ c la s s 3 2 " , 0 Tool In fo TOOLINFO <> T o o ltip T e x t db "T e k st k o n tr o lk i p o d p o w ie d z i.", 0 MsgText db " K lik n ą łe ś k o n tro lk ę p o d p o w ie d z i.", 0 MsgCaption db "In fo r m a c ja ", 0 .d a ta ? h T o o ltip dd ? p T o o ltip P ro c dd ?
W sekcji .DATA pierw szą zm ienną jest tytuł kontrolki podpowiedzi, drugą — klasa (będzie potrzebna do utw orzenia kontrolki), trzecią — struktura TOOLINFO, a kolejne dwie to treść i tytuł MessageBox. N a tomiast w sekcji z niezainicjow anym i danym i (.DATA?) pierw szy jest uchwyt do kontrolki Tooltip, zaś druga zm ienna to w cześniejsza procedura kontrolki, którą zachow ujem y w zm iennej, gdy „podm ie nim y" procedurę okna przy użyciu funkcji SetWindowLong. Oto kod, który należy um ieścić na początku program u, na przykład przy inicjacji okna: invo ke CreateWindowEx, NULL, addr c ls T o o l t i p , \ NULL, TTS_BALLOON,\ CW_USEDEFAULT, CW_USEDEFAULT,\ CW_USEDEFAULT, CW_USEDEFAULT,\ NULL, NULL, h In s ta n c e , NULL mov [h T o o lt ip ],
eax
mov T o o lIn f o .c b S iz e , SIZEO F TOOLINFO mov T o o lIn f o .u F la g s , TTF_SUBCLASS push [hWin] pop Too lInfo.h W nd mov T o o lIn f o . u Id , 0 invo ke G e tC lie n tR e c t , hWin, addr T o o lIn f o . r e c t mov T o o lIn f o .lp s z T e x t, o f f s e t T o o ltip T e x t invo ke SendMessage, h T o o ltip , TTM_SETDELAYTIME, TTDT_RESHOW, 10000 invo ke SendMessage, h T o o ltip , TTM_ADDTOOL, 0, addr T o o lIn fo invo ke SendMessage, h T o o ltip , TTM_SETTITLE, TTI_NONE, addr T o o lt ip T i t l e invo ke SetWindowLong, h T o o ltip , GWL_WNDPROC, o f f s e t T o o ltip P r o c mov p T o o ltip P ro c , eax
Rozdz ał 5. Programowan e w system e W ndows
|
75
Pierw sza fu nkcja je s t Ci zn ana — tw orzy kontrolkę podpow ied zi Tooltip. W dalszej części wypełniamy strukturę TOOLINFO itd. Natomiast dwa ostatnie wiersze to w yw ołanie SetWindowLong w celu podm iany procedury kontrolki oraz zachowanie uchwytu do „starej" procedury w zmiennej. Pozostała nam jeszcze jedna rzecz do zrobienia — m usim y podm ie nić aktualną procedurę kontrolki. N ow ą procedurę należy um ieścić przed procedurą głównego okna. T o o lt ip P ro c proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam : DWORD .if
uMsg == WM_MOUSEMOVE invo ke SendMessage, hWin, TTM_POPUP, 0, 0
. e l s e i f uMsg == WM_LBUTTONDOWN invo ke MessageBox, 0, addr MsgText, addr M sgCaption, 0 invo ke SendMessage, hWin, TTM_POP, 0, 0 . e l s e i f uMsg == WM_RBUTTONDOWN invo ke SendMessage, hWin, TTM_POP, 0, 0 .e l s e invo ke C allW in dow Pro c, p T o o ltip P r o c , hWin, uMsg, wParam, lParam .e n d if Ret T o o lt ip P ro c EndP
Jeżeli kontrolka otrzym a kom unikat WM_MOUSEMOVE, to dodany przez nas kod sprawi, że kontrolka będzie wyświetlana (domyślnie właśnie w tedy znika). Po otrzym aniu przez okno w iadom ości WM_LBUTTONDOWN (użytkow nik klika kontrolkę lewym przyciskiem myszy) zostanie wyświetlony komunikat, a kontrolka zostanie ukryta (TTM_POP). Gdy użytkownik wciśnie prawy przycisk myszy (WM_RBUTTONDOWN), kontrolka podpowiedzi zostanie ukryta. Poniżej w id zim y wyw ołanie funkcji CallWindowProc. Jest ona wyw oływana, gdy przesyłany jest jakiś inny komunikat niż te, które obsługujemy. Krótko mówiąc, jeżeli komunikat jest inny niż te pow yżej, to jest on przesyłan y do dom yślnej proce dury okna (stąd właśnie w pierwszym parametrze znajduje się uchwyt tej w cześniejszej procedury).
Hiperłącza w kontrolce podpowiedzi W kontrolce podpowiedzi można również używać hiperłączy. W tym celu w ystarczy ustaw ić flagę TTF_PARSELINKS w strukturze TOOLINFO. mov T o o lIn f o .u F la g s , TTF_SUBCLASS o r TTF_PARSELINKS
Link tworzymy poprzez umieszczenie w treści znacznika języka HTML: T o o ltip T e x t db 'K l i k n i j
tu ta j< / a > .' , 0
76
|
Asembler. Leksykon k eszonkowy
Przykładowe programy N a rysunku 5.23 w idać okno program u, który zawiera różne rodzaje kontrolek podpowiedzi. N iestety nie udało m i się zaprezentow ać w szystkich rodzajów, ale jeśli uruchomisz przykład i najedziesz kur sorem myszy na dany tekst, w yśw ietli się odpowiednia kontrolka podpowiedzi. N atom iast na rysunku 5.24 w idać obsługę kliknięcia kontrolki podpow iedzi, a na rysunku 5.25 — kontrolkę podpowiedzi wyśw ietlaną z zasobnika system owego.
Rysunek 5.23. Kontrolki podpowiedzi z różnym wyglądem i opcjami Przykład o nazwie tooltip_control1 jest dostępny pod adresem : ftp :// ftp.helion.pl/przyklady/asem lk.zip.
Rysunek 5.24. Obsługa kliknięcia kontrolki podpowiedzi Przykład o nazwie tooltip_control2 jest dostępny pod adresem: ftp://ftp. helion.pl/przyklady/asemlk.zip. Przykład o nazwie tooltip_control3 jest dostępny pod adresem : ftp ://ftp . helion.pl/przyklady/asemlk.zip.
Rozdz ał 5. Programowan e w system e W ndows
|
77
Rysunek 5.25. Kontrolka podpowiedzi wyświetlana z zasobnika systemowego W ięcej inform acji na temat kontrolki podpow iedzi m ożna znaleźć na stronach MSDN.
5.17. Kontrolka do wprowadzania adresu IP (IPAddress) Kontrolka, jak nazw a sugeruje, służy do w yśw ietlania adresu IP. Przed jej użyciem dodajemy: in c lu d e c o m ctl3 2 .in c in c lu d e lib c o m c tl3 2 .lib
O czywiście, nie zapomnij w swoim program ie o wywołaniu: invo ke InitComm onControls
Pobieranie adresu IP z kontrolki Do pobrania adresu IP wpisanego w kontrolce posłuży nam kom u nikat IPM_GETADDRESS. W param etrze lParam podajem y w skaźnik do zmiennej typu DWORD(w niej będzie pobrany adres), w której bity 0 - 7 to pierwsza część adresu IP, 8 - 15 — druga, 16 - 23 — trzecia, a bity 24 31 to czwarta część. Do rozdzielania p oszczeg óln y ch części adresu IP służą m akra FIRST_IPADDRESS, SECOND_IPADDRESS, THIRD_IPADDRESS i FOURTH_I PADDRESS. N aw et jeśli w plikach dołączonych do M ASM -a nie m a tych makr, nie m a problem u, bo m ożem y je sami napisać. Je śli zajrzym y do pliku nagłów kow ego commctrl.h kom pilatora C + + , znajdziem y następujące informacje: # d e fin e FIRST _IPA D D R ESS(a) # d e fin e SECOND_IPADDRESS(a) # d e fin e THIRD_IPADDRESS(a) # d e fin e FOURTH_IPADDRESS(a)
((a>>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)<<24) + ((DWORD)(b2)<<16) + ((DWORD)(b3)<<8) + ( (DW ORD)(b4))) )
Skorzystam y z niego przy pisaniu własnego sposobu na łączenie po szczególnych części adresu IP. Stworzyłem do tego procedurę, opie rając się na zadeklarow anym m akrze w nagłów kach C + + . Poniżej przedstawiam w spom nianą procedurę: M akeIPAddress proc F F i r s t :
DWORD, SSecond: DWORD, T T h ird : DWORD, FFo u rth :
DWORD mov ebx, F F i r s t s h l ebx, 24 mov ecx, SSecond s h l ecx,
16
mov edx, T T h ird shl edx, 8 mov eax, FFo urth add eax, ebx add eax, ecx add eax, edx Ret M akeIPAddress EndP
Najpierw do rejestru EBX kopiujem y pierw szą część adresu IP. W y konujemy przesunięcie bitowe w lewo o 24. W rejestrze ECX zapisujemy drugą część adresu IP i wykonujemy przesunięcie bitowe w lewo o 16. Do rejestru EDX wędruje trzecia część adresu IP — ją również przesu wamy w lewo, ale o 8 bitów. Z kolei w rejestrze EAX um ieszczam y czwartą część IP, a potem dodajem y resztę części adresów IP z in nych rejestrów. Jeżeli chcesz w yw ołać tę procedurę, pam iętaj o zad eklarow aniu jej prototypu (przed sekcją z danymi): M akeIPAddress PROTO :DWORD,
:DWORD, :DWORD, :DWORD
A tak wygląda w yw ołanie w cześniejszej procedury: invo ke M akeIPAddress, F i r s t , Second, T h ir d , mov [d w A d d r], eax
80
|
Asembler. Leksykon k eszonkowy
Fourth
Jako argum enty podajem y poszczególne części adresu IP, a przed stawiona procedura łączy je ze sobą i zw raca jako w artość DWORD. N a koniec trzeba jeszcze ustaw ić now y adres IP w kontrolce poprzez wysłanie komunikatu IPM_SETADDRESS (w lParam zmienna DWORD z nowym adresem IP): invo ke SendMessage, h IP A d d ress,
IPM_SETADDRESS, 0, dwAddr
Czyszczenie zawartości kontrolki Zaw artość kontrolki IPAddress czyścim y, w ysyłając do niej kom uni kat IPM_CLEARADDRESS (za pom ocą funkcji SendMessage).
Ustawianie focusu dla danego pola kontrolki Aby ustanow ić focu s dla danego pola k ontrolk i, należy skorzystać z kom unikatu IPM_SETFOCUS. W y starczy podać w param etrze wParam num er pola (licząc od zera).
Powiadomienia Pozostały jeszcze do om ówienia pow iadom ienia kontrolki. Bez oba wy, nie m a ich dużo, bo tylko jedno: • IPN_FIELDCHANGED — powiadam ia, że jedno z pól kontrolki uległo zmianie. (Pow iadom ienie jest w ysyłane w form ie wiadom ości WM_NOTIFY głównego okna). W lParam znajduje się w skaźnik do struktury NMIPADDRESS. Poniżej przedstawiam strukturę NMIPADDRESS: ty p e d e f s t r u c t { NMHDR hdr; in t i F i e l d ; i n t iV a lu e ; } NMIPADDRESS, *LPNMIPADDRESS;
Pola struktury: • hdr — struktura NMHDR zaw ierająca dodatkow e inform acje o ko m unikacie powiadomienia. • iField — numer pola kontrolki IPAddress, w którym zaszła zmiana (licząc od zera).
Rozdz ał 5. Programowan e w system e W ndows
|
81
• i Val ue — now a w artość dla pola. Podczas przetw arzania po wiadom ienia IPN_FIELDCHANGED to pole m oże zaw ierać dowolną w artość (ważne jednak, by m ieściła się w przedziale adresu IP) — kontrolka ustaw i ją w polu. Poniżej przedstawiam strukturę NMHDR: ty p e d e f s t r u c t tagNMHDR { HWND hwndFrom; UINT_PTR idFrom; UINT code; } NMHDR;
Pola struktury: • hwndFrom — uchw yt kontrolki wysyłającej powiadomienie. • i dFrom — num er ID kontrolki wysyłającej powiadomienie. • code — kod pow iadom ienia. M oże b yć typowym kodem powia domienia (NM_xxx) lub specyficznym dla danej kontrolki.
Przykładowy program N a rysunku 5.26 w idać okno przykładowego programu, który potrafi dzielić adres IP na części oraz złożyć z nich kom pletny adres IP, by w yśw ietlić go w kontrolce IPAddress.
IPAddress
id
Pierwsza część adresu IP: j| Druga część adresu IPi
|" <-
.
1 .
Trzecia część adresu IP: -> Czwarta część adresu IP: |
i
1
'
'
' , Wyczysc |
Przykład pokazuje,jak pobierać adres IP z kontrola IPAddress, dzielić go na części oraz jak z podanych częśa stworzyć znów adres IP.
Rysunek 5.26. Okno przykładowego programu dla kontrolki IPAddress Przykład o nazwie ipaddress_control jest dostępny pod adresem: ftp:/ftp. helion.pl/przyklady/asemlk.zip. W ięcej informacji o kontrolce podpow iedzi m ożna znaleźć na stro nach MSDN.
82
|
Asembler. Leksykon k eszonkowy
5.18. Kontrolka tekstu o bogatym formatowaniu (RichEdit) Tej kontrolki m ożna użyć na przykład do stw orzenia edytora tekstu. Opiszę tutaj takie zagadnienia, jak zaznaczanie, wyszukiw anie czy zamienianie tekstu i przechodzenie do określonego wiersza. Nie będę jed n ak op isyw ał kopiow ania czy w ycinania, gdyż ogran iczają się one jedynie do wysłania odpowiedniej w iadom ości do kontrolki. Na końcu tej części dołączę przykładow y edytor stworzony za pom ocą kontrolki RichEdit.
Zaznaczanie całego tekstu Tekst w kontrolce zaznaczamy, wysyłając do niej wiadomość EM_EXSETSEL i podając w param etrze l Param adres struktury CHARRANGE. (...) lo c a l
ch rg: CHARRANGE
(... ) mov
ch rg .cp M in , 0
mov
chrg.cpM ax, -1
invo ke SendMessage, h R ic h E d it,
EM_EXSETSEL, 0, addr chrg
Wyszukiwanie tekstu Tekst wyszukujemy poprzez wysłanie do kontrolki wiadomości EM_FINDTEXTEX i podanie w parametrze wParam odpowiednich flag, a w pa rametrze lParam — adresu struktury FINDTEXTEX. invo ke IsD lg Butto nC h ecked, hWin, 1016 .if
eax == BST_CHECKED or
u F la g s ,
FR_DOWN
mov eax, fin d te x t.c h rg .c p M in . i f eax != fin d te x t.c h rg .c p M a x push fin d te x t.c h rg .c p M a x pop
fin d te x t.c h rg .c p M in
.e n d if mov fin d te x t.c h rg .c p M a x ,
-1
.e ls e mov fin d te x t.c h rg .c p M a x , 0 .e n d if invo ke IsD lg Butto nC h ecked, hWin, 1012 .if
eax == BST_CHECKED o r u F la g s , FR_MATCHCASE ; uwzględnij w ielkość liter
.e n d if invo ke IsD lg Butto nC h ecked, hWin, 1013 .if
eax == BST_CHECKED o r u F la g s , FR_WHOLEWORD ; szukaj tylko całych wyrazów
Rozdz ał 5. Programowan e w system e W ndows
|
83
.e n d if mov
f i n d t e x t . lp s t r T e x t , o f f s e t F in d B u ffe r
invo ke SendMessage, h R ic h E d it, .if
EM_FINDTEXTEX, u F la g s , addr f in d te x t
eax != -1 invo ke SendMessage, h R ic h E d it,
EM_EXSETSEL, 0, addr fin d te x t.c h r g T e x t
.e n d if
Zamienianie wybranego tekstu Jeżeli chcemy zamienić tekst w kontrolce, wysyłamy do niej komunikaty: • EM_FINDTEXTEX — w yszukuje tekst; • EM_EXSETSEL — zaznacza w ybrany tekst; • EM_SETTEXTEX — zam ienia tekst. Oto kod: (... ) lo c a l
s e t t e x t : SETTEXTEX
(... )
; p o b ie r z tekst d o szukania invo ke G etD lg Item T ex t, hWin, 1020, addr F in d B u ff e r ,
s iz e o f F in d B u ffe r
; p o b ierz tekst do zam iany invo ke G etD lg Item T ex t, hWin, 1022, addr R e p la c e B u ffe r , s iz e o f R e p la c e B u ffe r mov
fin d te x t.c h r g .c p M in , 0
mov
fin d te x t.c h rg .c p M a x ,
mov
-1
f i n d t e x t . lp s t r T e x t , o f f s e t F in d B u ffe r
mov
s e t t e x t . f l a g s , ST_SELECTION
mov
se tte x t.c o d e p a g e , CP_ACP
.w h ile TRUE invo ke SendMessage, h R ic h E d it, .b rea k . i f
EM_FINDTEXTEX, FR_DOWN, addr f in d te x t
eax == -1 ; je ż e li zam ien ion o wszystko, przerw ij pętlę
invo ke SendMessage, h R ic h E d it,
EM_EXSETSEL, 0, addr fin d te x t.c h r g T e x t
invoke SendMessage, h R ich E d it, EM_SETTEXTEX, addr s e tte x t, addr R eplaceB uffer .endw
Przechodzenie do określonego wiersza Jeżeli chcemy przejść do konkretnego wiersza kontrolki RichEdit, wysyłamy do niej wiadomość EM_SETSEL, podając w parametrze wParam pozycję startową, a w lParam — pozycję końcową.
Formatowanie W ygląd czcionki ustaw iam y, w y sy łając w iad om ość EM_SETCHARFORMAT i podając w param etrze wParam SCF_ALL, a w l Param — adres struktury CHARFORMAT.
B4
j
Asembler. Leksykon k eszonkowy
.d a ta CharFormat CHARFORMAT <> .code mov C h a rFo rm a t.cb Siz e , s iz e o f CHARFORMAT mov
CharFormat.dwMask, CFM_FACE + CFM_SIZE
invo ke l s t r c p y , mov
addr CharForm at.szFaceNam e, S Z ("V e rd a n a ")
C h a rFo rm a t.yH e ig h t,
100
invo ke SendMessage, h R ic h E d it,
EM_SETCHARFORMAT, SCF_ALL, addr CharFormat
Przykładowy program N a rysunku 5.27 w idać okno przykładowego program u dla kontro lki RichEdit. Jest to prosty edytor tekstu, którego opcje są bardzo po dobne do w indow sowego N otatnika.
Prnst-y arlytnr teksti i npar+y n a Irnntrnlrp R irh F rlit
Plik
r j.
- I
-
I
a
1®
jr-W A
j
,,
Cofnij Powtórz W ytn ij K o p iu j Wklej
Usuń Znajdź Znajdź następny Zamień... Przejdź do...
Zaznacz wszystko
Rysunek 5.27. Okno przykładowego programu dla kontrolki RichEdit Przykład o nazw ie richedit_control je st dostępny pod adresem : ftp :// ftp.helion.pl/przyklady/asem lk.zip. Więcej informacji o kontrolce podpowiedzi można znaleźć na stronach MSDN.
5.19. Kontrolki w nowym stylu (pliki .manifest) W tym podrozdziale pokażę, jak sprawić, aby kontrolki w Twoich pro gramach wyglądały now ocześnie.
Rozdz ał 5. Programowan e w system e W ndows
|
85
Plik .manifest Wklej poniższy kod do Notatnika i zapisz go jako nazw a_program u.exe. m anifest. < a sse m b ly Id e n tity v e rs io n = "1 .0 .0 .0 " p ro c e s s o rA rc h ite c tu re = "X86" name="CompanyName.ProductName.YourAppl ic a t io n " type= "win32" /> < d escrip tio n > T u taj umieść o p is Twojej a p lik a c ji.< / d e s c r ip tio n > < a s se m b ly Id e n tity type="win32" nam e="Microsoft.Windows.Com m on-Controls" v e rs io n = "6 .0 .0 .0 " p ro ce s so rA rch ite ctu re = "X 8 6 " publicKeyToken="6595b64144ccf1df" language= "*" />
Teraz skopiuj ten plik do katalogu Tw ojego program u i w skrypcie zasobów dopisz wiersz: 100 RT_MANIFEST DISCARDABLE "nazw a_prog ram u.exe.m anifest"
Po wykonaniu pow yższych czynności kontrolki Tw oich programów będą w yglądały równie now ocześnie co na rysunku 5.28.
Rysunek 5.28. Zmiana stylu kontrolek na nowoczesne 86
|
Asembler. Leksykon k eszonkowy
5.20. Podpięcia do systemu Windows (Hooks) Czym są podpięcia do systemu Windows? Podpięcia do systemu W indow s służą do m onitorow ania określo nych zdarzeń w systemie. Poniżej pokażę, jak m ożna m onitorow ać w ciskane klawisze na klawiaturze.
Rodzaje podpięć Istnieją różne rodzaje podpięć; poniżej krótko scharakteryzuję każde z nich: • WH_CALLWNDPROC — monitoruje kom unikaty w ysyłane przez sys tem do danego okna. • WH_CALLWNDPROCRET — m onitoru je kom unikaty w ysyłane przez system do danego okna po tym, jak zostaną już przetworzone. • WH_CBT — używ ane przy monitorow aniu pow iadom ień uży tecznych dla aplikacji CBT (ang. Computer Based Training). • WH_DEBUG— użyteczne przy testowaniu innej procedury podpięcia. • WH_FOREGROUNDIDLE — zakłada procedurę podpięcia, która będzie w yw oływ ana, podczas gdy pierw szoplanow y w ątek aplikacji pozostaje bezczynny. Przydatny do wykonywania zadań o ni skim priorytecie w trakcie bezczynności. • WH_GETMESSAGE — m onitoruje wiadom ości przesyłane do kolejki kom unikatów (ang. message queue). • WH_JOURNALPLAYBACK — zakłada procedurę, która wysyła wiadomości odnotowane wcześniej przez procedurę podpięcia WH_JOURNALRECORD. • WH_JOURNALRECORD — zakłada procedurę, która odbiera wiadomości w ejściow e w ysyłane do kolejki kom unikatów systemu. • WH_KEYBOARD — m onitoruje w iadom ości w ysyłane podczas wci skania klawiszy na klawiaturze. • WH_KEYBOARD_LL — m onitoru je niskopoziom ow e zd arzenia kla wiatury. • WH_MOUSE — m onitoruje wiadom ości wysyłane przez mysz kom puterową. Rozdz ał 5. Programowan e w system e W ndows
|
87
• WH_MOUSE_LL — m onitoru je niskopoziom ow e zd arzenia m yszy kom puterowej. • WH_MSGFILTER — m onitoruje wiadom ości wygenerow ane jako re zultat zdarzeń w ejściow ych w oknie dialogowym , oknie infor m acyjnym , m enu lub pasku przew ijania. • WH_SHELL — zakłada procedurę, która odbiera powiadom ienia, gdy dzieje się coś z powłoką systemową. • WH_SYSMSGFILTER — podobne do WH_MSGFILER, lecz bardziej ogólne.
Instalowanie podpięcia Podpięcie instalujem y poprzez w yw ołanie funkcji SetWindowsHookEx. Jej składnia jest następująca: HHOOK WINAPI SetWindowsHookEx( in
i n t idHook,
in
HOOKPROC lp f n ,
in
HINSTANCE hMod,
in
DWORD dwThreadId
);
Param etry: • i dHook — rodzaj podpięcia (jedno z w ym ienionych powyżej). • lpfn — adres do procedury obsługi podpięcia. • hMod — uchwyt do biblioteki D LL zawierającej procedurę pod pięcia. Jeżeli dotyczy to bieżącego procesu, ta w artość powinna w ynosić zero (NULL). • dwThreadId — num er wątku, który m a być m onitorow any przez podpięcie. Jeżeli wpiszesz tutaj zero, będzie to miało efekt ogólnosystemowy. Po obsłudze naszego podpięcia dobrym zwyczajem jest dopuszcze nie także innych podpięć poprzez wyw ołanie funkcji CallNextHookEx. Składnia tej funkcji jest następująca: LRESULT WINAPI CallN extH ookEx( in _o p t
HHOOK hhk,
in
i n t nCode,
in
WPARAM wParam,
in
LPARAM lParam
);
88
|
Asembler. Leksykon k eszonkowy
Parametry: • hhk — ten param etr jest ignorowany; • nCode — kod podpięcia wysłany do aktualnej procedury podpięcia (Twojej); • wParam — param etr w ysłany do aktualnej procedury podpięcia (Twojej); • l Param — param etr w ysłany do aktualnej procedury podpięcia (Twojej). M usisz p am iętać, aby przed zam knięciem w yw ołać fu nkcję Unhook MWindowsHookEx, co umożliwi zwolnienie zasobów skojarzonych z pod pięciem. Jako argum ent tej fu nkcji należy p o d ać uchw yt zwrócony przez wcześniejsze wyw ołanie SetWindowsHookEx.
Niskopoziomowe podpięcie do klawiatury Niskopoziom owe podpięcie do klawiatury m oże służyć do m onito rowania w ciskanych klawiszy. Rodzaj podpięcia, jaki tutaj zastosu jem y, to WH_KEYBOARD_LL.
Ę 3 Podpięcie do klawiatury (keyboard hookl
t°
1
Wdskane kiawsze: test podpięcia do klawiatury jak widaCjprogram przechwytuje wciskane klawisze
1 Zainstaluj podpięcie
Usuń podpięcie |
Rysunek 5.29. Okno programu z niskopoziomowym podpięciem do klawiatury Przykład o nazw ie keyboard_hook jest dostępny pod adresem: ftp ://ftp . helion.pl/przyklady/asemlk.zip.
5.21. Ekran powitalny (Splashscreen) Najprościej opisując, ekran powitalny to okno wyświetlane przed głów nym oknem programu. N ajczęściej zaw iera jakąś grafikę. Rozdz ał 5. Programowan e w system e W ndows
|
89
Jak wykonać okno powitalne? Uruchom środow isko W inAsm i z górnego m enu wybierz File/New Project, przejdź na zakładkę Dialog, wybierz Bones i kliknij OK. N astępnie usuń przycisk z napisem Exit i w szystkie od w ołania do niego w kodzie. Teraz w staw do okna kontrolkę Image. Przełącz się do widoku skryptu zasobów i dopisz wiersz, który dołą czy do zasobów wcześniej przygotow aną grafikę: 300 BITMAP DISCARDABLE "splash.bm p"
Teraz zaznacz kontrolkę Image i w okienku Explorer wybierz na dole zakładkę Resources. We właściwości Image wybierz 300 (numer identyfi kacyjny zasobu bitm apy). Przejdź do kodu bones.inc i zadeklaruj następującą zmienną: .d a ta ? hWindow
dd
?
Teraz przejdź do kodu pliku bones.asm i w obsłudze kom unikatu WM_INITDIALOG wpisz: push hWin pop
hWindow
invo ke
S e tT im e r, hWin, 1, 1000, addr Tim erProc
Nad procedurą obsługi okna (Dl gProc) wpisz procedurę obsługującą licznik: T im erPro c proc hWnd: DWORD, uMsg: DWORD, id E v e n t: DWORD, dwTime: DWORD invo ke
DialogBoxParam , h In s ta n c e ,
IDD_DLG1002, 0, addr D lg 2Pro c, 0
Ret T im erPro c endp
Teraz w okienku Explorer wybierz na dole zakładkę Resources i za pom ocą przycisku na górze dodaj now e okno dialogowe. N astępnie w pliku bones.inc wpisz num er tego okienka jako stałą: .co n st IDD_DLG1002 equ 1002
Przejdź do kodu pliku bones.asm i nad procedurą obsługującą licznik (TimerProc) dodaj procedurę obsługującą now e okno dialogowe: D lg2Proc proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam : DWORD mov .if
eax, uMsg eax == WM_INITDIALOG invo ke
90
|
L oadIco n, h In s ta n c e , 200
Asembler. Leksykon k eszonkowy
invo ke invo ke invo ke .e ls e if invo ke
SendMessage, hWin, WM_SETICON, 1, eax K illT im e r , hWindow, 1 EndD ialog , hWindow, 0 eax == WM_CLOSE EndD ialog , hWin, 0
.e n d if xor
eax, eax
re t D lg2Proc endp
Po uruchom ieniu powyższego kodu na jedną sekundę powinno się pokazać okno pow italne z grafiką, a następnie okno główne.
Przykładowy program N a rysunku 5.30 w idać okno pow italne przykładow ego programu. Jest ono wyśw ietlane przez sekundę, a następnie pojaw ia się główne okno aplikacji.
Rysunek 5.30. Okno powitalne Przykład o nazw ie splashscreen je st dostępny pod adresem : ftp://ftp. helion.pl/przyklady/asemlk.zip.
5.22. Ikona w zasobniku systemowym (Tray) Ikona w zasobniku systemowym to mała ikonka wyświetlana na pasku zadań obok zegara. Za chwilę pokażę, jak umieścić ikonę naszej aplikacji w zasobniku oraz jak wyświetlić menu po kliknięciu tej ikony prawym przyciskiem myszy.
Rozdz ał 5. Programowan e w system e W ndows
|
91
N a początku m usim y dołączyć do projektu odpowiednie pliki: in c l ude
shel l3 2 . in c
in c l u d e lib
shel 132.1 ib
N astępnie należy zadeklarow ać odpowiednie stałe i zmienne: .co n st WM_SHELLNOTIFY EQU WM_USER + 5 .d a ta AppName db "Prog ram ", 0 p t POINT <> E x i t S t r i n g db "Z a m k n ij", 0 .d a ta ? n o te
NOTIFYICONDATA <>
hPopupMenu dd ?
Dalej m usim y w ypełnić strukturę NOTIFYICONDATA: mov
n o te .c b S iz e , s iz e o f NOTIFYICONDATA
push
hWin
pop
note.hwnd
mov
n o te .u ID , 0
mov
n o te .u F la g s , N I F _ I CON + NIF_MESSAGE + N IF _ T IP
mov
n o te.u C a llb a ck M essag e, WM SHELLNOTIFY
invoke L oadIco n, NULL, mov
IDI_WINLOGO
n o te .h Ic o n , eax
invo ke l s t r c p y ,
addr n o te .s z T ip , addr AppName
Teraz utw orzym y ikonę w zasobniku, w yw ołując Shell_Noti fyIcon: invo ke S h e ll_ N o t if y Ic o n , NIM_ADD, addr note
M enu tw orzym y za pom ocą następującego kodu: invo ke CreatePopupMenu mov
hPopupMenu, eax
invo ke AppendMenu, hPopupMenu, MF_STRING, 1001, addr E x it S t r in g
Kliknięcie pozycji menu obsługujem y po odebraniu przez okno wia domości WM_COMMAND; num er klikniętej pozycji m enu będzie się znaj dował w param etrze wParam. W yświetlanie m enu obsługujem y po odebraniu przez okno wiado m ości WM_SHELLNOTIFY. . e l s e i f eax == WM_SHELLNOTIFY mov
eax, wParam
.if
eax == 0 . i f lParam == WM_RBUTTONDOWN invo ke G etC u rso rPos, addr pt invo ke SetForegroundW indow, hWin
92
|
Asembler. Leksykon k eszonkowy
invo ke TrackPopupMenu, hPopupMenu, TPM_RIGHTALIGN or TPM_RIGHTBUTTON, ^ p t.x ,
p t . y , NULL, hWin, NULL
.e n d if .e n d if
Przy zam knięciu aplikacji ikonę z zasobnika usuw am y za pom ocą funkcji Shel l_NotifyIcon z wiadom ością NIM_DELETE: invo ke S h e ll_ N o t if y Ic o n , NIM_DELETE, ADDR note
Przykładowy program Na rysunku 5.31 widać ikonę przykładowego programu w zasobniku system owym oraz m enu, które pozwala zam knąć program.
Rysunek 5.31. Ikona w zasobniku systemowym wraz z menu Przykład o nazw ie trayicon jest dostępny pod adresem: ftp://ftp.helion. pl/przyklady/asemlk.zip.
5.23. Podmiana procedury obsługi okna Czasam i zachodzi potrzeba filtrow ania w prow adzanych przez użyt kow nika danych. Załóżm y, że potrzebujem y pola edycyjnego, w któ rym m ożna w pisyw ać jedynie cyfry binarne. Przejmując procedurę obsługi okna, mamy nad nim pełną kontrolę i m ożem y b lok o w ać nie które znaki już podczas ich wpisywania. Jeżeli użytkow nik w pisuje coś do pola edycyjnego, do okna jest w y syłana w iadom ość WM_CHAR. Przejmiem y procedurę okna i sami obsłu żym y tę wiadom ość, filtrując inne znaki jak zera i jedynki. N ow ą procedurę obsługi okna ustaw iam y przy użyciu funkcji Set ^WindowLong, która m a następującą składnię: LONG WINAPI SetWindowLong( in
HWND hWnd,
in
i n t nIndex,
in
LONG dwNewLong
);
Rozdz ał 5. Programowan e w system e W ndows
|
93
Parametry: • hWnd — uchw yt okna; • nIndex — rodzaj zmiany: • GWL_EXSTYLE — ustaw ia now y rozszerzony styl dla okna, • GWL_HINSTANCE — ustaw ia now y uchw yt instancji, • GWL_ID — ustaw ia now y identyfikator okna, • GWL_STYLE — ustaw ia now y styl okna, • GWL_USERDATA — u staw ia w artość użytkow nika zw iązaną z oknem, • GWL_WNDPROC — ustawia nową procedurę obsługi okna (to będzie nas interesowało); • dwNewLong — now a wartość. Najpierw pobierzem y uchw yt do pola edycyjnego i zachow am y go w zmiennej hEdit: invo ke G e tD lg Item , hWin, 1001 mov h E d it , eax
Teraz podm ienim y procedurę pola edycyjnego, a zw róconą przez funkcję starą procedurę zapiszem y w zm iennej hOl dProc: invo ke SetWindowLong, h E d it , GWL_WNDPROC, addr E d itP r o c mov h O ldProc, eax
N ow a procedura obsługi pola edycyjnego będzie w yglądała nastę pująco: E d itP r o c proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam : DWORD mov eax, uMsg .if
eax == WM_CHAR mov eax, wParam . i f (a l == "0" || al
== "1 ")
invo ke CallW in dow Pro c, h O ldProc, hWin, uMsg, wParam, lParam re t .e n d if .e ls e invo ke C allW in dow Pro c, h O ldProc, hWin, uMsg, wParam, lParam re t .e n d if xor
eax, eax
re t E d itP r o c endp
94
|
Asembler. Leksykon k eszonkowy
W powyższym kodzie w idzim y funkcję CallWindowProc. U żyw am y jej tutaj do wyw ołania domyślnej procedury obsługi okna. W ykonanie pow yższych czynności skutkuje tym , że do pola edycyj nego będzie m ożna w prow adzać jedynie znaki 0 i 1.
Przykładowy program N a rysunku 5.32 w idać okno przykładowego program u, w którym użyto subclassingu. Pole edycyjne w tej aplikacji dopuszcza jedynie wpisywanie znaków 1 i 0.
{ ¿ I Podmiana procedury obsługi ołna {subclassing)
P
|
I 1100101000011 ll|
Rysunek 5.32. Okno przykładowego programu wykorzystującego subclassing Przykład o nazw ie su bclassin g je s t dostępny pod adresem : ft p ://ftp . helion.pl/przyklady/asem lk.zip.
5.24. Programowanie aplikacji wielowątkowych W ielow ątkow ość m ożna rozum ieć podobnie jak wielozadaniow ość. Przenosząc jakieś czynności do innego wątku, spraw iam y, że nie bę dą one przeszkadzały w pracy aplikacji. N ow y w ątek tw orzymy przy użyciu funkcji CreateThread o następu jącej składni: HANDLE WINAPI C rea te T h re ad ( in opt in
LPSECURITY ATTRIBUTES lp T h r e a d A ttr ib u te s , S IZ E _T d w Sta ck Siz e,
in in _o p t in
LPTHREAD_START_ROUTINE lp S ta r tA d d r e s s , LPVOID lp P a ra m e te r, DWORD d w C re a tio n F lag s,
out_o pt
LPDWORD lp T h re a d Id
);
Parametry: • lpThreadAttributes — wartość NULL spowoduje ustawienie domyśl nego deskryptora zabezpieczeń. Rozdz ał 5. Programowan e w system e W ndows
|
95
• dwStackSize — decyduje o rozmiarze stosu wątku. Jeżeli w pi szesz tutaj NULL, stos wątku będzie taki sam jak wątku głównego. • l pStartAddress — adres do funkcji wątku. • l pParameter (opcjonalny) — adres do zm iennych, które zostaną przesłane do wątku. • dwCreationFlags — jeżeli wpiszesz tutaj 0, w ątek zostanie uru chom iony od razu po utworzeniu. A by utw orzyć „uśpiony" wątek, wpisz CREATE_SUSPENDED. • lpThreadId — adres do zm iennej, w której zostanie zachow any identyfikator wątku. W przypadku pow odzenia funkcja zw róci uchw yt wątku, w prze ciwnym razie zwróci NULL. Funkcja naszego w ątku będzie w yglądała następująco: ThreadProc proc uses ecx Param: DWORD mov
ecx, 900000000
P e t la :
; ja k iś ko d dec
ecx
cmp
ecx, 0
jn e P e t la invoke MessageBox, 0, addr sz T ex t, addr sz C a p tio n , MB_OK re t ThreadProc endp
W powyższej deklaracji fu nkcji w id ać słow a uses ecx, o których wcześniej nie wspominałem. Za ich pom ocą rezerw u jem y rejestr dla swoich celów. Wątek tw orzymy w następujący sposób: invo ke C reate T h re ad , NULL, NULL, addr T hrea d P ro c, NULL, NORMAL_PRIORITY_CLASS, addr ThreadID
Po utworzeniu w ątku zwalniam y jego uchwyt: invo ke C loseH an dle, eax
Komunikacja między wątkami W ątki m ogą się kom unikow ać m iędzy sobą poprzez zm ienne glo balne, kom unikaty lub obiekt zd arzeń. Pow inieneś ju ż w iedzieć, czym są zmienne globalne. Komunikat zaś to wiadomość, jaką otrzy muje okno. W łasne w iadom ości m ożem y deklarow ać jako stałe:
96
|
Asembler. Leksykon k eszonkowy
WM_MOJAWIADOMOSC equ WM_USER+100h
Obiekt zdarzeń m ożesz sobie w yobrazić w postaci znacznika, który sygnalizuje, czy wątek m a być wykonyw any, czy nie.
Przykładowy program N a rysunku 5.33 w id ać okno przykład ow ego p rogram u , który jest aplikacją w ielowątkową. Po kliknięciu przycisku Utwórz wątek zo staje utworzony now y wątek, który wykonuje obliczenia. W zwykłej aplikacji n ie m ożna w ykonyw ać kilku obliczeń jed n ocześn ie, ale w w ątkach można.
Rysunek 5.33. Okno przykładowego programu wielowątkowego Przykład o nazw ie multithreading jest dostępny pod adresem: ftp ://ftp . helion.pl/przyklady/asemlk.zip.
5.25. Tworzenie bibliotek DLL Zapewne zdarzyło się już, że niektórych fragm entów kodu używałeś w swoich programach wielokrotnie. Dobrym zwyczajem jest umiesz czenie takich fragm entów w procedurach i załadowanie całości do biblioteki. Dzięki temu, że korzystasz ze środow iska W inAsm , jest to bardzo proste, gdyż zaw iera ono szablon prostej b ib liotek i D LL. W ystarczy, że z górnego m enu wybierzesz File/New Project, przejdziesz na za kładkę Bare Bone, w ybierzesz DLL i klikniesz OK. Szkielet prostej biblioteki prezentuje się następująco: .386 .model
fla t,
s t d c a ll
o p tio n casemap: none
Rozdz ał 5. Programowan e w system e W ndows
|
97
in c lu d e w indo w s.inc in c lu d e u s e r3 2 .in c in c lu d e k e rn e l3 2 .in c in c lu d e lib u s e r 3 2 .lib in c lu d e lib
k e r n e l3 2 .lib
.d a ta AppName
db " S z k ie l e t b i b l i o t e k i
HelloM sg
DLL, 0
db " W i t a j , w ła ś n ie w yw o łałeś fu n k c ję z b i b l i o t e k i
D LL", 0
.code D llE n t r y proc h In s ta n c e : HINSTANCE, reaso n : DWORD, r e s e r v e d l: mov
DWORD
eax, TRUE
re t D llE n t r y endp
; patrz p lik skeleton .def: to je s t fu n kcja eksportow an a TestH el lo proc invo ke MessageBox, NULL, addr H elloM sg, addr AppName, MB_OK re t TestH el lo endp End D ll E n try
Biblioteka składa się z plików *.asm i *.def. Plik *.asm zaw iera kod źródłow y biblioteki, a plik *.def, jak m ożna się dom yślić z jego roz szerzenia, definicje funkcji um ieszczonych w bibliotece. Biblioteki mogą być dołączane statycznie (pliki *.lib) lub dynam icz nie (pliki *.dll). Biblioteka dołączona statycznie zostaje wbudowana w program , natom iast b ib liotek a D LL p ozostaje jak o osobny plik, który ładujem y do pam ięci przy użyciu funkcji LoadLibrary o nastę pującej składni: HINSTANCE L o a d L ib ra ry ( LPCTSTR lp L ib F ile N a m e );
Parametr: • lpLibFileName — adres do zmiennej zawierającej nazwę biblioteki (ciąg znaków zakończony zerem). W przypadku pow od zenia fu n kcja zw raca uchw yt do b iblioteki, w przeciw nym razie zwraca NULL. Teraz, jeżeli chcem y w y w ołać jak ąś fu nkcję z b ib liotek i DLL, m u sim y pobrać adres tej funkcji. A by tego d okon ać, m usim y skorzy stać z funkcji GetProcAddress o następującej składni:
98
|
Asembler. Leksykon k eszonkowy
FARPROC WINAPI G etP ro cA d d ress( in
HMODULE hModule,
in
LPCSTR lpProcName
);
Parametry: • hModule — uchw yt do biblioteki; • l pProcName — adres zmiennej tekstowej z nazw ą funkcji. Funkcja W inAPI zw róci adres w rejestrze EAX. A by teraz w yw ołać funkcję z biblioteki, wystarczy, że wpiszemy: c a ll
[eax]
5.26. Pliki odwzorowane w pamięci Omów ione wcześniej alokow anie bloku pam ięci w celu wczytania do niego pliku m a jedną zasadniczą wadę: plik m oże być większy niż przydzielony mu blok pamięci. Tutaj z pom ocą przychodzą nam pliki odw zorow ane w pam ięci. Korzystanie z tej techniki jest prost sze, niż m oże się wydawać. Całe działanie ogranicza się do w ykonania następujących kroków: • O twórz plik przy użyciu funkcji CreateFile. • Użyj funkcji CreateFileMapping w celu utw orzenia pliku odw zo rowanego w pamięci. • Wywołaj MapViewOfFile, aby odwzorować w pamięci plik lub jego część. Funkcja zwróci wskaźnik na pierwszy bajt odwzorowanego pliku. Teraz m ożesz w ykonyw ać na pliku różne operacje. • Użyj UnmapViewOfFile, aby zak ończy ć pracę z odw zorow anym plikiem . • Teraz za pom ocą CloseHandle zamknij uchw yt do odw zorow a nego pliku, a następnie do uchwytu pliku otworzonego za po m ocą funkcji CreateFile.
5.27. Pobieranie adresu IP lokalnego komputera Niekiedy podczas pisania aplikacji sieciowych m usim y pobrać adres IP m aszyny, na której urucham iany jest nasz program.
Rozdz ał 5. Programowan e w system e W ndows
|
99
Najpierw należy dodać do naszego program u bibliotekę W insock: in c lu d e
w s2_3 2.inc
in c l u d e lib
w s2 _3 2 .lib
N astępnie trzeba w ykonać następujące kroki: • Inicjujem y W insock za pom ocą funkcji WSAStartup. • Pobieram y nazw ę hosta przy użyciu funkcji gethostname. • Pobieramy strukturę hostent z nazw y h osta za pom ocą funkcji gethostbyname. • Pobieram y adres IP z pola h_li st struktury hostent. • Zam ieniam y adres IP na tekst przy użyciu funkcji inet_ntoa. A oto kod źródłowy: .386 .model
fla t,
o p tio n
casemap: none
s t d c a ll
i ncl ude
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c lu d e
u s e r3 2 .in c
in c lu d e
w s2_3 2.inc
in c l u d e lib
u s e r 3 2 .lib
in c l u d e lib
k e r n e l3 2 .lib
in c l u d e lib
w s2 _3 2 .lib
.d a ta wsaData WSADATA <>; P h o sten t <>; HostName db 128 d u p (0 ); szC aptio n db "Twój adres I P " , 0 .d a ta ? .code s ta rt:
; in icjacja W insock invo ke W SA Startup, 0101h, addr wsaData
; p o b ierz nazwę hosta invo ke gethostnam e, HostName, 128
; p o b ierz strukturę hostent z nazwy hosta invo ke gethostbynam e, addr HostName mov
ebx, eax
; EBX aktualnie w skazuje strukturę hostent
100 |
Asembler. Leksykon k eszonkowy
assume ebx: p t r h o sten t mov
eax, [ e b x ] . h _ l i s t
assume ebx: no thing
; E B X aktualnie w skazuje listę adresów IP mov
ebx, eax
mov
eax, [ebx]
; p o b ierz ad res IP z w skaźnika na ad res IP mov
eax, [eax]
; zam ień ad res IP na tekst invo ke in e t_ n to a , eax invo ke MessageBox, 0, eax, addr sz C a p tio n , 0 invo ke E x itP r o c e s s ,
NULL
end s t a r t
Rozdz ał 5. Programowan e w system e W ndows
| 101
Rozdział 6. Dodatkowe zestawy instrukcji 6.1. Korzystanie z instrukcji koprocesora (FPU) Koprocesor (FPU) to układ scalony, który został stworzony do w y konyw ania operacji zmiennoprzecinkow ych. Jego zadaniem jest od ciążenie głównego procesora. Dodatkowo koprocesor wykonuje wspo mniane operacje o wiele szybciej. Istnieje jeszcze kop rocesor graficzny (GPU), ale nie będziem y poruszać tu tego tematu. Koprocesor m a również swój zestaw instrukcji oraz w łasny zestaw rejestrów.
Rejestry Istnieje osiem rejestrów 80-bitowych. Są one ponum erow ane w na stępujący sposób: ST(0), ST(1), ST(2) ... ST(7) (lub bez naw iasów , czyli ST0, ST1 ). Są jeszcze trzy rejestry 16-bitowe (ang. Control Word, Status Word, Tag Word) oraz wew nętrzny rejestr flagowy (ang. Internal F lag R egister), jed n ak do niego program ista nie m a dostępu. Główne zasady: • W artości m ogą być odkładane tylko na górę stosu rejestrów. • Rejestr FPU (80-bitowy) musi być pusty, zanim załaduje się do niego jakąś wartość. • Załadowanie jakiejś wartości przesuwa niżej wcześniejszą wartość. Zm ienne przechow ujące liczby zm iennoprzecinkow e pow inny m ieć wielkość: • podwójnego słowa, czyli 4 bajty (liczba zmiennoprzecinkowa po jedynczej precyzji) — deklarujem y je przy użyciu dyrektywy DD; • poczwórnego słowa, czyli 8 bajtów (liczba zmiennoprzecinkowa podwójnej precyzji) — deklarujemy je przy użyciu dyrektywy DQ; • dziesięć bajtów (liczba zmiennoprzecinkowa rozszerzonej precyzji) — deklarujem y je przy użyciu dyrektywy DT.
102 |
Asembler. Leksykon k eszonkowy
Wyświetlanie liczb zmiennoprzecinkowych Zanim podam spis instrukcji FPU, kilka słów o tym , ja k wyśw ietlać i form atow ać liczby zm iennoprzecinkow e. W pliku masm32.inc m ożem y znaleźć prototypy trzech funkcji: comment * -------------------------------------s t r in g and f l o a t in g p o in t co n versio n s * F lo a tT o S tr
p ro to
s t d c a ll
fp in : QWORD, szD bl:
PTR CHAR
Flo a tT o S tr2 p ro to
s t d c a ll
fp in : QWORD, szD bl:
PTR CHAR
S tr T o F lo a t
s t d c a ll
s z In :
p ro to
PTR BYTE, fp o u t:
PTR DWORD
FloatToStr
Jak m ożna się d om yślić z nazw y, funkcja konw ertuje liczbę zm ien noprzecinkową na tekst. Oto przykład pokazujący, jak przekonw ertow ać liczbę zm iennoprze cinkową na tekst i ją wyświetlić. (...) .d a ta Pi dq 3. 1415926535897931
; d ek la ra cja zm iennej o rozm iarze QWORD
.d a ta ?
; d ek la ra cja b u fora na tekst
B u f f e r db 128 d u p (?) (... ) .code invo ke F lo a tT o S tr ,
P i,
addr B u ffe r
invo ke MessageBox, 0, addr B u f f e r , 0, 0
; konw ersja z liczby na tekst ; wyśw ietlenie tekstu w kom unikacie
(... )
Gdy skompilujesz ten program i spojrzysz na liczbę w kom unikacie, zobaczysz, że kilka m iejsc po przecinku zostało obciętych. Otóż funkcja FloatToStr tak w łaśnie skraca liczbę zm iennoprzecinkową. Jeżeli chcemy tego uniknąć, m usim y zastosow ać funkcję FloatToStr2, opisaną poniżej. FloatToStr2
Funkcja m a takie samo przeznaczenie jak powyższa, ale nie skraca liczby zm iennoprzecinkow ej. Przykład wygląda praw ie tak samo jak dla powyższej funkcji: (... ) .d a ta Pi dq 3. 1415926535897931
; d ek la ra cja zm iennej o rozm iarze QWORD
.d a ta ? B u f f e r db 128 d u p (?)
; d ek la ra cja b u fora na tekst
(... )
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 103
.code invo ke F lo a tT o S tr2 ,
P i , addr B u f f e r
invo ke MessageBox, 0, addr B u f f e r , 0, 0
; kon w ersja z liczby na tekst ; wyśw ietlenie tekstu w kom unikacie
(...)
StrToFloat
Ta funkcja służy natom iast do konw ersji tekstu na liczbę zm ienno przecinkową. A oto przykładow y kod: (... ) .d a ta szP i db "3 . 1415926535897931", 0 ; zm ienna BYTE z licz bą p i dqPi dq 0 .0 ; zm ienna QWORD na liczbę .d a ta ? B u f f e r db 128 d u p (?) ; b u for na tekst (... ) .code invo ke S t r T o F lo a t , addr s z P i, addr dqPi ; konw ersja tekstu na liczbę
; poniższy k o d pon ow n ie konw ertuje liczbę na tekst i wyświetla, ; ab y zobaczyć, czy liczba została dobrze przekon w ertow an a invo ke F lo a tT o S tr 2 , d q P i, addr B u ffe r invo ke MessageBox, 0, addr B u f f e r , 0, 0 (... )
Zaokrąglanie do danego miejsca po przecinku
Do tego celu posłuży nam funkcja sprintf z biblioteki msvcrt. (... ) .d a ta F lo a t1 dq 12.075535325423453 szFormat db " % . 8 f " , 0 .d a ta ? B u f f e r db 128 d u p (?) (... ) .code invo ke c r t _ s p r i n t f ,
o f f s e t B u f f e r , o f f s e t szForm at,
Flo a t1
(... )
Krótko m ów iąc, zm ienna Float1 jest zm ienną z liczbą, którą chcemy zaokrąglić. Po kropce w zmiennej szFormat podajem y liczbę m iejsc po przecinku. W niezainicjow anych danych (.DATA?), jak wiadom o, de klarujem y bufor na tekst. Nie m ożna oczywiście zapom nieć o dołączeniu plików: in c lu d e m s v c r t.in c i n c lu d e lib m s v c r t . lib
104 |
Asembler. Leksykon k eszonkowy
Spis instrukcji koprocesora Poniżej znajduje się lista instrukcji koprocesora (x87): • F2XM1 — 2Ax - 1. • FABS — w artość bezw zględna z w artości w ST(0). • FADD —
dodaje dwie liczby zm iennoprzecinkow e.
• FADDP — dodaje dwie liczby zm iennoprzecinkow e, na przykład ST(0) i ST(i), i zdejm uje ze stosu ST (0). • FBLD —
ładuje liczbę zapisaną w kodzie BCD z pamięci.
• FBSTP — ładuje liczbę zapisaną w kodzie BCD do pamięci. • FCHS — zm ienia znak liczby w ST(0) . • FCLEX — zeruje znacznik wyjątków. • FCMOVcc — po spełnieniu danego w arunku nad p isu je w artość w ST (0) w artością z S T (i). Jeżeli chcem y u ży w ać tej instrukcji w M ASM , m usim y skorzystać z dyrektywy .686: • FCMOVB — przenieś, jeżeli m niejsze (CF=1); • FCMOVE — przenieś, jeżeli równe (ZF=1); • FCMOVBE — przenieś, jeżeli m niejsze lub równe (CF=1 lub ZF=1); • FCMOVU — przenieś, jeżeli nieuporządkow ane (PF=1); •
FCMOVNB— przenieś, jeżeli nie m niejsze (CF=0);
•
FCMOVNE— przenieś, jeżeli nie jest równe (ZF=0);
•
FCMOVNBE — przenieś, jeżeli nie mniejsze lub równe (CF=0
•
FCMOVNU— przenieś, jeżeli nie jest nieuporządkow ane (PF=0).
i ZF=0);
• FCOM — porównuje wartość z ST(0) do danej liczby zmiennoprze cinkowej. • FCOMI — porów nuje ST(0) z ST(i) i ustaw ia flagi. • FCOMIP — porów nuje ST(0) i ST ( i ) , ustaw ia flagi i zd ejm u je ze stosu ST(0). • FCOMP — porównuje ST(0) z liczbą zm iennoprzecinkow ą i zdejmuje ST(0) ze stosu. Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 105
• FCOMPP — porów nuje ST(0) oraz ST(1) i zdejm uje ze stosu oba rejestry. • FCOS — oblicza cosinus z wartości kąta podanej w ST(0) (wartość w radianach). • FDECSTP — dekrem entuje wskaźnik stosu. • FDIV — dzieli dwie liczby zm iennoprzecinkow e. • FDIVP — dzieli dwie liczby zm iennoprzecinkow e i zdejm uje ze stosu ST(0) . • FDIVR — dzieli odw rotnie dwie liczby zm iennoprzecinkow e. • FDIVRP — dzieli od w rotnie dw ie liczby zm ien noprzecinkow e i zd ejm u je ST(0) ze stosu. • FFREE — czyści rejestr. • FIADD — ładuje liczbę całkow itą z pam ięci do ST(0) . • FICOM — porów nuje w artość w ST(0) z liczbą całkowitą. • FICOMP — porów nuje w artość w ST(0) z liczbą całkow itą i zdej m uje ze stosu ST(0) . • FIDIV — dzieli wartość w ST(0) przez liczbę całkowitą z pamięci. • FIDIVR — dzieli liczbę całkowitą w pamięci przez wartość z reje stru ST(0) . • FILD — ładuje liczbę całkowitą z pamięci. • FIMUL — mnoży wartość w ST(0) przez liczbę całkowitą z pamięci. • FINCSTP — inkrem entuje w skaźnik stosu. • FINIT — inicjuje FPU. • FIST — zapisuje liczbę całkowitą do pamięci. • FISTP — zapisuje liczbę całkowitą do pam ięci i zdejm uje ze sto su ST(0). • FISUB — odejmuje liczbę całkowitą z pamięci od wartości z ST (0). • FISUBR — odejmuje wartość w ST(0) od liczby całkowitej w pamięci. • FLD — ładuje liczbę rzeczywistą.
106 |
Asembler. Leksykon k eszonkowy
• FLD1 — ładuje liczbę 1. • FLDCW— ładuje słowo kontrolne (ang. Control Word). • FLDENV — ładuje środowisko. • FLDL2E — ładuje logarytm o pod staw ie 2 z e (ang. N apierian C onstant). • FLDL2T — ładuje logarytm o podstaw ie 2 z 10. • FLDLG2 — ładuje logarytm o pod staw ie 10 z 2 (ang. Com m on Log o f 2 ). • FLDLN2 — ładuje logarytm o podstawie e z 2 (ang. Natural Log o f 2). • FLDPI — ładuje w artość liczby pi (□). • FLDZ — ładuje w artość zero. • FMUL — m noży dwie liczby zm iennoprzecinkow e. • FMULP — m noży dwie liczby zm iennoprzecinkow e i zdejm uje ze stosu ST(0). • FNCLEX — czyści w yjątki (bez oczekiwania). • FNINIT — inicjuje FPU (bez oczekiwania). •
FNOP — pusta instrukcja.
•
FNSAVE — zapisuje stan FPU (bez oczekiwania).
•
FNSTCW — zachow uje słowo kontrolne oczekiwania).
•
FNSTENV — zachow uje środowisko (bez
•
(ang. ControlWord)(bez
oczekiwania).
FNSTSW — zachow uje słowo statusu (ang. Status oczekiwania).
Word) (bez
• FPATAN — częściow y arcus tangens z wartości ST(1) /S T (0 ). • FPREM— częściow a reszta. • FPREM1 — częściow a reszta 1. • FPTAN — częściow y tangens z w artości kąta w ST(0). • FRNDINT — zaokrągla w artość w ST(0) do liczby całkowitej.
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 107
• FRSTOR — przyw raca wszystkie rejestry. • FSAVE — zachow uje stan FPU. • FSCALE — skalu je ST(0) przez ST(1), czyli w ykonuje: S t ( 0 ) _ ST(0) * 2ZaokrąglijWKierunkuZera(ST(1)) • FSIN — sinus z w artości kąta w ST(0) (w artość w radianach, nie w stopniach). • FSINCOS — sinus i cosinus z w artości kąta w ST(0). (Szybszy niż oddzielne w yw ołanie FSIN i FCOS). • FSQRT — pierw iastek z ST(0). • FST — zapisuje liczbę rzeczywistą. • FSTCW— zapisuje słowo kontrolne (ang. Control Word). • FSTENV — zachow uje środowisko. • FSTP — zapisuje liczbę rzeczywistą i zdejm uje ze stosu ST (0). • FSTSW — zachow uje słowo statusu (ang. Status Word). • FSUB — odejm uje dwie liczby zm iennoprzecinkow e. • FSUBP — odejm uje dwie liczby zm iennoprzecinkow e i zdejm uje ze stosu ST(0) . • FSUBR — odejm uje odw rotnie dwie liczby zm iennoprzecinkow e. • FSUBRP — odejmuje odw rotnie dwie liczby zm iennoprzecinkow e i zdejm uje ze stosu ST(0). • FTST — porów nuje ST (0) z wartością +0.0. • FUCOM — nieuporządkow ane porów nanie ST (0) do w artości zm iennoprzecinkow ej. • FUCOMI — nieuporządkow ane porów nanie ST(0) do ST (i) i usta wienie flag CPU. • FUCOMIP — nieuporządkow ane porów nanie ST(0) i ST ( i ) , usta wienie flag CPU i zdjęcie ze stosu ST(0). • FUCOMP — nieuporządkow ane porów nanie ST(0) do wartości zm iennoprzecinkow ej i zdjęcie ze stosu ST (0).
108 |
Asembler. Leksykon k eszonkowy
• FUCOMPP — nieuporządkowane porównanie ST(0) oraz ST(1) i zdję cie ze stosu obu rejestrów. • FWAIT — czeka, gdy koprocesor jest zajęty (używ ana, aby się up ew nić, że w ykonyw anie poprzedniej instrukcji zostało za kończone). • FXAM— spraw dza w artość w ST(0). • FXCH — zamienia wartość z ST(0) z wartością d ow olnego rejestru — S T (i). • FXTRACT — rozdziela cechę i mantysę. • FYL2X — Y*Log2X. • FYL2XP1 — Y*Log2(X+1).
Przykładowy program Na rysunku 6.1 zostało przedstawione okno przykładowego kalkulatora instrukcji koprocesora. Przykład ten będzie na pewno pom ocny przy nauce i badaniu, jak działają poszczególne rozkazy.
FPU Calculator
|ga|
\
I25
|2.S
I 5,0000000000000000000 5
i FADD i1 | FLDLG2 FCHS | FPATAN
FSUB
1 FSUBR
FMUL
FLDLN2 | FLDL2E j FLDL2T FYL2X | F2XM1 |, FYL2XP11 FPTAN | FSQRT j FRNDIMt]
FDIV FLDPI FSIN FSCALE |
FDIVR FABS
j
FCOS | Clear
|
jAdd floating-point about
Rysunek 6.1. Okno kalkulatora korzystającego z instrukcji koprocesora Przykład o nazwie fpu_calc jest dostępny pod adresem: ftp://ftp.helion.pl/ przyklady/asemlk.zip.
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 109
6.2. Korzystanie z rozszerzeń MMX i SSE Istnieje osiem rejestrów MMX, a ich rozmiar to 64 bity. W Asemblerze są one oznaczane jako mm0 - mm7. Rejestrów SSE jest również osiem, jednak każdy z nich ma rozmiar 128 bitów. Są one oznaczone jako xmm0 - xmm7. Oba om aw iane rozszerzenia (MMX i SSE) dają wiele now ych m ożli wości poprzez powiększenie standardow ego zestawu instrukcji. Jeżeli chcesz korzystać z zestawów instrukcji M M X i SSE, pow inie neś uaktualnić swój asem bler M A SM do najnow szej wersji. Jak to zrobić? Po prostu ściągnij najnowsze Microsoft Visual Studio i podmień plik M L.EXE w katalogu M A SM -a na ten z M icrosoft Visual Studio. Aby skorzystać z M M X i SSE, m usisz jeszcze d op isać do swojego program u następujące dyrektywy: . MMX ; dyrektywy p oz w alają ce na . XMM ; korzystanie z M M X i SSE
Zatem cały szkielet program u będzie wyglądał następująco: .686 .model
fla t,
s t d c a ll
o p tio n casemap: none .MMX ; dyrektywy p oz w alają ce na . XMM ; korzystanie z M M X i SSE i ncl ude
w indows.i nc
i n clu d e
k e rn e l3 2 .in c
in c l u d e lib
k e r n e l3 2 .lib
.d a ta .d a ta ? .code s ta rt:
; Tw ój k o d invo ke E x itP r o c e s s ,
NULL
end s t a r t
Instrukcje rozszerzenia MMX Instrukcje rozszerzenia M M X to przede wszystkim rozkazy wyko rzystyw ane w pracy z multimediami.
110 |
Asembler. Leksykon k eszonkowy
Tabela 6.1. Instrukcje rozszerzenia MMX nstrukcja
Ops
PADDB, PADDW, PADDD
Dodawanie spakowanych liczb całkowitych
PSUBB PSUBW PSUBD
Odejm owanie spakow anych liczb całkowitych
PADDSB PADDSW PADDUSB PADDUSW
Dodaw anie z nasyceniem
PSUBSB PSUBSW PSUBUSB PSUBUSW
Odejm owanie z nasyceniem
PMULHW PMULLW
M n o żen ie liczb 16 b ito w ych ze znakiem z 32 b ito w e g o w ynik u poś edniego jest zapisywanych 16 mniej albo ba dziej znaczących bitów
PMADDWD
Spakowane mnożenie i dodawanie (a * b + c * d)
PCMPEQB PCMPEQW PCMPEQD
Po ów nania spakow anych danych
PCMPGTB PCMPGTW PCMPGTD PACKUSWB PACKSSWB PACKSSDW
K on w e sje między óżnymi odzajami
PUNPCKHBW PUNPCKHWD PUNPCKHDQ
w ekto ó w
PUNPCKLBW PUNPCKLWD PUNPCKLDQ POR
Alte n atyw a logiczna
PAND
Koniunkcja logiczna
PANDN
Koniunkcja z z a n eg o w a n y m jednym z a g u m en tó w
PXOR
Alte n atyw a wykluczająca
PSLLW PSLLD PSLLQ
P zesunięcia bitowe w lewo
PSRLW PSRLD PSRLQ PSRAW PSRAD
P zesunięcia bitowe i a ytm etyczne w p aw o
MOVD MOVQ
P zenoszenie w a tości pomiędzy ejest ami
EMMS
P zygotow anie kop oceso a do działań
M M X pamięcią i ejest ami
zmiennop zecinkowych
Opis instrukcji M M X zaczerpnięto ze strony http://pl.wikipedia.org/ wiki/MMX. Tekst jest udostępniany na licen cji C reative Com m ons, uznanie autorstw a na tych samych warunkach.
Instrukcje rozszerzenia SSE Instrukcje rozszerzenia SSE służą w głównej m ierze do wykonyw a nia działań zm ien noprzecinkow ych na czteroelem entow ych w ek torach liczb pojedynczej precyzji.
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 111
Tabela 6.2. Instrukcje rozszerzenia SSE nstrukcja ADDPS ADDSS
Ops Dodaw anie spakow anych zmiennop zecinkowych liczb pojedynczej p ecyzji
SU BPS SU BSS
O dejm owanie spakowanych zmiennop zecinkowych liczb pojedynczej p ecyzji
MULPS M ULSS
M nożenie spakow anych zmiennop zecinkowych liczb pojedynczej p ecyzji
D IV P S D IV S S
Dzielenie spakowanych zmiennop zecinkowych liczb pojedynczej p ecyzji
R C PPS R C PSS
1/x
SQ RT PS SQ RT SS
Pie w iastek kwad atow y
RSQ RTPS RSQ RTSS
1/sqrH x)
M IN P S M IN SS
W yznaczenie minimalnej w a tości
MAXPS MAXSS
W yznaczenie maksymalnej w a tości
ORPS
Alte natyw a logiczna
ANDPS
Koniunkcja logiczna
ANDNPS
Koniunkcja z negacją (jeden z ope andó w jest negow any p zed obliczeniem iloczynu)
XORPS
Alte natyw a wykluczająca
C V T S I2 S S C V T P I2 P S
K on w e sje pomiędzy liczbami całkowitym i
C V T SS2SI CVTTPS2PI
i zmiennop zecinkowymi
C V TPS2PI CVTTPS2PI SH U F P S U N PC K LPS UNPCKHPS
Rozmieszczenie elem entów w w ekto ze
MOVAPS MOVUPS MOVSS
T ansfe liczb zmiennop zecinkowych między
MOVLPS MOVHPS MOVLHPS
ejest ami i pamięcią
MOVHLPS MOVMSKPS PREFETC H T 0 PREFETCH T1
Ok eślenie miejsca w hie a chii w pamięci
PREFETC H T 2 PREFETCHNTA
pod ęcznej
MOVNTQ MOVNTPS MASKMOVQ
Zapisyw anie danych do pamięci z pominięciem
PAVGB PAVGW
Ś ednia bajtów /słów bez znaku
PMAXUB PM INUB
W y b anie b a jtó w bez znaku o m aksym alnej/
PMAXSW PMINSW
W y b anie słów ze znakiem o maksymalnej/
pamięci pod ęcznej
minimalnej w a tości
minimalnej w a tości PMOVMSKB
U tw o zenie maski bitowej z najsta szych bitów wszystkich bajtów
PMULHUW
Sta sze słowo z wyniku mnożenia słów bez znaku
PSADBW
Sum a m odułów óżnicy bajtów
PEXTRW PIN SRW
Pob anie/w staw ienie dow olnego słow a w ekto a
PSHUFW
Rozmieszczenie słów w w ekto ze
112 |
Asembler. Leksykon k eszonkowy
Opis instrukcji SSE zaczerpnięto ze strony http://pl.wikipedia.org/wiki/ Streaming_SIMD_Extensions. Tekst jest udostępniany na licencji Creative Commons, uznanie autorstw a na tych samych warunkach.
Instrukcje rozszerzenia SSE2 Instrukcje SSE2 to kolejne rozszerzenie zestaw u instrukcji SSE. Um ożliw iają one m iędzy innymi działania w ektorow e i skalarne na liczbach zm iennoprzecinkow ych podwójnej precyzji. Tabela 6.3. Instrukcje rozszerzenia SSE2 nstrukcja ADDPD ADDSD
Ops Dodaw anie spakow anych liczb zmiennop zecinkowych podwójnej p ecyzji
SU BPD SU BSD
O dejm owanie spakow anych liczb zmiennop zecinkowych podwójnej p ecyzji
D IV P D D IV SD
Dzielenie spakow anych liczb zmiennop zecinkowych podwójnej p ecyzji
MULPD MULSD
M nożenie spakow anych liczb zmiennop zecinkowych podwójnej p ecyzji
SQRTPD SQRTSD
Pie w iastek kwad atow y
MAXPD MAXSD
W a tość maksym alna
M INPD M INSD
W a tość minimalna
ORPD
Alte natyw a logiczna
ANDPD
Koniunkcja logiczna
ANDNPD
Koniunkcja i negacja
XORPD
Alte natyw a wykluczająca
CMPPD CMPSD COMISD
Po ównanie
UCOMISD SH UFPD UNPCKLPD UNPCKHPD C V T PD 2PI C V T TPD 2 PI
Rozmieszczanie elem entów w w ekto ach K on w e sja liczb zmiennop zecinkowych podwójnej p ecyzji na 32 bitowe liczby całkowite (w ekto o w e )
CVTPD2PQ CVTTPD2PQ
K on w e sja liczb zmiennop zecinkowych podwójnej p ecyzji na 64 bitowe liczby całkowite (w ekto o w e )
C V T P I2 P D
K on w e sja 32 bitowych liczb całkowitych na liczby z m iennop z ecin ko w e po dw ójnej p ecyzji (w ekto o w e )
CVTDQ2PD
K on w e sja 64 bitowych liczb całkowitych na liczby z m iennop z ecin ko w e po dw ójnej p ecyzji (w ekto o w e )
C V T SD 2 SI C V T T SD 2 SI
K on w e sja liczb zmiennop zecinkowych podwójnej p ecyzji na 32 bitowe liczby całkow ite (skala ne)
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 113
Tabela 6.3. Instrukcje rozszerzenia SSE2 — ciąg dalszy nstrukcja C V T S I2 S D
Ops K on w e sja 32 bitowych liczb całkowitych na liczby zmiennop zecinkowe podwójnej p ecyzji (skala ne)
CVTPS2DQ CVTTPS2DQ
K on w e sja liczb zmiennop zecinkowych pojedynczej p ecyzji na 64 bitowe liczby całkow ite (w ekto o w e )
CVTDQ2PS
K on w e sja 64 bitowych liczb całkowitych na liczby zmiennop zecinkowe pojedynczej p ecyzji (skala ne)
C VTPS2PD
K on w e sja w ekto ó w z pojedynczej na podwójną p ecyzję
CVTPD2PS
K on w e sja w ekto ó w z podwójnej na pojedynczą p ecyzję
C VTSS2SD
K on w e sja skala ó w z pojedynczej na podwójną p ecyzję
C V T PS 2 SS
K on w e sja skala ó w z podwójnej na pojedynczą p ecyzję
PMULUDQ
M nożenie 32 bitowych liczb bez znaku wyniki są 64 bitowe
PADDQ
Dodaw anie 64 bitowych liczb ze znakiem
PSUBQ
O dejm owanie 64 bitowych liczb ze znakiem
PSHUFLW PSHUFHW
Z m ia n a kolejności e le m e n tó w 16 bito w ych o d p o w ied n io w dolnej i gó nej po łó w ce 128 bitowego w ekto a
PSHUFD
Zm iana kolejności elem entów 32 bitowych
PSLLD Q PSRLDQ
P zesunięcia bitow e w lewo i p a w o elem entów
PUNPCKHQDQ PUNPCKLQDQ
P zeplatanie elem entów ejest ó w
64 bitowych
MFENCE LFEN CE
Usze egow anie ope acji odczytu pamięci i zapisu pamięci bądź wyłącznie odczytu (ba ie a pamięci)
C LFLU SH
Zapisuje i unieważnia wskazaną linijkę c a c h e
PAUSE
Jest podpowiedzią dla p oceso a któ a p zyspiesza
na wszystkich poziomach pamięci pod ęcznej
wyjście z pętli aktyw nego oczekiwania MASKMOVDQU
Uaktualnienie w yb anych bajtów z ejest u X M M
MOVNTPD MOVNTDQ
Zapis ejest u X M M
MOVNTI
Zapisanie ejest u ogólnego p zeznaczenia
MOVAPD MOVUPD MOVHPD
P zesyłanie wekto ó w liczb
MOVLPD MOVSD MOVMSKPD
zmiennop zecinkowych
MOVDQA MOVQ2DQ MOVDQ2Q
P zesyłanie wekto ó w liczb całkowitych
114 |
Asembler. Leksykon k eszonkowy
Opis instrukcji SSE2 zaczerpnięto ze strony http://pl.wikipedia.org/wiki/ SSE2. Tekst jest udostępniany na licencji Creative Commons, uznanie autorstw a na tych samych warunkach.
Instrukcje rozszerzenia SSE3 Instrukcje rozszerzenia SSE3 wprow adzają m iędzy innymi nowe rozkazy do arytm etyki zespolonej, konwersji liczb zmiennoprzecin kow ych na całkowite oraz rozkazy do kodow ania grafiki. Tabela 6.4. Instrukcje rozszerzenia SSE3 nstrukcja
Ops
F IS T T P
Do konw e sji liczb zmiennop zecinkowych na całkowitoliczbowe
ADDSUBPS
Dodaw anie dw óch w ekto ó w liczb zmiennop zecinkowych pojedynczej p ecyzji
ADDSUBPD
Dodaw anie dw óch w ekto ó w liczb zmiennop zecinkowych podwójnej p ecyzji
HADDPS
Dodaw anie sąsiednich w ekto ó w liczb zmiennop zecinkowych pojedynczej p ecyzji
H SU BPS
O dejm owanie sąsiednich w ekto ó w liczb zmiennop zecinkowych pojedynczej p ecyzji
HADDPD
Dodaw anie sąsiednich w ekto ó w liczb zmiennop zecinkowych podwójnej p ecyzji
HSUBPD
O dejm owanie sąsiednich w ekto ó w liczb zmiennop zecinkowych podwójnej p ecyzji
MOVSLDUP
Powiela elem enty o pa zystych indeksach w w ekto ze liczb zmiennop zecinkowych pojedynczej p ecyzji
MOVSHDUP
Powiela elem enty o niepa zystych indeksach w w ekto ze liczb zmiennop zecinkowych pojedynczej p ecyzji
MOVDDUP LDDQU
Powiela liczbę zmiennop zecinkową podwójnej p ecyzji w ejest ze X M M Rozkaz ładuje 128 bitó w spod ad esó w niew y ó w n a n ych do g anicy 16 b ajtów
MONITOR
Ustala początkow y ad es zak esu pamięci któ y następnie jest autom atycznie m onito o w a n y p zez p oceso
MWAIT
W ykon an ie ozkazu MWAIT pow oduje wejście w zoptym alizowaną sp zętową pętlę któ a jest p ze yw ana dopie o wtedy gdy wspomniana fla g a zostanie u sta w io n a a w ięc gdy nastąpi zapis pod o bse w o w a n y ad es
Opis instrukcji SSE3 zaczerpnięto ze strony http://pl.wikipedia.org/wiki/ SSE3. Tekst jest udostępniany na licencji C reative C om m ons, uznanie autorstw a na tych samych warunkach.
Rozdz ał 6. Dodatkowe zestawy nstrukcj
| 115
Instrukcje rozszerzenia SSSE3 Rozszerzenie SSSE3 w prow adza now e instrukcje, które działają na wektorach liczb całkowitych. Tabela 6.5. Instrukcje rozszerzenia SSSE3 nstrukcja P S IG B N
PSIGNW
P SIG N D
Ops Działają odpowiednio na w ekto ach bajtów słów bądź podwójnych słów ze znakiem zmieniając znaki tych elementów w a gumencie docelowym dla któ ych odpowiadające im elem enty a gum entu ź ódłow ego są ujemne
P A BSB PABSW PABSD
Działają odpowiednio na w ekto ach bajtów słów bądź po d w ó jn ych słó w ze znakiem obliczając w a tość bezwzględną każdego z elem entów w ekto a ź ódłow ego
PHSUBW PHSUBD
Działają podobnie do PHADDx z tą óżnicą że odejmują sąsiednie elem enty od elem entu o indeksie pa zystym jest odejmowany element o indeksie pa zystym Rozkaz PHSUBSW w ykonuje to samo działanie co PHSUBW z tym że wyniki odejm ow ania są nasycane
PHADDW PHADDD
Działają odpowiednio na w ekto ach słów bądź podwójnych słów ze znakiem wykonując dodawanie sąsiednich elementów PHADDSW w ykonuje to samo działanie co PHADDW z tym że wyniki dodaw ania są nasycane
PMULHRSW
M noży w ekto y słów ze znakiem W yniki mnożenia są zaok ąglane
PMADDUBSW
W ykon uje mnożenie dw óch w ekto ó w bajtów t aktując bajty z w ekto a docelow ego jako liczby bez znaku natomiast ze ź ó d ło w e g o
ze znakiem
w ynikiem poś ednim jest
w ekto 16 bitowych liczb ze znakiem PSH UFB
Rozmieszcza elementy w wekto ze bajtów zgodnie ze wzo cem zapisanym w w ekto ze ź ódłow ym
P A LIG N R
Łączy d w a 16 bajtow e w ekto y w jeden 32 bajtow y po czym w ybie a z niego pewien zak es 16 bajtów i zapisuje w w ekto ze docelowym Początek zak esu jest w skazyw any p zez t zeci a g um ent ozkazu
8 b ito w ą stałą
n a ty ch m ia s to w ą imm8 PHSUBSW
Spakow ane ho yzontalne odejm ow anie z satu acją
PHADDSW
Spakow ane ho yzontalne dodaw anie z satu ac ą
Opis instrukcji SSSE3 zaczerpnięto ze strony http://pl.wikibooks.org/wiki/ A sem bler_X 86/Instrukcje/S S SE 3. T ek st je st u d ostęp n ian y na licencji C reative Com m ons, uznanie autorstw a na tych samych warunkach.
116 |
Asembler. Leksykon k eszonkowy
Instrukcje rozszerzenia SSE4 Instrukcje rozszerzenia SSE4 zaw ierają m iędzy innym i instrukcje do operacji na wektorach liczb całkowitych i zmiennoprzecinkow ych, rozkazy do kom presji wideo czy rozkaz obliczający sum ę kontrolną CRC32. Tabela 6.6. Instrukcje rozszerzenia SSE4 nstrukcja BLEN D PS BLENDPD BLEN D VPS
Ops P zepisanie tylko w yb anych elem entów w ekto ó w
BLENDVPD PBLEN D V B PBLENDW
(w skazanych maską bitową lub maską bajtow ą)
D PPS DPPD
Obliczanie iloczynu skala nego
EXTRAC TPS P EX T R B PEXTRW
W y b anie elem entu z w ekto a (z ejest u X M M )
PEXTRD PEXTRQ
i zapisanie go do ejest u ogólnego p zeznaczenia
IN S E R T P S P IN S R B P IN S R D
Zapisanie ejest u ogólnego p zeznaczenia albo
lub pamięci
P IN SR Q
pamięci na wskazanej pozycji w ekto a
PMAXSB PMAXSD PMAXUB
W y b anie m aksym alnych/minim alnych elem entów
PMAXD P M IN SB PM INSD
z dw óch w ekto ó w bajtów lub podwójnych słów
PM IN UB PMIND
(ze znakiem albo bez znaku)
PMULDQ PMULLD
Rozkazy mnożą wekto y 32 bitowych liczb ze znakiem PMULDQ zapisuje wyniki 64 bitow e natomiast PMULLD tylko mniej znaczące 32 bity wyniku
PMOVSXBW PMOVSXBD
Rozsze zenie zak esu liczb ze znakiem (z 8 na 16
PMOVSXBQ PMOVSXWD
32 lub 64 bity z 16 na 32 lub 64 bity z 32 na 64 bity)
PMOVSXWD PMOVSXDQ PMOVZXBW PMOVZXBD
Rozsze zenie zak esu liczb bez znaku (z 8 na 16 32
PMOVZXBQ PMOVZXWD
lub 64 bity z 16 na 32 lub 64 bity z 32 na 64 bity)
PMOVZXWD PMOVZXDQ PACKUSDW
K on w e sja w ekto a czte ech 32 bitowych liczb całkowitych ze znakiem na wekto liczb całkowitych 16 bitowych bez znaku p zy konw e sji następuje nasycenie wyniku
PCMPEQQ
Po ów nanie w ekto ó w poczwó nych słów ze
ROUNDPD ROUNDPS ROUNDSD
Zaok ąglanie w ekto ó w lub skala ó w liczb
ROUNDSS
zmiennop zecinkowych pojedynczej bądź
znakiem (elem enty 64 bitow e) elacją „ ó w n y"
podwójnej p ecyzji PHMINPOSUW
Rozkaz wyszukuje w w ekto ze liczb 16 bitowych bez znaku najmniejszą w a tość zw aca w a tość elem entu o az jego indeks
PTEST
Rozkaz pozwala na spaw dzenie k tó e bity w ejest ze X M M są ustawione
ozkaz m odyfikuje ejest flag
mik op oceso a
Rozdz ał 6. Dodatkowe zestawy nstrukcj
j 117
Tabela 6.6. Instrukcje rozszerzenia SSE4— ciąg dalszy nstrukcja
Ops
MPSADBW
Rozkaz oblicza 8 kolejnych sum m odułów óżnic w ekto ó w 4 elem entow ych
MOVNTDQA
Ładuje 128 bitów z pamięci z pominięciem pamięci
CRC32
Aktualizacja sumy kont olnej CRC 32 używ any
pod ęcznej
wielomian 11edc6f41h POPCNT
Zliczenie liczby zapalonych bitów w słowach 16 32 lub 64 bitowych (a gumentami m ogą być ejest y bądź ad esy pamięci)
PCMPGTQ
Po ów nanie w ekto ó w poczwó nych słów ze znakiem (elem enty 64 bitow e) elacją „większy"
PC M PE ST R I
PCMPESTRM
Rozkazy działają na łańcuchach bajtów lub słów ze
P C M P IS T R I
PCM PISTRM
znakiem lub bez znaku i pozwalają na sp awdzenie czy łańcuchy są ó w n e stw ie dzenie któ e znaki z pie wszego łańcucha znajdują się w d ugim (ew entualnie czy znajdują się w p zedziałach zdefiniowanych w d ugim łańcuchu) czy wyszukanie w ystąpień jednego z łańcuchów w d ugim
Opis instrukcji SSE4 zaczerpnięto ze strony http://pl.wikipedia.org/wiki/ SSE4. Tekst jest udostępniany na licencji Creative Commons, uznanie autorstw a na tych samych warunkach. Jeśli chcesz lepiej poznać instrukcje M M X i SSE, zajrzyj do doku mentów: M M X Technology Developers Guide oraz Intel 64 and IA-32 Architectures Software Developer's M anual: Volume 2B: Instruction Set R eference.
6.3. Nowe rozszerzenie — Advanced Vector Extensions (AVX) Jest to kolejne rozszerzenie zestawu instrukcji SSE. Doszło 16 no wych rejestrów oznaczonych jako YMM0 - YMM15, każdy o rozmiarze 256 bitów. W trybie 64-bitow ym dostępne są w szy stk ie rejestry, nato m iast w trybie 32-bitowym jedynie osiem pierwszych. Doszło także 19 całkiem now ych instrukcji. D odatkow o niektóre instrukcje zostały rozszerzone, aby m ogły działać na now ych rejestrach.
118 |
Asembler. Leksykon k eszonkowy
Nowe instrukcje rozszerzenia AVX
Instrukcje rozszerzenia AVX to między innymi rozkazy działające na w ektorach, wspom agające szyfrowanie algorytm em AES czy m no żenie liczb binarnych. Tabela 6.7. Nowe instrukcje rozszerzenia AVX nstrukcja AESDEC A ESD EC LA ST AESENC
Ops W spom ag ające szyf o w anie algo ytm em AES
A ESEN C LA ST A ESIM C A E S K E Y G E N A S S IS T VBROADCASTSS VBROADCASTSD
Powielenie liczby 32
VBROADCASTF12B
z pamięci w ejest ze X M M lub Y M M
V EXTRAC TF12B
64 lub 128 bitowej pob anej
P zepisanie ba dziej znaczących lub mniej znaczących 128 bitów z ejest u Y M M do zmiennej w pamięci lub ejest u X M M (z wyze owaniem sta szych 12 bitów sto w a zyszonego z nim ejest u Y M M )
V IN S E R T F 1 2 B
W pisanie 128 bitów z ejest u X M M lub pamięci do ba dziej znaczącej lub mniej znaczącej połówki ź ódłow ego ejest u Y M M i p zepisanie tak u tw o zonego w ekto a docelow ego Y M M
VMASKMOVPS VMASKMOV
P zesłanie w yb anych elem entów z/do pamięci (t ansfe y 128 lub 256 bitowe)
V P E R M IL P D V P E R M IL P S
Dowolna pe mutacja elem entów w ekto a
V P E R M IL 2 P D V P E R M IL 2 P S
Dowolna pe mutacja elementów z dwóch wekto ó w
VPERM 2F12B PCLMULQDQ
M n o ż en ie liczb bina nych 64 b ito w ych bez p zeniesień
V P T E S T P S V P T E ST PD
Rozkazy podobne do V PTEST
VZEROALL
W t ybie L on g M o d e wyczyszczenie wszystkich d o stęp nych
ejest ó w Y M M
w t yb ie L e g a c y /
C o m p a t M o d e tylko ejest y od Y M M 0 do Y m M 7 V ZER O U PPER
W t ybie Long M o d e wyczyszczenie bitów 128 w e w szystkich d o stęp nych
255
ejest ach Y M M
w t ybie L e g a c y /C o m p a t M o d e tylko w ejest ach od Y M M 0 do Y M M 7 VLDMXCSR VSTMXCSR
Załadowanie/zapis zaw a tości ejest u kont olnego z/do pamięci
Opis instrukcji AVX zaczerpnięto ze strony http://pl.wikipedia.org/wiki/ Advanced_Vector_Extensions. Tekst jest udostępniany na licencji Creative Commons, uznanie autorstw a na tych samych warunkach. Dokładniejszy opis instrukcji AVX znajdziesz w dokum encie Intel® A dvanced Vector Extensions Program ming Reference.
Rozdz ał 6. Dodatkowe zestawy nstrukcj
j 119
Rozdział 7. Asembler 64-bitow y (x86-64) 7.1. Wstęp do Asemblera dla architektury 64-bitowej Jakiś czas tem u stałem się posiadaczem system u W indow s 7 (64-bitow ego) i zapew ne w śród C zytelników też są użytkow n icy 64-bitow ych system ów. Od razu zaciekawiło mnie, jak wygląda pro gramowanie w A sem blerze pod tym system em , zatem ruszyłem po pom oc do Google. W tym rozdziale chciałbym zeb rać informacje, które — mam nadzieję — będą pom ocne w rozpoczęciu program o w ania w system ach 64-bitowych. M ateriałów w języku polskim nie stety póki co nie m a, a zatem dodatkow ych inform acji trzeba szukać na anglojęzycznych forach i w dokumentacji.
Podstawowe informacje W system ach 64-bitowych nie m a już możliwości urucham iania apli kacji dla system u DOS. M ożna to jednak zrobić, korzystając z em u latora DosBox, choć — trzeba przyznać — jest to spore ograniczenie. N atom iast jeżeli chodzi o aplikacje dla system u W in32, w większości przyp adków pow inien eś je bez p roblem ów uruchom ić, licząc się z niew ielką stratą wydajności. U m ożliw ia to nakładka W O W 64 (ang. Windows on W indows 64). Loader urucham iający pliki wykonywalne rozpoznaje, czy są one 32-bitow e. Jeżeli tak, są one urucham iane w ten sposób, że m iędzy innym i w yw ołania funkcji są „tłum aczone" przez tę nakładkę i przekierow yw ane (rysunek 7.1) do bibliotek system owych (64-bitowych). Wraz z now ą architekturą zwiększyła się przestrzeń adresowa, zmienił się form at plików (nazywany PE32+), m am y też now e rejestry pro cesora. Co praw da niektóre instrukcje nie są już dostępne, ale za to doszły nowe.
Zmiany w formacie plików wykonywalnych P ięć pól stru ktury pliku w ykonyw alnego zostało rozszerzonych, a jedno zostało usunięte — przedstaw ia to tabela 7.1.
120 |
Asembler. Leksykon k eszonkowy
Rysunek 7.1. Schemat emulacji WOW64 Tabela 7.1. Zmiany w formacie plików wykonywalnych N azw a pola
Rozm ar w strukturze PE
Im a g e B a s e
ULONG
Rozm ar w strukturze PE32+ ULONGLONG
S iz e O fS ta c k R e s e r v e
ULONG
ULONGLONG
S iz e O fS t a c k C o m m it
ULONG
ULONGLONG
S iz e O f H e a p R e s e r v e
ULONG
ULONGLONG
SizeO fH ea p C o m m i t
ULONG
ULONGLONG
B a s e O fD a t a
ULONG
Pole usunięto
Rejestry procesora w architekturze x64 Dotychczas znane rejestry ogólnego przeznaczenia zostały rozszerzone do rozmiaru 64 bitów, a do ich nazw dodano prefiks REX , czyli EAX ^ RAX, EBX ^ RBX, ECX ^ RCX itd. Doszło także osiem nowych rejestrów ogólnego przeznaczenia, nazw anych: R8, R9 , R10 , R11 , R12 , R13 , R14 i R15 (rysu nek 7.2). Zostały też dodane nowe rejestry 128-bitowe XMM (XMM8 - XMM15).
Rozdz ał 7. Asembler 64-b towy (x86-64)
| 121
Rejestry ogólnego przeznaczenia
Rejestry 64-bitowe oraz rejestry zmiennoprzec in kowe
Rejestry 128-bitowe XMM0
RAX
MMX0/FPR0
RBX
MMX1/FPR1
XMM1
RCX
MMX2/FPR2
XMM2
RDX
MMX3/FPR3
XMM3
RBP
MMX4/FPR4
XMM4
RSI
MMX5/FPR5
XMM5
RDI
MMX6/FPR6
XMM6
RSP
MMX7/FPR7
XMM7
R8
XMM8
63
R9
XMM9
RIO
XMM10
Rejestr flag |e f l a g s |
R13
63
XMM11 r fla g s
0
XMM12 XMM1J
R14
Wskaźnik instrukcji
XM M 14
R1S
|
XMM1S
EIP
| RIP
[
| Rejestry dostępne we wszystkich trybach
I
I Rejestry dostępne tylko w trybie 64-bitowym
Rysunek 7.2. Zmiany w rejestrach procesora (rysunek pochodzi z dokumentacji firm y AMD)
Zmiany w instrukcjach Poniżej w ym ieniam instru kcje, które nie są ju ż d ostępne (w ystąpi w yjątek invalid-opcode): • AAA— dostosuj po dodawaniu. • AAD— dostosuj AX przed dzieleniem. • AAM— dostosuj AX po mnożeniu. • AAS — dostosuj AL po odejmowaniu. • BOUND— spraw dź, czy indeks tablicy mieści się w przedziale. • DAA— dostosuj dziesiętnie AL po dodawaniu. • DAS — dostosuj dziesiętnie AL po odejmowaniu. • INTO — przerw anie do w ektora przepełnienia. • LDS, LES — załaduj daleki wskaźnik.
122 |
Asembler. Leksykon k eszonkowy
• POPA, POPAD — zdejmij ze stosu wszystkie rejestry ogólnego prze znaczenia. • POP DS/ES/SS — instrukcja POP z operandem DS, ES lub SS. • PUSH CS/DS/ES/SS — instrukcja PUSH z operandem CS, DS, ES lub SS. • PUSHA, PUSHAD — odłóż wszystkie rejestry ogólnego przeznaczenia na stos. D odatkow o instrukcja SYSENTER/SYSEXIT jest dostępna tylko w trybie Legacy M ode (inaczej w ystąpi w yjątek inval id-opcode). W trybie Long M ode należy użyć instrukcji SYSCALL/SYSRET. Instrukcje LODSB, LODSW, LODSD, CMPSB, CMPSQ, MOVSW, MOVSQ, SCASD, SCASQ, STOSQ zostały rozszerzone do obsługi adresów 64-bitowych; zostały też dodane nowe instrukcje: LODSQ, CMPSQ, MOVSQ, SCASQ i STOSQ. Również instrukcje REP, REPZ, REPNZ, LOOP, LOOPZ i LOOPNZ korzystają obecnie z 64-bitowych rejestrów.
Konwencja wywołania Z m ieniła się także konw encja w yw ołania (ang. calling convention). W systemie Win32 obowiązywała konwencja STDCALL. Tutaj konwen cja wyw ołania nazyw a się FASTCALL i zam iast przekazyw ać para m etry przez stos, pierwsze cztery param etry przekazuje przez spe cjalne rejestry (RCX, RDX, R8, R9), a resztę przez stos. D odatkow o m usim y zrobić m iejsce na stosie na param etry przekazywane przez rejestry (w praktyce wykonanie sub rsp, l iczba). Poniżej przedstawiam sposób wywołania funkcji MessageBox w Win32: push 0 push o f f s e t szC aption push o f f s e t szText push 0 c a ll
MessageBoxA
W system ie W in64 wyw ołanie tej samej funkcji wygląda tak: sub rs p , 28h mov r9d, 0 le a r8 ,
szC aption
le a rdx, szText mov rc x , 0 c a ll
MessageBoxA
Rozdz ał 7. Asembler 64-b towy (x86-64)
| 123
Adresowanie W Asem blerze x64 adresy do miejsc (danych i kodu), które znajdują się wew nątrz program u, pozostają 32-bitowe. Jest to wynikiem rela tyw nego adresowania (ang. RIP relative addressing). M y podajem y adres pośredni, który po zsum ow aniu z bieżącym adresem daje ad res bezpośredni. Jeżeli odw ołujem y się do adresów zewnętrznych, na przykład funkcji z jakiejś biblioteki, adres jest 64-bitowy.
Kompilatory Asemblera x64 • MASM64 — jest dołączony do W INDDK (ang. Windows Driver Development Kit) w katalogu \W IN D D K\3790.1830\bin\w in64\ x86\am d64. • jW asm — jest kom patybilny z M ASM -em. • N ASM — asem bler NASM od wersji 2.00 wspiera architekturę x86-64. • FASM — polski asembler. • GoAsm — asem bler autorstw a Jerem y'ego Gordona.
Debuggery aplikacji 64-bitowych • Debugging Tools for W indows 64-bit Version, • FDBG — AM D64 Assem bly Debugger.
124 |
Asembler. Leksykon k eszonkowy
Rozdział 8. Opis rozkazów procesorów z rodziny 80x86 8.1. Instrukcje na literę A AAA Dostosuj po dodawaniu Użycie: AAA M odyfikowane flagi: AF, CF (OF, PF, SF, ZF niezdefiniowane) Zamienia wartość AL na niespakowaną wartość w kodzie BCD. Bardziej znaczący nibble jest zerowany. Rodzaje operandów: brak
AAD Dostosuj AX przed dzieleniem Użycie: AAD M odyfikowane flagi: SF, ZF, PF (AF, CF, OF niezdefiniowane) Używana przed dzieleniem niespakowanych liczb dziesiętnych. Mnoży AHprzez 10 i dodaje do AL. Zeruje AH. AL := 10*AH+AL AH := 0 Rodzaje operandów: brak
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 125
AAM Dostosuj AX po m nożeniu Użycie: AAM M odyfikowane flagi: PF, SF, ZF (AF, CF, OF niezdefiniowane) AH := AL / 10 AL := AL mod 10 Używ ana po m nożeniu dwóch niespakow anych liczb dziesiętnych. Przed użyciem tej instrukcji bardziej znaczący nibble każdego bajtu m usi być wyzerowany. Rodzaje operandów: brak
AAS Dostosuj AL po odejmowaniu Użycie: AAS M odyfikowane flagi: AF, CF (OF, PF, SF, ZF niezdefiniowane) Popraw ia rezultat odejm owania dwóch niespakow anych liczb dzie siętnych w rejestrze AL. Bardziej znaczący nibble jest zerowany. Rodzaje operandów: brak
ADC Dodawanie z przeniesieniem Użycie: ADC ce l, źródło M odyfikowane flagi: AF, CF, OF, SF, PF, ZF Sum uje dwa operandy binarne, um ieszczając rezultat w pierwszym operandzie (celu). Jeżeli jest ustaw iona flaga CF, do rezultatu jest do dawana liczba 1.
126 |
Asembler. Leksykon k eszonkowy
Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa
ADD Dodawanie Użycie: ADD ce l, źródło M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Dodaje operand źródłowy do operandu celu i wynik umieszcza w operandzie celu. O ba operandy są binarne. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa
AND Koniunkcja logiczna Użycie: AND ce l, źródło M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) Wykonuje koniunkcję logiczną na dwóch operandach, wynik umiesz czając w pierwszym operandzie (celu).
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 127
Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastow a • akum ulator, w artość natychm iastow a
ARPL Dostosuj pole selektora RPL Użycie: ARPL cel , źródło M odyfikow ana flaga: ZF Porównuje bity RPL operandu celu i operandu źródła. Jeżeli bity RPL operandu celu są m niejsze niż operandu źródła, bity RPL operandu celu są ustawiane na równi z bitami operandu źródła i ustawiana jest flaga ZF. W przeciwnym w ypadku znacznik ZF jest zerowany. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr
8.2. Instrukcje na literę B BOUND Spraw dź, czy indeks tablicy m ieści się w przedziale Użycie: BOUND źródło, lim it M odyfikowane flagi: brak Spraw dzane jest, czy indeks tablicy w rejestrze źródłow ym mieści się w górnym i dolnym przedziale pamięci źródłowej. Pierwsze słowo w l i mi t jest dolną granicą, a słowo w lim it + 2 jest górną granicą.
128 |
Asembler. Leksykon k eszonkowy
Rodzaje operandów: • rejestr (16), pam ięć (32) • rejestr (32), pam ięć (64)
BSF Skanow anie bitów do przodu Użycie: BSF ce l, źródło M odyfikow ana flaga: ZF Skanuje operand źródłow y w poszukiw aniu pierwszego bitu równe go 1. Jeżeli bit ten zostanie odnaleziony, ustaw iany jest znacznik ZF, który jest zapisyw any w operandzie celu. Zeruje znacznik ZF, jeżeli żaden bit nie jest ustaw iony. Skanuje od najmniej znaczącego bitu. Rodzaje operandów: • rejestr, rejestr • rejestr, pam ięć • rejestr (32), rejestr (32) • rejestr (32), pam ięć (32)
BSR Skanow anie bitów wstecz Użycie: BSR ce l, źródło M odyfikow ana flaga: ZF Skanuje operand źródłow y do pierw szego ustaw ionego bitu. Usta wia znacznik ZF, jeżeli bit ten zostanie odnaleziony, i zapisuje do operandu celu numer ustawionego bitu. Jeżeli żaden bit nie został usta wiony, zeruje znacznik ZF. Skanuje od najbardziej znaczącego bitu. Rodzaje operandów: • rejestr, rejestr • rejestr, pam ięć • rejestr (32), rejestr (32) • rejestr (32), pam ięć (32)
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 129
BSWAP Zam iana bajtów Użycie: BSWAP re je s tr (32) M odyfikowane flagi: brak Zam ienia kolejność bajtów rejestru 32-bitow ego z big endian na little endian lub odwrotnie. Jeżeli operandem jest rejestr 16-bitowy, w ynik jest nieokreślony. Rodzaje operandów: • rejestr (32)
BT Test bitów Użycie: BT cel , źródło M odyfikow ana flaga: CF Bit celu indeksowany przez wartość źródła jest kopiowany do znacz nika CF. Rodzaje operandów: • rejestr (16), w artość natychm iastow a (8) • pam ięć (16), w artość natychm iastow a (8) • rejestr (16), rejestr (16) • pam ięć (16), rejestr (16)
BTC Test bitów z uzupełnieniem Użycie: BTC ce l, źródło M odyfikow ana flaga: CF Bit z operandu celu o num erze określonym przez operand źródła jest kopiow any do znacznika CF po tym, jak zostanie zanegow any.
130 |
Asembler. Leksykon k eszonkowy
Rodzaje operandów: • rejestr (16), w artość natychm iastow a (8) • pam ięć (16), w artość natychm iastow a (8) • rejestr (16), rejestr (16) • pam ięć (16), rejestr (16)
BTR Test bitów z resetem Użycie: BTR ce l, źródło M odyfikow ana flaga: CF Bit z operandu celu w skazyw any przez w artość operandu źródła jest kopiow any do znacznika CF i zerow any w operandzie celu. Rodzaje operandów: • rejestr (16), w artość natychm iastowa (8) • pam ięć (16), w artość natychm iastow a (8) • rejestr (16), rejestr (16) • pam ięć (16), rejestr (16)
BTS Test bitów z ustawieniem Użycie: BTS ce l, źródło M odyfikow ana flaga: CF Bit w operandzie celu wskazyw any przez w artość źródłow ą jest ko piow any do znacznika CF i następnie ustaw iany w operandzie celu. Rodzaje operandów: • rejestr (16), w artość natychm iastowa (8) • pam ięć (16), w artość natychm iastowa (8) • rejestr (16), rejestr (16) • pam ięć (16), rejestr (16)
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 131
8.3. Instrukcje na literę C CALL W ywołaj procedurę Użycie: CALL cel M odyfikowane flagi: brak Odkłada rejestr IP na stos (oraz segm ent kodu przy dalekich w yw o łaniach) i wczytuje do rejestru IP adres procedury. Kod jest dalej w ykonyw any od CS:IP. Rodzaje operandów: • relatywnie (16) — blisko, relatywnie do IP • relatywnie (32) — blisko, relatywnie do IP • rejestr (16) — blisko, przez rejestr pośrednio • rejestr (32) — blisko, przez rejestr pośrednio • pam ięć (16) — blisko, przez pam ięć pośrednio • pam ięć (32) — blisko, przez pam ięć pośrednio • w skaźnik (16:16) — daleko, pełny wskaźnik • w skaźnik (16:32) — daleko, pełny wskaźnik • w skaźnik (16:16) — daleko, wskaźnik, tryb chroniony • w skaźnik (16:32) — daleko, wskaźnik, tryb chroniony • m (16:16) — daleko, pośrednio • m (16:32) — daleko, pośrednio • m (16:16) — daleko, pośrednio, tryb chroniony • m (16:32) — daleko, pośrednio, tryb chroniony • w skaźnik (16:16) — task, via TSS lub task gate • m (16:16) — task, via TSS lub task gate • m (16:32) — task
132 |
Asembler. Leksykon k eszonkowy
m (16:32) — task w skaźnik (16:16) — gate, te same uprawnienia w skaźnik (16:32) — gate, te same uprawnienia m (16:16) — gate, te same upraw nienia m (16:32) — gate, te same upraw nienia w skaźnik (16:16) — gate, more priv, no parm w skaźnik (16:32) — gate, more priv, no parm m (16:16) — gate, more priv, no parm m (16:32) — gate, more priv, no parm w skaźnik (16:16) — gate, more priv, x parms w skaźnik (16:32) — gate, more priv, x parms m (16:16) — gate, more priv, x parms m (16:32) — gate, more priv, x parms
CBW Przekonwertuj bajt na słowo Użycie: CBW M odyfikowane flagi: brak Konwertuje bajt w AL na słowo w AX, rozszerzając znak w AL poprzez cały rejestr AH (zachowuje znak). Rodzaje operandów: brak
CDQ Przekonwertuj podw ójne słowo na poczwórne słowo Użycie: CDQ M odyfikowane flagi: brak
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 133
Z am ienia w artość o rozmiarze podw ójnego słow a w EAX na w artość o rozmiarze poczwórnego słowa w EDX:EAX, wypełniając EDX najbardziej znaczącym bajtem z EAX (zachowuje znak). Rodzaje operandów: brak
CLC W yczyść znacznik przeniesienia Użycie: CLC M odyfikow ana flaga: CF Zeruje znacznik CF. Rodzaje operandów: brak
CLD Użycie: CLD M odyfikow ana flaga: DF Zeruje znacznik DF, pow odując zwiększenie rejestru SI i DI przez in strukcje działające na ciągach znaków. Rodzaje operandów: brak
CLI W yczyść znacznik przerw ania Użycie: CLI M odyfikow ana flaga: IF Zeruje znacznik IF. Rodzaje operandów: brak
134 |
Asembler. Leksykon k eszonkowy
CLTS W yczyść znacznik Task-Switched w CR0 Użycie: CLTS M odyfikowane flagi: brak Czyści znacznik Task Switched w M achine Status Register. Jest to ope racja uprzyw ilejow ana, która jest w ykorzystyw ana przede wszyst kim przez system operacyjny. Rodzaje operandów: brak
CMC Uzupełnij znacznik przeniesienia Użycie: CMC M odyfikow ana flaga: CF Odwraca w artość znacznika CF (CF = not CF). Rodzaje operandów: brak
CMP Porównaj dw a operandy Użycie: CMP ce l, źródło M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Odejm uje w artość operandu źródłow ego od operandu celu i ustaw ia flagi. Nie zachow uje wyniku. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 135
rejestr, w artość natychm iastow a pam ięć, w artość natychm iastow a akum ulator, w artość natychm iastow a
CMPS Porównaj ciągi znaków Użycie: CMPS ce l, źródło CMPSB CMPSW CMPSD M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Odejmuje w artość operandu celu od operandu źródła i nie zapisuje w yniku. A ktu alizu je znaczniki zależnie od w yniku od ejm ow ania i zwiększa lub zm niejsza w artość rejestrów (E)SI i (E)DI zależnie od ustaw ienia znacznika DF. CMPSD zw iększa/zm niejsza w artość reje strów o 1, CMPSW — o 2, a CMPSD — o 4. Prefiks REP m oże być użyty do przetw arzania ciągów znaków. Rodzaje operandów: • cel, źródło
CWD Przekonwertuj słowo na podw ójne słowo Użycie: CWD M odyfikowane flagi: brak Rozszerza znak słowa w rejestrze AX poprzez rejestr DX, tw orząc po dwójne słowo DX:AX. Rodzaje operandów: brak
136 |
Asembler. Leksykon k eszonkowy
CWDE Przekonwertuj słowo na podw ójne słowo Użycie: CWDE M odyfikowane flagi: brak Konwertuje słowo ze znakiem w AX na podw ójne słowo ze znakiem w EAX, rozszerzając bit znaku AX poprzez część rejestru EAX. Rodzaje operandów: brak
8.4. Instrukcje na literę D DAA Dostosuj dziesiętnie AL po dodawaniu Użycie: DAA M odyfikowane flagi: AF, CF, PF, SF, ZF (OF niezdefiniowana) Popraw ia rezultat w AL po dodawaniu liczb BCD. Zaw artość rejestru AL jest zam ieniana na parę spakow anych cyfr dziesiętnych. Rodzaje operandów: brak
DAS Dostosuj dziesiętnie AL po odejmowaniu Użycie: DAS M odyfikowane flagi: AF, CF, PF, SF, ZF (OF niezdefiniowana) Popraw ia rezultat w AL po odejm owaniu liczb BCD. Z aw artość reje stru AL jest zam ieniana na parę spakow anych cyfr dziesiętnych. Rodzaje operandów: brak
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 137
DEC Zmniejsz o jeden Użycie: DEC cel M odyfikowane flagi: AF, OF, PF, SF, ZF Zm niejsza w artość operandu celu o 1. Rodzaje operandów: • rejestr (8) • pam ięć • rejestr (16/32)
DIV Dzielenie bez znaku Użycie: DIV źródło M odyfikowane flagi: brak (AF, CF, OF, PF, SF, ZF niezdefiniowane) Dzielenie bez znaku. W artość akum ulatora jest dzielona przez ope rand źródła. Jeżeli dzielnik m a rozm iar jednego bajtu — w ynik znaj duje się w AL, a reszta z dzielenia w AH. Jeżeli dzielnik m a rozmiar słowa — wynik jest umieszczony w AX, a reszta w DX. Jeżeli dzielnik ma rozmiar podwójnego słowa — wynik znajduje się w EAX, a reszta w EDX. Rodzaje operandów: • rejestr (8) • rejestr (16) • rejestr (32) • pam ięć (8) • pam ięć (16) • pam ięć (32)
138 |
Asembler. Leksykon k eszonkowy
8.5. Instrukcje na literę E ENTER Utwórz ramkę stosu dla param etrów procedury Użycie: ENTER zmienne lokalne, poziom M odyfikowane flagi: brak M odyfikuje stos do w ejścia proced u ry języ k a w ysokiego poziom u. Operand zmienne lokalne określa ilość pamięci do zarezerwowania na stosie, a operand poziom określa poziom zagłębienia procedury. Instruk cja użyta w parze z instrukcją LEAVE jest efektyw nym sposobem na wejście i w yjście z procedury. Rodzaje operandów: • w artość natychm iastow a (16), 0 • w artość natychm iastow a (16), 1 • w artość natychm iastow a (16), w artość natychm iastowa (8)
8.6. Instrukcje na literę H HLT Zatrzymaj Użycie: HLT M odyfikowane flagi: brak Zatrzym uje CPU do czasu aktyw ow an ia linii RESET lub odebrania przerw ania N M I bądź maskow alnego. CPU przestaje być używany, ale w artość CS:IP jest zachow yw ana do późniejszego startu. Rodzaje operandów: brak
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 139
8.7. Instrukcje na literę I IDIV Dzielenie ze znakiem Użycie: IDIV źródło M odyfikowane flagi: brak (AF, CF, OF, PF, SF, ZF niezdefiniowane) Działa podobnie jak DIV, tyle że dzieli liczby ze znakiem. Rodzaje operandów: • rejestr (8) • rejestr (16) • rejestr (32) • pam ięć (8) • pam ięć (16) • pam ięć (32)
IMUL Użycie: IMUL źródło IMUL źródło, wartość natychmiastowa IMUL ce l, źródło, wartość natychmiastowa (8) IMUL ce l, źródło M odyfikowane flagi: CF, OF (AF, PF, SF, ZF niezdefiniowane) M noży w artość z EAX z podaną wartością (IMUL wartość) lub mnoży dwie wartości i wynik zachowuje w pierwszym operandzie (IMUL wynik, wartość, wartość), lub m noży rejestr z wartością (IMUL wynik, wartość). Rodzaje operandów: • rejestr (8) • rejestr (16) • rejestr (32) • pam ięć (8)
140 |
Asembler. Leksykon k eszonkowy
• pam ięć (16) • pam ięć (32) • rejestr (16), rejestr (16) • rejestr (32), rejestr (32) • rejestr (16), pam ięć (16) • rejestr (32), pam ięć (32) • rejestr (16), w artość natychm iastowa • rejestr (32), w artość natychm iastowa • rejestr (16), rejestr (16), w artość natychm iastowa • rejestr (32), rejestr (32), w artość natychm iastowa • rejestr (16), pam ięć (16), w artość natychm iastowa • rejestr (32), pam ięć (32), w artość natychm iastowa
IN W ejście z portu Użycie: IN akumulator, port M odyfikowane flagi: brak O dczytuje dane z portu i um ieszcza w akum ulatorze. Jeżeli numer portu zawiera się w przedziale 0 - 255, m oże być podany jako w ar tość natychm iastow a, w przeciwnym wypadku podajem y go w reje strze DX. Rodzaje operandów: • akum ulator, w artość natychm iastow a (8) • akum ulator, DX
INC Zwiększ o jeden Użycie: INC cel M odyfikowane flagi: AF, OF, PF, SF, ZF Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 141
D odaje w artość 1 do operandu celu. Rodzaje operandów: • rejestr (8) • rejestr (16) • rejestr (32) • pam ięć
INS W ejście z portu do ciągu znaków Użycie: INS c e l, port INSB INSW INSD M odyfikowane flagi: brak W czytuje dane z portu do ES:(E)DI (nawet gdy określony jest ope rand celu). Rejestr (E)DI jest dostosowywany przez rozmiar operan du i jest zw iększany, jeżeli znacznik DF jest w yzerowany, lub zm niej szany, jeżeli znacznik DF wynosi 1. Instrukcje INSB, INSW, INSD nie m ają operandów, a rozm iar danych jest określany przez instrukcję. Rodzaje operandów: • cel, port • brak
INT W ywołanie procedury przerw ania Użycie: INT numer M odyfikowane flagi: TF, IF Inicjuje przerw anie program ow e poprzez odłożenie flag n a stos, w y zerow anie znaczników TF i IF, odłożenie na stos CS i IP oraz załado wanie rejestrów CS:IP wartościam i odnalezionym i w tablicy wekto rów przerwań. W ykonyw anie program u rozpoczyna się od nowej wartości w CS:IP. 142 |
Asembler. Leksykon k eszonkowy
Rodzaje operandów: •3 • w artość natychm iastow a (8)
IRET/IRETD Pow rót z przerw ania Użycie: IRET IRETD M odyfikowane flagi: AF, CF, DF, IF, PF, SF, TF, ZF Zwraca kontrolę do punktu, w którym nastąpiło przerw anie, po przez zdjęcie ze stosu IP, CS i rejestru flag. Rodzaje operandów: brak
8.8. Instrukcje na literę J Jcc Użycie: Jcc etykieta M odyfikowane flagi: brak Skacze do określonego m iejsca w kodzie po spełnieniu danego w a runku.
M nem on k
Znaczen e
W arunek
JA JAE JB JBE JC JCXZ JE JG
Skocz Skocz Skocz Skocz Skocz Skocz Skocz Skocz
CF CF CF CF CF
= = = = =
0 iZF = 0 0 1 1 lub ZF = 1 1
O X
II
o
Tabela 8.1. Lista instrukcji skoku
jeżeli powyżej jeżeli powyżej lub ówne jeżeli poniżej jeżeli poniżej lub ówne jeżeli p zeniesienie jeżeli CX = 0 jeżeli ówne jeżeli większe
ZF = 1 ZF = 0 iSF = OF
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 143
Tabela 8.1. Lista instrukcji skoku — ciąg dalszy M nem on k
Znaczen e
W arunek
JG E
Skocz jeżeli większe lub ów n e
S F = OF
JL
Skocz jeżeli mniejsze
SF
JL E
Skocz jeżeli mniejsze lub ów n e
Z F = 1 lub S F
JM P
Skocz bezwa unkowo
bezwa unkowo
JN A
Skocz jeżel nie powyżej
CF = 1 lub ZF = 1
JN A E
Skocz jeżel nie powyżej lub ów n e
CF = 1
JN B
Skocz jeżel nie poniżej
CF = 0
JN B E
Skocz jeżel nie poniżej lub ów n e
CF = 0 iZ F
JN C
Skocz jeżel nie p zeniesienie
CF = 0
JN E
Skocz jeżel nie jest ów n e
ZF = 0
JNG
Skocz jeżel nie jest większe
Z F = 1 lub S F
JN G E
Skocz jeżel nie jest większe lub ó w n e
SF
JN L
Skocz jeżel nie jest mniejsze
S F = OF
JN L E
Skocz jeżel nie jest mniejsze lub ó w n e
ZF = 0 iS F
JN O
Skocz jeżel nie m a p zepełnienia
OF = 0
JN P
Skocz jeżel niepa zyste
PF = 0
JN S
Skocz jeżel bez znaku
SF = 0
JN Z
Skocz jeżel nie ze o
ZF = 0
JO
Skocz jeżel p zepełnienie
OF = 1
JP
Skocz jeżel pa zyste
PF = 1
JP E
Skocz jeżel pa zyste
PF = 1
JP O
Skocz jeżel niepa zyste
PF = 0
JS
Skocz jeżel ze znakiem
SF = 1
JZ
Skocz jeżel ze o
ZF = 1
Rodzaje operandów: • etykieta
8.9. Instrukcje na literę L LAHF Załaduj rejestr flag do rejestru Użycie:
AH
LA HF
M odyfikowane flagi: brak
144 |
Asembler. Leksykon k eszonkowy
!= OF != OF
= 0
!= OF
!= OF
= OF
Kopiuje bity 0 - Z rejestru flag do rejestru AH. AH := SF ZF xx AF xx PF xx CF Rodzaje operandów: brak
LAR Załaduj bajt praw dostępu Użycie: LAR ce l, źródło M odyfikow ana flaga: ZF Najbardziej znaczący b a jt rejestru d ocelow ego je s t nad pisyw any wartością bajtu praw dostępu. Najmniej znaczący bajt jest zerowany w zależności od operandu źródłow ego. Rodzaje operandów: • rejestr (16), rejestr (16) • rejestr (32), rejestr (32) • rejestr (16), pam ięć (16) • rejestr (32), pam ięć (32)
LEA Załaduj adres efektywny Użycie: LEA ce l, źródło M odyfikowane flagi: brak Kopiuje adres operandu źródłow ego do operandu celu. Rodzaje operandów: • rejestr, pam ięć
LEAVE W yjście z procedury wysokiego poziom u Użycie: LEAVE Rozdz ał S. Op s rozkazów procesorów z rodz ny S0xS6
j 14S
M odyfikowane flagi: brak Zw alnia zm ienne lokalne utworzone przez instrukcję ENTER poprzez odtw orzenie rejestru SP i BP. Rodzaje operandów: brak
LGDT Załaduj rejestr Global/Interrupt Descriptor Table Użycie: LGDT źródło M odyfikowane flagi: brak Ładuje w artość z operandu do rejestru GDT. Rodzaje operandów: • pam ięć (64)
LIDT Załaduj rejestr Global/Interrupt Descriptor Table Użycie: LIDT źródło M odyfikowane flagi: brak Ładuje w artość z operandu do rejestru IDT. Rodzaje operandów: • pam ięć (64)
LGS Załaduj pełny wskaźnik Użycie: LGS ce l, źródło M odyfikowane flagi: brak Ładuje w skaźnik z pam ięci do rejestru docelowego oraz GS. Rodzaje operandów: • rejestr, pam ięć 146 |
Asembler. Leksykon k eszonkowy
LLDT Załaduj rejestr Local Descriptor Table Użycie: LLDT źródło M odyfikowane flagi: brak Ładuje w artość z operandu do rejestru LDTR. Rodzaje operandów: • rejestr (16) • pam ięć (16)
LMSW Załaduj M achine Status Word Użycie: LMSW źródło M odyfikowane flagi: brak Ładuje w artość z operandu źródłow ego do rejestru MSW. Rodzaje operandów: • rejestr (16) • pam ięć (16)
LOCK W łącz LOCK# Signal Prefix Użycie: LOCK M odyfikowane flagi: brak W łącza LO CK# Signal P refix. Rodzaje operandów: brak
Rozdz ał S. Op s rozkazów procesorów z rodz ny S0xS6
j 147
LODS Załaduj ciąg znaków Użycie: LODS źródło LODSB LODSW LODSD M odyfikowane flagi: brak Kopiuje ciąg znaków spod DS:SI do rejestru akumulatora. Rodzaje operandów: • źródło
LOOP Pętla z licznikiem CX Użycie: LOOP etykieta M odyfikowane flagi: brak Zm niejsza CX o 1 i przenosi kontrolę do etykiety, dopóki CX nie jest równy zero. Rodzaje operandów: • etykieta
8.10. Instrukcje na literę M MOV Kopiuj dane Użycie: MOV ce l, źródło M odyfikowane flagi: brak Kopiuje dane z operandu źródłow ego do operandu celu. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr 148 |
Asembler. Leksykon k eszonkowy
• rejestr, pam ięć • pam ięć, w artość natychm iastow a • rejestr, w artość natychm iastow a • pam ięć, akum ulator • akum ulator, pam ięć • rejestr segm entowy, rejestr (16) • rejestr segm entowy, pam ięć (16) • rejestr (16), rejestr segm entowy • pam ięć (16), rejestr segm entowy • rejestr (32), CR0/CR2/CR3 • CR0, rejestr (32) • CR2, rejestr (32) • CR3, rejestr (32) • rejestr (32), DR0/DR1/DR2/DR3 • rejestr (32), DR6/DR7 • DR0/DR1/DR2/DR3, rejestr (32) • DR6/DR7, rejestr (32) • rejestr (32), TR6/TR7 • TR6/TR7, rejestr (32) • rejestr (32), TR3 • TR3, rejestr (32)
MOVS Kopiuj dane z ciągu znaków do drugiego ciągu znaków Użycie: MOVS ce l, źródło MOVSB MOVSW MOVSD
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 149
M odyfikowane flagi: brak Kopiuje dane spod DS:SI do ES:DI i aktualizuje SI i DI zależnie od rozmiaru operandu. Rejestry SI i DI są inkrementowane, gdy znacznik DF jest wyzerowany, w przeciwnym wypadku są dekrementowane. Uży waj tej instrukcji razem z prefiksem REP do operacji na ciągach znaków. Rodzaje operandów: • cel, źródło
MOVSX Kopiuj z rozszerzeniem znaku Użycie: MOVSX cel , źródło M odyfikowane flagi: brak Kopiuje w artość z operandu źródłow ego do operandu celu z rozsze rzeniem znaku. Rodzaje operandów: • rejestr, rejestr • rejestr, pam ięć
MOVZX Kopiuj z rozszerzeniem zerow ym Użycie: MOVZX cel , źródło M odyfikowane flagi: brak Kopiuje dane z operandu źródłow ego do operandu celu z rozszerze niem zerowym. Rodzaje operandów: • rejestr, rejestr • rejestr, pam ięć
150 |
Asembler. Leksykon k eszonkowy
MUL M nożenie bez znaku rejestru AL lub AX Użycie: MUL źródło M odyfikowane flagi: CF, OF (AF, PF, SF, ZF niezdefiniowane) Mnoży bez znaku rejestr akumulatora przez podany operand. W ynik zachow uje w akum ulatorze. Rodzaje operandów: • rejestr (S) • rejestr (16) • rejestr (32) • pam ięć (S) • pam ięć (16) • pam ięć (32)
S.11. Instrukcje na literę N NEG Negacja z uzupełnieniem do dwóch Użycie: NEG cel M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Odejmuje w artość operandu docelowego od zera i zapisuje w ynik do operandu docelowego. Rodzaje operandów: • rejestr • pam ięć
Rozdz ał S. Op s rozkazów procesorów z rodz ny S0xS6
j 1S1
NOP Pusta instrukcja Użycie: NOP M odyfikowane flagi: brak Zajmuje miejsce i czas. Równoważna instrukcji xchg eax, eax. Używana do w ypełniania luk w kodzie. Rodzaje operandów: brak
NOT Negacja z uzupełnieniem do jednego Użycie: NOT cel M odyfikowane flagi: brak O dw raca bity operandu docelow ego i zapisuje w ynik w operandzie docelowym. Rodzaje operandów: • rejestr • pam ięć
8.12. Instrukcje na literę O OR Alternatyw a logiczna Użycie: OR ce l, źródło M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) Wykonuje alternatywę logiczną na bitach podanych operandów i zapi suje w ynik do operandu docelowego.
152 |
Asembler. Leksykon k eszonkowy
Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć (8), w artość natychm iastow a (8) • pam ięć (16), w artość natychm iastow a (16) • akum ulator, w artość natychm iastowa
OUT W yjście do portu Użycie: OUT port, akumulator M odyfikowane flagi: brak K opiu je dane z rejestru akum ulatora do portu sp rzętow ego. Jeżeli num er portu m ieści się w przedziale 0 - 255, m ożna go podać jako w artość natychm iastow ą, w przeciwnym w ypadku należy posłużyć się rejestrem DX. Rodzaje operandów: • w artość natychm iastow a (8), akum ulator • DX, akum ulator
OUTS W yprowadzenie ciągu znaków do portu Użycie: OUTS port, źródło OUTSB OUTSW OUTSD M odyfikowane flagi: brak Kopiuje dane z rejestru akumulatora do portu podanego w rejestrze DX. Rodzaje operandów: • port, źródło
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 153
8.13. Instrukcje na literę P POP Zdejmij dane ze stosu Użycie: POP cel M odyfikowane flagi: brak Zdejm uje słow o/pod w ójne słowo ze stosu i um ieszcza w operandzie docelowym. Zw iększa też odpowiednio w skaźnik stosu (SP) do no wego wierzchołka stosu. Rodzaje operandów: • rejestr (16) • rejestr (32) • rejestr segm entowy • pam ięć (16) • pam ięć (32)
POPA/POPAD Zdejmij ze stosu wszystkie rejestry ogólnego przeznaczenia Użycie: POPA POPAD M odyfikowane flagi: brak Zdejm uje osiem w artości ze stosu i um ieszcza w 16-/32-bitow ych rejestrach ogólnego przeznaczenia. Rejestry są wypełniane w kolej ności: (E)DI, (E)SI, (E)BP, (E)SP, (E)DX, (E)CX i (E)AX. Rodzaje operandów: brak
154 |
Asembler. Leksykon k eszonkowy
POPF/POPFD Zdejmij dane ze stosu do rejestru EFLAGS Użycie: POPF POPFD M odyfikowane flagi: wszystkie Zdejm uje ze stosu słow o/pod w ójne słowo i u m ieszcza w rejestrze flag. Zwiększa w skaźnik stosu (SP) o dwa (POPF) lub o cztery (POPFD). Rodzaje operandów: brak
PUSH Odłóż operand na stosie Użycie: PUSH źródło PUSH wartość natychmiastowa M odyfikowane flagi: brak O d kład a n a stosie operand i zm niejsza odpow iednio w skaźnik wierzchołka stosu (SP). Rodzaje operandów: • rejestr (16) • rejestr (32) • pam ięć (16) • pam ięć (32) • rejestr segm entowy • w artość natychm iastow a
PUSHA/PUSHAD Odłóż na stos wszystkie rejestry ogólnego przeznaczenia Użycie: PUSHA PUSHAD Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 155
M odyfikowane flagi: brak O dkłada na stosie wszystkie rejestry ogólnego przeznaczenia w ko lejności: (E)AX, (E)CX, (E)DX, (E)BX, (E)SP, (E)BP, (E)SI i (E)DI. Rodzaje operandów: brak
PUSHF/PUSHFD Odłóż na stos rejestr znaczników Użycie: PUSHF PUSHFD M odyfikowane flagi: brak Odkłada rejestr znaczników na stos. PUSHF odkłada w artość 16-bitową, a PUSHFD w artość 32-bitową. Rodzaje operandów: brak
8.14. Instrukcje na literę R RCL Obrót bitów w lewo z przeniesieniem Użycie: RCL cel, licznik M odyfikowane flagi: CF, OF Obraca bity w lewo licznik razy. Bity w ych od zące z lew ej w chodzą z prawej. Znacznik CF zaw iera ostatni bit, który wyszedł. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL
156 |
Asembler. Leksykon k eszonkowy
• pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8)
RCR Obrót bitów w praw o z przeniesieniem Użycie: RCR cel, licznik M odyfikowane flagi: CF, OF Obraca bity w prawo licznik razy. Bity wychodzące z prawej wchodzą ponownie z lewej. Znacznik CF zawiera ostatni bit, który w yszedł. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8)
REP Powtarzaj następujące operacje na ciągu znaków Użycie: REP M odyfikowane flagi: brak W ykonuje operacje na ciągu znaków , dopóki CX jest różny od zera. Po każdej operacji CX jest zm niejszany o 1 i spraw dzana jest flaga ZF. Rodzaje operandów: brak
Rozdz ał 8. Ops rozkazów procesorów z rodz ny 80x86
| 157
REPE/REPZ Powtarzaj następujące operacje na ciągu znaków Użycie:
REPE
R EP Z
M odyfikowane flagi: brak Wykonuje instrukcję operującą na ciągu znaków, dopóki CX != 0 i usta wiony jest znacznik Z F . Po każdej operacji jest dekrem entowany re jestr CX i spraw dzana flaga Z F . Rodzaje operandów: brak
REPNE/REPNZ Powtarzaj następujące operacje na ciągu znaków Użycie:
REPN E
REPNZ
M odyfikowane flagi: brak Wykonuje instrukcję operującą na ciągu znaków, dopóki CX != 0 i flaga ZF nie jest ustaw iona. Po każdej operacji rejestr CX jest dekrem ento w any i testowane jest ustaw ienie flagi Z F . Rodzaje operandów: brak
RET Pow rót z procedury Użycie:
RET
M odyfikowane flagi: brak Przekazuje sterowanie z procedury do adresu odłożonego wcześniej na stos. Rodzaje operandów: brak 158 |
Asembler. Leksykon k eszonkowy
ROL Obrót bitów w lewo Użycie: ROL cel, licznik M odyfikowane flagi: CF, OF Obraca bity w operandzie celu w lewo. Bity w ych od zące z lew ej w chodzą ponownie z prawej. Znacznik CF zaw iera ostatni bit, który wyszedł. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8)
ROR Obrót bitów w prawo Użycie: ROR cel, licznik M odyfikowane flagi: CF, OF O braca bity w operandzie docelow ym w praw o. B ity w ychod zące z prawej wchodzą ponownie z lewej. Znacznik CF zaw iera ostatni bit, który wyszedł. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8) Rozdzał 8. Ops rozkazów procesorów z rodz ny 80x86
| 159
8.15. Instrukcje na literę S SAHF Zachowaj rejestr AHw rejestrze znaczników Użycie: SAHF M odyfikowane flagi: AF, CF, PF, SF, ZF Kopiuje bity 0 - 7 rejestru AHdo rejestru flag. Rodzaje operandów: brak
SAL/SHL Arytm etyczne przesunięcie w lewo Użycie: SAL cel, licznik SHL cel, licznik M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) Przesuwa bity w lewo w op erand zie celu licznik razy. Z prawej strony na w olne m iejsca w chodzą zera. Znacznik CF zaw iera ostatni w ysunięty bit. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8)
160 |
Asembler. Leksykon k eszonkowy
SAR Arytm etyczne przesunięcie w prawo Użycie: SAR cel, licznik M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) Przesuwa bity w praw o w operandzie celu licznik razy. Bit znaku jest replikow any najbardziej znaczącym bitem. Znacznik CF zawiera ostatni w ysunięty bit. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8)
SHR Arytm etyczne przesunięcie w prawo Użycie: SHR cel, licznik M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) Przesuwa w praw o bity operandu celu licznik razy. Z lewej strony na w olne m iejsca wchodzą zera. Znacznik CF zawiera ostatni wysu nięty bit. Rodzaje operandów: • rejestr, 1 • pam ięć, 1 • rejestr, CL • pam ięć, CL • rejestr, w artość natychm iastow a (8) • pam ięć, w artość natychm iastow a (8) Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 161
SBB Odejm ow anie całkowite z zapożyczeniem Użycie: SBB cel, źródło M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Odejmuje w artość operandu źródła od operandu celu. Jeżeli je st ustaw iona flaga CF, dodatkow o od ejm ow ana je st w artość 1. W ynik jest zw racany w operandzie celu. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa
SCAS Porównaj dane ciągu znaków Użycie: SCAS ciąg znaków SCASB SCASW SCASD M odyfikowane flagi: AF, CF, OF, PF, SF, ZF Porównuje w artość spod ES:DI i akum ulatora. Ustaw ia flagi podob nie do odejmowania. Rejestr DI jest zw iększany/zm niejszany zależ nie od formatu instrukcji i stanu znacznika DF. Używaj razem z pre fiksem REP. Rodzaje operandów: • ciąg znaków
162 |
Asembler. Leksykon k eszonkowy
SETcc Ustaw bajt po spełnieniu warunku Użycie:
SETcc
cel
M odyfikowane flagi: brak Ustawia bajt na 1 w operandzie celu po spełnieniu warunku. W prze ciwnym wypadku ustaw ia na 0. Tabela 8.2. Lista instrukcji ustawiających bajt po spełnieniu warunku M nem on k SETA E/SET N B
Znaczen e
W arunek
U staw jeżeli powyżej lub ó w n e/ jeżeli
CF = 0
nie niżej SE T B / S E T N A E
U staw jeżeli poniżej/ jeżeli nie wyżej lub
CF = 1
ów ne SETBE/SETN A
U staw jeżeli poniżej lub ó w n e/ jeżeli nie
CF = 1 lub ZF = 1
powyżej SETE/SETZ
U staw jeżeli ó w n e/ jeżeli ze o
ZF = 1
SETN E/SETN Z
Ustaw jeżeli nie jest ówne/ jeżeli nie ze o
ZF = 0
U staw jeżeli mniejsze/ jeżeli nie większe
SF
SETL/SETN G E
!
OF
lub ó w n e SETG E/SET N L
U staw jeżeli większe lub ó w n e/ jeżeli
S F = OF
nie mniejsze SETLE/SETN G
U staw jeżeli mniejsze lub ó w n e/ jeżeli
Z F = 1 lub S F
!= OF
Z F = 0 lub S F
= OF
nie większe SETG /SET N LE
U staw jeżeli większe/ jeżeli nie mniejsze lub ó w n e
SETS
U staw jeżeli ze znakiem
SF = 1
SET N S
U staw jeżeli bez znaku
SF = 0
SETC
U staw jeżeli p zeniesienie
CF = 1
SETN C
Ustaw jeżeli nie m a p zeniesienia
CF = 0
SETO
Ustaw jeżeli p zepełnienie
OF = 1
SETNO
Ustaw jeżeli nie m a p zepełnienia
OF = 0
SETP/SETPE
Ustaw jeżeli pa zyste
PF = 1
SETN P/SETPO
Ustaw jeżeli niepa zyste
PF = 0
Rodzaje operandów: • rejestr (8) • pam ięć (8)
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 163
SGDT/SIDT Zachowaj rejestr Global/Interrupt Descriptor Table Użycie: SGDT cel SIDT cel M odyfikowane flagi: brak Zachow uje w artość rejestru GDT/ IDT w podanym operandzie. Rodzaje operandów: • pam ięć (64)
SHLD Przesunięcie w lewo podw ójnego rejestru Użycie: SHLD cel, źródło, licznik M odyfikowane flagi: CF, PF, SF, ZF (OF, AF niezdefiniowane) Instru kcja SHLD p rzesuw a w lew o bity w pierw szym operandzie o liczbę bitów podaną w trzecim operandzie. Najstarsze bity pierwszego operandu zostają wyrzucone (flaga CF przyjm uje w artość ostatniego wyrzuconego bitu), a najm łodsze bity przyjm ują w artości najstar szych bitów z drugiego operandu. Uwaga! Bity operandu drugiego pozostają niezm ienione. Rodzaje operandów: • rejestr (16), rejestr (16), w artość natychm iastow a (S) • rejestr (32), rejestr (32), w artość natychm iastow a (S) •
pam ięć (16),
rejestr (16), w artość natychm iastow a (S)
•
pam ięć (32),
rejestr (32), w artość natychm iastow a (S)
• rejestr (16), rejestr (16), CL • rejestr (32), rejestr (32), CL •
pam ięć (16),
rejestr (16), CL
•
pam ięć (32),
rejestr (32), CL
164 j
Asembler. Leksykon k eszonkowy
SHRD Przesunięcie w praw o podw ójnego rejestru Użycie: SHRD cel, źródło, licznik M odyfikowane flagi: CF, PF, SF, ZF (OF, AF niezdefiniowane) SHRD p rzesu w a b ity pierw szego operandu o liczbę bitów podaną w trzecim operandzie. Najm łodsze bity pierwszego operandu zostają wyrzucone, a najstarsze bity przyjm ują w artość najmłodszych bitów z operandu drugiego. Bity drugiego operandu pozostają niezmienione. Rodzaje operandów: • rejestr (16), rejestr (16), w artość natychm iastow a (8) • rejestr (32), rejestr (32), w artość natychm iastow a (8) • pam ięć (16), rejestr (16), w artość natychm iastowa (8) • pam ięć (32), rejestr (32), w artość natychm iastowa (8) • rejestr (16), rejestr (16), CL • rejestr (32), rejestr (32), CL • pam ięć (16), rejestr (16), CL • pam ięć (32), rejestr (32), CL
SLDT Zachowaj rejestr Local Descriptor Table Użycie: SLDT cel M odyfikowane flagi: brak Zachow uje w artość rejestru LDT w podanym operandzie. Rodzaje operandów: • rejestr (16) • pam ięć (16)
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 165
SMSW Zachowaj M achine Status Word Użycie: SMSW cel M odyfikowane flagi: brak Zachow uje rejestr MSWw operandzie celu. Rodzaje operandów: • rejestr (16) • pam ięć (16)
STC Ustaw znacznik przeniesienia Użycie: STC M odyfikow ana flaga: CF U staw ia znacznik przeniesieni na 1. Rodzaje operandów: brak
STD Ustaw znacznik kierunku Użycie: STD M odyfikow ana flaga: DF Ustaw ia znacznik DF na 1. Ustaw ienie tej flagi pow oduje zm niejsza nie SI i DI przez instrukcje operujące na ciągach znaków. Rodzaje operandów: brak
166 |
Asembler. Leksykon k eszonkowy
STI Ustaw znacznik przerw ania Użycie: STI M odyfikow ana flaga: IF U staw ia znacznik przerw ania na 1, co pow od u je rozpoznaw anie przerw ań sprzętowych. Rodzaje operandów: brak
STOS Zachowaj dane ciągu znaków Użycie: STOS cel STOSB STOSW STOSD M odyfikowane flagi: brak Kopiuje w artość z akum ulatora do ES:(E)DI. Rejestr ( E)DI jest inkre m entow any/dekrem entow any zależnie od rozmiaru operandu (lub formatu instrukcji), a także od ustaw ienia znacznika DF. Używaj ra zem z prefiksem REP. Rodzaje operandów: • cel
STR Zachowaj Task Register Użycie: STR cel M odyfikowane flagi: brak Zachow uje w artość Task Register w podanym operandzie. Rodzaje operandów: • rejestr (16) • pam ięć (16) Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 167
SUB Odejm ow anie całkowite Użycie: SUB cel, źródło M odyfikowane flagi: AF, CF, OF, PF, SF, ZF W artość operandu źródłow ego jest odejm owana od w artości operandu celu. W ynik jest zachow yw any w operandzie celu. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa
8.16. Instrukcje na literę T TEST Porównanie logiczne Użycie: TEST cel, źródło M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) W ykonuje koniunkcję logiczną na dw óch op erand ach, ustaw iając odpowiednio znaczniki, ale nie zapisując wyniku. Rodzaje operandów: • rejestr, rejestr • rejestr, pam ięć • pam ięć, rejestr • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa 168 j
Asembler. Leksykon k eszonkowy
8.17. Instrukcje na literę V VERR Zweryfikuj segm ent do czytania Użycie: VERR źródło M odyfikowane flagi: ZF Sprawdza, czy m ożna czytać z określonego selektora segm entu na aktualnym poziomie uprzywilejowania. Jeśli tak, ustawiany jest znacz nik ZF, w przeciwnym wypadku jest on zerowany. Rodzaje operandów: • rejestr (16) • pam ięć (16)
VERW Zweryfikuj segm ent do pisania Użycie: VERW źródło M odyfikow ana flaga: ZF Sprawdza, czy m ożna pisać do określonego selektora segm entu na aktualnym poziomie uprzywilejowania. Jeśli tak, ustawiany jest znacz nik ZF, w przeciwnym wypadku jest on zerowany. Rodzaje operandów: • rejestr (16) • pam ięć (16)
8.18. Instrukcje na literę W WAIT Czekaj, dopóki BUSY# Pin jest nieaktyw ny Użycie: WAIT M odyfikowane flagi: brak Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
| 169
CPU przechodzi w stan oczekiwania, dopóki koprocesor nie zasy gnalizuje, że ukończył operację. Rodzaje operandów: brak
8.19. Instrukcje na literę X XCHG Zam ień w artości operandów Użycie: XCHG cel , źródło M odyfikowane flagi: brak Zam ienia w artości operandu źródłow ego i operandu celu. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • akum ulator, rejestr • rejestr, akum ulator
XLAT/XLATB Table Look-up Translation Użycie: XLAT translation-table XLATB M odyfikowane flagi: brak Zam ienia bajt w AL z bajtem z tablicy użytkow nika adresowanym przez rejestr BX. Oryginalna w artość rejestru AL jest indeksem do ta beli. Najprościej m ożna to opisać instrukcją: MOV AL,[BX+AL]. Rodzaje operandów: • offset tablicy
170 |
Asembler. Leksykon k eszonkowy
XOR Alternatyw a wykluczająca Użycie: XOR cel, źródło M odyfikowane flagi: CF, OF, PF, SF, ZF (AF niezdefiniowana) W ykonuje logiczną alternatywę w ykluczającą na dwóch podanych operandach. W ynik zapisuje w operandzie celu. Rodzaje operandów: • rejestr, rejestr • pam ięć, rejestr • rejestr, pam ięć • rejestr, w artość natychm iastowa • pam ięć, w artość natychm iastowa • akum ulator, w artość natychm iastowa
Rozdz ał 8. Op s rozkazów procesorów z rodz ny 80x86
j 171
Rozdział 9. Dyrektywy asemblera MASM 9.1. Etykiety kodu ALIGN Wyrównuje następną zmienną lub instrukcję procesora do wielokrotno ści number bajtów. Składnia: ALIGN [[num ber]]
EVEN U staw ia adres następnej zm iennej lub instrukcji na parzysty. Składnia: EVEN
LABEL Tworzy nową etykietę poprzez przyporządkowanie aktualnej wartości wskaźnika pozycji asemblera. N azw a i typ są określone argumentem dyrektywy. Składnia: name LABEL type name LABEL [[NEAR | FAR | PROC]]
PTR [ [ t y p e ] ]
ORG Ustawia wskaźnik pozycji asemblera na wartość podaną w argumencie. Składnia: ORG ex p ressio n
172 |
Asembler. Leksykon k eszonkowy
9.2. Warunkowa kontrola przepływu .BREAK Generuje kod wychodzący z bloku jest praw dziw y.
.W H IL E
lub
.R E P E A T ,
gdy w arunek
Składnia: .BREAK [ [ . I F
c o n d itio n ]]
.CONTINUE Generuje kod skaczący do początku bloku w arunek jest prawdziwy.
.W H IL E
lub
.R E P E A T ,
gdy
Składnia: .CONTINUE [ [ . I F
c o n d itio n ]]
.ELSE W ykonuje blok instrukcji um ieszczony pod dyrektywą, gdy waru nek w bloku . I F jest nieprawdziwy. Składnia: . ELSE
.ELSEIF Łączy
.E L S E
i
w jedną dyrektywę.
.IF
Składnia: .E L S E IF ex p ressio n
.ENDIF Kończy blok
.IF
.
Składnia: .ENDIF
Rozdz ał 9. Dyrektywy asemblera MASM
| 173
.ENDW Kończy blok
.W H IL E .
Składnia: .ENDW
.IF W ykonuje kod pod dyrektywą, gdy w arunek jest prawdziwy. Składnia: .IF
c o n d itio n
; ko d . ENDIF
.REPEAT W ykonuje kod zaw arty w bloku , d opóki w aru nek n ie stanie się prawdziwy. Składnia: .REPEAT statem ents .UNTIL c o n d itio n
.UNTIL Zobacz opis dyrektywy
.R E P E A T .
.UNTILCXZ Zobacz opis dyrektywy
.R E P E A T .
.WHILE W ykonuje blok instrukcji zaw arty pod dyrektywą, dopóki warunek pozostaje praw dziw y. Składnia: .WHILE c o n d itio n statem ents .ENDW
174 |
Asembler. Leksykon k eszonkowy
9.3. Alokacja danych BYTE/SBYTE Tworzy zm ienną o rozm iarze jednego bajta. Dyrektywa bajt bez znaku, a S B Y T E ze znakiem.
BY TE
tworzy
Składnia: v a r l BYTE v a lu e l var2 SBYTE value2
DB Tworzy zm ienną, która jest ciągiem bajtów o określonym rozmiarze. Składnia: v a r l DB v a lu e l ,
v a lu e 2 .. .
var2 DB s iz e D U P (in it_ v a lu e )
DWORD/SDWORD Tworzy zmienną o rozmiarze 4 bajtów bez znaku (DWORD) lub ze znakiem (SDWORD). Składnia: [[nam e]]
DWORD i n i t i a l i z e r
name SDWORD i n i t i a l i z e r
[[,
[[,
in it ia liz e r ]]...
in it ia liz e r ]]...
FWORD Tworzy zm ienną o rozmiarze 6 bajtów. Składnia: [[nam e]]
FWORD i n i t i a l i z e r
[[,
in it ia liz e r ]]...
QWORD Tworzy zm ienną o rozmiarze 8 bajtów. Składnia: [[nam e]] QWORD i n i t i a l i z e r
[[,
in it ia liz e r ]]...
Rozdz ał 9. Dyrektywy asemblera MASM
| 175
REAL4 Tworzy zm ienną o rozm iarze 4 b ajtów do przech ow yw ania liczb zm iennoprzecinkow ych pojedynczej precyzji. Składnia: name REAL4 i n i t i a l i z e r
[[,
in it ia liz e r ]]...
REAL8 Tworzy zm ienną o rozmiarze 8 bajtów do przechow yw ania liczb zm iennoprzecinkow ych podwójnej precyzji. Składnia: name REAL8 i n i t i a l i z e r
[[,
in it ia liz e r ]]...
REAL10 Tworzy zm ienną o rozmiarze 10 bajtów do przechow yw ania liczb zm iennoprzecinkow ych. Składnia: name REAL10 i n i t i a l i z e r
[[,
in it ia liz e r ]]...
TBYTE Tworzy zm ienną o rozmiarze 10 bajtów. Składnia: [[nam e]] TBYTE i n i t i a l i z e r
[[,
in it ia liz e r ]]...
WORD/SWORD Tworzy zm ienną o rozmiarze 2 bajtów bez znaku (WORD) lub ze zna kiem (SWORD). Składnia: [[nam e]] WORD i n i t i a l i z e r name SWORD i n i t i a l i z e r
176 |
[[,
[[,
in it ia liz e r ]]...
in it ia liz e r ]]...
Asembler. Leksykon k eszonkowy
9.4. Przyrównania
Przypisuje w artość num eryczną w yrażenia do nazwy. Składnia: name = ex p ressio n
EQU Pierwsza dyrektywa przypisuje w artość do nazw y, zaś druga tekst do nazwy. Składnia: name EQU ex p ressio n name EQU
TEXTEQU Przypisuje tekst do nazwy. Tekst m oże być ciągiem znaków lub na pisem zwróconym przez makro. Składnia: name TEXTEQU [ [ t e x t it e m ] ]
9.5. Makra ENDM Kończy deklarację makra. Składnia: ENDM
EXITM Kończy m akro i rozpoczyna asem blację kolejnego wyrażenia poza blokiem. Składnia: EXITM [ [ t e x t it e m ] ]
Rozdz ał 9. Dyrektywy asemblera MASM
| 177
GOTO Przenosi asem blację program u do macrolabel. Składnia: GOTO m acrolabel
LOCAL Definiuje etykietę wew nątrz makra, która jest unikatow a dla każdej instancji makra. Składnia: LOCAL localnam e [ [ ,
l o c a ln a m e ] ] . ..
MACRO Definiuje m akro o nazw ie podanej w name. Składnia: name MACRO [[p a ra m e te r [[:R E Q
| := d e fa u lt | :VARARG]] ] ] . . .
statem ents ENDM [ [ v a l u e ] ]
PURGE U suw a określone m akro z pamięci. Składnia: PURGE macroname [ [ , m acro n a m e ]]...
9.6. Procedury ENDP Kończy deklarację procedury rozpoczętą dyrektywą PROC. Składnia: name ENDP
178 |
Asembler. Leksykon k eszonkowy
INVOKE W ywołuje procedurę spod adresu podanego w jąc argum enty poprzez stos lub rejestry.
e x p r e s s io n ,
przesyła
Składnia: INVOKE e x p ressio n [ [ ,
argum ents]]
PROC D eklaru je proced u rę o nazw ie podanej w l a b e l . Taką proced u rę m ożna później w yw ołać instrukcją CA LL lub dyrektywą IN V O K E . Składnia: la b e l
PROC [ [ d i s t a n c e ] ]
[[U S E S r e g l i s t ] ]
[[,
[ [ la n g t y p e ] ]
[[v is ib ility ]]
[[< p ro log uearg > ]]
param eter [ [ : t a g ] ] ] ] . . .
[FRAME [:e h a n d le r- a d d re s s ] ] statem ents la b e l
ENDP
PROTO Tworzy prototyp funkcji. Składnia: la b e l
PROTO [ [ d i s t a n c e ] ]
[[ la n g t y p e ] ]
[[,
[[p a r a m e te r ]]:ta g ]]...
9.7. Rodzaj zestawu instrukcji procesora .386 Pozwala korzystać z nieuprzywilejowanych instrukcji procesora 80386. Nie pozw ala na korzystanie z instrukcji now szych procesorów. Składnia: .386
Rozdz ał 9. Dyrektywy asemblera MASM
| 179
.386P Pozwala korzystać z uprzyw ilejow anych instrukcji procesora S03S6. Nie pozw ala na korzystanie z instrukcji nowszych procesorów. Składnia: .386P
.387 Pozwala korzystać z instrukcji koprocesora S03S7. Składnia: .387
.486 Pozwala korzystać z nieuprzywilejowanych instrukcji procesora S04S6. Nie pozw ala na korzystanie z instrukcji nowszych procesorów. Składnia: .486
.486P Pozwala korzystać z uprzyw ilejow anych instrukcji procesora S04S6. Nie pozw ala na korzystanie z instrukcji nowszych procesorów. Składnia: .486P
.586 Pozwala korzystać z nieuprzywilejowanych instrukcji procesora Pen tium. Nie pozwala na korzystanie z instrukcji nowszych procesorów. Składnia: .586
180 j
Asembler. Leksykon k eszonkowy
.586P Pozwala korzystać z uprzyw ilejow anych instrukcji procesora Pen tium. N ie pozw ala na korzystanie z instrukcji now szych procesorów. Składnia: .586P
.686 Pozwala korzystać z nieuprzyw ilejow anych instrukcji procesora Pentium Pro. Składnia: .686
.686P Pozwala korzystać z uprzyw ilejow anych instrukcji procesora Pen tium Pro. Składnia: .6B6P
.K3D Pozwala na korzystanie z instrukcji K3D. Składnia: . K3D
.MMX Pozwala na korzystanie z instrukcji M M X i SIMD. Składnia: .MMX
Rozdz ał 9. Dyrektywy asemblera MASM
j 181
.XMM P o z w a la n a ko rzy sta n ie z in stru k cji S S E .
Składnia: .XMM
9.8. Bloki powtórzeń FOR Tworzy blok, który będzie powtarzany raz dla każdego argumentu. Przy każdym powtórzeniu bieżący argument będzie zamienia! parametr. Składnia: FOR param eter [[:R E Q
| := d e fa u lt]]
,
a r g u m e n t]]...>
statem ents ENDM
FORC Tworzy blok, który będzie powtarzany raz dla każdego znaku w ciągu, zam ieniając param etr bieżącym znakiem przy powtórzeniu. Składnia: FORC p aram eter, < string> statem ents ENDM
REPEAT Tworzy blok, który będzie pow tarzany Składnia: REPEAT ex p ressio n statem ents ENDM
182 |
Asembler. Leksykon k eszonkowy
e x p r e s s io n
razy.
WHILE Powtarza kod zawarty w bloku, dopóki w yrażenie pozostaje praw dziwe. Składnia: WHILE ex p ressio n statem ents ENDM
9.9. Zakres COMM Tworzy w spólną zm ienną z atrybutam i określonym i w definition. Składnia: COMM d e f i n i t i o n
[ [ , d e fin itio n ]]
..
EXTERN Tworzy zew nętrzną zm ienną, etykietę lub symbol. Składnia: EXTERN [ [ la n g t y p e ] ] ty p e [ [ ,
name [ [ ( a l t i d ) ] ]
[ [ la n g t y p e ] ]
:
name [ [ ( a l t i d ) ] ]
:ty p e ]]...
EXTERNDEF Tworzy jedną lub więcej zewnętrznych zmiennych, etykiet lub symboli. Składnia: EXTERNDEF [[ la n g t y p e ] ]
nam e:type [ [ ,
[[ la n g t y p e ] ]
n a m e : t y p e ] ]. . .
INCLUDELIB Inform uje konsolidator, że pow inien dołączyć daną bibliotekę. Składnia: INCLUDELIB lib ra ryn a m e
Rozdz ał 9. Dyrektywy asemblera MASM
| 183
PUBLIC Sprawia, że każda zm ienna, etykieta lub symbol będą dostępne tak że w innych modułach. Składnia: PUBLIC [ [ la n g t y p e ] ]
name [ [ ,
[ [ la n g t y p e ] ]
n a m e ]]...
9.10. Segmenty .ALPHA Układa segm enty alfabetycznie. Składnia: .ALPHA
ASSUME W łącza spraw dzanie błędów dla w artości rejestrów. Składnia: ASSUME se g re g is te r:n a m e [ [ ,
s e g r e g is t e r : n a m e ] ]. . .
ASSUME d a t a r e g is t e r : t y p e [ [ , d a t a r e g i s t e r : t y p e ] ] . .. ASSUME re g is te r:E R R O R [ [ , r e g i s t e r : E R R O R ] ] . . . ASSUME [ [ r e g i s t e r : ] ] NOTHING [ [ , r e g is te r :N O T H IN G ]]...
.DOSSEG Układa segm enty tak jak w system ie M S-DO S — najpierw segm ent kodu, później segm enty, które nie są w DGROUP, a na końcu te, które są w DGROUP. Składnia: .DOSSEG
END Oznacza koniec modułu i opcjonalnie ustaw ia punkt wejścia pro gramu na podany adres. Składnia: END [[a d d r e s s ]]
184 |
Asembler. Leksykon k eszonkowy
ENDS Kończy segment, strukturę lub unię. Składnia: name ENDS
GROUP D odaje określony segm ent do grupy podanej w name. Składnia: name GROUP segment [ [ ,
s e g m e n t]]...
SEGMENT Definiuje segm ent program ow y o nazw ie podanej w name. Składnia: name SEGMENT [[READONLY]]
[[a lig n ]]
[[co m b in e ]]
[[u s e ]]
[[c h a r a c te r is tic s ]]
A L IA S ( s t r i n g ) [ [ ' c l a s s ' ] ] statem ents name ENDS
I
eq
Układa segm enty sekw encyjnie (dom yślna kolejność). Składnia: .SEQ
9.11. Uproszczone segmenty .CODE O znacza początek segm entu kodu. Param etr name jest opcjonalny. Składnia: .CODE [[nam e]]
Rozdz ał 9. Dyrektywy asemblera MASM
| 185
.CONST Rozpoczyna segm ent danych (nazwany
CONST ).
Składnia: .CONST
.DATA Rozpoczyna segment bliskich danych zainicjowanych (nazwany
_DATA ).
Składnia: .DATA
.DATA? Rozpoczyna segment bliskich danych niezainicjowanych (nazwany _ B S S ). Składnia: .DATA?
.EXIT Generuje kod zam ykający. Składnia: .E X IT
[[e x p r e s s io n ]]
.FARDATA Rozpoczyna segm ent dalekich danych zainicjowanych (nazwany FAR_DATA lub name ). Składnia: .FARDATA [[nam e]]
.FARDATA? Rozpoczyna segm ent dalekich danych niezainicjow anych (nazwany FA R _ B S S lub name ). Składnia: .FARDATA? [[nam e]]
186 |
Asembler. Leksykon k eszonkowy
.MODEL Inicjuje m odel pam ięci programu. Składnia: .MODEL memorymodel
[[,
la n g t y p e ]]
[[,
s ta c k o p tio n ]]
.STACK Definiuje segm ent stosu (nazwany rozm iar dla stosu w bajtach.
STACK ).
O pcjonalnie m ożna podać
Składnia: .STACK [ [ s i z e ] ]
.STARTUP Generuje kod startowy programu. Składnia: .STARTUP
9.12. Łańcuchy znaków CATSTR Łączy w całość części tekstu. Składnia: name CATSTR [ [ t e x t it e m l
[[,
te x tite m 2 ]]
...]]
INSTR Szuka pierwszego wystąpienia
t e x tite m 2
w
te x tite m l.
Składnia: name INSTR [ [ p o s i t i o n , ] ]
t e x t it e m l, tex titem 2
Rozdz ał 9. Dyrektywy asemblera MASM
| 187
SIZESTR O blicza rozm iar tekstu. Składnia: name SIZ E ST R te x tite m
SUBSTR Zwraca część tekstu z texti tem, zaczynając od position. Składnia: name SUBSTR te x tite m , p o s itio n
[[,
le n g th ]]
9.13. Struktury i rekordy RECORD Deklaruje rekord złożony z określonych pól: fieldname to nazwa pola, width określa liczbę bitów , a expression to w artość inicjująca. Składnia: recordname RECORD fie ld n a m e :w id th [[= e x p re s s io n ]] [[,
fie ld n a m e :w id th
[[= e x p r e s s i o n ] ] ] ] . . .
STRUCT Deklaruje strukturę z odpowiednimi polami, każde pole musi posiadać popraw ną definicję danych. Składnia: name STRUCT [[a lig n m e n t]]
[[,
NONUNIQUE]]
f ie ld d e c la r a t io n s name ENDS
TYPEDEF Definiuje typ o nazw ie name odpow iadający typowi type. Składnia: name TYPEDEF typ e
188 |
Asembler. Leksykon k eszonkowy
UNION Deklaruje unię o jednym lub wielu typach danych; f i e l d d e c l a r a t i o n s m uszą być poprawnym i deklaracjam i danych. M ożesz om inąć ety kietę końcową name, gdy tw orzysz unie zagnieżdżone. Składnia: name UNION [[a lig n m e n t]] f ie ld d e c la r a t io n s [[nam e]]
[[,
NONUNIQUE]]
ENDS
9.14. Różne ALIAS Tworzy now ą nazw ę dla funkcji. Składnia: ALIA S
< a lias> =
COMMENT Traktuje
te x t
jako komentarz.
Składnia: COMMENT d e lim it e r [ [ t e x t ] ] [[te x t ]] [ [ t e x t ] ] d e lim it e r [ [ t e x t ] ]
ECHO W yświetla
m essa g e
na standardow e wyjście (dom yślnie ekran).
Składnia: ECHO message
INCLUDE W staw ia kod źródłow y z pliku w dane m iejsce w trakcie asemblacji programu. Składnia: INCLUDE filen am e
Rozdz ał 9. Dyrektywy asemblera MASM
| 189
MMWORD Używ ane jako 64-bitowe operandy dla instrukcji M M X i SSE. Składnia: MMWORD
OPTION W łącza lub w yłącza opcje asemblera. Składnia: OPTION o p t i o n li s t
Więcej o dyrektywie na stronach MSDN.
POPCONTEXT Odtwarza częściowo lub w całości aktualny kontekst (zachowany przez dyrektywę PUSHCONTEXT). Kontekstem m oże być ASSUMES, RADIX, LISTING, CPU lub ALL. Składnia: POPCONTEXT co ntext
PUSHCONTEXT Zachow uje część lub całość aktualnego kontekstu: segm ent, rejestr, przypisania, podstaw ę wyliczeniow ą, wartość, listing i flagi CREF lub wartości procesora/koprocesora. Kontekst to: ASSUMES, RADIX, LISTING, CPU lub ALL. Składnia: PUSHCONTEXT co n te x t
.RADIX Ustaw ia dom yślną podstaw ę wyliczeń na w artość expression. Składnia: .RADIX ex p ressio n
190 |
Asembler. Leksykon k eszonkowy
.SAFESEH Rejestruje funkcję jako strukturalną obsługę wyjątków. Składnia: .SAFESEH i d e n t i f i e r
XMMWORD Używ ane jako 128-bitowe operandy dla instrukcji M M X i SSE. Składnia: XMMWORD
YMMWORD Używ ane jako 256-bitow e operandy dla instrukcji AVX (ang. Intel Advanced Vector Extensions). Składnia: YMMWORD
D y r e k t y w a ta z o s t a ła d o d a n a d o M A S M
w M ic r o s o f t V is u a l
S t u d io 2010.
Rozdz ał 9. Dyrektywy asemblera MASM
| 191
Dodatki Dodatek A Tablica kodów ASCII Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
192 |
Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A IB 1C ID 1E 1Ü
Char NULL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DCI DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
Dec 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
Hex 2© 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 3© 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
Char i ■■
# t %
& ■ ( ) t
+ } -
I 0 1 2 3 4 5 6 7 8 9 i < = > ?
Asembler. Leksykon k eszonkowy
Dec
Hex
Char
Dec
Hex
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
§> A B C D E F G Hl
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
6© 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 7© 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
I
3 K L M N 0 P Q R S T U V w
X Y Z [ \ ] A
-
Char a b c d e f g h i j k I m n o
P q r s t u V
w X
y z { 1 > DEL
Dodatek B Potęgi liczby dwa 2-2 = 1 /4 2-1 = 1 /2 20 = 1 21 = 2 22 = 4 23 = 8 24 = 16 25 = 32 26 = 64 27 = 128 28 = 256 29 = 512 210 = 1024 211 = 2048 212 = 4096 213 = 8192 214 = 16 384 215 = 32 768 216 = 65 536 217 = 131 072 218 = 262 144 219 = 524 288 220 = 1 048 576 Dodatek B. Potęg l czby dwa
| 193
221 = 2 097 152 222 = 4 194 304 223 = 8 388 60S 224 = 16 777 216 225 = 33 554 432 226 = 67 108 864 227 = 134 217 728 228 = 268 435 456 229 = 536 870 912 230 = 1 073 741 824 231 = 2 147 483 648 232 = 4 294 967 296 233 = 8 589 934 592 234 = 17 179 869 184 235 = 34 359 738 368 236 = 68 719 476 736 237 = 137 438 953 472 238 = 274 877 906 944 239 = 549 755 813 888 240 = 1 099 511 627 776 241 = 2 199 023 255 552 242 = 4 398 046 511 104 243 = 8 796 093 022 208 244 = 17 592 186 044 416 245 = 35 184 372 088 832 246 = 70 368 744 177 664 247 = 140 737 488 355 328
194 j
Asembler. Leksykon k eszonkowy
248 = 281 474 976 710 656 249 = 562 949 953 421 312 250 = 1 125 899 906 842 624 251 = 2 251 799 813 685 248 252 = 4 503 599 627 370 496 253 = 9 007 199 254 740 992 254 = 18 014 398 509 481 984 255 = 36 028 797 018 963 968 256 = 72 057 594 037 927 936 257 = 144 115 188 075 855 872 258 = 288 230 376 151 711 744 259 = 576 460 752 303 423 488 260 = 1 152 921 504 606 846 976 261 = 2 305 843 009 213 693 952 262 = 4 611 686 018 427 387 904 263 = 9 223 372 036 854 775 808 264 = 18 446 744 073 709 551 616
Dodatek B. Potęg l czby dwa
j 195
Dodatek C Lista opkodów procesora 80x86 Opkod (ang. opcode) to sym boliczna nazw a, której odpowiada kod bajtowy. Pisząc w Asemblerze, używ am y właśnie opkodów (nazy wanych też czasem m nem onikam i). Później opkody są tłumaczone na kod bajtowy. 00 ADD
01 ADD
02 ADD
03 ADD
04 ADD
05 ADD
06 PUSH
07 POP
08 OR
09 OR
0A OR
0B OR
0C OR
0D OR
0E PUSH
0F 00
LLDT
0F 00 LTR
0F 00 SLDT
0F 00 ST R
0F 00 V ERR
0F 00 VERW
0F 01
0F 01
0F 01
0F 01
LMSW
IN V LPG
LGDT
L ID T
0F 01 SGDT
0F 01 S ID T
0F 01 SMSW
0F 01 SMSW
0F 02
LAR
0F 03 L SL
0F 08
0F 09 WBINVD
0F 0B UD2
0F 20 MOV
0F 21 MOV
0F 22 MOV
0F 23 MOV
0F 30 WRMSR
0F 31
0F 32 RDMSR
0F 33 RDPMC
0F 40 CMOVO
0F 41 CMOVNO
INVD
RDTSC
0F 42 CMOVB
0F 42 CMOVC
0F 42 CMOVNAE
0F 43 CMOVAE
0F 43 CMOVNB
0F 43 CMOVNC
0F 44 CMOVE
0F 44 CMOVZ
0F 45 CMOVNE
0F 45 CMOVNZ
0F 46 CMOVBE
0F 46 CMOVNA
0F 47 CMOVA
0F 47 CMOVNBE
0F 48 CMOVS
0F 49 CMOVNS
0F 4A CMOVP
0F 4A CMOVPE
0F 4B CMOVNP
0F 4B CMOVPO
0F 4C CMOVL
0F 4C CMOVNGE
0F 4D CMOVGE
0F 4D CMOVNL
0F 4E CMOVLE
0F 4E CMOVNG
0F 4F CMOVG
0F 4F CMOVNLE
0F 60 PUNPCKLBW
0F 61
0F 62 PUNPCKLDQ
0F 63 PACKSSWB
0F 64 PCMPGTB
0F 65 PCMPGTW
0F 66 PCMPGTD
0F 67 PACKUSWB
0F 68 PUNPCKHBW
0F 69 PUNPCKHWD
0F 6A PUNPCKHDQ
0F 6B PACKSSDW
0F 6E MOVD
0F 6F MOVQ
0F 71 PSLLW
0F 71
0F 71 PSRLW
0F 72 P SL LD
0F 72 PSRAD
0F 72 PSRLD
0F 73 P SL LQ
0F 73 PSRLQ
0F 74 PCMPEQB
0F 75 PCMPEQW
0F 76 PCMPEQD
0F 77
0F 7E MOVD
0F 7F MOVQ
0F 80 JO
0F 81 JN O
0F 82 J B
0F 82 JC
196 |
PUNPCKLWD
EMMS
Asembler. Leksykon k eszonkowy
PSRAW
0F 82 JN A E
0F 83 JA E
0F 83 JN B
0F 84 J E
0F 84 J Z
0F 85 JN E
0F 85 JN Z
0F 86 J B E
0F 86 JN A
0F 87 J A
0F 87 JN B E
0F 88 J S
0F 89 JN S
0F 8A J P
0F 8A J P E
0F 8B J N P
0F 8B JP O
0F 8C J L
0F 8C JN G E
0F 8D JG E
0F 8D JN L
0F 8E J L E
0F 8E JNG
0F 8F JG
0F 8F JN L E
0F 90 SETO
0F 91 SETNO
0F 92 S E T B
0F 92 SETC
0F 92 SETN A E
0F 93 SE T A E
0F 93 SETN B
0F 93 SETNC
0F 94 S E T E
0F 94 S E T Z
0F 95 SE T N E
0F 95 SETN Z
0F 96 S E T B E
0F 96 SETNA
0F 97 SE T A
0F 97 SE T N B E
0F 98 S E T S
0F 99 SET N S
0F 9A S E T P
0F 9A S E T P E
0F 9B S E T N P
0F 9B SETPO
0F 9C S E T L
0F 9C SETN GE
0F 9D SE T G E
0F 9D SET N L
0F 9E S E T L E
0F 9E SETNG
0F 9F SETG
0F 9F S E T N L E
0F A0 PUSH
0F A1
0F A3 BT
0F A4 SHLD
POP
0F 83 JN C
0F A5 SHLD
0F A8 PUSH
0F A9 POP
0F AA RSM
0F AB BT S
0F AC SHRD
0F AD SHRD
0F AF
0F B0 CMPXCHG
0F
B1 CMPXCHG
0F B2
0F
0F B4 L F S
0F
B5
0F B6 MOVZX
0F
B7 MOVZX
0F BA BT
0F
BA BTC
0F BA BTR
0F
BA BTS
0F BB BTC
0F
BC B S F
0F BD BSR
0F
BE MOVSX
0F BF MOVSX
0F C0 XADD
0F C1 XADD
0F C7
LGS
L SS
IMUL
B3 BTR
CMPXCHG8B 0F C8 BSWAP
0F D1 PSRLW
0F D2 P SR LD
0F D3 PSRLQ
0F D8 P SU B U SB
0F D9 PSUBUSW
0F DB PAND
0F DC PADDUSB
0F DD PADDUSW
0F DF PANDN
0F
E1 PSRAW
0F
E2 PSRAD
0F
E5 PMULHW
0F
E8 P SU B SB
0F
E9 PSUBSW
0F
EB POR
0F
EC PADDSB
0F
ED PADDSW
0F
EF PXOR
0F
F1
0F
F2 P S L L D
0F
F3 P SLLQ
0F
F5 PMADDWD
0F
F8 PSU BB
0F
F9 PSUBW
0F
FA PSUBD
0F
FC PADDB
0F
FD PADDW
0F
FE PADDD
PSLLW
10 ADC
11 ADC
12 ADC
13 ADC
14 ADC
15 ADC
16 PUSH
17 POP
18 S B B
19 S B B
1A S B B
1B S B B
1C S B B
1D S B B
1E PUSH
Dodatek C. L sta opkodow procesora 80x86
| 197
1F POP
20 AND
21 AND
22 AND
23 AND
24 AND
25 AND
27 DAA
28 SU B
29 SUB
2A SUB
2B SUB
2C SU B
2D SUB
2F DAS
30 XOR
31 XOR
32 XOR
33 XOR
34 XOR
35 XOR
37 AAA
38 CMP
39 CMP
3A CMP
3B CMP
3C CMP
3D CMP
3F AAS
40 INC
48 DEC
50 PUSH
58 POP
60 PUSHA
60 PUSHAD
61
61 POPAD
62 BOUND
63 A RPL
68 PUSH
69 IMUL
6A PUSH
6B
6C IN S
6C IN S B
6D IN S
6D IN SD
6D INSW
6E OUTS
6E OUTSB
6F OUTS
6F OUTSD
6F OUTSW
70 JO
71 JN O
72 J B
72 JC
72 JN A E
73 JA E
73 JN B
73 JN C
74 J E
74 J Z
75 JN E
75 JN Z
76 J B E
76 JN A
77 J A
77 JN B E
78 J S
79 JN S
7A J P
7A J P E
7B JN P
7B JP O
7C J L
7C JN G E
7D JG E
7D JN L
7E J L E
IMUL
POPA
7E JN G
7F JG
7F JN L E
80 ADC
80 ADD
80 AND
80 CMP
80 OR
80 S B B
80 SUB
80 XOR
81 ADC
81 ADD
81 AND
81 CMP
81 OR
81 S B B
81 SUB
81 XOR
83 ADC
83 ADD
83 AND
83 CMP
83 OR
83 S B B
83 SUB
83 XOR
84 T EST
85 T EST
86 XCHG
87 XCHG
88 MOV
89 MOV
8A MOV
8B MOV
8B MOV
8C MOV
8D LEA
8E MOV
8F
90 NOP
90 XCHG
98 CBW
98 CWDE
99 CDQ
99 CWD
9A CALL
9A CALL
9B D9 FSTCW
9B D9 FSTENV
9B DB E2 FC LEX
9B DB E3
9B DD FSA VE
9B DD FSTSW
9B DF E0 FSTSW
9B
198 |
Asembler. Leksykon k eszonkowy
POP
FWAIT
F IN IT
9B WAIT
9C PUSHF
9C PUSHFD
9D POPFD
9E SAHF
9F
A1 MOV
A2 MOV
A3 MOV
A4
A4 MOVSB
A5 MOVS
A5 MOVSD
A5
A6 CMPS
A6 CMPSB
A7 CMPS
A7
A7 CMPSW
A8 TEST
A9 TEST
AA
AA ST O SB
AB STOS
AB STOSD
AB
AC LODS
AC LODSB
AD LODS
AD
AD LODSW
AE SCAS
AE SC A SB
AF
AF SCASD
AF SCASW
B0 MOV
B8 MOV
C0 RCL
C0 RCR
C0 ROL
C0
C0 SA L
C0 SA R
C0 SH L
C0
C1 RCL
C1 RCR
C1 ROL
C1
C1 SA L
C1 SA R
C1 SH L
C1
C2 RET
C3 RET
C4 L ES
C5
C6 MOV
C7 MOV
C8 00 ENTER
C8
C8 ENTER
C9 LEAVE
CA RET
CC
CD IN T
CE INTO
CF IR E T
CF
D0 RCL
DO RCR
D0 ROL
D0
D0 SA L
D0 SA R
D0 SH L
D0
D1 RCL
D1 RCR
D1 ROL
D1
D1 SA L
D1 SA R
D1 SH L
D1
D2 RCL
D2 RCR
D2 ROL
D2
D2 SA L
D2 SA R
D2 SH L
D2
D3 RCL
D3 RCR
D3 ROL
D3
D3 SA L
D3 SA R
D3 SH L
D3
D4 (brak m nem onika)
LAHF
9D
D5
D4 OA AAM
(b ra k m n em o n ika)
A0
D5 0A AAD
D7 XLAT
D7 X LA T B
D8 C0 FADD
D8 C8 FMUL
D8 D0 FCOM
D8 D1 FCOM
D8 D8 FCOMP
D8 D9 FCOMP
D8 E0 FSUB
D8 E8 FSU B R
D8 F0 F D IV
D8 F8
D8 FADD
D8 FCOM
D8 FCOMP
D8 F D IV
D8 F D IV R
D8 FMUL
D8 FSUB
D8 FSU BR
D9 C0 FLD
D9 C8 FXCH
D9 C9 FXCH
D9
F D IV R
Dodatek C. L sta opkodów procesora 80x86
| 199
D9 E4 FTST
D9 ES
D9 EA FLD L2E
D9 EB F L D P I
D9 EC FLDLG2
D9 EE
D9 F0 F2XM l
D9 F2
D9 F4 FXTRACT
D9 F5 FP R E M l
D9 F6 FD ECSTP
D9 F9 F Y L 2 X P l
D9 FA FSQRT
D9 FB
FSIN C O S
D9 FC FRNDINT
D9 FD FSC A LE
D9 FE
D9 FF
FCOS
D9 FLD
D9 FLDCW
D9 FLDENV
D9 FNSTCW
D9 FNSTENV
D9 FST
D9 F S T P
DA C0 FCMOVB
DA CS FCMOVE
DA D0 FCMOVBE
DA DS FCMOVU
DA E9 FUCOMPP
DA FIA D D
DA FICOM
DA FICOM P
DA F I D I V
DA F I D I V R
DA FIM U L
DA F IS U B
DA F IS U B R
DB C0 FCMOVNB
DB CS FCMOVNE
DB D0 FCMOVNBE
DB DS FCMOVNU
DB E2 FNCLEX
DB E3
DB ES
DB F0 FCOMI
DB F IL D
DB F IS T
DB F I S T P
DB FLD
DB FS T P
DC C0 FADD
DC CS FMUL
DC E0 FSU BR DC FADD
D9 E0 FCHS
D9 E l
D9 E9 FLDL2T D9 ED FLDLN2 D9 F3 FPATAN D9 F7 F IN C S T P
FA BS
FLDZ
F N IN IT
F S IN
FUCOMI
FPTAN
DC F0 F D IV R
DC FS
DC FCOM
DC FCOMP
DC F D IV
DC F D IV R
DC FMUL
DC FSUB
DC FSU B R
DD C0 F F R E E
DD D0 FST
DD DS F S T P
DD E0 FUCOM
DD E l
DD ES
DD E9 FUCOMP
DD FLD
DD FNSAVE
DD FNSTSW
DD FRSTOR
DD FST
DD F ST P
DE C0 FADDP
DE C l
DE CS FMULP
DE C9 FMULP
DE D9 FCOMPP
DE E0 F SU B R P
DE E l
F SU B R P
DE
ES
FSU B P
DE E9 F SU B P
DE F0 F D IV R P
DE F l
F D IV R P
DE
FS
F D IV P
DE F9 F D IV P
DE FIADD
DE FICOM
DE
FICOM P
DE F I D I V
DE F I D I V R
DE FIM U L
DE
F IS U B
DE F IS U B R
DF E0 FNSTSW
DF ES
DF F0 FCOMIP
DF FBLD
DF F B S T P
DF F IL D
DF F IS T
DF F I S T P
E0
LOOPNE
E0 LOOPNZ
El
El
E2
LOOP
E3 JC X Z
E3 JE C X Z
E4 IN
E5
IN
E6 OUT
E7 OUT
ES CALL
E9 JM P
EA JM P
EB JM P
EC IN
ED IN
EE OUT
EF OUT
F0 LOCK
F2 A6 REPNE
F2 A7 REPN E
F2 AE REPNE
DC ES
FSUB
FUCOMP
LOOPZ
200 j
FADDP
Asembler. Leksykon k eszonkowy
F D IV
FLD l
FUCOMIP
FUCOM
LOOPE
FZ AF REPN E
Fa 6C R EP
Fa 6D R EP
Fa
Fa 6 F R EP
Fa A4 R EP
Fa A5 R EP
Fa A6 R EP E
Fa A ?
Fa AA R EP
Fa AB R EP
Fa AC R EP
Fa AD R EP
Fa AE R EP E
Fa AF R EP E
F4 HLT
F5 CMC
F6 D IV
F6
F6
F6 MUL
F6 NEG
F6 NOT
F6 T EST
F?
D IV
F?
ID IV
F?
IMUL
F ? MUL
F?
NEG
F?
NOT
F?
TEST
FS CLC
R EP E
ID IV
6E R EP
IMUL
F9 STC
FA C L I
FC CLD
FD STD
FE DEC
FE
FF CALL
FF DEC
FF
FF JM P
INC
INC
FF
PUSH
Dodatek C. L sta opkodów procesora 80x86
j 201
Skorowidz 386, 179
A S C I I , 192
C a llW in d o w P ro c, 76, 95
386P, 180
asem bler, 7
C a r r y Fla g , 11, 22
387, 180
A sem b ler, 7
C A R R Y ? , 36
486, 180
64-bitowy, 120
C A T S T R , 187
486P, 180
A S S U M E , 44, 184
C B _ A D D S T R IN G , 63
586, 180
A u x illa r y F la g , 11
C B _ D E L E T E S T R I N G , 63
586P, 181
A V X , 118
C B _ G E T C O U N T , 63
686, 181
instrukcje, 119 A X , 10
686P, 181
C B _ G E T C U R S E L , 63 C B _ S E T C U R S E L , 63 C B W , 133
A
B
C D Q , 133 C F , 11, 22
A A A , 125
bajt, 9
C H A R F O R M A T , 84
A A D , 125
b iblioteki D L L , 97
C H A R R A N G E , 83
A A M , 126
bit, 9
C h e ckB o x , 60
A A S , 126
bloki
p r z y k ła d o w y pro gram ,
A C , 12
pam ięci, 52
A D C , 126
po w tórzeń , 182
61 sp ra w d z a n ie stanu, 60
A D D , 19, 127
B O U N D , 128
A D D R , 40
B R E A K , 36, 173
ad res I P , P atrz IP A d d r e s s
B S _ 3 S T A T E , 60
h D lg , 61
B S _ A U T O 3 S T A T E , 60
n ID B u tto n , 61
lokalnego kom putera, 99
ustaw ianie stanu, 61 C h e ck D lg B u tto n , 61
adres zm iennej, 39
B S _ F L A T , 57
ad reso w an ie x64, 124
B S F , 129
C L C , 134
A d v a n c e d V ector
B S R , 129
C L D , 134
B S T _ C H E C K E D , 60, 61
C L I, 134
B S T _ IN D E T E R M IN A T E , 60,
C lo s e H a n d le , 99
Extensions, Patrz A V X A F , 11 A H , 10
61
u C h eck , 61
C L T S , 135
aku m u la to r, 10
B S T _ U N C H E C K E D , 60, 61
C M C , 135
A L , 10
B S W A P , 130
C M P , 29, 135
A L IA S , 189
B T , 130
C M P S , 31, 136
A L I G N , 172
B T C , 130
C O D E , 41, 50, 185
A lig n m e n t C h e ck, 12
B T R , 131
Code Segment, 11
alokacja
B T S , 131
C o m b oBo x, 62
b lo k ó w p am ięci, 52 d a n ych , 175 A L P H A , 184
b u d o w a p ro g ra m u D O S , 13, 14 W in d o w s , 15
k o m u n ik a ty , 63 p r z y k ła d o w y pro gram , 63
a ltern a ty w a , 21
Bu tto n , 56
C O M M , 183
a lte rn a ty w a w yk lu czająca,
B Y T E , 41, 175
C O M M E N T , 189
21
C O N S T , 41, 186
A M D 6 4 A sse m b ly
C
D ebug ger, 124
C O N T I N U E , 173 C P L , 12
A N D , 20, 127
C A L L , 17, 26, 132
C rea te F ile, 99
aplikacje w ielo w ą tk o w e , 95
C a llN e x tH o o k E x , 88
C re a te F ile M a p p in g , 99
a rchitektura
hh k, 89
Create T h re ad , 95
64-bitowa, Patrz x64
lP a ra m , 89
x86, 10
nCode, 89
d w Sta ck Size, 96
w P a ra m , 89
lp P a ram ete r, 96
A R P L , 128
202 |
Asembler. Leksykon k eszonkowy
d w C re a tio n F la g s, 96
lp Sta rtA d d ress, 96
E C H O , 189
Flo a tT o S tr, 103
lpThreadAttributes, 95
E C X , 10
FloatT oStr2, 103
lp T h re a d Id , 96
E D I , 10
F O R , 182
C re a te W in d o w E x , 72
E d it, 57
F O R C , 182
C S, 11
pobieranie liczby, 58
F O U R T H _ IP A D D R E S S , 78
C u rre n t P r io r ity L e v e l, 12
pobieranie tekstu, 58
F P U , 102
C W _ U S E D E F A U L T , 72
p rz y k ła d o w y program ,
FS, 11
60
C W D , 136 C W D E , 137
D
funkcje
ustawianie liczby, 59
p o w ró t, 27
ustawianie tekstu, 59
tw o rz en ie, 27
E D X , 10
w y w o ła n ie , 26
E F L A G S , 11, 13
D A A , 137
E IP , 13
D A S , 137
ek ran p o w ita ln y ,
D A T A , 41, 186
F W O R D , 42, 175
G
Patrz Splashscreen
Data Segment, 11
E L S E , 35, 173
G e tD lg lte m , 72
D A T A ? , 41, 186
E L S E I F , 35, 173
GetD IgItem Int, 58
D B , 41, 175
E M _ E X S E T S E L , 83, 84
bSig ned , 58
D D , 41
E M _ F I N D T E X T E X , 83, 84
h D lg , 58
debug gery, 7
E M _ S E T C H A R F O R M A T , 84
lpTranslated, 58
aplikacji x64, 124 D e b u g g in g T oo ls for
E M _ S E T S E L , 84 E M _ S E T T E X T E X , 84
W in d o w s 64-bit V ersio n,
E N D , 184
124
E n d D ia lo g , 50
h D lg , 58
D E C , 20, 138
E N D I F , 35, 173
dekrem entacja, 20
E N D M , 177
dereferencja, 40
E N D P , 27, 178
D F , 12, 30, 42
E N D S , 43, 185
D I, 10
E N D W , 36, 174
D ia lo g B o x P a ra m , 50
E N T E R , 139
D ire c tio n Fla g , 12, 30
E Q U , 177
D IV , 19, 138
E S, 11
D L L , 97
E S I, 10
d o d a w an ie , 19
E S P , 10
DOS
e ty k ie ty , 29
b u d o w a program u, 13, szablony aplikacji, 14
n M a x C o u n t, 58 gethostbynam e, 100 gethostnam e, 100 G e tM o d u le H a n d le , 50
lp P ro c N a m e , 99 G e tS td H a n d le , 45 G o A s m , 124 G O T O , 178 G R O U P , 185 G ro u p B o x , 62
exe, 7
G S , 11
D O S S E G , 184
E X IT , 186
double w ord , 9
E X I T M , 177
D Q , 42
E x itProcess, 16, 50
D S, 11
E X T E R N , 183
D W , 41
E X T E R N D E F , 183
D W O R D , 41, 175
E x tr a S e g m e n t, 11
G W L _ E X S T Y L E , 94
d y re k ty w y asem blera
G W L _ H I N S T A N C E , 94 G W L _ I D , 94 G W L _ S T Y L E , 94 G W L _ U S E R D A T A , 94 G W L _ W N D P R O C , 94
F
dzielenie bez znaku , 19
F A R D A T A , 186
ze znakiem , 20
F A R D A T A ? , 186 F A S M , 124
E
n ID D lg Ite m , 58
h M o d u le , 99
k o d u, 172
M A S M , 172
lp Strin g , 58
G e tP ro c A d d re s s, 98
E V E N , 172
14
n ID D lg Ite m , 58 G e tD lg Item T ex t, 58
F A S T C A L L , 123 F D B G , 124
E A X , 10
F I N D T E X T E X , 83
E B P , 10
F IR S T _ IP A D D R E S S , 78
E B X , 10
flag i, 11
H H IG H - W O R D , 10 H L T , 139 H o o k s, 87 in sta lo w a n ie, 88 k la w ia tu ra , 89 rodzaje, 87 hostent, 100
Skorow dz
| 203
I I / O Privilege Level, 12
I R E T , 143
su w a k a , P atrz T rac k B a r
IR E T D , 143
tekstu sform atow aneg o,
IsDlgButtonChecked, 60
ID , 12
h D lg , 60
Iden tifica tio n , 12
n ID B u tto n , 60
P atrz R ic h E d it w id o k u drz e w a,
I D IV , 20, 140
P atrz T re e V ie w
IF , 12, 35, 174
J
I M U L , 19, 140
listy, P atrz L is tV ie w w p ro w a d z a n ia adresu
I N , 141
JA , 30
I N C , 20, 141
J A E , 30
I N C L U D E , 189
JB , 30
I N C L U D E L I B , 183
J B E , 30
inet_ntoa, 100 InitCom m onControls, 50
Jcc, 143 JE , 30
inkrem entacja, 20
JG , 30
IN S , 142
JG E , 29, 30
IN S T R , 187
JL , 30
k o p io w a n ie , 18
instrukcje
J L E , 30
koprocesor, 102
IP , P atrz IP A d d r e s s w yb o ru pojedynczego,
Patrz RadioButton w ielokrotnego ,
P atrz C h e ck B o x k o n w en cja w y w o ła n ia x64, 123
a rytm etyczn e, 18
J N E , 30
instrukcje, 105
A V X , 119
J N Z , 30
p r z y k ła d o w y pro gram ,
k o p io w a n ia , 18
jW a s m , 124
koprocesora, 105
JZ , 30
109 rejestry, 102
logiczne, 20 M M X , 110
K
operujące na łańcuchach, 30
K 3 D , 181
p o ró w n a n ia , 29
kernel32.dll, 16
przesunięć b ito w y ch , 21
kilobajt, 10
rodzaje zestaw ó w , 179
k la w ia tu ra , 52
s k o k u , 29
k o d y A S C II, 192
S S E , 111
k o m p ila to ry A sem b lera
SSE 2 , 113 SSE 3 , 115 SSE 4 , 117
x64, 124 k o m u n ik a cja m ię d z y w ą tk a m i, 96
SSS E3 , 116
ko niunk cja, 20
z m ia n y w x64, 122
konsola w W in d o w s, 45
z w iązane z proceduram i, 26 IN T , 14, 142 In te rru p t Fla g , 12
k o lo ry , 46 p o bieranie d anych, 45 p r z y k ła d o w y p ro gram , 47
I N V O K E , 17, 179
tw o rz en ie aplikacji, 45
IO P L , 12
w yśw ietla n ie danych, 45
IP A d d re s s , 78 czyszczenie zaw arto ści, 81
ko nso lid ato r, 7 kontrola p rz epływ u, 35, 173 k o ntro lki
po bieranie adresu, 78
listy, P atrz L is tB o x
p o w ia d o m ie n ia , 81
lis ty rozw ijanej,
p r z y k ła d o w y p ro g ra m , 82
n ow oczesne, 85
u sta w ia n ie adresu, 80 u sta w ia n ie focusu, 81 IP M _ C L E A R A D D R E S S , 81 I P M _ G E T A D D R E S S , 78 I P M _ S E T A D D R E S S , 80, 81 IP M _ S E T F O C U S , 81 IP N _ F IE L D C H A N G E D , 81
204 |
P atrz C o m b o Bo x p a ska postępu,
P atrz Prog ressB ar p o d p o w ie d z i,
P atrz T oo ltip p o la tekstow ego,
P atrz E d it p rz ycisku , P atrz B u tto n
Asembler. Leksykon k eszonkowy
L L A B E L , 172 L A H F , 144 L A R , 145 L B _ A D D S T R I N G , 64 L B _ G E T C O U N T , 64 L B _ G E T C U R S E L , 64 L B _ S E T C U R S E L , 64 L E A , 40, 145 L E A V E , 145 L G D T , 146 L G S , 146 licz b y zm iennoprzecinkowe, 103 licz n ik, 10 L ID T , 146 lin ker, 7 lista, Patrz L istBo x lista ro zw ijan a,
P atrz C o m b o Bo x L is tB o x , 64 k o m u n ik a ty , 64 p r z y k ła d o w y pro gram , 64 L is tV ie w , 68 elem en ty, 69 k o lu m n y , 68 p rzykładow y program, 69 L L D T , 147 L M S W , 147 L o a d Ico n , 50
M essag eBo x, 16
O F , 12
M F _ B I T M A P , 56
O F F S E T , 39
L O C A L , 40, 178
M F _ C H E C K E D , 56
okno d ia lo g o w e, 47
L O C K , 147
M F _ D I S A B L E D , 56
L O D S , 32, 148
M F _ G R A Y E D , 56
O l l y Debug ger, 8
lo k a ln y adres IP , 99
M F _ M E N U B R E A K , 56
opcode, 196
L O O P , 148
M F _ O W N E R D R A W , 56
operacje n a plika ch , 52
L O W - W O R D , 10
M F _ S T R I N G , 56
L V C F _ F M T , 68
młodsze słowo, 10
L V C F _ S U B I T E M , 68
M M W O R D , 42, 190
o p era to ry p o ró w n a n ia , 36
L V C F _ T E X T , 68
M M X , 13, 42, 110, 181
o p k o d y procesora 80x86,
L o a d L ib ra ry , 98 lpLib FileN am e, 98
L V C F _ W ID T H , 68 L V C F M T _ C E N T E R , 68
instrukcje, 110 m nożenie
w łaś c iw o ś ci, 48
p r z y k ła d o w y pro gram , 54
196 O P T IO N , 190
L V C F M T _ L E F T , 68
bez znaku , 19
O R , 21, 152
L V C F M T _ R IG H T , 68
ze z nakiem , 19
O R G , 172
M O D E L , 187
O U T , 153
cc h T e x tM a x , 69
M O V , 18, 148
O U T S , 153
fm t, 68
M O V S , 30, 149
O v e r flo w F la g , 12
im ask , 68
M O V S X , 150
O V E R F L O W ? , 36
iSu b Ite m , 69
M O V Z X , 150
lx, 69
M S D N , 16
pszText, 69
M U L , 19, 151
L V C O L U M N , 68
L V I F _ I M A G E , 69
m ysz, 51
L V IF _ P A R A M , 69
N
L V IF _ S T A T E , 69 L V IF _ T E X T , 69
P A R I T Y ? , 36 pasek postępu,
P atrz Prog ressB ar
N A S M , 124
L V IT E M , 69
P P a r ity Flag, 11
cchT extM ax, 69
N E G , 151
P B M _ G E T P O S , 65
iItem , 69
N e s te d T a sk , 12
P B M _ G E T R A N G E , 65
im ask , 69
nibble, 9
P B M _ G E T S T E P , 65
iSu b Ite m , 69
N I M _ D E L E T E , 93
P B M _ S E T P O S , 65
pszText, 69
N M H D R , 82
P B M _ S E T R A N G E , 65
L V M _ IN S E R T C O L U M N , 68
code, 82
P B M _ S E T S T E P , 66
L V M _ I N S E R T I T E M , 69
h w n d F r o m , 82
P B M _ S T E P IT , 66
L V M _ S E T IT E M , 69
id F ro m , 82
P B R A N G E , 65
L V S _ R E P O R T , 68
Ł ła ń c u c h y zn a k ó w , 30, 187
N M I P A D D R E S S , 81
P F , 11
iField, 81
pliki
iV a lu e , 81 N O P , 152
M _ L B U T T O N D B C L K , 51
N O T I F Y I C O N D A T A , 92 now oczesne k o n tro lki, 85 N T , 12
O
do tw o rz e n ia pętli, 36 obj, 7
m anifest, 85
obsługa okna, 93
M a p V ie w O fF ile , 99
odczyt
M A SM 6 4 , 124
k la w ia tu r y , 52 m ysz y , 51
m egabajt, 10
o d ejm o w an ie, 19
m enu , 55
o d p lu sk w ia cz , 7
p rz y k ła d o w y pro gram , 56
pobieranie lokalnego p o c z w ó rn e sło w o , 10
m akroinstrukcje, 35, 177
M A SM , 8
w p am ięci, 99 operacje, 52 adresu IP , 99
M A C R O , 178
ko n tro li p rz e p ły w u , 35
.m anifest, 86 o d w z o ro w an e
N O T , 21, 152
M
pętle, 36
h d r, 81
o d w z o ro w a n ie p lik ó w w p am ięci, 99
p o d m ia n a p ro ce d u ry obsługi okna, 93 prz y k ła d o w y program, 95 p o d p ięcia do W in d o w s ,
P atrz H o o k s p o d p o w ie d z , P atrz T oo ltip podw ójne słowo, 9 pole tekstow e, Patrz E d it P O P , 13, 18, 154
Skorow dz
| 205
P O P A , 154
R E A L 1 0 , 42, 176
S B B , 162
P O P A D , 154
R E A L 4 , 42, 176
S B Y T E , 175
P O P C O N T E X T , 190
R E A L 8 , 42, 176
S C A S , 33, 162
P O P F , 155
R E C O R D , 188
S C F _ A L L , 84
P O P F D , 155
rejestry, 10
S D W O R D , 175
p o ró w n a n ie , 29
b a z o w y , 10
S E C O N D _ IP A D D R E S S , 78
o perato ry, 36
d anych, 10
S E G M E N T , 185
potęgi lic z b y d w a , 193
flag, 11
segm enty, 184
p o w ró t
in d e kso w e , 10
z fu n k c ji/ p ro c e d u ry , 27
koprocesora, 13, 102
p o w tó rze n ia, 182
M M X , 13
półbajt, 9
ogólnego
P R O C , 27, 179 p ro ced u ry, 178
uproszczone, 185 SendM essag e, 62 h W n d , 63 lP a ra m , 63
przeznaczenia, 10 procesora x64, 121
M s g , 63 w P a ra m , 63
p o w ró t, 27
segmentowe, 11
S E Q , 185
tw o rz en ie, 27
S S E , 13
SE T c c, 163
w y w o ła n ie , 26
w sk a ź n ik o w e , 10
SetConsoleTextAttribute, 46
p ro g ra m o w anie
rek o rd y , 188
Se tD lg Ite m In t, 59
R E P , 157
bSig ned , 59
R E P E , 158
h D lg , 59
k o m u n ik a ty , 65
R E P E A T , 37, 174, 182
n ID D lg Ite m , 59
p rz y k ła d o w y pro gram ,
R E P N E , 158
w W in d o w s , 45 Prog ressB ar, 65
u V a lu e , 59
R E P N Z , 158
66
SetDlgItemText, 59
P R O T O , 179
R E P Z , 158
p rz e rw a n ia , 14
Resum e Flag, 12
przesunięcia
R E T , 27, 158
a rytm etyczn e, 21, 22
R F , 12
b ito w e , 21
R ic h E d it, 83
h D lg , 59 n ID D lg Ite m , 59 S e tW in d o w L o n g , 93
logiczne, 21, 22
fo rm ato w a n ie, 84
logiczne po d w ó jn eg o
przejście do
rejestru, 24 przycisk, P atrz B u tto n p rz y ró w n a n ia , 177 P U B L I C , 184
określonego w iersza, 84 p r z y k ła d o w y p ro gram , 85
P U R G E , 178
w yszu kiw anie tekstu, 83
P U S H , 13, 17, 18, 155
z a m ienian ie w yb ra n e g o tekstu, 84
P U S H A , 155 P U S H A D , 155 P U S H C O N T E X T , 190
zaznaczanie całego tekstu, 83 rodzaje z estaw ó w
P U S H F , 156 P U S H F D , 156
instru kcji, 179 R O L , 23, 159
Q q u a d w o r d , 10 Q W O R D , 42, 175
bez u ż y c ia flagi C F , 23, 24 24
R A D I X , 190
S A F E S E H , 191
R C L , 23, 156
S A H F , 160
R C R , 24, 157
S A L , 21, 160
R e a d F ile , 45
S A R , 22, 161
206 |
Asembler. Leksykon k eszonkowy
d w T h re a d Id , 88 h M o d , 88 id H o o k , 88 lp fn , 88 SF , 12 S G D T , 164 S h e ll_ N o tify Ic o n , 92 S H L , 21, 160 S H L D , 24, 164 S H R , 22, 161
S ID T , 164 S ig n Flag, 12 S IG N ? , 36 S IZ E S T R , 188 sko k, 29
S
przykładow y program, 62
nIn d e x , 94 Se tW in d o w sH o o k Ex , 88, 89
S I, 10
rotacja
R a d io B u tto n , 62
d w N e w L o n g , 94 h W n d , 94
S H R D , 24, 165
R O R , 24, 159
z u ż y ciem flagi C F , 23,
R
lp S tr in g , 59
S L D T , 165 słow o , 9 młodsze, 10 p o c z w ó rn e , 10 podwójne, 9 starsze, 10
S M S W , 166
p o d m ia n a p ro ce d u ry
Splashscreen, 89 p rz y k ła d o w y pro gram ,
p rz y k ła d o w e p ro g ra m y, 77
91 w y k o n a n ie , 90
tw orz enie, 72 T rac k B a r, 70
S S , 11 S S E , 13, 42, 110
po bieranie pozycji su w a k a , 71
instrukcje, 111
p r z y k ła d o w y p ro gram ,
SSE 2 , 113
U
obsługi okna, 74
U n h o o k W in d o w s H o o k E x , 89 U N I O N , 189 U n m a p V ie w O f F ile , 99 U N T I L , 37, 174 U N T I L C X Z , 174 uproszczone segmenty, 185
71
SSE 3 , 115
usta w ia n ie zakresu, 70
SSE 4 , 117
V
SSS E3 , 116
Tran slateM essage, 52
S T A C K , 187
T ra p F la g , 12
V E R R , 169
S ta c k Segment, 11
T ra y , 91
V E R W , 169
p r z y k ła d o w y p ro gram ,
stałe, 41
93
starsze słowo, 10 S T A R T U P , 187
T re e V ie w , 66 d o d a w a n ie elem en tów ,
S T C , 166
66
S T D , 166
p r z y k ła d o w y p ro gram ,
S T I, 167
67
stos, 13 S T O S , 33, 167
S T R U C T , 43, 188 stru k tu ry, 42, 188 S U B , 19, 168 S U B S T R , 188 su w a k , P atrz T rac k B a r S W O R D , 176 system y liczbo w e, 9 binarny, 9 szablony aplikacji D O S, 14
T T B M _ G E T P O S , 71
V irtual Interrupt Flag, 12 V irtu a l In te rru p t Pen d in g , 12 V M , 12
W
67 T T F _ P A R S E L I N K S , 76
W A I T , 169
T T I_ E R R O R , 74
w artość zm iennej, 39
T T I_ IN F O , 74
w a ru n k o w a ko n tro la
T T I_ N O N E , 74
p rz e p ły w u , 173
T T I _ W A R N IN G , 74
W H _ C A L L W N D P R O C , 87
T T M _ A D D T O O L , 73
W H _C A LLW N D PRO C RET,
T T M _ P O P , 76 T T M _ S E T M A X T IP W ID T H , T T M _ S E T T IT L E , 74 T T S _ B A L L O O N , 74
87 W H _ C B T , 87 W H _ D E B U G , 87 W H _ F O R E G R O U N D ID L E , 87
T T S _ C L O S E , 74
W H _ G E T M E S S A G E , 87
T V _ IN S E R T S T R U C T , 66
W H JO U R N A L P L A Y B A C K ,
h In se rtA fter, 66 tablica k o d ó w A S C II, 192
V irtu a l 8086 M o d e , 12
klikn ię teg o elem entu,
74
heksadecym alny, 9
V I P , 12
spra w d z a n ie
S T R , 167 S trT o Flo a t, 104
V IF , 12
hParent, 66 item , 67
87 W H _ JO U R N A L R E C O R D , 87
T B M _ S E T R A N G E M A X , 70
T V I_ F IR S T , 66
W H _ K E Y B O A R D , 87
T B M _ S E T R A N G E M IN , 70
T V I _ L A S T , 66
W H _ K E Y B O A R D _ L L , 87, 89
T B Y T E , 176
T V I_ R O O T , 67
W H _ M O U S E , 87
tekst sfo rm a to w a n y,
T V I_ S O R T , 67
W H _ M O U S E _ L L , 88
T V IT E M , 67
W H _ M S G F I L T E R , 88
T E S T , 168
T V M _ IN S E R T IT E M , 66
W H _ S H E L L , 88
T E X T E Q U , 177
T V N _ S E L C H A N G E D , 67
W H _ S Y S M S G F I L T E R , 88
T F , 12
tw o rz en ie
W H I L E , 36, 174, 183
P atrz R ic h E d it
T H I R D _ I P A D D R E S S , 78
bibliotek D L L , 97
T O O L IN F O , 73, 75, 76
fu nkcji, 27
d rz e w a , Patrz T re e V ie w
Too ltip , 71
m enu , 55
listy, P atrz L is tV ie w
d o sto so w yw a n ie w y g lą d u , 73 hiperłącza, 76
pro ced u r, 27 T Y P E D E F , 188
w id o k
w ie lo w ą tk o w o ś ć, 95 ko m u n ikacja, 96 p r z y k ła d o w y pro gram , 97
Skorowdz
| 207