Win32ASM. Asembler w Windows



Podobne dokumenty
Win32ASM. Asembler w Windows

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

1 Podstawy c++ w pigułce.

Mikrokontroler ATmega32. Język symboliczny

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

1 Podstawy c++ w pigułce.

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Cw.12 JAVAScript w dokumentach HTML

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Smarty PHP. Leksykon kieszonkowy

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Podstawy Programowania C++

Zmienne, stałe i operatory

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Programowanie w języku Python. Grażyna Koba

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wykład 4. Środowisko programistyczne

Blockly Kodowanie pomoc.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Pętle. Dodał Administrator niedziela, 14 marzec :27

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Podstawy programowania skrót z wykładów:

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Techniki multimedialne

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Języki skryptowe w programie Plans

Algorytm. a programowanie -

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

Programowanie komputerowe. Zajęcia 1

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Systemy liczenia. 333= 3*100+3*10+3*1

4. Funkcje. Przykłady

Programowanie w języku C++ Grażyna Koba

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Programowanie Niskopoziomowe

Podstawy Informatyki Języki programowania c.d.

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Programowanie Niskopoziomowe

Kurs Zaawansowany S7. Spis treści. Dzień 1

Język C++ zajęcia nr 2

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Podstawy Programowania Podstawowa składnia języka C++

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Język C - podstawowe informacje

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

1. Operacje logiczne A B A OR B

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Przewodnik użytkownika (instrukcja) AutoMagicTest

1 Przygotował: mgr inż. Maciej Lasota

Kurs Podstawowy S7. Spis treści. Dzień 1

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Języki programowania zasady ich tworzenia

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Umieszczanie kodu. kod skryptu

Programowanie strukturalne i obiektowe

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Metody numeryczne Laboratorium 2

7. Pętle for. Przykłady

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

Pracownia Komputerowa wykład V

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Podstawy programowania w C++

Podstawy programowania (1)

Pętla for. Wynik działania programu:

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wykład 2 Składnia języka C# (cz. 1)

Podstawy programowania - 1

Kodowanie informacji. Przygotował: Ryszard Kijanka

Autor: dr inż. Katarzyna Rudnik

Po zakończeniu rozważań na temat World Wide Web, poznaniu zasad organizacji witryn WWW, przeczytaniu kilkudziesięciu stron i poznaniu wielu nowych

Wstęp do informatyki- wykład 2

Struktura pliku projektu Console Application

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

Transkrypt:

IDZ DO PRZYK ADOWY ROZDZIA KATALOG KSI EK ZAMÓW DRUKOWANY KATALOG Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl TWÓJ KOSZYK CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK CZYTELNIA SPIS TRECI KATALOG ONLINE DODAJ DO KOSZYKA FRAGMENTY KSI EK ONLINE 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. Jeli chcesz do nich do³¹czyæ, znalaz³e w³aciw¹ ksi¹ kê. Asembler daje programicie poczucie ogromnej wolnoci 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 tekcie 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......33 Jednostki objętości danych...s...37 Kodowanie liczb...s...s... 37 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...5 6

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......93 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 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 Pojęcie okna...s...s....192 Komunikaty okna...s...s...193 Szkielet aplikacji dialogowej...s...194 Konsola...S...S......195 Podsumowanie...S...S...197 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...30 1 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...30 8 Rozdział 13. Zagadnienia wcale niezaawansowane... 309 Biblioteki DLL...S...S...3 09 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......353 Wybrane strony z narzędziami...s...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 linijkach. 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 zajmuje 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 przejrzystość kodu. Weźmy na przykład bardzo często stosowaną w asemblercze konstrukcję:

132 Win32ASM. Asembler w Windows 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: 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 przypomina 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 pamię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 zdefiniowany 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 praktyce, 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 komunikat 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ć: ; w tym przykładzie parametry nas nie interesują ; -1 oznacza tutaj kod błędu ; jeśli błąd skok do etykiety Blad ; \ dalsza część programu, wykonująca się ; / jeśli nie ma błędu ; obsługa błędu Z kolei w języku MASM taka operacja może zostać zastąpciona kodem: ; w tym przykładzie parametry nas nie interesują ; -1 oznacza tutaj kod błędu ; \ dalsza część programu, wykonująca się ; / jeśli nie ma błędu ; 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 praktycznego punktu widzenia makro ma ogólną postać typu: ; tutaj umieść treść makra Dla przykładu makro, którego celem jest wstawienie do kodu funkcji tzw. epilogu zwracającego daną wartość w rejestrze, może mieć postać: Wywołanie zdefiniowanego makra wygląda następująco (wc przykładzie zwracamy ): Umieszczenie powyższego kodu w programie powoduje, że analizujący kod asembler po napotkaniu tego wyrażenia rozwinie je w następucjący kod: a za wartość zostanie podstawiona wartość, dając finalną wersję kodu: 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 operatorami używanymi do zapisu wyrażeń różnego typu. Zaczniemy od znaków o specjalnym znaczeniu. Znaki specjalne Zapis liczb 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. reprezentuje dziesiętną; z reguły nie trzeba dodawać przyrostkac, chyba że zostanie zmieniony domyślny system liczbowcy (używany przez asembler w trakcie asemblacji). reprezentuje szesnastkową (heksadecymalną); przedrostek dodaje się w przypadku liczb rozpoczynających się od cyfr cszesnastkowych,,,, lub. reprezentuje dwójkową (binarną). Przedefiniowane symbole i funkcje reprezentuje aktualną datę.

Rozdział 5. Macro Assembler 135 reprezentuje aktualny czas. reprezentuje wersję programu Macro Assembler. reprezentuje nazwę pliku poddawanego asemblacji. reprezentuje pełną nazwę pliku poddawanego asemblcacji. dostarcza informacji o segmencie kodu. dostarcza informacji o segmencie danych. dostarcza informacji o segmencie stosu. dostarcza informacji o bieżącym (tzn. tym, w którym acktualnie użyty jest symbol ) 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: \Win32ASM\Src\!Symbole\!Symbole.asm ; =========================================================== ; Opis : Demonstracja wykorzystania różnych ; funkcji wbudowanych w Macro Assembkler ; =========================================================== ; instrukcje 586 ; płaski model pamięci ; konwencja STDCALL ; sekcja kodu ; początek programu ; powrót z procedury ; tu zaczyna się program

136 Win32ASM. Asembler w Windows A oto rezultat przykładowej asemblacji programu. archiwum: \Win32ASM\Src\!Symbole\!Symbole.txt Operatory Operatory matematyczne zwraca sumę obu. zwraca różnicę obu. zwraca iloczyn obu. zwraca iloraz obu. zwraca ze znakiem zmienionym na przeciwny. zwraca resztę z dzielenia (funkcja, funkcja ) przez. Operatory logiczne zwraca iloczyn logiczny (funkcja ) obu. zwraca sumę logiczną (funkcja ) obu.

Rozdział 5. Macro Assembler 137 zwraca negację logiczną (funkcja ). zwraca sumę modulo (funkcja, inaczej ) obu. Operatory przesunięć zwraca wartość powstałą z przesunięcia w lewo warctości zadaną razy. zwraca wartość powstałą z przesunięcia w prawo wacrtości zadaną razy. Operatory porównań Operatory inne zwraca wartość (o wartości ), jeśli jest równe ; w przeciwnym przypadku zwraca wartość (o wartości ). zwraca wartość (o wartości ), jeśli nie jest równe ; w przeciwnym przypadku zwraca wartość (o wartości ). zwraca wartość (o wartości ), jeśli jest większe od ; w przeciwnym przypadku zwraca wartość (o wartości ). zwraca wartość (o wartości ), jeśli jest mniejsze od ; w przeciwnym przypadku zwraca wartość (o wartości ). zwraca wartość (o wartości ), jeśli jest większe lub równe ; w przeciwnym przypadku zwraca wartość (o wartości ). zwraca wartość (o wartości ), jeśli jest mniejsze lub równe ; w przeciwnym przypadku zwraca wartość (o wartości ). powoduje, że odnosi się do innego niż domyślny; może być nazwą rejestru, segmentu, grupy segmentów lucb wyrażeniem stałym. zwraca adres będący sumą adresu i adresu w strukturze lub unii; w ten sposób można odwoływać się także do strucktur zagnieżdżonych np. ; może być nazwą rejestru lub zmiennej.

138 Win32ASM. Asembler w Windows powoduje, że traktowany jest jako łańcuch tekstowy. powoduje, że traktowany jest jako łańcuch tekstowy. powoduje, że będące parametrem przekazywanym do makra będzie traktowane jako łańcuch tekstowy. powoduje zastąpienie łańcucha wartością. zwraca adres ; najczęściej dotyczy zmiennych lokalnych. zwraca adres (offset, przesunięcie) ; najczęściej dotyczy zmiennych globalnych. zwraca rozmiar (w bajtach). Makra związane z procesem asemblacji Przyjrzymy się teraz bliżej wszystkim ważniejszym poleceniom, jakie można wykorzystać w języku Macro Asembler. Na końcu tego rozdziału przedstawię plik, 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). 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). 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). pozwala wykorzystywać instrukcje procesora 80486 (koprcocesor jest wbudowany w procesor); pozwala na użycie instrukcji uprzywilejowanych (dotyczy trybu chronionego). nie pozwala wykorzystywać instrukcji koprocesora. Komentarze powoduje, że pierwsza linia (z wyrażeniem ) oraz wszystkie inne, w których występuje będą traktowane przez asembler jako komentarz. powoduje, że traktowany będzie jako komentarz. powoduje, że traktowany będzie jako komentarz tylko w definicjic makra i nie będzie widoczny na listingu (po rozwinicęciu makra). Listingi definiuje listingu programu. lub definiuje listingu.

140 Win32ASM. Asembler w Windows Wyświetlanie informacji (w trakcie asemblacji) powoduje wyświetlenie w trakcie asemblacji. powoduje wyświetlenie w trakcie asemblacji; znak powoduje, że wszystkie makra tekstowe użyte w zostaną rozwinięte. powoduje wyświetlenie w trakcie asemblacji. Dołączanie kodu źródłowego umieszczonego w innym plikru powoduje, że w miejscu wystąpienia zapisu zostanie dołączony tekst zapisany w pliku ; 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 powoduje, że w trakcie łączenia (budowania) pliku wycnikowego program łączący dołączy bibliotekę zawartą w pliku ; 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 powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie ; powinien być objęty parą nawiasów ostrych. Konstrukcja.ERR2 powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie ; powinien być objęty parą nawiasów ostrych ; w przeciwieństwie do, błąd generowany będzie przy każdym przebiegu asemblera (opcja musi być równa wartości ).

Rozdział 5. Macro Assembler 141 Konstrukcja.ERRB powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli jest pusty; i muszą być objęte parą nawiasów ostrych. Konstrukcja.ERRNB powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli nie jest pusty; i muszą być objęte parą nawiasów ostrych. Konstrukcja.ERRDEF powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli była już wcześniej zdefiniowana jako zmienna, etykieta lub symbol; powinien być objęty parą nawiasów ostrych. Konstrukcja.ERRNDEF powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli nie była wcześniej zdefiniowana jako zmienna, etykieta lub symbol; powinien być objęty parą nawiasów ostrych. Konstrukcja.ERRDIF powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli nie jest identyczny z ; i muszą być objęte parą nawiasów ostrych ; małe i wielkie litery są rozróżniane podczas operacji porównania. Konstrukcja.ERRDIFI powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli nie jest identyczny z ; i muszą być objęte parą nawiasów ostrych ; małe i wielkie litery nie są rozróżniane podczas operacji porównania. Konstrukcja.ERRIDN powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli jest identyczny z ;

142 Win32ASM. Asembler w Windows i muszą być objęte parą nawiasów ostrych ; małe i wielkie litery są rozróżniane podczas operacji porównania. Konstrukcja.ERRIDNI powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli jest identyczny z ; i muszą być objęte parą nawiasów ostrych ; małe i wielkie litery nie są rozróżniane podczas operacji porównania. Konstrukcja.ERRE powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli zwraca wartość ; musi być objęty parą nawiasów ostrych. Konstrukcja.ERRNZ powoduje wygenerowanie błędu i przerwanie asemblaccji oraz ewentualnie wyświetlenie, jeśli zwraca wartość ; musi być objęty parą nawiasów ostrych. Sterowanie przebiegiem asemblacji Etykiety i skoki powoduje, że kolejną przetwarzaną przez asembler lcinią będzie linia, w której umieszczono zapis (tj. przed etykietą zawsze występuje dwukropek); makroinstrukcja może być wykorzystywana tylko i wyłącznie wewnątrz bloków:,,,,. definiuje ; do można odwoływać się w innych miejscach programu za pomocą konstrukcji. Pętle FOR i IRP lub równoważne: gdzie:

Rozdział 5. Macro Assembler 143 określają początek pętli. oznacza, któremu można przypisać wartość, oznaczają kolejne, na których będzie wykonana zadana w kolejnych obiegach pętli. oznacza koniec bloku. Pętle FORC i IRPC lub równoważne: gdzie: określają początek pętli. oznaczają, któremu będzie przypisana kolejna litera z ; na każdej z liter będzie wykonana zadana. oznacza koniec bloku. Pętla REPEAT i REPT lub równoważne: gdzie: określają początek pętli oraz powtórzeń generowanego. określa powtarzany zadaną razy. oznacza koniec bloku.

144 Win32ASM. Asembler w Windows Pętla WHILE gdzie: określają początek pętli, w której będzie przetwarzany tak długo, jak długo będzie zwracało wartość prawdziwą. określa asemblowany (w kółko) tak długo, jak długo będzie zwracało wartość prawdziwą. oznacza koniec bloku. Asemblacja warunkowa Asemblacja warunkowa pozwala na asemblację wybranych fragmentów kodu w zależności od pewnych parametrów. Konstrukcja IF gdzie: oznacza początek konstrukcji zostanie poddane asemblacji po wystąpieniu określonego. oznacza kolejne bloki (,,, ) wykonywane, jeśli spełnione są odpowiednio:,,,, gdzie może przyjmować wartości: jeśli (uproszczona wersja zapisu ), jeśli jest puste,

Rozdział 5. Macro Assembler 145 jeśli jest zdefiniowane, jeśli następne wyrażenie jest inne (małe i wielkice litery są rozróżniane), jeśli następne wyrażenie jest inne (małe i wielkice litery nie są rozróżniane), jeśli jest równe, jeśli następne wyrażenie jest identyczne (małe i cwielkie litery są rozróżniane), jeśli następne wyrażenie jest identyczne (małe i cwielkie litery nie są rozróżniane), jeśli jest niepuste, jeśli nie jest zdefiniowane. określa wykonywane tylko wtedy, jeśli żaden z powyższych warunków, tj.,,,, nie został spełniony. kończy konstrukcję. Konstrukcja IFB powoduje asemblację, jeśli jest pusty; składnia jest identyczna jak w konstrukcji. Konstrukcja IFDEF powoduje asemblację, jeśli był wcześniej zdefiniowany jako symbol, zmienna lub etykieta; składnia jest idecntyczna jak w konstrukcji. Konstrukcja IFE powoduje asemblację, jeśli jest równy (wartość ); składnia jest identyczna jak w konstrukcji.

146 Win32ASM. Asembler w Windows Konstrukcja IFDIF powoduje asemblację, jeśli i są różne (małe i wielkie litery są rozróżniane); składnia jest identcyczna jak w konstrukcji. Konstrukcja IFDIFI powoduje asemblację, jeśli i są różne (małe i wielkie litery nie są rozróżniane); składnia jest identyczna jak w konstrukcji. Konstrukcja IFIDN powoduje asemblację, jeśli i są identyczne (małe i wielkie litery są rozróżniane); składnia jest identyczna jak w konstrukcji. Konstrukcja IFIDNI powoduje asemblację, jeśli i są identyczne (małe i wielkie litery nie są rozróżniane); składnia jest identyczna jak w konstrukcji. Konstrukcja IFNB powoduje asemblację, jeśli jest niepusty; składnia jest identyczna jak w konstrukcji. Konstrukcja IFNDEF powoduje asemblację, jeśli nie był wcześniej zdefiniowany; składnia jest identyczna jak w konstrukcji.

Rozdział 5. Macro Assembler 147 Konstrukcja IF2 konstrukcja warunkowa ma identyczną składnię jak ; różnica polega na tym, że w przypadku konstrukcji asembler interpretuje tylko raz, natomiast w przypadku przy każdym przebiegu (opcja musi być równa wartości ). Konstrukcja ELSEIF2 konstrukcja warunkowa ma identyczną składnię jak ; w przypadku konstrukcji asembler interpretuje tylko raz, natomiast w przypadku przy każdym przebiegu (opcja musi być równa wartości ). Operatory związane z programowaniem Operatory porównań matematycznych znaczenie: czy jest równe? znaczenie: czy nie jest równe? znaczenie: czy jest większe od? znaczenie: czy jest większe lub równe? znaczenie: czy jest mniejsze od? znaczenie: czy jest mniejsze lub równe? Operatory porównań logicznych znaczenie: czy i są prawdziwe? znaczenie: czy lub są prawdziwe?

148 Win32ASM. Asembler w Windows znaczenie: czy iloczyn logiczny i jest prawdziwy? znaczenie: czy przeciwieństwo jest poprawne?; negacja logiczna. znaczenie: czy jest ustawiony znacznik przeniesiencia w rejestrze znaczników? znaczenie: czy jest ustawiony znacznik nadmiaru w rejestrze znaczników? znaczenie: czy jest ustawiony znacznik przepełniencia w rejestrze znaczników? znaczenie: czy jest ustawiony znacznik znaku w rejestrze znaczników? znaczenie: czy jest ustawiony znacznik zera w rejestrze znaczników? Podział programu na sekcje (segmenty) Deklaracja sekcji (segmentów) określa początek sekcji (segmentu) kodu; może występcować wielokrotnie w treści programu; istnieje możliwość nadania tej scekcji programu wybranej ; domyślną nazwą dla modelu jest. 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 jest. 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 jest. 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 jest.

Rozdział 5. Macro Assembler 149 Sygnalizacja końca modułu, segmentu oraz początku progrramu określa koniec bieżącego modułu. określa początek programu jako tego miejsca (tej lcinii kodu) w programie, w którym występuje deklaracja ; typowo używa się zapisu. określa koniec segmentu o podanej. Inne konstrukcje dotyczące sekcji (segmentów) ustawia segmenty w kolejności alfabetycznej. ustawia segmenty w kolejności występowania w kodzcie; ustawienie domyślne. dodaje zadane segmenty,,, do. pozwala kontrolować błędy wynikające z przypisanica nieodpowiednich wartości; użycie powoduje, że asembler będzie kontrolował wartości przypisane danym 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 przy użyciu konstrukcji: a w celu wyłączenia kontroli wartości przypisywanej należy użyć następującego zapisu: Typowe konstrukcje Definicja symboli (stałych) w programie definicja symbolu ; definicja może być wielokrotnie zmieniana. definicja symbolu i przypisanie mu wartości liczbowej ; definicja nie może być zmieniana. definicja symbolu i przypisanie mu wartości tekstowej ; definicja może być zmieniana.

150 Win32ASM. Asembler w Windows Pętle definicja symbolu i przypisanie mu wartości ; może być łańcuchem tekstowym, stałą poprzedzaną znakiem lub łańcuchem tekstowym zwracanym przez makro. powoduje przypisanie symbolowi wartości będącej długością zadanego. Definicja etykiety na poziomie programu definiuje ; do można odwoływać się w innych miejscach programu za pomocą instrukcji zmieniających bieg programu (rozkazy skoków, pętli, wywołania procedur). definiuje o zadanym ; do 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ętla.REPEAT.UNTIL powoduje wykonywanie zadanego po uruchomieniu programu tak długo, aż zostanie spełniony zadany. Pętla.REPEAT.UNTILCXZ powoduje wykonywanie zadanego po uruchomieniu programu tak długo, aż wartość rejestru przyjmie wartość i ewentualnie zostanie spełniony dodatkowy. Pętla.WHILE powoduje wykonywanie zadanego po uruchomieniu programu tak długo, jak długo spełniony jest zadany.