Przyk³adowy szkielet programu wygl±da w ten sposób :
Teraz zajmijmy siê obja¶nieniem paru spraw.Kod:.386.MODEL FLAT, STDCALL OPTION CASEMAP:NONE .DATA; twoje zainicjowane dane .DATA?; twoje niezainicjowane dane .CONST; sta³e .CODE; twój kod ¼ród³owy programu start :; etykieta END start; koniec etykiety
.386 - dyrektywa procesora, informuj±ca assembler aby korzystaæ z instrukcji procesora o numerze 80386.
.MODEL FLAT, STDCALL.
.MODEL - dyrektywa assemblera okre¶laj±ca pamiêæ twojego programu. W Windows32 istnieje tylko 1 model pamiêci, a zwie siê on jak wcze¶niej wspominali¶my FLAT.
STDCALL - konwencja przekazywania parametrów dla procedur oraz funkcji, umieszcza parametry na stosie od lewej do prawej lub od prawej do lewej.
.DATA - zawiera zainicjowane dane twojego programu.
.DATA? - zawiera niezainicjowane dane twojego programu.
.CONST - zawiera deklaracje sta³ych, u¿ywanych przez Twój program.
.CODE - zawiera twój kod programu
Etykieta - jest dowoln± etykiet± do okre¶lenia zasiêgu twojego kodu.
END etykieta - koniec kodu ¼ród³owego
Po wyja¶nieniu wszystkiego, czas teraz napisaæ jaki¶ program. Aby napisaæ jaki¶ program, przyda nam siê MASM32, mo¿na go pobraæ na www.protools.cjb.net
Po zainstalowaniu MASMA, pliki bêdziemy zapisywaæ do jego folderu, nigdzie indziej, bo przy kompilacji mog± wyst±piæ b³êdy.
¬ród³o zwyk³ego programu, wy¶wietlaj±cego okienko z tytu³em jaki sobie ustalimy tekstem i przyciskiem OK oraz jego analiza.
A teraz czas na analizê kodu wy¿ej przedstawionego.Kod:.386; dyrektywa procesora informuj±ca assembler aby korzystaæ z 80386 .MODEL FLAT, STDCALL; dyrektywa okre¶laj±ca pamiêæ twojego programu OPTION CASEMAP:NONE; dodatek, du¿e i ma³e litery s± brane pod uwagê INCLUDE include\windows.inc; do³±czamy windows.inc INCLUDE include\kernel32.inc; do³±czamy kernel32.inc INCLUDELIB lib\kernel32.lib; do³±czamy kernel32.lib INCLUDE include\user32.inc; do³±czamy user32.inc INCLUDELIB lib\user32.lib; do³±czamy user32.lib .DATA; zainicjowane dane MsgBoxCaption DB "Program w Assemblerze",0; tytu³ okna MsgBoxText DB "Moj pierwszy program w Assemblerze",0; tekst w oknie .CODE; kod ¼ród³owy programu start:; etykieta INVOKE MessageBox, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK; wywo³anie ; okienka INVOKE ExitProcess, NULL; wy³±czenie programu END start; koniec etykiety
Zobaczmy na :
Bo jest to dla nas nowo¶æ, nie omawia³em tego wcze¶niej. A mianowicie plik windows.inc zawiera definicje sta³ych i struktur niezbêdnych do programowania w jêzyku assembler.Kod:INCLUDE \masm32\include\windows.inc
INVOKE, moim zdaniem jest lepsze ni¿ funkcja call, poniewa¿ assembler informuje Ciê o pope³nionym b³êdzie. Sk³adnia Invoke jest nastêpuj±ca :
Czyli np. INVOKE ExitProcess, NULLKod:INVOKE wyra¿enie [,jakis_argument]
Prototyp funkcji MessageBox ma nastêpuj±c± postaæ :
hwnd - handle czyli uchwyt programu, mo¿esz to traktowaæ jako liczbê, która bêdzie Ci reprezentowa³a okno twojego programu.Kod:MessageBox PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD
lpText - jest to wskazanie tekstu, który ma byæ wy¶wietlany w twoim oknie
lpCaption - poprostu tytu³ twojego okienka
uType - okre¶la liczbê u¿ytych w twoim programie przycisków
ADDR - obs³uguje zmienne lokalne, jego przeciwieñstwem jest mo¿e wam znany OFFSET. Zmienne lokalne s± jedynie pewnym miejscem zarezerwowanym na stosie waszego procesora. Adres ten, bêdzie tylko znany w trakcie uruchomionego siê programu. Natomiast operator OFFSET, przetwarzany jest podczas procesu assemblacji przez wybrany przez was assembler. Jak mówi³em jest to przeciwieñstwo ADDR, czyli nie funkcjonuje on na zmiennych lokalnych.
Informacje na temat plików DLL.
Kernel32.dll zawiera funkcje API obs³uguj±ce zarz±dzanie pamiêci± oraz procesami.
User32.dll zawiera funkcje obs³uguj±ce aspekty interfejsu u¿ytkownika dla twojego programu.
Gdi32.dll jest odpowiedzialna za operacje graficzne.
Rejestry. Je¶li programujemy w Windows32 musimy znaæ kilka prostych zasadSystem Windows wykorzystuje dla swoich potrzeb rejestry takie jak esi, edi, ebp, ebx. Je¶li u¿ywasz którego¶ z tych rejestrów w funkcji zwrotnej np. callback to nie mo¿esz go zapomnieæ odtworzyæ przed powrotem.
Konwencja typu C & Pascal :
Innej kolejno¶ci nie ma.Kod:push [p3]; Umie¶æ na stosie trzeci parametr push [p2]; Umie¶æ na stosie parametr 2 push [p1]; Oraz pierwszy call foo add sp, 12; Po wykonaniu, usuñ parametry ze stosu
Rejestry:
Accumulator
32 bitowe - eax
16 bitowe - ax
8 bitowe - ah, al
U¿ywamy ich do operacji arytmetycznych & logicznych
Base
32 bitowe - ebx
16 bitowe - bx
8 bitowe - bh, bl
U¿ywamy ich jako podstawê do wyznaczenia adresu
Counter
32 bitowe - ecx
16 bitowe - cx
8 bitowe - ch, cl
U¿ywany do zliczania liczb przej¶æ pêtli (np. LOOP i REP)
Data
32 bitowe - edx
16 bitowe - dx
8 bitowe - dh, dl
Rejestry stosu:
Base Pointer -
32 bitowe - ebp
16 bitowe - bp
Wska¼nik u¿ywany przy adresowaniu pamiêci.
Stack Pointer
32 bitowe - esp
16 bitowe - sp
Wska¼nik stosu.
Rejestry wska¼nikowe
Source Index
32 bitowe - esi
16 bitowe - si
Wskazuje miejsce w pamiêci, sk±d s± przesy³ane dane.
Destination Index
32 bitowe - edi
16 bitowe - di
Wskazuje miejsce w pamiêci, dok±d s± przesy³ane dane.
Instruction Pointer
32 bitowe - eip
16 bitowe - ip
Wskazuje nastêpn± instrukcjê w segmencie.
Zachêcam was do nauki assemblera, bo warto.


