Przyk³adowy szkielet programu wygl±da w ten sposób :

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
Teraz zajmijmy siê obja¶nieniem paru spraw.

.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.

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
A teraz czas na analizê kodu wy¿ej przedstawionego.

Zobaczmy na :

Kod:
INCLUDE \masm32\include\windows.inc
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.

INVOKE, moim zdaniem jest lepsze ni¿ funkcja call, poniewa¿ assembler informuje Ciê o pope³nionym b³êdzie. Sk³adnia Invoke jest nastêpuj±ca :

Kod:
INVOKE wyra¿enie [,jakis_argument]
Czyli np. INVOKE ExitProcess, NULL

Prototyp funkcji MessageBox ma nastêpuj±c± postaæ :

Kod:
MessageBox PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD
hwnd - handle czyli uchwyt programu, mo¿esz to traktowaæ jako liczbê, która bêdzie Ci reprezentowa³a okno twojego programu.
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 zasad System 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 :

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
Innej kolejno¶ci nie ma.

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.