Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
01516 009806 10446090 na godz. na dobę w sumie
Win32ASM. Asembler w Windows - książka
Win32ASM. Asembler w Windows - książka
Autor: Liczba stron: 376
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-022-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> asembler - programowanie
Porównaj ceny (książka, ebook, audiobook).

Przekonanie, że programowanie w asemblerze odeszło w przeszłość wraz z opartymi na interfejsie tekstowym systemami w rodzaju DOS i upowszechnieniem się wysokopoziomowych języków programowania takich jak Visual Basic, C++ czy Java, jest błędne. Całkiem spora grupa osób nadal używa asemblera w środowisku Windows. Jeśli chcesz do nich dołączyć, znalazłeś właściwą książkę.

Asembler daje programiście poczucie ogromnej wolności i pełnego panowania nad sprzętem. Dzięki tej książce nauczysz się programować w tym języku, poznasz również cały zestaw aplikacji, które programowanie to ułatwią. W tekście książki znajdziesz wiele przykładów kodu ilustrujących najważniejsze omawiane zagadnienia.

Książka przedstawia:

Jeszcze jedna metoda tworzenia programów w Windows, która może zafascynować osoby lubiące 'dłubanie w kodzie'? Dlaczego nie! Przeczytaj tę książkę, a sam będziesz mógł ocenić, czy asembler się zdewaluował.

Programowanie w Windows dla wtajemniczonych
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Win32ASM. Asembler w Windows Autor: Adam B³aszczyk ISBN: 83-7361-022-7 Format: B5, stron: 360 Przekonanie, ¿e programowanie w asemblerze odesz³o w przesz³oġæ wraz z opartymi na interfejsie tekstowym systemami w rodzaju DOS i upowszechnieniem siê wysokopoziomowych jêzyków programowania takich jak Visual Basic, C++ czy Java, jest b³êdne. Ca³kiem spora grupa osób nadal u¿ywa asemblera w ġrodowisku Windows. Jeġli chcesz do nich do³¹czyæ, znalaz³eġ w³aġciw¹ ksi¹¿kê. Asembler daje programiġcie poczucie ogromnej wolnoġci i pe³nego panowania nad sprzêtem. Dziêki tej ksi¹¿ce nauczysz siê programowaæ w tym jêzyku, poznasz równie¿ ca³y zestaw aplikacji, które programowanie to u³atwi¹. W tekġcie ksi¹¿ki znajdziesz wiele przyk³adów kodu ilustruj¹cych najwa¿niejsze omawiane zagadnienia. Ksi¹¿ka przedstawia: • Podstawowe informacje zwi¹zane z asemblerem: systemy kodowania, zapis liczb i znaków • Rejestry i pamiêæ maszyny z punktu widzenia programisty asemblera, adresowanie • Instrukcje asemblera i listê rozkazów procesora • Programowanie z u¿yciem MASM — Makro Asemblera • U¿ycie programu NMAKE i tworzenie plików Makefile • Programowanie w Windows: WinAPI • Biblioteki DLL • Technologie COM i OLE • Zasoby programów Windows Jeszcze jedna metoda tworzenia programów w Windows, która mo¿e zafascynowaæ osoby lubi¹ce „d³ubanie w kodzie”? Dlaczego nie! Przeczytaj tê ksi¹¿kê, a sam bêdziesz móg³ oceniæ, czy asembler siê zdewaluowa³. Programowanie w Windows dla wtajemniczonych. • Poznaj jêzyk asembler dla procesorów Intel i kompatybilnych • Naucz siê u¿ywaæ Windows API z poziomu asemblera • Poznaj narzêdzia u³atwiaj¹ce programowanie Spis treści Od Autora........................................................................................... 9 Wstęp .............................................................................................. 11 Rozdział 1. Zanim zaczniemy na poważnie........................................................... 15 Platform SDK, MSDN ...................................................S...................................................S15 Pakiet Masm32...................................................S...................................................S............16 Narzędziownia...................................................S...................................................S............ .17 Rozdział 2. Asembler kontra Windows................................................................. 19 Krótko o różnych rodzinach okienek ...................................................S.............................19 Gdzie się podziały przerwania?...................................................S......................................23 Windows API ...................................................S...................................................S..............24 Windows z perspektywy asemblera ...................................................S...............................27 Rozdział 3. Co trzeba wiedzieć? .......................................................................... 31 Systemy liczbowe i nie tylko ...................................................S.........................................31 Informacja i system dwójkowy (binarny) ...................................................S................32 Potęgi liczby 2...................................................S...................................................S.......... Jednostki objętości danych...................................................S.............................................37 Kodowanie liczb...................................................S...................................................S..........37 ...33 NKB (naturalny kod binarny) ...................................................S..................................40 Kod dwójkowo-dziesiętny BCD (Binary Coded Decimal) ........................................41 Reprezentacja liczb ujemnych ...................................................S.................................42 Reprezentacja stałoprzecinkowa ...................................................S..............................45 Reprezentacja zmiennoprzecinkowa...................................................S........................45 Problemy związane z błędami obliczeń ...................................................S...................46 Kodowanie znaków ...................................................S...................................................S.....47 ASCII (ISO 646) ...................................................S...................................................S...47 ASCII rozszerzone (ASCII Extended, HI-ASCII)...................................................S...47 Polskie znaki diaktryczne w różnych systemach kodowania znaków ........................54 ASCIIZ (ASCII Zero) ...................................................S..............................................55 Systemy kodowania MBCS (Multibyte Character Set) i DBCS (Double Character Set) ...................................................S.........................................55 Unicode ...................................................S...................................................S.................56 6 Win32ASM. Asembler w Windows Rozdział 4. Asembler .......................................................................................... 63 Z czego składa się typowy program? ...................................................S.............................63 Program wykonywalny — od środka...................................................S.............................70 Gdzie umieszczać kod i dane? ...................................................S.......................................73 Zamiana tekstu programu na kod wykonywalny ...................................................S...........74 Procesory 80x86 — krótkie wprowadzenie ...................................................S...................77 Pamięć — model płaski...................................................S..................................................77 Rejestry.............................................S...................................................S....................... .......80 Rejestry tzw. ogólnego przeznaczenia ...................................................S.....................80 Rejestr EIP ...................................................S...................................................S............82 Rejestry segmentowe ...................................................S...............................................82 Rejestr eflags...................................................S...................................................S.........83 Moment uruchomienia programu...................................................S...................................86 Dostęp do pamięci i sposoby jej adresowania...................................................S................87 Adresowanie bezpośrednie ...................................................S......................................87 Adresowanie pośrednie ...................................................S............................................88 Adresowanie a wielkość danych ...................................................S....................................89 Adresowanie a rejestry segmentowe ...................................................S..............................90 Adresowanie łańcuchów ...................................................S................................................91 Instrukcje 32- i 16-bitowe ...................................................S..............................................92 Stos ...................................................S...................................................S..................... Wywoływanie procedur ...................................................S.................................................94 Przekazywanie parametrów przez rejestry...................................................S...............95 Przekazywanie parametrów przez stos ...................................................S....................95 Deklarowanie zmiennych...................................................S...............................................95 Zmienne, wskaźniki — adresowanie ...................................................S.............................97 Najważniejsze instrukcje programu ...................................................S...............................99 .........93 Instrukcja mov ...................................................S...................................................S......99 Para instrukcji push/pop...................................................S.........................................100 Rozkazy dotyczące operacji na łańcuchach ...................................................S...........100 Rozkazy arytmetyczne ...................................................S...........................................101 Etykiety, pętle, skoki...................................................S..............................................102 Rozkazy związane z procedurami...................................................S..........................103 Rozkazy logiczne ...................................................S...................................................S105 Rozkazy przesunięć ...................................................S...............................................106 Lista rozkazów IA-32 — opis skrócony ...................................................S......................108 Instrukcje transferu danych...................................................S....................................108 Instrukcje arytmetyczne ...................................................S.........................................108 Instrukcje porównujące i testujące ustawienie danego bitu ......................................108 Instrukcje arytmetyczne (kod BCD) ...................................................S......................109 Instrukcje logiczne ...................................................S.................................................109 Instrukcje przesunięć ...................................................S.............................................109 Instrukcje obrotów ...................................................S.................................................109 Intrukcje operujące na bitach ...................................................S.................................109 Intrukcje przenoszące kontrolę do innego miejsca w programie..............................109 Intrukcje operujące na łańcuchach...................................................S.........................110 Instrukcje dotyczące rejestru znaczników ...................................................S.............110 Instrukcje dotyczące segmentów ...................................................S...........................110 Instrukcje różne...................................................S...................................................S...110 Rozdział 5. Macro Assembler............................................................................ 131 MASM — Macro Assembler ...................................................S.......................................131 Jak powstają makra? ...................................................S..............................................133 Spis treści 7 Najważniejsze informacje o makrach ...................................................S..........................134 Znaki specjalne ...................................................S...................................................S...134 Zapis liczb ...................................................S...................................................S...........134 Przedefiniowane symbole i funkcje ...................................................S.......................134 Operatory ...................................................S...................................................S............136 Makra związane z procesem asemblacji ...................................................S................138 Operatory związane z programowaniem ...................................................S...............147 Tworzenie własnych makr ...................................................S.....................................155 Plik macro.inc — przykłady użytecznych makr ...................................................S....155 Słowa zarezerwowane w języku Macro Assembler ...................................................S.....169 Rozdział 6. Pisanie plików makefile — program NMAKE ................................... 175 Zawartość pliku projektowego ...................................................S.....................................175 Bloki komentarzy...................................................S...................................................S176 Bloki opisowe ...................................................S...................................................S.....176 Pora na praktykę — budowanie własnych projektów...................................................S..178 Uniwersalny makefile (plik makefile.mak)...................................................S..................179 Rozdział 7. Parametry wywołania programów MASM, LINK, RC i NMAKE .......... 185 Parametry wywołania ML.EXE ...................................................S...................................185 Parametry wywołania LINK.EXE...................................................S................................187 Parametry wywołania RC.EXE...................................................S....................................188 Parametry wywołania NMAKE ...................................................S...................................189 Rozdział 8. Podstawy programowania Windows ................................................ 191 .192 Pojęcie okna ...................................................S...................................................S............. Komunikaty okna ...................................................S...................................................S......193 Szkielet aplikacji dialogowej ...................................................S.......................................194 Konsola............................................S...................................................S......................... Podsumowanie ...................................................S...................................................S..........197 ....195 Rozdział 9. Jak korzystać z dokumentacji SDK? ............................................... 209 Notacja węgierska ...................................................S...................................................S.....209 Funkcje Win API...................................................S...................................................S.......209 Parametry funkcji Win API...................................................S..........................................213 Funkcje Unicode kontra funkcje ANSI...................................................S........................215 Rozdział 10. Win32ASM — graficzny interfejs użytkownika GUI .......................... 223 Rola interfejsu użytkownika ...................................................S..................................223 Elementy interfejsu ...................................................S................................................225 Zmiany wprowadzone przez Windows XP...................................................S............226 Wszystko o oknach ...................................................S................................................226 Menu ...................................................S...................................................S...................262 Rozdział 11. Zasoby programów Windows ........................................................... 269 Skrypty zasobów w plikach .rc i .res...................................................S............................269 Binaria, czyli zasoby w plikach wykonywalnych ...................................................S........272 Dostęp do zasobów z poziomu programu ...................................................S..............273 Jeszcze raz o narzędziach...................................................S.......................................273 Tworzenie plików z zasobami ...................................................S...............................274 Piszemy własny edytor tekstu ...................................................S................................275 Inne rodzaje zasobów...................................................S.............................................287 Manifest w Windows XP ...................................................S.......................................288 Zakładka Wersja — informacje o programie...................................................S.........291 8 Win32ASM. Asembler w Windows Rozdział 12. WinAPI — najczęściej wykorzystywane funkcje............................... 301 Wersja systemu ...................................................S...................................................S.........301 Odczyt parametrów systemu ...................................................S........................................301 Dostęp do katalogów systemowych ...................................................S.............................302 Powiadomienia o zmianach (stanu systemu, jego ustawień lub stanu okna itp.)............303 Dostęp do linii poleceń programu ...................................................S................................303 Operacje na liczbach i łańcuchach ...................................................S...............................305 Pliki w systemie Windows ...................................................S...........................................305 Dostęp do Rejestru ...................................................S...................................................S....306 Liczniki czasowe ...................................................S...................................................S.......308 Rozdział 13. Zagadnienia wcale niezaawansowane............................................. 309 Biblioteki DLL ...................................................S...................................................S..........309 Haki w systemie Windows...................................................S...........................................312 Internet ...................................................S...................................................S................. .....313 Uaktualnianie wersji programu przez internet ...................................................S.......313 Piszemy „konia trojańskiego”, czyli oprogramowanie typu serwer-klient...............317 Rozdział 14. Technologia COM i kontrolki OLE .................................................... 331 Obecność na pasku zadań — interfejs ITaskbarList ...................................................S....332 Plik skrótu — interfejs IShellLink ...................................................S...............................338 Najmniejsza przeglądarka świata — interfejs IWebBrowser2 .......................................340 Rozdział 15. Materiały pomocnicze ..................................................................... 351 Dokumentacja i podręczniki...................................................S.........................................351 Najważniejsze strony domowe poświęcone Win32ASM ...............................................351 Opracowania i literatura dotyczące Win32ASM, WinAPI i tematyki pokrewnej ..........352 Asemblery, kompilatory, programy łączące ...................................................S................352 Inne...................................................S...................................................S..................... Wybrane strony z narzędziami ...................................................S.....................................353 .......353 Rozdział 16. Programy źródłowe.......................................................................... 355 Skorowidz....................................................................................... 361 Rozdział 5. Macro Assembler Niniejsza część książki poświęcona jest całkowicie przybliżeniu podstawowych i najważ- niejszych z punktu widzenia programisty informacji cna temat języka Macro Assembler. MASM — Macro Assembler Macro Assembler to język całkowicie typowy i nic dziwnego, że sterują nim pewne, odgórnie ustalone zasady. Przede wszystkim jest to zwykły asembler, w którym można tworzyć programy w klasyczny sposób — pisząc kolejne instrukcje w osobnych linij- kach. Prawdziwa siła Macro Assemblera tak naprawdę tkwi jednak w makrach. Czym są i jak używać ich skutecznie w swoich programach opowiemy za chwilę, zastanówmy się jednak najpierw, co jest największą bolączką programistów piszących w języku asembler. Odpowiedź na to pytanie znalazła się już w poprzednim podrozdziale — chodzi o chaos widoczny w większości programów pisanych w tym języku. Jeśli masz już jakieś doświadczenia jako programista pracujący w asemblerze, zapewne znasz doskonale uczucie towarzyszące przeglądaniu programów źródłowych, szczególnie tych pochodzących z przeszłości lub pisanych przez innych programistów. Sporo czasu zaj- muje zwykle zrozumienie sedna sprawy i to tutaj właśnie Macro Assembler ma okazję pokazać swoje największe zalety, a już szczególnie swój zbawienny wpływ na przej- rzystość kodu. Weźmy na przykład bardzo często stosowaną w asemblercze konstrukcję: EORGCZ LGGCZA EORGCZ LGGCZA  EORGCZ LGGCZA  132 Win32ASM. Asembler w Windows GCZA  LORFCNGL GCZA  LORFCNGL GCZA  LORFCNGL  FCNGL która pozwala na wykonywanie różnego kodu w zależności od określonych warunków. W przypadku jednego rozgałęzienia nie ma problemu, natomiast komplikacje są od razu widoczne przy większej liczbie warunków. Macro Assembler świetnie rozwiązuje tę kwestię, pozwalając na uproszczenie tego typu konstrukcji za pomocą bloku +(, któ- ry dla powyższego przykładu moglibyśmy zastosować wc następujący sposób: +(GCZ   .5 +(GCZ   .5 +(GCZ   0 Od razu rzucają się w oczy trzy rzeczy. Po pierwsze, zapis jest o wiele krótszy; po drugie, nie musimy korzystać z uciążliwych etykiet; po trzecie — składnia bardzo przy- pomina zapis języka wyższego poziomu. I tak jest w istocie. Istnieje nawet opinia, iż programowanie w Macro Asemblerze w niedużym stopniu różni się od programowania w języku C lub podobnym. Chyba już wiesz, jaką potęgę skupia w sobie ten niepozorny język? Tak, tak… Składnia języka wysokiego poziomu, instrukcje asemblera, bezpośredni dostęp do pa- mięci, bezpośredni dostęp do funkcji Win API, możliwość ingerencji w kod programu na najniższym poziomie i wiele innych czynników, włączając w to jeden drobny, acz chyba najbardziej lubiany przez wszystkich koderów szczegół — programy wynikowe są o wiele krótsze niż pisane w językach wysokiego poziomu. Odpowiednio zdefinio- wany zestaw makr może także służyć do wykrywania błędów w programie (ułatwione śledzenie programu, dzięki informacjom na temat jegoc wykonywania). Poznaliśmy już konstrukcję makra +(. Jeszcze raz popatrzmy, jak wygląda ono w prak- tyce, biorąc za przykład wykonanie pewnego typowego kodu w zależności od jakiegoś warunku. Na szybko wymyślmy sytuację, w której chcemy wyświetlić na ekranie komu- nikat o błędzie, jeśli wynik zwrócony przez funkcję octwierającą plik jest niepoprawny. Rozdział 5. ♦ Macro Assembler 133 I tak, zapisany w typowy sposób kod miałby postać: KPXQMG1RGP(KNG; w tym przykładzie parametry nas nie interesują EORGCZ; -1 oznacza tutaj kod błędu LG$NCF; jeśli błąd — skok do etykiety Blad ; dalsza część programu, wykonująca się ; / jeśli nie ma błędu $NCF ; obsługa błędu Z kolei w języku MASM taka operacja może zostać zastąpciona kodem: KPXQMG1RGP(KNG; w tym przykładzie parametry nas nie interesują +(GCZ; -1 oznacza tutaj kod błędu ; dalsza część programu, wykonująca się ; / jeśli nie ma błędu  0 +( ; obsługa błędu Jak powstają makra? Makra w MASM to bloki tekstu, które mogą być dołączane w dowolnym momencie kodu. Definicja makra nadaje mu nazwę i opisuje, co dane makro ma robić — z prak- tycznego punktu widzenia makro ma ogólną postać typu: 0CYC/# 41CTIWOGPV[ ; tutaj umieść treść makra 0 / Dla przykładu makro, którego celem jest wstawienie do kodu funkcji tzw. epilogu zwra- cającego daną wartość w rejestrze GCZ, może mieć postać: 4 6740/# 41EQAYTCECO[ OQXGCZEQAYTCECO[ TGV 0 / Wywołanie zdefiniowanego makra wygląda następująco (wc przykładzie zwracamy ): 4 6740 Umieszczenie powyższego kodu w programie powoduje, że analizujący kod asembler po napotkaniu tego wyrażenia „rozwinie” je w następucjący kod: OQXGCZEQAYTCECO[ TGV a za wartość EQAYTCECO[ zostanie podstawiona wartość , dając finalną wersję kodu: OQXGCZ TGV Powyższy przykład przewija się w wielu programach źródłowych Win32ASM, jakie można znaleźć w internecie. 134 Win32ASM. Asembler w Windows Najważniejsze informacje o makrach Pisanie makr oraz wykorzystanie możliwości języka Macro Assembler są związane z koniecznością zapoznania się z najważniejszymi makrami, symbolami oraz opera- torami używanymi do zapisu wyrażeń różnego typu. Zaczniemy od znaków o specjal- nym znaczeniu. Znaki specjalne  !  =? — oznacza aktualną (tj. w danym momencie procesu asemcblacji) wartość licznika określającego adres bieżącej instrukcji; w praktyce można traktować to jako symboliczny zapis adresu miejsca, w którym symbol ten wystąpił. — symbol używany podczas deklaracji danych; jego zasctosowanie informuje asembler, że zmienna zadeklarowana przy użyciu symbolu ! nie ma wartości początkowej. — symbol używany przy deklaracji etykiet oraz w nazcwach przedefiniowanych symboli (opisanych w następnym podrozdziale). — symbole używane przy deklaracji zmiennych lub stacłych tekstowych oraz podczas łączenia wielu parametrów w jeden ciąg (traktowany jako jeden parametr). — symbole używane przy odwoływaniu się do komórek pacmięci. Zapis liczb .KEDCF — reprezentuje .KEDú dziesiętną; z reguły nie trzeba dodawać przyrostkac F, chyba że zostanie zmieniony domyślny system liczbowcy (używany przez asembler w trakcie asemblacji). .KEDCJ — reprezentuje .KEDú szesnastkową (heksadecymalną); przedrostek  dodaje się w przypadku liczb rozpoczynających się od cyfr cszesnastkowych #, $, , , lub (. .KEDCD — reprezentuje .KEDú dwójkową (binarną). Przedefiniowane symbole i funkcje CVG — reprezentuje aktualną datę. Rozdział 5. ♦ Macro Assembler 135 6KOG — reprezentuje aktualny czas. 8GTUKQP — reprezentuje wersję programu Macro Assembler. (KNG WT — reprezentuje nazwę pliku poddawanego asemblacji. (KNG0COG — reprezentuje pełną nazwę pliku poddawanego asemblcacji. EQFG — dostarcza informacji o segmencie kodu. FCVC — dostarcza informacji o segmencie danych. UVCEM — dostarcza informacji o segmencie stosu. WT5GI — dostarcza informacji o bieżącym (tzn. tym, w którym acktualnie użyty jest symbol WT5GI) segmencie. Poniższy przykład pokazuje, w jaki sposób można wykorzystać opisane symbole do wy- świetlania informacji diagnostycznych w trakcie kompilowania programu. archiwum: Win32ASMSrc!Symbole!Symbole.asm ; =========================================================== ; Opis : Demonstracja wykorzystania różnych ; funkcji wbudowanych w Macro Assembkler ; =========================================================== ; instrukcje 586 /1 .(.#656 #..; płaski model pamięci ; konwencja STDCALL EQFG; sekcja kodu 5VCTV; początek programu TGV; powrót z procedury  *1 CVC CVG  CVG  *1 CU 6KOG  6KOG  *19GTULC 8GTUKQP  8GTUKQP  *10CYC (KNG WT  (KNG WT  *10CYCRGđPC (KNG0COG  (KNG0COG  *15GIOGPVMQFW EQFG  EQFG  *15GIOGPVFCP[EJ FCVC  FCVC  *15GIOGPVUVQUW UVCEM  UVCEM  *15GIOGPVCMVWCNP[ WT5GI  WT5GI 0 5VCTV; tu zaczyna się program 136 Win32ASM. Asembler w Windows A oto rezultat przykładowej asemblacji programu. archiwum: Win32ASMSrc!Symbole!Symbole.txt +PHQ ĦEKGľMCFQ/#5/E /CUO 6YQTúRTQLGMV5[ODQNG 9GTULC4 . #5 RNKM : DGCUQDÎY #UUGODNKPI5[ODQNGCUO CVC CVG  CU 6KOG  9GTULC 8GTUKQP  0CYC (KNG WT 5[ODQNGCUO 0CYCRGđPC (KNG0COG 5;/$1. 5GIOGPVMQFW EQFG A6 :6 5GIOGPVFCP[EJ FCVC (.#6 5GIOGPVUVQUW UVCEM (.#6 5GIOGPVCMVWCNP[ WT5GI A6 :6 #D[MQPV[PWQYCèPCEKħPKLFQYQNP[MNCYKU Operatory Operatory matematyczne 9[TCľGPKG 9[TCľGPKG — zwraca sumę obu 9[TCľGē. 9[TCľGPKGō9[TCľGPKG — zwraca różnicę obu 9[TCľGē. 9[TCľGPKG∗9[TCľGPKG — zwraca iloczyn obu 9[TCľGē. 9[TCľGPKG9[TCľGPKG — zwraca iloraz obu 9[TCľGē. Ō9[TCľGPKG — zwraca 9[TCľGPKG ze znakiem zmienionym na przeciwny. 9[TCľGPKG/1 9[TCľGPKG — zwraca resztę z dzielenia (funkcja /1 , funkcja /1 7.1) 9[TCľGPKC przez 9[TCľGPKG. Operatory logiczne 9[TCľGPKG#0 9[TCľGPKG — zwraca iloczyn logiczny (funkcja #0 ) obu 9[TCľGē. 9[TCľGPKG149[TCľGPKG — zwraca sumę logiczną (funkcja 14) obu 9[TCľGē. Rozdział 5. ♦ Macro Assembler 137 0169[TCľGPKG — zwraca negację logiczną (funkcja 016) 9[TCľGPKC. 9[TCľGPKG:149[TCľGPKG — zwraca sumę modulo (funkcja :14, inaczej : .75+8 14) obu 9[TCľGē. Operatory przesunięć 9[TCľGPKG5*..KEDC — zwraca wartość powstałą z przesunięcia w lewo warctości 9[TCľGPKC zadaną .KEDú razy. 9[TCľGPKG5*4.KEDC — zwraca wartość powstałą z przesunięcia w prawo wacrtości 9[TCľGPKC zadaną .KEDú razy. Operatory porównań 9[TCľGPKG 39[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG jest równe 9[TCľGPKW; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). 9[TCľGPKG0 9[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG nie jest równe 9[TCľGPKW; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). 9[TCľGPKG)69[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG jest większe od 9[TCľGPKC; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). 9[TCľGPKG.69[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG jest mniejsze od 9[TCľGPKC; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). 9[TCľGPKG) 9[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG jest większe lub równe 9[TCľGPKW; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). 9[TCľGPKG. 9[TCľGPKG — zwraca wartość VTWG (o wartości ), jeśli 9[TCľGPKG jest mniejsze lub równe 9[TCľGPKW; w przeciwnym przypadku zwraca wartość HCNUG (o wartości ). Operatory inne 5GIOGPV9[TCľGPKG — powoduje, że 9[TCľGPKG odnosi się do innego 5GIOGPVW niż domyślny; 5GIOGPV może być nazwą rejestru, segmentu, grupy segmentów lucb wyrażeniem stałym. 9[TCľGPKG2QNG==2QNG??ŗ — zwraca adres będący sumą adresu 9[TCľGPKC i adresu 2QNC w strukturze lub unii; w ten sposób można odwoływać się także do strucktur zagnieżdżonych np. 9[TCľGPKG2QNG2QNG+PPG; 9[TCľGPKG może być nazwą rejestru lub zmiennej. 138 Win32ASM. Asembler w Windows Œ6GMUVŒ — powoduje, że 6GMUV traktowany jest jako łańcuch tekstowy. 6GMUV — powoduje, że 6GMUV traktowany jest jako łańcuch tekstowy. 9[TCľGPKG — powoduje, że 9[TCľGPKG będące parametrem przekazywanym do makra będzie traktowane jako łańcuch tekstowy. 9[TCľGPKG — powoduje zastąpienie łańcucha 9[TCľGPKG wartością 9[TCľGPKC. # 49[TCľGPKG — zwraca adres 9[TCľGPKC; najczęściej dotyczy zmiennych lokalnych. 1((5 69[TCľGPKG — zwraca adres (offset, przesunięcie) 9[TCľGPKC; najczęściej dotyczy zmiennych globalnych. 5+ 9[TCľGPKG — zwraca rozmiar (w bajtach) 9[TCľGPKC. Makra związane z procesem asemblacji Przyjrzymy się teraz bliżej wszystkim ważniejszym poleceniom, jakie można wykorzy- stać w języku Macro Asembler. Na końcu tego rozdziału przedstawię plik OCMTQKPE, w którym zawarłem najczęściej używane makra, z powodzeniem możesz ich użyć w swoich programach, bez konieczności pisania od „zecra”. Makra o charakterze ogólnym Definicja rodzaju procesora  — pozwala wykorzystywać instrukcje procesora 8086 i kocprocesora 8087; ustawienie domyślne.  — pozwala wykorzystywać instrukcje koprocesora 8087; usctawienie domyślne.  — pozwala wykorzystywać instrukcje procesora 80186 i kocprocesora 8087.  — pozwala wykorzystywać instrukcje procesora 80286 i kocprocesora 80287; nie pozwala na skorzystanie z instrukcji uprzywilejowanych (dotyczy trybu chronionego). 2 — pozwala wykorzystywać instrukcje procesora 80286 i kocprocesora 80287; pozwala na użycie instrukcji uprzywilejowanych (dotcyczy trybu chronionego). Rozdział 5. ♦ Macro Assembler 139  — pozwala wykorzystywać instrukcje koprocesora 80287.  — pozwala wykorzystywać instrukcje procesora 80386 i kocprocesora 80387; nie pozwala na skorzystanie z instrukcji uprzywilejowanych (dotyczy trybu chronionego). 2 — pozwala wykorzystywać instrukcje procesora 80386 i kocprocesora 80387; pozwala na użycie instrukcji uprzywilejowanych (dotcyczy trybu chronionego).  — pozwala wykorzystywać instrukcje koprocesora 80387.  — pozwala wykorzystywać instrukcje procesora 80486 (koprcocesor jest wbudowany w procesor); nie pozwala skorzystanie z incstrukcji uprzywilejowanych (dotyczy trybu chronionego). 2 — pozwala wykorzystywać instrukcje procesora 80486 (koprcocesor jest wbudowany w procesor); pozwala na użycie instrukcji uprzywilejowanych (dotyczy trybu chronionego). 01 — nie pozwala wykorzystywać instrukcji koprocesora. Komentarze 1// 065GRCTCVQT==6GMUV?? ==6GMUV?? ==6GMUV??5GRCTCVQT — powoduje, że pierwsza linia (z wyrażeniem 1// 06 5GRCTCVQT ==6GMUV??) oraz wszystkie inne, w których występuje 5GRCTCVQT będą traktowane przez asembler jako komentarz. 6GMUV — powoduje, że 6GMUV traktowany będzie jako komentarz. 6GMUV — powoduje, że 6GMUV traktowany będzie jako komentarz tylko w definicjic makra i nie będzie widoczny na listingu (po rozwinicęciu makra). Listingi 6+6. 6[VWđ — definiuje 6[VWđ listingu programu. 57$6+6. 2QFV[VWđ lub 57$66.2QFV[VWđ — definiuje 2QFV[VWđ listingu. 140 Win32ASM. Asembler w Windows Wyświetlanie informacji (w trakcie asemblacji) *1-QOWPKMCV — powoduje wyświetlenie -QOWPKMCVW w trakcie asemblacji.  *1-QOWPKMCV — powoduje wyświetlenie -QOWPKMCVW w trakcie asemblacji; znak  powoduje, że wszystkie makra tekstowe użyte w -QOWPKMCEKG zostaną „rozwinięte”. 176-QOWPKMCV — powoduje wyświetlenie -QOWPKMCVW w trakcie asemblacji. Dołączanie kodu źródłowego umieszczonego w innym plikru +0 .7 0CYC2NKMW — powoduje, że w miejscu wystąpienia zapisu +0 .7 0CYC2NKMW zostanie dołączony tekst zapisany w pliku 0CYC2NKMW; 0CYC2NKMW powinna być objęta parą nawiasów ostrych … , jeśli w nazwie występuje którykolwiek ze znaków: (lewy ukośnik),  (średnik), (większy niż zero, nawias ostry zamykający),  (mniejszy niż zero, nawias ostry otwierający), (apostrof),  (znak cudzysłowia w standardzie ASCII; dokładniej: znak cala). Dołączanie zewnętrznej biblioteki w trakcie budowanira programu +0 .7 .+$0CYC$KDNKQVGMK — powoduje, że w trakcie łączenia (budowania) pliku wycnikowego program łączący dołączy bibliotekę zawartą w pliku 0CYC$KDNKQVGMK; 0CYC$KDNKQVGMK powinna być objęta parą nawiasów ostrych … , jeśli w nazwie występuje którykolwiek ze znaków: (lewy ukośnik),  (średnik), (większy niż zero, nawias ostry zamykający),  (mniejszy niż zero, nawias ostry otwierający), (apostrof),  (znak cudzysłowia w standardzie ASCII; dokładniej: znak cala). Przerywanie procesu asemblacji Konstrukcja .ERR  44==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW; -QOWPKMCV powinien być objęty parą nawiasów ostrych … . Konstrukcja .ERR2  44==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW; -QOWPKMCV powinien być objęty parą nawiasów ostrych … ; w przeciwieństwie do  44, błąd generowany będzie przy każdym przebiegu asemblera (opcja 126+105 6+( musi być równa wartości 647 ). Rozdział 5. ♦ Macro Assembler 141 Konstrukcja .ERRB  44$ NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV jest pusty; NGOGPV i -QOWPKMCV muszą być objęte parą nawiasów ostrych … . Konstrukcja .ERRNB  440$ NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV nie jest pusty; NGOGPV i -QOWPKMCV muszą być objęte parą nawiasów ostrych … . Konstrukcja .ERRDEF  44 (0CYC==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli 0CYC była już wcześniej zdefiniowana jako zmienna, etykieta lub symbol; -QOWPKMCV powinien być objęty parą nawiasów ostrych … . Konstrukcja .ERRNDEF  440 (0CYC==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli 0CYC nie była wcześniej zdefiniowana jako zmienna, etykieta lub symbol; -QOWPKMCV powinien być objęty parą nawiasów ostrych … . Konstrukcja .ERRDIF  44 +( NGOGPV NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV nie jest identyczny z NGOGPVGO; NGOGPV i NGOGPV muszą być objęte parą nawiasów ostrych … ; małe i wielkie litery są rozróżniane podczas operacji porównania. Konstrukcja .ERRDIFI  44 +(+ NGOGPV NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV nie jest identyczny z NGOGPVGO; NGOGPV i NGOGPV muszą być objęte parą nawiasów ostrych … ; małe i wielkie litery nie są rozróżniane podczas operacji porównania. Konstrukcja .ERRIDN  44+ 0 NGOGPV NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV jest identyczny z NGOGPVGO; NGOGPV 142 Win32ASM. Asembler w Windows i NGOGPV muszą być objęte parą nawiasów ostrych … ; małe i wielkie litery są rozróżniane podczas operacji porównania. Konstrukcja .ERRIDNI  44+ 0+ NGOGPV NGOGPV==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli NGOGPV jest identyczny z NGOGPVGO; NGOGPV i NGOGPV muszą być objęte parą nawiasów ostrych … ; małe i wielkie litery nie są rozróżniane podczas operacji porównania. Konstrukcja .ERRE  44 9[TCľGPKG==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli 9[TCľGPKG zwraca wartość (#.5 ; -QOWPKMCV musi być objęty parą nawiasów ostrych … . Konstrukcja .ERRNZ  440 9[TCľGPKG==-QOWPKMCV?? — powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie -QOWPKMCVW, jeśli 9[TCľGPKG zwraca wartość 647 ; -QOWPKMCV musi być objęty parą nawiasów ostrych … . Sterowanie przebiegiem asemblacji Etykiety i skoki )161 V[MKGVC — powoduje, że kolejną przetwarzaną przez asembler lcinią będzie linia, w której umieszczono zapis  V[MKGVC (tj. przed etykietą zawsze występuje dwukropek); makroinstrukcja )161 może być wykorzystywana tylko i wyłącznie wewnątrz bloków: /# 41, (14, (14 , 4 2 #6, 9*+. .  V[MKGVC — definiuje V[MKGVú; do V[MKGV[ można odwoływać się w innych miejscach programu za pomocą konstrukcji )161 V[MKGVC. Pętle FOR i IRP (142CTCOGVT==4 3^ QO[ħNPC??ĐCēEWEJ==ĐCēEWEJ??==ŗ??==ĐCēEWEJ0?? 1RGTCELC 0 / lub równoważne: +422CTCOGVT==4 3^ QO[ħNPC??ĐCēEWEJ==ĐCēEWEJ??==ŗ??==ĐCēEWEJ0?? 1RGTCELC 0 / gdzie: Rozdział 5. ♦ Macro Assembler 143 (14NWD+42 — określają początek pętli. 2CTCOGVT==4 3^ QO[ħNPC?? — oznacza 2CTCOGVT, któremu można przypisać wartość QO[ħNPæ, ĐCēEWEJ==ĐCēEWEJ??==ŗ??==ĐCēEWEJ0?? — oznaczają kolejne ĐCēEWEJ[, na których będzie wykonana zadana 1RGTCELC w kolejnych obiegach pętli. 0 / — oznacza koniec bloku. Pętle FORC i IRPC (14 2CTCOGVTĐCēEWEJ 1RGTCELC 0 / lub równoważne: +42 2CTCOGVTĐCēEWEJ 1RGTCELC 0 / gdzie: (14 NWD+42 — określają początek pętli. 2CTCOGVTĐCēEWEJ 1RGTCELC — oznaczają 2CTCOGVT, któremu będzie przypisana kolejna litera z ĐCēEWEJC; na każdej z liter będzie wykonana zadana 1RGTCELC. 0 / — oznacza koniec bloku. Pętla REPEAT i REPT 4 2 #6.KEDC -QF 0 / lub równoważne: 4 26.KEDC -QF 0 / gdzie: 4 2 #6.KEDCNWD4 26.KEDC — określają początek pętli oraz .KEDú powtórzeń generowanego -QFW. -QF — określa -QF powtarzany zadaną .KEDú razy. 0 / — oznacza koniec bloku. 144 Win32ASM. Asembler w Windows Pętla WHILE 9*+. 9[TCľGPKG 1RGTCELC 0 / gdzie: 9*+. 9[TCľGPKG — określają początek pętli, w której -QF będzie przetwarzany tak długo, jak długo 9[TCľGPKG będzie zwracało wartość prawdziwą. -QF — określa -QF asemblowany (w kółko) tak długo, jak długo 9[TCľGPKG będzie zwracało wartość prawdziwą. 0 / — oznacza koniec bloku. Asemblacja warunkowa Asemblacja warunkowa pozwala na asemblację wybranych fragmentów kodu w zależ- ności od pewnych parametrów. Konstrukcja IF +(9CTWPGM 9[TCľGPKG == .5 ZZZZ9CTWPGM 9[TCľGPKG?? ŗ == .5 ZZZZ9CTWPGM0 9[TCľGPKG0?? == .5 9[TCľGPKG+PPG?? 0 +( gdzie: +(9CTWPGM 9[TCľGPKG — oznacza początek konstrukcji — 9[TCľGPKG zostanie poddane asemblacji po wystąpieniu określonego 9CTWPMW. == .5 ZZZZ9CTWPGM 9[TCľGPKG?? ŗ == .5 ZZZZ9CTWPGM0 9[TCľGPKG0?? — oznacza kolejne bloki (9[TCľGPKG, 9[TCľGPKG, ŗ, 9[TCľGPKG0) wykonywane, jeśli spełnione są odpowiednio: .5 ZZZZ 9CTWPGM, .5 ZZZZ 9CTWPGM, ŗ, .5 ZZZZ 9CTWPGM0, gdzie .5 ZZZZ może przyjmować wartości:   .5 +( — jeśli… (uproszczona wersja zapisu .5 +(), .5 +($ — jeśli jest puste…, Rozdział 5. ♦ Macro Assembler 145         .5 +( ( — jeśli jest zdefiniowane…, .5 +( +( — jeśli następne wyrażenie jest inne (małe i wielkice litery są rozróżniane)…, .5 +( +(+ — jeśli następne wyrażenie jest inne (małe i wielkice litery nie są rozróżniane)…, .5 +( — jeśli jest równe…, .5 +(+ 0 — jeśli następne wyrażenie jest identyczne (małe i cwielkie litery są rozróżniane)…, .5 +(+ 0+ — jeśli następne wyrażenie jest identyczne (małe i cwielkie litery nie są rozróżniane)…, .5 +(0$ — jeśli jest niepuste…, .5 +(0 ( — jeśli nie jest zdefiniowane…. == .5 9[TCľGPKG+PPG?? — określa 9[TCľGPKG+PPG wykonywane tylko wtedy, jeśli żaden z powyższych warunków, tj. .5 ZZZZ 9CTWPGM, .5 ZZZZ 9CTWPGM, ŗ, .5 ZZZZ 9CTWPGM0, nie został spełniony. 0 +( — kończy konstrukcję. Konstrukcja IFB +($ NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV jest pusty; składnia jest identyczna jak w konstrukcji +(. Konstrukcja IFDEF +( ( NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV był wcześniej zdefiniowany jako symbol, zmienna lub etykieta; składnia jest idecntyczna jak w konstrukcji +(. Konstrukcja IFE +(  NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV jest równy  (wartość HCNUG); składnia jest identyczna jak w konstrukcji +(. 146 Win32ASM. Asembler w Windows Konstrukcja IFDIF +( +( NGOGPV NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV i NGOGPV są różne (małe i wielkie litery są rozróżniane); składnia jest identcyczna jak w konstrukcji +(. Konstrukcja IFDIFI +( +(+ NGOGPV NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV i NGOGPV są różne (małe i wielkie litery nie są rozróżniane); składnia jest identyczna jak w konstrukcji +(. Konstrukcja IFIDN +(+ 0 NGOGPV NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV i NGOGPV są identyczne (małe i wielkie litery są rozróżniane); składnia jest identyczna jak w konstrukcji +(. Konstrukcja IFIDNI +(+ 0+ NGOGPV NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV i NGOGPV są identyczne (małe i wielkie litery nie są rozróżniane); składnia jest identyczna jak w konstrukcji +(. Konstrukcja IFNB +(0$ NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV jest niepusty; składnia jest identyczna jak w konstrukcji +(. Konstrukcja IFNDEF +(0 ( NGOGPV 9[TCľGPKG ŗ — powoduje asemblację 9[TCľGPKC, jeśli NGOGPV nie był wcześniej zdefiniowany; składnia jest identyczna jak w konstrukcji +(. Rozdział 5. ♦ Macro Assembler 147 Konstrukcja IF2 +(9CTWPGM 9[TCľGPKG ŗ — konstrukcja warunkowa +( ma identyczną składnię jak +(; różnica polega na tym, że w przypadku konstrukcji +( asembler interpretuje 9CTWPGM tylko raz, natomiast w przypadku +( — przy każdym przebiegu (opcja 126+105 6+( musi być równa wartości 647 ). Konstrukcja ELSEIF2 .5 +(9CTWPGM 9[TCľGPKG ŗ — konstrukcja warunkowa .5 +( ma identyczną składnię jak .5 +(; w przypadku konstrukcji .5 +( asembler interpretuje 9CTWPGM tylko raz, natomiast w przypadku +( — przy każdym przebiegu (opcja 126+105 6+( musi być równa wartości 647 ). Operatory związane z programowaniem Operatory porównań matematycznych 9[TCľGPKG9[TCľGPKG — znaczenie: czy 9[TCľGPKG jest równe 9[TCľGPKW? 9[TCľGPKG9[TCľGPKG — znaczenie: czy 9[TCľGPKG nie jest równe 9[TCľGPKW? 9[TCľGPKG 9[TCľGPKG — znaczenie: czy 9[TCľGPKG jest większe od 9[TCľGPKC? 9[TCľGPKG 9[TCľGPKG — znaczenie: czy 9[TCľGPKG jest większe lub równe 9[TCľGPKW? 9[TCľGPKG9[TCľGPKG — znaczenie: czy 9[TCľGPKG jest mniejsze od 9[TCľGPKC? 9[TCľGPKG9[TCľGPKG — znaczenie: czy 9[TCľGPKG jest mniejsze lub równe 9[TCľGPKW? Operatory porównań logicznych 9[TCľGPKG9[TCľGPKG — znaczenie: czy 9[TCľGPKG i 9[TCľGPKG są prawdziwe? 9[TCľGPKG^^9[TCľGPKG — znaczenie: czy 9[TCľGPKG lub 9[TCľGPKG są prawdziwe? 148 Win32ASM. Asembler w Windows 9[TCľGPKG#0 9[TCľGPKG — znaczenie: czy iloczyn logiczny 9[TCľGPKC i 9[TCľGPKC jest prawdziwy? 9[TCľGPKG — znaczenie: czy przeciwieństwo 9[TCľGPKC jest poprawne?; negacja logiczna. #44;! — znaczenie: czy jest ustawiony znacznik przeniesiencia ( w rejestrze znaczników (.#)5? 18 4(.19! — znaczenie: czy jest ustawiony znacznik nadmiaru 1( w rejestrze znaczników (.#)5? 2#4+6;! — znaczenie: czy jest ustawiony znacznik przepełniencia 2( w rejestrze znaczników (.#)5? 2#4+6;! — znaczenie: czy jest ustawiony znacznik znaku 5( w rejestrze znaczników (.#)5? 41! — znaczenie: czy jest ustawiony znacznik zera ( w rejestrze znaczników (.#)5? Podział programu na sekcje (segmenty) Deklaracja sekcji (segmentów)  1 ==0CYC?? — określa początek sekcji (segmentu) kodu; może występcować wielokrotnie w treści programu; istnieje możliwość nadania tej scekcji programu wybranej 0CY[; domyślną nazwą dla modelu (.#6 jest A6 :6.  #6# — określa początek sekcji (segmentu) danych zainicjowcanych (z wartościami początkowymi, z wartościami znanymi w momencie asemcblacji); może występować wielokrotnie w treści programu; nazwą tej sekcji dla modelu (.#6 jest A #6#.  #6#! — określa początek sekcji (segmentu) danych niezainiccjowanych (bez wartości początkowych, wartości nie są znane w momencie asemcblacji); może występować wielokrotnie w treści programu; nazwą tej sekcji dlca modelu (.#6 jest A$55.  1056 — określa początek sekcji (segmentu) danych zainicjowcanych (z wartościami początkowymi, z wartościami znanymi w momencie asemcblacji); może występować wielokrotnie w treści programu; sekcja tca posiadać będzie atrybut „tylko do odczytu”; nazwą tej sekcji dla modelu (.#6 jest 1056. Rozdział 5. ♦ Macro Assembler 149 Sygnalizacja końca modułu, segmentu oraz początku progrramu 0 — określa koniec bieżącego modułu. 0  V[MKGVC — określa początek programu jako tego miejsca (tej lcinii kodu) w programie, w którym występuje deklaracja V[MKGV[; typowo używa się zapisu 0 5VCTV. 0CYC 0 5 — określa koniec segmentu o podanej 0CYKG. Inne konstrukcje dotyczące sekcji (segmentów) #.2*# — ustawia segmenty w kolejności alfabetycznej. 5 3 — ustawia segmenty w kolejności występowania w kodzcie; ustawienie domyślne. )TWRC)41725GIOGPV==5GIOGPV??==ŗ??==5GIOGPV0?? — dodaje zadane segmenty 5GIOGPV, 5GIOGPV, ŗ, 5GIOGPV0 do )TWR[. #557/ 4GLGUVT0CYC==4GLGUVT0CYC??==ŗ??==4GLGUVT00CYC?? — pozwala kontrolować błędy wynikające z przypisanica 4GLGUVTQO nieodpowiednich wartości; użycie #557/ powoduje, że asembler będzie kontrolował wartości przypisane danym 4GLGUVTQO po czym, w przypadku wykrycia próby przypisania im niepoprawnej wartościc, zgłosi błąd; istnieje możliwość całkowitego zabronienia użycia danych 4GLGUVTÎY przy użyciu konstrukcji: #557/ 4GLGUVT 4414==4GLGUVT 4414??==ŗ??==4GLGUVT0 4414?? a w celu wyłączenia kontroli wartości przypisywanej 4GLGUVTQO należy użyć następującego zapisu: #557/ 4GLGUVT016*+0)==4GLGUVT016*+0)??==ŗ??==4GLGUVT0016*+0)?? Typowe konstrukcje Definicja symboli (stałych) w programie 0CYC9[TCľGPKG — definicja symbolu 0CYC; definicja może być wielokrotnie zmieniana. 0CYC 379[TCľGPKG — definicja symbolu 0CYC i przypisanie mu wartości liczbowej 9[TCľGPKG; definicja nie może być zmieniana. 0CYC 376GMUV — definicja symbolu 0CYC i przypisanie mu wartości tekstowej 6GMUV; definicja może być zmieniana. 150 Win32ASM. Asembler w Windows 0CYC6 :6 37==6GMUV?? — definicja symbolu 0CYC i przypisanie mu wartości 6GMUV; 6GMUV może być łańcuchem tekstowym, stałą poprzedzaną znakiem  lub łańcuchem tekstowym zwracanym przez makro. 0CYC5+ 5646GMUV — powoduje przypisanie symbolowi 0CYC wartości będącej długością zadanego 6GMUVW. Definicja etykiety na poziomie programu V[MKGVC — definiuje V[MKGVú; do V[MKGV[ można odwoływać się w innych miejscach programu za pomocą instrukcji zmieniających bieg programu (rozkazy skoków, pętli, wywołania procedur). V[MKGVC.#$ .V[R — definiuje V[MKGVú o zadanym 6[RKG; do V[MKGV[ można odwoływać się w innych miejscach programu za pomocą instrukcji zmieniających biceg programu (rozkazy skoków, pętli, wywołania procedur). Pętle Pętla .REPEAT .UNTIL 4 2 #6 -QF 706+.9CTWPGM — powoduje wykonywanie zadanego -QFW po uruchomieniu programu tak długo, aż zostanie spełniony zadany 9CTWPGM. Pętla .REPEAT .UNTILCXZ 4 2 #6 -QF 706+.==9CTWPGM?? — powoduje wykonywanie zadanego -QFW po uruchomieniu programu tak długo, aż wartość rejestru : przyjmie wartość  i ewentualnie zostanie spełniony dodatkowy 9CTWPGM. Pętla .WHILE 9*+. 9CTWPGM -QF  0 9 — powoduje wykonywanie zadanego -QFW po uruchomieniu programu tak długo, jak długo spełniony jest zadany 9CTWPGM. Rozdział 5. ♦ Macro Assembler 151 Przerywanie pętli za pomocą konstrukcji .BREAK $4 #-==+(9CTWPGM?? — przerywa wykonywanie pętli 9*+. lub 4 2 #6; możliwe jest przerwanie po wystąpieniu określonego 9CTWPMW. Kontynuacja pętli za pomocą konstrukcji .CONTINUE  106+07 ==+(9CTWPGM?? — kontynuuje wykonywanie pętli 9*+. lub 4 2 #6 od jej początku; możliwe jest wykonanie skoku po wystąpieniu określonego 9CTWPMW. Wyrażenie warunkowe +(9CTWPGM 9[TCľGPKG == .5 +(9CTWPGM 9[TCľGPKG?? ŗ == .5 +(9CTWPGM0 9[TCľGPKG0?? == .5 9[TCľGPKG??  0 +( IFKG +(9CTWPGM 9[TCľGPKG — oznacza początek konstrukcji — 9[TCľGPKG zostanie wykonane po spełnieniu określonego 9CTWPMW. == .5 +(9CTWPGM 9[TCľGPKG?? ŗ == .5 +(9CTWPGM0 9[TCľGPKG0?? — oznacza kolejne bloki (9[TCľGPKG, 9[TCľGPKG, ŗ, 9[TCľGPKG0) wykonywane, jeśli spełnione są odpowiednie 9CTWPGM, 9CTWPGM, ŗ, 9CTWPGM0. == .5 9[TCľGPKG?? — określa 9[TCľGPKG wykonywane tylko wtedy, jeśli żaden z powyższych warunków, tj. 9CTWPGM, 9CTWPGM, ŗ, 9CTWPGM0 nie został spełniony.  0 +( — kończy konstrukcję. Operacje na łańcuchach 0CYC #6564==6GMUV==6GMUV??==ŗ?? — łączy kilka łańcuchów (operacja konkatenacji) w jedncą całość; łączone łańcuchy mogą być stałymi poprzedzanymi znakiem  lub łańcuchami tekstowymi zwracanymi przez makra. 152 Win32ASM. Asembler w Windows 0CYC+0564==2Q[ELC??6GMUV6GMUV — wyszukuje pierwsze wystąpienie łańcucha tekstowegoc 6GMUV w łańcuchu 6GMUV; istnieje możliwość podania 2Q[ELK, od której będzie rozpoczynać się przeszukiwanie; łańcuchy mogą być stałymi poprzedzancymi znakiem  lub łańcuchami tekstowymi zwracanymi przez makra. Deklaracja danych Deklaracja danych w różnych sekcjach programu (głównie .DATA i .DATA?) $ 9 ( 3 6 — deklaracja danej o rozmiarze 8 bitów — dana typu $;6 . — deklaracja danej o rozmiarze 16 bitów — dana typu 914 . — deklaracja danej o rozmiarze 32 bitów — dana typu 914 (inaczej 17$. 914 ). — deklaracja danej o rozmiarze 48 bitów — dana typu (914 (inaczej (#4914 ). — deklaracja danej o rozmiarze 64 bitów — dana typu 3914 (inaczej 37# 914 ). — deklaracja danej o rozmiarze 80 bitów — dana typu 6$;6 (inaczej 6 0$;6 ). Definiowanie struktur 0CYC5647  GMNCTCELC2ÎN 0CYC 0 5 lub 0CYC5647 6  GMNCTCELC2ÎN 0CYC 0 5 gdzie: 0CYC5647 NWD0CYC5647 6 — określa początek definicji struktury o podanej 0CYKG. GMNCTCELC2ÎN — definiuje części składowe struktury — pola o zadanycm typie ( $, 9, inne struktury, itd.). 0CYC 0 5 — określa koniec struktury o podanej 0CYKG. Rozdział 5. ♦ Macro Assembler 153 Definiowanie unii 0CYC70+10  GMNCTCELC2ÎN 0CYC 0 5 gdzie: 0CYC70+10 — określa początek definicji unii o podanej 0CYKG. GMNCTCELC2ÎN — definiuje części składowe unii. 0CYC 0 5 — określa koniec unii o podanej 0CYKG; w przypadku zagnieżdżonych bloków 70+10 wystarczy pojedynczy zapis 0CYC 0 5. Deklaracja nowych typów 0CYC6;2 (6[R — definiuje nowy typ o podanej 0CYKG, który jest jednoznaczny z 6[RGO. Deklaracja zmiennych lokalnych w procedurach (funkcjarch) .1 #. OKGPPC$;6 — deklaracja OKGPPGL 8-bitowej. .1 #. OKGPPC5$;6 — deklaracja OKGPPGL 8-bitowej ze znakiem. .1 #. OKGPPC914 — deklaracja OKGPPGL 16-bitowej. .1 #. OKGPPC914 — deklaracja OKGPPGL 16-bitowej ze znakiem. .1 #. OKGPPC 914 — deklaracja OKGPPGL 32-bitowej. .1 #. OKGPPC5 914 — deklaracja OKGPPGL 32-bitowej ze znakiem. .1 #. OKGPPC(914 — deklaracja OKGPPGL 48-bitowej. .1 #. OKGPPC3914 — deklaracja OKGPPGL 64-bitowej. .1 #. OKGPPC6$;6 — deklaracja OKGPPGL 80-bitowej. 154 Win32ASM. Asembler w Windows Inne operacje #.+)0==9CTVQħè?? — powoduje, że adres pierwszej (następnej po wystąpiecniu konstrukcji #.+)0) zadeklarowanej zmiennej będzie wyrównany do wielokrcotności 9CTVQħEK. 8 0 — powoduje, że adres pierwszej (następnej po wystąpiecniu konstrukcji 8 0) zadeklarowanej zmiennej lub użytej instrukcji będzie wyrównany do adresu parzystego. Procedury i funkcje Deklaracja procedury (funkcji) — PROC i ENDP 0CYC241 == KUV??==,ú[M??== CMTGU??==2CT??==2CT??==ŗ??==2CT0?? ==75 5.KUVC4GLGUVTÎY??==2CTCOGVT== PCEPKM????ŗ  KCđQ 0CYC 0 2 gdzie: 0CYC241 ==2CT??==2CT??==ŗ??==2CT0??==75 5.KUVC4GLGUVTÎY?? — rozpoczyna definicję procedury o podanej 0CYKG; procedura może być wywoływana z parametrami (2CT, 2CT, ŗ, 2CT0); procedura może być wywoływana w programie poleceniem +081- PCYC lub #.. PCYC; można określić, które rejestry są niszczone przez procedurcę, tak że assembler automatycznie zadba o zachowanie ich w prologu i prczywrócenie w epilogu procedury (75 5 .KUVC4GLGUVTÎY). KCđQ — kod procedury (z reguły kończący się rozkazem 4 6). 0CYC 0 2 — kończy definicję procedury o zadanej 0CYKG. Wywołanie procedury (funkcji) — INVOKE +081- 0CYC==2CT??==2CT??==ŗ??==2CT0?? — powoduje wywołanie procedury o podanej 0CYKG; istnieje możliwość przekazywania parametrów 2CT, 2CT, ŗ, 2CT0 do procedury (funkcji); parametry te zostaną umieszczone na stosie lub w rejestrach w kolejności wynikającej z przyjętego modelu wywoływania procedur; parametracmi mogą być rejestry, adresy pamięci i wyrażenia; asembler jest w stanie csprawdzić, czy liczba parametrów i ich typ zgadza się z parametrami zadekclarowanymi w ciele procedury. Rozdział 5. ♦ Macro Assembler 155 Deklaracja prototypu procedury (funkcji) — PROTO 0CYC24161==2CTCOGVT??ŗ — prototyp procedury (funkcji); informuje asembler o isctnieniu procedury (funkcji) o zadanej 0CYKG i atrybutach. Tworzenie własnych makr Konstrukcja MACRO /# 410CYC==2CTCOGVT??==2CTCOGVT??==ŗ??==2CTCOGVT0?? -QF/CMTC 0 / gdzie: /# 410CYC==2CTCOGVT??==2CTCOGVT??==ŗ??==2CTCOGVT0?? — rozpoczyna definicję makra o podanej 0CYKG; makro może być wywoływane z parametrami (2CTCOGVT, 2CTCOGVT, ŗ, 2CTCOGVT0); w miejscu wywołania makra zostanie ono rozwinięte zgodnie z -QFGO/CMTC. 0 / — kończy definicję makra lub blok 4 2 #6. Konstrukcja EXITM :+6/==9CTVQħè?? — powoduje zakończenie przetwarzania bieżącego blokuc (rozpoczętego konstrukcją /# 41 lub 4 2 #6); przetwarzanie rozpocznie się od następnej instrukcji po zakończonym właśnie bloku; istnieje możliwość zwrócenia zadanej 9CTVQħEK do wyrażenia, które spowodowało wywołanie makra.
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Win32ASM. Asembler w Windows
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: