plik


ÿþIDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ Praktyczny kurs SPIS TRE CI SPIS TRE CI asemblera KATALOG KSI¥¯EK KATALOG KSI¥¯EK Autor: Eugeniusz Wróbel KATALOG ONLINE KATALOG ONLINE ISBN: 83-7361-433-8 Format: B5, stron: 384 ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA Wejd w wiat programowania w jêzyku asemblera DODAJ DO KOSZYKA " Dowiedz siê, kiedy u¿ycie asemblera jest niezbêdne " Poznaj zasady programowania w asemblerze CENNIK I INFORMACJE " Napisz szybkie i wydajne programy dla DOS-a i Windows CENNIK I INFORMACJE " Zdob¹d wiedzê o zasadach dzia³ania procesora i pamiêci ZAMÓW INFORMACJE ZAMÓW INFORMACJE Uwa¿asz, ¿e mo¿liwo ci jêzyków programowania wysokiego poziomu nie pozwalaj¹ O NOWO CIACH O NOWO CIACH na napisanie programu, którego potrzebujesz? Chcesz stworzyæ sterownik, program rezydentny, demo lub... wirusa? Interesuje Ciê, co dzieje siê w komputerze podczas ZAMÓW CENNIK ZAMÓW CENNIK wykonywania programu? Wykorzystaj potencja³ asemblera! Programowanie w jêzyku niskiego poziomu daje niemal nieograniczon¹ kontrolê CZYTELNIA CZYTELNIA nad sprzêtem i dzia³aniem aplikacji. Programy napisane w jêzyku asemblera dzia³aj¹ szybko, s¹ niewielkie i zajmuj¹ ma³o pamiêci. S¹ bardzo wydajne i otwieraj¹ dostêp FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE do takich obszarów komputera, do których dostêp z poziomu C++ czy Visual Basica jest niemo¿liwy. Ksi¹¿ka  Praktyczny kurs asemblera wprowadzi Ciê w wiat programowania w tym jêzyku. Dowiesz siê, jak dzia³a procesor, w jaki sposób komunikuje siê z pamiêci¹ i pozosta³ymi elementami komputera. Poznasz typy rozkazów procesora, tryby adresowania i zasady tworzenia programów w asemblerze. Lepiej poznasz swój komputer i dowiesz siê, w jaki sposób zapamiêtuje i przetwarza dane. Komputer przestanie byæ dla Ciebie  czarn¹ skrzynk¹ wykonuj¹c¹ w czarodziejski sposób Twoje polecenia. " Podstawowe wiadomo ci o architekturze procesorów Intel " Organizacja pamiêci i tryby adresowania Wydawnictwo Helion " Omówienie listy rozkazów procesora ul. Chopina 6 " Narzêdzia do tworzenia programów w jêzyku asemblera 44-100 Gliwice tel. (32)230-98-63 " Struktura programu w asemblerze e-mail: helion@helion.pl " Definiowanie zmiennych " Tworzenie podprogramów i makrorozkazów " Wykorzystanie funkcji BIOS-a oraz MS-DOS " Programy w asemblerze uruchamiane w systemie Windows " Optymalizacja kodu " Tworzenie modu³ów dla innych jêzyków programowania Spis tre[ci RozdziaB 1. Wprowadzenie ...................................................................................7 1.1. Co to jest asembler? .....................................................................................................7 1.2. Dlaczego programowa w j¹zyku asemblera? ...........................................................10 1.3. Dlaczego warto pozna j¹zyk asemblera?..................................................................12 1.4. Wymagane umiej¹tno[ci ............................................................................................12 1.5. Konwencje stosowane w ksi|ce ...............................................................................13 RozdziaB 2. Zaczynamy typowo  wiedzc niewiele, uruchamiamy nasz pierwszy program ................................................17 2.1.  Hello, world! pod systemem operacyjnym MS DOS .............................................18 2.2.  Hello, world! pod systemem operacyjnym Windows.............................................22 RozdziaB 3. Wracamy do podstaw  poznajemy minimum wiedzy na temat architektury procesorów 80x86.........................................29 3.1. Rejestry procesora 8086.............................................................................................30 3.2. Zwi¹kszamy rozmiar rejestrów  od procesora 80386 do Pentium 4......................33 3.3. Zwi¹kszamy liczb¹ rejestrów  od procesora 80486 do Pentium 4 .........................35 3.4. Segmentowa organizacja pami¹ci ..............................................................................39 3.5. Adresowanie argumentów..........................................................................................43 3.6. Adresowanie argumentów w pami¹ci operacyjnej.....................................................44 RozdziaB 4. Poznajemy narzdzia ........................................................................47 4.1. Asembler MASM .......................................................................................................49 4.2. Program konsolidujcy  linker ...............................................................................52 4.3. Programy uruchomieniowe ........................................................................................54 4.4. Wszystkie potrzebne narz¹dzia razem, czyli [rodowiska zintegrowane....................62 RozdziaB 5. Nadmiar mo|liwo[ci, z którym trudno sobie poradzi  czyli lista instrukcji procesora......................................................67 5.1. Instrukcje ogólne  jednostki staBoprzecinkowej .....................................................70 5.2. Koprocesor arytmetyczny  instrukcje jednostki zmiennoprzecinkowej.................73 5.3. Instrukcje rozszerzenia MMX....................................................................................75 5.4. Instrukcje rozszerzenia SSE.......................................................................................78 5.5. Instrukcje rozszerzenia SSE2.....................................................................................82 5.6. Instrukcje rozszerzenia SSE3.....................................................................................85 5.7. Instrukcje systemowe .................................................................................................85 4 Praktyczny kurs asemblera RozdziaB 6. Wracamy do ogólnej struktury programu asemblerowego ..................87 6.1. Uproszczone dyrektywy definiujce segmenty..........................................................87 6.2. PeBne dyrektywy definiowania segmentów................................................................92 6.3. Spróbujmy drobn cz¹[ tej wiedzy zastosowa w prostym programie, a przy okazji poznajmy nowe pomocnicze dyrektywy...................................................96 RozdziaB 7. Wa|na rzecz w ka|dym jzyku programowania  definiowanie i stosowanie zmiennych .........................................105 7.1. Zmienne caBkowite ...................................................................................................106 7.2. Zmienne zmiennoprzecinkowe ................................................................................109 7.3. Definiowanie tablic i BaDcuchów..............................................................................110 7.4. Struktury zmiennych ................................................................................................114 7.5. Dyrektywa definiujca pola bitowe..........................................................................117 RozdziaB 8. Podprogramy .................................................................................119 8.1. Stos...........................................................................................................................119 8.2. WywoBanie i organizacja prostych podprogramów..................................................122 8.3. Poznajemy dyrektyw¹ PROC-ENDP.......................................................................123 8.4. Parametry wywoBania podprogramu ........................................................................128 8.5. Zmienne lokalne.......................................................................................................137 RozdziaB 9. Oddalamy si od asemblera w kierunku jzyków wy|szego poziomu, czyli u|ycie makroinstrukcji oraz dyrektyw asemblacji warunkowej.... 139 9.1. Makroinstrukcja definiowana...................................................................................139 9.2. Dyrektywa LOCAL..................................................................................................144 9.3. Dyrektywy asemblacji warunkowej.........................................................................144 9.4. Makroinstrukcje niedefiniowane..............................................................................148 9.5. Makroinstrukcje tekstowe ........................................................................................149 9.6. Makroinstrukcje operujce na BaDcuchach (na tekstach)..........................................150 RozdziaB 10. Czy obsBug wszystkich urzdzeD komputera musimy wykona sami? Funkcje systemu MS DOS oraz BIOS ..............................................153 10.1. Co ma prawo przerwa wykonanie naszego programu?........................................154 10.2. ObsBuga klawiatury oraz funkcje grafiki na poziomie BIOS .................................156 10.3. WywoBywanie podprogramów systemu operacyjnego MS DOS...........................163 RozdziaB 11. Obalamy mity programujc w asemblerze pod systemem operacyjnym Windows.............................................169 11.1. Systemowe programy biblioteczne ........................................................................170 11.2. Najprawdziwsze pierwsze okno.............................................................................173 11.3. Struktury programowe HLL  to te| jest asembler!.............................................178 11.4. Idziemy jeden krok dalej i wykorzystujemy program generatora okien Prostart......180 RozdziaB 12. Czy mo|emy przy[pieszy dziaBanie naszego programu? Wybrane zagadnienia optymalizacji programu..................................189 12.1. Kiedy i co w programie powinni[my optymalizowa?..........................................191 12.2. Optymalizujemy program przygotowany dla procesora Pentium 4.......................193 12.3. Wspieramy proces optymalizacji programem Vtune.............................................200 12.4. Na ile ró|nych sposobów mo|emy zakodowa kopiowanie tablic?........................201 RozdziaB 13. Dzielimy program na moduBy i Bczymy moduBy zakodowane w ró|nych jzykach programowania ................................................209 13.1. Jak realizowa poBczenia mi¹dzymoduBowe?.......................................................210 13.2. Mieszamy moduBy przygotowane w ró|nych j¹zykach .........................................214 Spis tre[ci 5 RozdziaB 14. PrzykBadowe programy (MS DOS) ...................................................219 14.1. Identyfikujemy procesor ........................................................................................219 14.2. Wchodzimy w [wiat grafiki  nieco patriotycznie...............................................225 14.3. Program rezydentny, czyli namiastka wielozadaniowo[ci.....................................228 14.4. Pozorujemy gB¹bi¹..................................................................................................233 14.5. Wy|sza graficzna szkoBa jazdy ze zmiennymi zespolonymi .................................236 RozdziaB 15. PrzykBadowe programy (Windows)..................................................243 15.1. Zegarek...................................................................................................................243 15.2. Dotkni¹cie grafiki przez du|e  G .........................................................................248 15.3. PrzeksztaBcamy map¹ bitow .................................................................................250 ZaBcznik 1.Interesujce strony w internecie ....................................................271 ZaBcznik 2.Lista dyrektyw i pseudoinstrukcji jzyka MASM..............................275 Z2.1. Dyrektywy okre[lajce list¹ instrukcji procesora ..................................................275 Z2.2. Organizacja segmentów.........................................................................................277 Z2.3. Definiowanie staBych oraz dyrektywy zwizane z nazwami symbolicznymi........279 Z2.4. Definiowanie zmiennych .......................................................................................280 Z2.4. Dyrektywy asemblacji warunkowej.......................................................................282 Z2.5. Makroinstrukcje i dyrektywy nimi zwizane.........................................................283 Z2.6. Pseudoinstrukcje typu HLL ...................................................................................285 Z2.7. Dyrektywy zwizane z podprogramami ................................................................286 Z2.8. Dyrektywy wpBywajce na ksztaBt listingu asemblacji..........................................287 Z2.9. PoBczenia mi¹dzymoduBowe ................................................................................289 Z2.10. Dyrektywy zwizane z diagnostyk procesu asemblacji.....................................290 Z2.11. Inne dyrektywy i pseudoinstrukcje......................................................................291 ZaBcznik 3.Operatory stosowane w jzyku MASM ............................................293 Z3.1. Operatory stosowane w wyra|eniach obliczanych w czasie asemblacji ...............293 Z3.2. Operatory stosowane w wyra|eniach obliczanych w czasie wykonywania programu.................................................................................297 ZaBcznik 4.Symbole predefiniowane.................................................................299 ZaBcznik 5.Przegld instrukcji procesora Pentium 4.........................................303 Z5.1. Instrukcje ogólne (jednostki staBoprzecinkowej) ...................................................303 Z5.2. Instrukcje jednostki zmiennoprzecinkowej (koprocesora arytmetycznego)..........309 Z5.3. Instrukcje rozszerzenia MMX ...............................................................................313 Z5.4. Instrukcje rozszerzenia SSE...................................................................................315 Z5.5. Instrukcje rozszerzenia SSE2.................................................................................319 Z5.6. Instrukcje rozszerzenia SSE3.................................................................................323 Z5.7. Instrukcje systemowe.............................................................................................325 ZaBcznik 6.Opis wybranych przerwaD systemu BIOS.........................................327 Z6.1. Funkcje obsBugi klawiatury wywoBywane przerwaniem programowym INT 16h...327 Z6.2. Funkcje obsBugi karty graficznej wywoBywane przerwaniem programowym INT 10h. .........................................................................329 ZaBcznik 7.WywoBania funkcji systemu operacyjnego MS DOS..........................335 Z7.1. Funkcje realizujce odczyt lub zapis znaku z ukBadu wej[ciowego lub wyj[ciowego ...........................................................................................................335 Z7.2. Funkcje operujce na katalogach...........................................................................337 Z7.3. Operacje na dysku..................................................................................................337 Z7.4. Operacje na plikach (zbiorach) dyskowych...........................................................339 Z7.5. Operacje na rekordach w pliku ..............................................................................341 6 Praktyczny kurs asemblera Z7.6. Zarzdzanie pami¹ci operacyjn..........................................................................342 Z7.7. Funkcje systemowe................................................................................................342 Z7.8. Sterowanie programem..........................................................................................344 Z7.9. Funkcje zwizane z czasem i dat...........................................................................345 Z7.10 Inne funkcje ..........................................................................................................345 ZaBcznik 8.Opis wybranych funkcji API ............................................................347 Z8.1. CheckDlgButtom ...................................................................................................347 Z8.2. CloseHandle...........................................................................................................348 Z8.3 CopyFile..................................................................................................................349 Z8.4. CreateFile...............................................................................................................350 Z8.5. CreateWindowEx...................................................................................................352 Z8.6. DeleteFile...............................................................................................................355 Z8.7. ExitProcess.............................................................................................................355 Z8.8. GetFileSize.............................................................................................................356 Z8.9. MessageBox...........................................................................................................357 Z8.10. ShowWindow.......................................................................................................359 ZaBcznik 9.Tablica kodów ASCII oraz kody klawiszy.........................................361 Z9.1. Kody ASCII ...........................................................................................................361 Z9.2. Kody klawiszy .......................................................................................................361 ZaBcznik 10. Program Segment Prefix (PSP)....................................................367 ZaBcznik 11. PByta CD zaBczona do ksi|ki .....................................................369 Skorowidz ........................................................................................................371 RozdziaB 2. Zaczynamy typowo  wiedzc niewiele, uruchamiamy nasz pierwszy program Ka|dy szanujcy si¹ podr¹cznik programowania niezale|nie od tego, jakiego j¹zyka dotyczy, musi rozpocz si¹ zgodnie z powszechnie szanowan tradycj: programem wy[wietlajcym na ekranie monitora komunikat  Hello, world! . Wprawdzie nie znamy jeszcze ani architektury procesora Pentium, ani te| samego j¹zyka asemblera i jego skBad- ni, to jednak spróbujmy pokaza, jak wygldaBby taki miniprogram, i to zarówno w wersji przeznaczonej do uruchomienia pod systemem operacyjnym MS DOS, jak i pod sys- temem Windows. Tak jak to zostaBo zasygnalizowane w pierwszym rozdziale, nie b¹- dziemy chcieli w naszym pierwszym programie zrobi wszystkiego sami! Skorzystamy w obu przypadkach z podprogramów (biblioteki) systemowych wy[wietlania tekstu na ekranie monitora. Tak wi¹c nasz program sprowadzi si¹ do: zadeklarowania, jaki tekst chcemy wy[wietli, przygotowania parametrów wywoBania procedury systemowej, wywoBania tej|e procedury, zakoDczenia programu, czyli oddania sterowania systemowi operacyjnemu. 18 Praktyczny kurs asemblera 2.1.  Hello, world! pod systemem operacyjnym MS DOS Najprostszy program asemblerowy, który w okienku wirtualnego systemu MS DOS bdz na caBym ekranie wy[wietli |dany napis, mo|e mie nast¹pujc posta: Spróbujmy teraz kolejno obja[ni poszczególne linie programu. Od razu mo|na zauwa- |y szczególn rol¹ znaku [rednika ( ). Za tym znakiem umieszcza b¹dziemy komen- tarz obja[niajcy dziaBanie programu, który nie jest analizowany przez asembler. Im wi¹cej b¹dzie tego komentarza i im bardziej b¹dzie wyczerpujcy, tym nasz program b¹dzie bardziej zrozumiaBy dla innych, jak i (po jakim[ czasie) dla nas samych. A teraz wyja[nijmy, co oznaczaj poszczególne linie programu: Procesor Pentium narzuca pewn specyficzn, segmentow organizacj¹ pami¹ci operacyjnej. Dyrektywa pozwala w prosty sposób zdefiniowa tzw. model pami¹ci, czyli sposób zorganizowania segmentów w naszym programie. Parametr informuje, |e w naszym programie b¹dziemy mieli do dyspozycji jeden segment z kodem programu oraz jeden segment z danymi. Ta dyrektywa powoduje, |e asembler (program tBumaczcy) zezwoli na u|ywanie w programie zbioru instrukcji procesora 80386 (a wi¹c tak|e procesora Pentium). W naszym prostym przykBadzie mogliby[my pomin t¹ dyrektyw¹, wtedy jednak asembler akceptowaBby jedynie instrukcje procesora 8086. WpByn¹Boby to jedynie na nieco inne przetBumaczenie obja[nionej poni|ej makroinstrukcji , jednak bez zmiany jej znaczenia w programie. Dyrektywa definiujca pocztek segmentu z danymi. RozdziaB 2. f& Zaczynamy typowo  wiedzc niewiele, uruchamiamy& 19 Linia programu deklarujca nasz jedyn zmienn, czyli tekst, jaki chcemy wy[wietli na ekranie. SBowo jest zdefiniowan przez nas nazw zmiennej tekstowej, z kolei sBowo jest dyrektyw asemblera informujc, |e zmienna tekstowa jest w rzeczywisto[ci zmienn bajtow. Ka|da z liter wy[wietlanego tekstu umieszczonego w cudzysBowie zamieniona zostanie w procesie asemblacji na odpowiadajcy jej bajt w kodzie ASCII. , to kody ASCII nowej linii oraz powrotu karetki (przesuni¹cia kursora do pocztku linii) wyra|one liczb szesnastkow. Poniewa| do wy[wietlenia komunikatu na ekranie wykorzystamy procedur¹ systemow, BaDcuch znaków zakoDczy musimy kodem ASCII znaku dolara, co zapisali[my: . Brak znaku dolara spowodowaBby, |e wy[wietlane byByby kolejne bajty z pami¹ci operacyjnej zawierajce przypadkowe warto[ci. Dyrektywa koDczy segment danych i deklaruje segment stosu o wielko[ci 256 bajtów (czyli 100 szesnastkowo). Dyrektywa definiujca kolejny segment, tym razem z kodem programu. Pierwsze instrukcje programu powinny zainicjowa odpowiednimi warto[ciami rejestry, które odpowiadaj za rozmieszczenie segmentów w pami¹ci operacyjnej. Program musi mie informacj¹, jaki jest adres pocztku segmentu danych i segmentu stosu (adres pocztku segmentu programu zostanie ustawiony przez system operacyjny w czasie Badowania programu do pami¹ci). Makroinstrukcja predefiniowana zostanie w czasie asemblacji zamieniona na cig instrukcji procesora wpisujcych do rejestrów segmentowych odpowiednie warto[ci. B¹dzie ona równocze[nie informacj, gdzie zaczyna si¹ program. Teraz nastpi gBówna cz¹[ programu. Instrukcje , b¹dce jednymi z najcz¹[ciej u|ywanych w asemblerze, powoduj skopiowanie prawego argumentu w miejsce lewe- go. B¹dzie to przygotowanie parametrów wywoBania podprogramu systemowego, który wywoBamy rozkazem . Rozkaz zaBaduje do rejestru procesora DX adres pocztku zmiennej tekstowej o nazwie w pami¹ci operacyjnej. B¹dzie to adres 16-bitowy (tak wielko[ ma rejestr DX) liczony wzgl¹dem pocztku segmentu danych, nazywany przez niektórych odlegBo[ci w bajtach od pocztku segmentu. Adres ten b¹dziemy nazywa krótko angielskim terminem offset. to tak|e nazwa operatora, który u|yty w omawianej instrukcji powoduje wydzielenie z nazwy tej cz¹[ci adresu. 20 Praktyczny kurs asemblera Wszystkie udost¹pnione programom u|ytkowym funkcje systemu operacyjnego MS DOS wywoBuje si¹ w identyczny sposób, dlatego ich rozró|nienie nast¹puje przez podanie jej numeru w rejestrze AH procesora. Procedura wyprowadzajca na ekran monitora tekst, którego offset umieszczony jest w rejestrze DX, ma numer 9. Instrukcja procesora powoduje wywoBanie specyficznego podprogramu, tzw. podprogramu obsBugi przerwania (ang. interrupt). System operacyjny MS DOS standardowo wykorzystuje rozkaz do wywoBywania udost¹pnionych programom u|ytkowym funkcji (procedur) systemowych, rozró|nianych zawarto[ci rejestru AH. Makroinstrukcja predefiniowana zostanie w procesie asemblacji zamieniona na nast¹pujcy cig instrukcji procesora, który powoduje zakoDczenie programu i oddanie sterowania systemowi operacyjnemu: Jak wida, jest to znane nam ju| wywoBanie procedury systemowej, tym razem o numerze 4c szesnastkowo. W taki sposób koDczy b¹dziemy ka|dy program asemblerowy uruchamiany pod systemem MS DOS. Dyrektywa koDczca program zródBowy, wstrzymujca proces asemblacji. Je|eli w zbiorze z programem zródBowym b¹d jeszcze jakie[ linie programu, to nie b¹d one analizowane. Skoro wiemy ju|, jak wyglda powinien nasz pierwszy program w asemblerze i co oznaczaj poszczególne linie programu zródBowego, to nale|aBoby teraz pokaza, co trzeba zrobi, aby program ten mo|na byBo uruchomi. W celu maksymalnego uprosz- czenia przyjmijmy, |e w wydzielonej kartotece mamy wszystkie niezb¹dne w tym przy- padku programy (zbiory) tak, jak pokazuje to rysunek 2.1. Rysunek 2.1. Zawarto[ kartoteki przed asemblacj RozdziaB 2. f& Zaczynamy typowo  wiedzc niewiele, uruchamiamy& 21 Zbiór o nazwie pierwszy.asm zawiera program zródBowy  Hello, world! . Wyja[nijmy rol¹ pozostaBych zbiorów: ML.EXE  program asemblera, pozwalajcy równocze[nie wywoBa program konsolidujcy LINK.EXE, ML.ERR  zbiór tekstowy z komunikatami asemblera, LINK.EXE  program konsolidujcy (linker), mo|e by wywoBywany automatycznie przez ML.EXE. PrzykBadowa sesja wywoBania z linii komendy MS DOS programu asemblera i linkera zilustrowana jest na rysunku 2.2. Wy[wietlenie zawarto[ci kartoteki pokazuje, |e w wyni- ku asemblacji oraz konsolidacji utworzone zostaBy zbiory pierwszy.obj oraz pierwszy.exe. Rysunek 2.2. WywoBanie asemblera ML.EXE Na razie nie b¹dziemy zajmowa si¹ rozwikBaniem wszystkich komunikatów, które wy[wietliBy si¹ na ekranie. Wa|ne jest, |e nie pojawiB si¹ |aden komunikat o bB¹dzie asemblacji, mo|emy wi¹c zaryzykowa uruchomienie naszego pierwszego programu. Uzyskany efekt ilustruje rysunek 2.3. Rysunek 2.3. Efekt dziaBania programu pierwszy.exe 22 Praktyczny kurs asemblera W linii programu zródBowego mo|e wystpi: instrukcja procesora zwana tak|e rozkazem procesora (np. MOV, INT), dyrektywa sterujca prac asemblera w procesie asemblacji (np. .MODEL, .DATA, .STACK, .CODE, END, .386), lub makroinstrukcja predefiniowana (np. .STARTUP, .EXIT) lub indywidualnie zdefiniowana przez nas (o czym bdzie w nastpnych rozdziaBach) i zamieniona przez asembler na cig instrukcji procesora i dyrektyw asemblera. Funkcje systemu MS DOS udostpnione programom u|ytkowym wywoBuje si roz- kazem INT 21h po wcze[niejszym zaBadowaniu do rejestru AH numeru funkcji. 2.2.  Hello, world! pod systemem operacyjnym Windows Okienkowa wersja naszego pierwszego (nazwiemy go dla rozró|nienia  drugim ) pro- gramu b¹dzie niestety zupeBnie inna. Wynika to z oczywistego faktu, |e tak naprawd¹ to caBy program sprowadza si¹ do wywoBania podprogramu bibliotecznego i nie ma w nim praktycznie |adnych obliczeD. Skoro system operacyjny jest zupeBnie inny, inna jest biblioteka dost¹pnych funkcji, inna wreszcie jest tak|e organizacja pami¹ci opera- cyjnej w przypadku pracy procesora w trybie adresacji wirtualnej z ochron, ponadto system jest wielozadaniowy  zatem nasz program b¹dzie musiaB dostosowa si¹ do wszelkich wynikajcych z tego wymogów. HasBo  Hello, world! wy[wietlimy w od- r¹bnym oknie (a [ci[lej w maBym okienku z komunikatem) wykorzystujc do tego funk- cj¹ API (ang. The Microsoft® Win32® Application Programming Interface). API sta- nowi zbiór dynamicznych bibliotek (DLL), z którego korzystaj wszystkie procesy uruchamiane w systemie Windows. Wi¹cej na ten temat  w jednym z dalszych roz- dziaBów ksi|ki, teraz wystarczy wiedzie, |e aby skorzysta ze wspomnianych funk- cji API, nale|y do programu zródBowego doBczy odpowiednie biblioteki oraz zbiory z deklaracjami tzw. prototypów. Program mógBby1 wyglda nast¹pujco: 1 Podkre[lam sBowo  mógBby wyglda , bowiem podobnie jak w innych j¹zykach programowania ka|dy problem mo|na rozwiza na wiele sposobów. RozdziaB 2. f& Zaczynamy typowo  wiedzc niewiele, uruchamiamy& 23 Podobnie jak poprzednio, wyja[nimy teraz znaczenie poszczególnych linii programu zródBowego, który  co wida na pierwszy rzut oka  kojarzy si¹ raczej z programem w j¹zyku wy|szego poziomu ni| j¹zykiem asemblera, bowiem nie wyst¹puj w nim wprost |adne instrukcje procesora. WspominaBem ju|, |e wynika to z braku w programie jakichkolwiek obliczeD. Program sprowadza si¹ do wywoBania dwóch podprogramów bibliotecznych: MessageBox  wy[wietlenia komunikatu, oraz ExitProcess  zakoDczenia programu. Podobnie jak w programie DOS-owym, dyrektywa ta powoduje mo|liwo[ u|ywania w programie zbioru instrukcji procesora 80386. Nie jest przypadkiem, |e tym razem dyrektywa ta jest pierwsz w programie. Ze wzgl¹du na inny model pami¹ci, zadeklarowany w nast¹pnej linii programu zródBowego, tak kolejno[ dyrektyw b¹dziemy zawsze stosowa na pocztku programu, który ma by uruchomiony pod systemem Windows. Procesor Pentium z systemem operacyjnym Windows pracuje z tzw. pBaskim modelem pami¹ci (ang. flat). Jest to szczególny przypadek modelu segmentowego, dost¹pny w trybie adresacji wirtualnej z ochron. Z kolei drugi parametr okre[la, w jakiej kolejno[ci parametry wywoBania procedur bibliotecznych w naszym programie przekazywane b¹d na stos i w jaki sposób stos b¹dzie opró|niany z tych parametrów. Nie wnikajc na tym etapie rozwa|aD w wi¹ksze szczegóBy, zapami¹tamy, |e taka linia programu b¹dzie si¹ musiaBa zawsze znalez na drugim miejscu po dyrektywie wyboru procesora. Dyrektywa powoduje, |e w nazwach symbolicznych rozró|niane b¹d maBe i du|e litery. Dyrektywa jest niezb¹dna, aby mogBo si¹ odby prawidBowe doBczenie procedur bibliotecznych API. Nast¹pujce po sobie trzy linie programu z dyrektyw powoduj doBczenie do naszego programu zródBowego zbiorów o nazwach odpowiednio: windows.inc, user32.inc oraz kernel32.inc. W zbiorach tych znajduj si¹ (w postaci kodów zródBowych) definicje tzw. prototypów procedur 24 Praktyczny kurs asemblera bibliotecznych i nazw symbolicznych2, które mo|emy doBcza do programu u|ytkowego. Brak tych prototypów i definicji spowodowaBby, |e u|yte w programie nazwy wywoBywanych procedur i niektórych staBych uznane byByby jako niezdefiniowane i w konsekwencji program wynikowy nie mógBby zosta wygenerowany. Dwie linie programu z dyrektyw informuj program konsolidujcy LINK.EXE, jakie moduBy biblioteczne powinien doBczy w procesie konsolidacji, czyli generowaniu zbioru drugi.exe. Dyrektywa definiujca pocztek segmentu danych, w zwizku z pBaskim modelem pami¹ci nazywanym w tym przypadku przez niektórych sekcj z danymi. Podobnie jak w przypadku programu uruchamianego pod systemem operacyjnym MS DOS, nast¹pne linie programu to deklaracje zmiennych tekstowych. Dwie dyrektywy definiuj dwie zmienne tekstowe zainicjowanymi napisami, z których jeden poka|e si¹ na ramce okienka, drugi za[  jako wBa[ciwy komunikat  wewntrz. Podprogram biblioteczny, który wykorzystamy do wy[wietlenia napisu, wymaga, aby tekst koDczyB si¹ bajtem o warto[ci zero (podobnie jak w przypadku funkcji systemu MS DOS znakiem dolara). Pocztek segmentu (sekcji) z kodem programu. Etykieta (czyli adres symboliczny) informujca, |e w tym miejscu powinno rozpocz si¹ wykonywanie programu. Etykieta ta b¹dzie musiaBa dodatkowo wystpi jako argument dyrektywy koDczcej program zródBowy. Dyrektywa pozwala wywoBa procedur¹  przesyBa ona na stos parametry wywoBania i wy[wietla komunikat. Parametrami wywoBania s w tym przypadku kolejno: çø  uchwyt do okna3, w naszym przypadku niepotrzebny i równy zero, çø adres pocztku komunikatu, jaki ma by wy[wietlony, 2 U|yli[my dwóch takich niezdefiniowanych bezpo[rednio w naszym programie nazw: i . 3 Poj¹cie  uchwyt zwizane jest z programowaniem pod systemem operacyjnym Windows i jest niezale|ne od j¹zyka programowania. RozdziaB 2. f& Zaczynamy typowo  wiedzc niewiele, uruchamiamy& 25 çø adres pocztku napisu, jaki ma by na ramce okienka, çø parametr okre[lajcy, jakie standardowe przyciski maj by wy[wietlone (w naszym przypadku jedynie przycisk  OK ). Dyrektywa nale|y do grupy dyrektyw asemblera nawizujcych do konstrukcji typowych dla j¹zyków wysokiego poziomu4. Operator w polu parametrów wywoBania procedury ma w tym przypadku identyczne znaczenie, jak poznany wcze[niej operator w polu argumentu instrukcji procesora. W czasie procesu asemblacji dyrektywa zostanie zastpiona nast¹pujc prost sekwencj instrukcji procesora: Je|eli w programie zródBowym zamiast dyrektywy napiszemy powy|sze instrukcje, koDcowy efekt dziaBania programu b¹dzie oczywi[cie dokBadnie taki sam. Instrukcje procesora przesyBaj argumenty instrukcji na szczyt stosu, skd pobierze go procedura . Procedura wywoBana zostanie typow instrukcj procesora wywoBania podprogramu . WywoBanie procedury koDczcej program. W czasie asemblacji dyrektywa zostanie zastpiona nast¹pujc sekwencj instrukcji: Skoro wiemy ju|, jak powinien wyglda najprostszy program pracujcy pod kontrol systemu Windows, to spróbujmy go uruchomi. Podobnie jak w przypadku poprzednie- go programu uruchomionego pod systemem MS DOS, umie[cimy dla prostoty wszystkie niezb¹dne zbiory w jednej kartotece, tak jak to pokazuje rysunek 2.4. Rysunek 2.4. Zawarto[ kartoteki przed asemblacj 4 Czasem nieco tylko zBo[liwie mówi¹, |e tego typu dyrektywy oddalaj j¹zyk asemblera od prawdziwego asemblera& 26 Praktyczny kurs asemblera Oprócz zbioru z programem zródBowym drugi.asm, programami asemblera ML.EXE, ML.ERR oraz programu konsolidatora LINK.EXE, w kartotece znajdujemy niezb¹dne dla prawidBowej asemblacji zbiory biblioteczne typu .LIB oraz doBczane do programu zródBowego zbiory typu .INC zawierajce wspomniane definicje prototypów i symboli. Aby prawidBowo przeprowadzi proces asemblacji i konsolidacji, musimy wywoBa program asemblera ML.EXE z przeBcznikami, które pozwol wygenerowa zbiory drugi.obj oraz drugi.exe w postaci akceptowanej przez program LINK.EXE oraz sys- tem operacyjny Windows. Ilustruje to rysunek 2.5. Rysunek 2.5. WywoBanie asemblera z przeBcznikami pozwalajcymi wygenerowa program pod system operacyjny Windows Uwa|ny Czytelnik zauwa|yB zapewne, |e u|yli[my tutaj dokBadnie tego samego pro- gramu asemblera, co w poprzednim przykBadzie dla systemu MS DOS. Musieli[my jednak zastosowa inny program konsolidatora LINK.EXE, który uwzgl¹dnia fakt innej ni| w poprzednim przypadku organizacji pami¹ci operacyjnej. Poszczególne przeBcz- niki w naszym przykBadzie maj nast¹pujce znaczenie: /coff çø Zbiór drugi.obj wygenerowany zostanie w formacie Common Object File Format /link çø Kolejne przeBczniki dotyczy b¹d programu konsolidatora /subsystem:windows çø Program wykonalny b¹dzie uruchamiany pod systemem operacyjnym Windows Po sprawdzeniu, |e zbiory drugi.obj i drugi.exe zostaBy rzeczywi[cie utworzone, mo|emy uruchomi nasz program. Rysunek 2.6 pokazuje uzyskany rezultat. Program mo|emy uruchomi zarówno z linii komendy systemu MS DOS, jak i klikajc mysz odpowied- ni ikon¹ w okienku mened|era plików. Warto (tak przy okazji) zwróci uwag¹ na wielko[ zbioru drugi.exe i porówna go z uruchomionym wcze[niej pierwszy.exe. Rysunek 2.6. Efekt wykonania programu drugi.exe RozdziaB 2. f& Zaczynamy typowo  wiedzc niewiele, uruchamiamy& 27 Program asemblerowy, który ma by uruchomiony pod systemem operacyjnym Win- dows, mo|e korzysta z programów bibliotecznych APl, podobnie jak programy pisane w innych jzykach programowania. Program asemblera generujcy zbiór typu .obj nie ró|ni si w tym przypadku od asemblera u|ywanego w przypadku programu uru- chamianego pod systemem MS DOS, cho inne nieco jest jego wywoBanie. Inny natomiast musi by zastosowany program konsolidatora, który uwzgldnia specy- fik stosowanego po systemem operacyjnym Windows modelu pamici. Skoro uruchomili[my ju| dwa pierwsze proste programy, to przed prób zaprojektowa- nia nieco bardziej zBo|onych programów musimy wróci do podstaw i w minimalnej dawce  niezb¹dnej programi[cie  omówi architektur¹ procesora, jego list¹ instruk- cji oraz tryby adresowania argumentów.

Wyszukiwarka

Podobne podstrony:
Krzan Katarzyna Praktyczny kurs pisarstwa
Suworin Aleksiej Praktyczny kurs leczenia głodem
Praktyczny kurs pisarstwa
Praktyczny kurs programowania w Delphi
Praktyczny Kurs Pisarstwa
Praktyczny Kurs Pisarstwa (pisanie, twórczość, proza)
praktyczny kurs szybkiego czytania
Praktyczny kurs pisarstwa

więcej podobnych podstron