Wikipedysta:Doles/Brudnopis/Prorotyp/Windows/Wstęp

Z Wikibooks, biblioteki wolnych podręczników.

Wstęp[edytuj]

Witaj w podręczniku programowania w Asemblerze przy użyciu WinAPI. Tak, zwróć uwagę na kolejność słów. Nie będziemy się tutaj uczyć jak programować w WinAPI przy użyciu Asemblera, tylko jak pisać programy w Asemblerze przy pomocy WinAPI. Jest to bardzo istotna różnica, gdyż będziemy się koncentrować głównie na samym języku programowania. Win32 będzie tylko "dodatkiem", pewną platformą do pisania programów. Z racji tego, że będziemy pisać programy dla systemu operacyjnego Microsoft Windows, musimy użyć pewnego minimum funkcji które ten system udostępnia. Nie będziemy tworzyć programów z graficznym interfejsem użytkownika, nasze aplikacje będą działały tylko w wierszu poleceń. Pisanie programów GUI to temat na inny podręcznik, bowiem WinAPI może być użyte zarówno w Asemblerze, jak i w C/C++ czy jeszcze innym języku programowania.

Co to jest WinAPI ?[edytuj]

WinAPI jest to interfejs programistyczny systemu Microsoft Windows, czyli zbiór funkcji, stałych i zmiennych potrzebnych i umożliwiających działanie programu w systemie operacyjnym Windows.

Zbiór ten jest bardzo obszerny i zawiera funkcje do tworzenia okien programów, aplikacji konsolowych, elementów interfejsu użytkownika, obsługi zdarzeń oraz umożliwiające dostęp do innych aplikacji, funkcji sieciowych czy sprzętu w komputerze. Mianem WinAPI określamy standardowe funkcje przychodzące wraz z bibliotekami DLL (w 16-bitowych wersjach z rozszerzeniem .exe) dostarczanymi z systemem - np. kernel32.dll, user32.dll, gdi32.dll czy wsock32.dll, znajdujące się w podkatalogu System w głównym katalogu Windows. Liczba bibliotek rośnie wraz z każdą nową wersją Windows.

Co to jest Win32 ?[edytuj]

Jest to tak zwana baza programistyczna, nic innego jak WinAPI dla Windowsa 32 bitowego (jak na przykład Windows NT, Windows 95 i nowsze). WinAPI Windowsa 16-bitowego (Windows 3.1 oraz starsze wersje) nosiło nazwę Win16. Biblioteki Win32 są głównie napisane w języku C zaś najważniejsze pliki DLL to kernel32.dll, user32.dll oraz gdi32.dll

Gdzie szukać opisów funkcji WinAPI ?[edytuj]

Jedynym autoryzowanym miejscem gdzie możesz znaleźć takie informacje jest [1]. Jest to internetowa baza wiedzy dla programistów Windowsa. Jeżeli znasz przynajmniej podstawy z języka angielskiego, ta strona będzie dla Ciebie bezcenna przy odkrywaniu funkcji WinAPI. Wielokrotnie w dalszych rozdziałach będę zachęcał Ciebie do przeczytania dokumentacji na tej stronie w celu lepszego wyjaśnienia danych wywołań systemowych, zmiennych, struktur danych etc.

Przygotowujemy środowisko pracy[edytuj]

Na początek musimy oczywiście pobrać pakiet MASM32. Dlaczego "pakiet" ? Zasadniczo asemblerem jest plik ML.EXE w katalogu BIN zaś linkerem LINK.EXE w tym samym katalogu. Są to dwa programy Microsoftu i tylko tyle. Brak tam bibliotek importu (plików *.lib), brak plików nagłówkowych z deklaracjami stałych, struktur danych oraz funkcji. MASM32 to nie tylko asembler i linker ale także napisane w Asemblerze biblioteki, oraz przygotowane pod niego pliki nagłówkowe. W skład całego zestawu zwanego SDK (ang software development kit zestaw narzędzi dla programisty do pracy z daną biblioteką itd) wchodzi również kompilator zasobów (pliki *.rc) debuger oraz spora dokumentacja wraz z najnowszymi wersjami tutoriali i poradników. Zabierzmy się do pracy:

  1. Pobierzmy cały SDK z strony [2].
  2. Następnie kliknij na "Download Page" i wybierz serwer, z którego ściągniesz instalator.
  3. Po rozpakowaniu archiwum uruchom plik install.exe. Podążaj za wskazówkami instalatora.

Twój asembler jest już zainstalowany. Pozostało nam tylko omówić jak on działa oraz z czego się składa proces tworzenia oprogramowania.

Ty jako programista tworzysz kod źródłowy programu, który zapisujesz w pliku o rozszerzeniu *.asm. Gdybyś pisał oprogramowanie z graficznym interfejsem użytkownika najprawdopodobniej Twój program miałby menu oraz ikonkę tudzież inne tzw zasoby. Ten rodzaj danych trzeba "zaprogramować" w pliku zasobów *.rc i skompilować go kompilatorem zasobów. Sam plik RC nazywany jest skryptem. Gdy kod źródłowy jest gotowy, należy go zasemblować. Asemblacja to proces, w którym asembler rozwija makra, włącza odpowiednie pliki nagłówkowe i przede wszystkim tłumaczy wszystkie mnemoniki na ich binarne odpowiedniki zrozumiałe dla procesora. W tym momencie powstaje plik obiektowy (plik *.obj). Jest to co prawda plik binarny, ale JESZCZE NIE wykonywalny. Jest "suchy", czyli zawiera w sobie tylko rozkazy procesora, brak tam obliczonych adresów oraz informacji dla systemu operacyjnego o tym jaki to plik, jakie ma prawa, jak go uruchomić, jakich potrzebuje zasobów systemowych, jakie ma sumy kontrolne i tak dalej. Aby uzupełnić go o te dane należy uruchomić linker. Linker łączy wszystkie pliki objektowe i skompilowane zasoby w jeden plik wykonywalny o rozszerzeniu *.exe. Dopiero taki plik nazywamy programem i możemy go uruchomić.

Tyle słowem teorii, teraz praktyka. Przyda Ci się troszkę wiedza o tym jak używać wiersza poleceń w systemie Microsoft Windows. Jeśli tego nie wiesz, podam Ci kilka dobrych rad i wskazówek.

  • Uruchom Wiersz Poleceń
  • Zmień aktualny katalog na folder z MASM32. Przykład:
C:\Documents and Settings\Bartek> 
C:\Documents and Settings\Bartek> cd c:\masm32

Polecenie cd zmienia katalog, pomagaj sobie klawiszem TAB. On uzpełnia nazwy plików i folderów, przykładowo jeśli na dysku jest tylko jeden folder "masm32" i napiszesz w wierszu poleceń słowo "masm" po czym stukniesz TAB, wiersz poleceń automatycznie dopełni Twoje słowo do "masm32". Dzięki niemu możemy "podróżować" z jednego folderu do drugiego. Pamiętaj, że jako argument cd może przyjąć zarówno pełną ścieżkę do folderu jak i znaki specjalne na przykład "..". Dwie kropli oznaczają przejście o jeden poziom wyżej. Przykład

C:\Documents and Settings\Bartek> cd..
C:\Documents and Settings\
  • Wejdź do katalogu BIN:
C\masm32>
C:\masm32\bin>
  • Zasembluj plik źródłowy:
C:\masm32\bin>ml.exe /c /coff /Cp plik.asm

Tutaj trzeba nieco wyjaśnień co do opcji asemblera. Oto i wyjaśnienia przełączników:

/c - nakazuje asemblerowi TYLKO zasemblować dany plik. Bez tego przełącznika będzie on próbował dodatkowo uruchomić linker z domyślnymi opcjami co raczej nie skończy się sukcesem.

/coff - mówi asemblerowi jakiego formatu będzie wygenerowany plik. Nie myl formatu z rozszerzeniem. Nadal to będzie plik *.obj jednak o formacie COFF, czyli klasyczny 32 bitowy plik binarny oraz później po działaniu linkera - wykonywalny.

/Cp - nakazuje asemblerowi aby uważał na wielkość liter. Dzięki tej opcji asembler wie, że "ALA" to nie to samo co "ala" czy "Ala". Często brak tej opcji jest przyczyną trudnych do zrozumienia błędów asemblera. Zamiast tej opcji asemblera, możesz użyć ".option casemap:none" tuż pod ".386" w pliku źródłowym. Efekt będzie ten sam.

Oczywiście zamiast plik.asm podajesz swój nazwany plik źródłowy. Dobrze teraz mamy plik obiektowy. Jeśli wszystko pójdzie ok, będziesz widział coś podobnego do tego komunikatu:

Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
Assembling: plik.asm

Czas na omówienie linkera. Do tworzenia plików *.exe użyjemy tego polecenia:

link.exe /subsytem:console plik.obj

I objaśnienia: /subsystem:console - mówi linkerowi jaka będzie docelowa platforma dla programu. Tutaj są dostępne dwa warianty - /subsysytem:console oraz /subsystem:windows. Nazwy mogą trochę mylić, gdyż obie dotyczą tworzenia programów pod Windowsa, jednak "console" linkuje program działający w wierszu poleceń a "windows" programów GUI.

Jeżeli nie będzie żadnych błędów ujrzysz zbliżoną wiadomość:

Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

I nic więcej. Tylko migający znak zachęty w nowej linii w wierszu poleceń. Jest to stara i znana taktyka: "Brak odpowiedzi jest dobrą odpowiedzią". Na koniec możesz uruchomić program w poniższy sposób:

C:\masm32\bin>plik.exe

W porządku. Teraz jesteś w pełni przygotowany do programowania. Najwyższy czas posmakować Asemblera. Przejdź do następnego rozdziału aby zmierzyć się z pierwszymi programami.