Asembler jest bardzo specyficznym jΩzykiem programowania. Jego konstrukcja wydaje siΩ jak by lekko zdzicza│a. Nie ma siΩ co dziwiµ - jest on jednym z najstarszych jΩzyk≤w programowania. Pisz▒c w nim programy dotykasz serca komputera - mikroprocesora. Programy w Asemblerze tworzy siΩ r≤wnie┐ w specyficzny spos≤b. Najpierw piszesz kod ╝r≤d│owy programu w edytorze tekstowym. NastΩpnie poddajesz go kompilacji, w wyniku kt≤rej (je┐eli kompilator nie stwierdzi ┐adnych b│Ωd≤w w kodzie) otrzymasz plik z rozszerzeniem *.obj. NastΩpnie, w celu otrzymania programu w postaci ko±cowej (czyli mo┐liwej do uruchomienia), plik *.obj poddajesz linkowaniu. I znowu, je┐eli linker nie stwierdzi ┐adnych b│Ωd≤w - otrzymasz wreszcie sw≤j program w postaci pliku *.exe. OK. Po kolei. poni┐ej znajduje siΩ przyk│ad programu. Wiersze zaczynaj▒ce siΩ od znaku ; (╢rednik) s▒ pomijane przez kompilator. Mo┐esz w nich umie╢ciµ sw≤j w│asny komentarz.
Jak wiadomo, aby napisaµ program trzeba znaµ jΩzyk, w kt≤rym siΩ go pisze. Im lepiej bΩdziesz go zna│, tym lepsze programy bΩdziesz m≤g│ pisaµ. Jednak zawsze trzeba od czego╢ zacz▒µ. Przedstawione poni┐ej instrukcje to naprawdΩ minimum, kt≤re musisz znaµ. Jednak nie ograniczaj siΩ tylko do nich, bo nic nie osi▒gniesz. Pog│Ωbiaj swoj▒ wiedzΩ, a zapanujesz nawet nad mikroprocesorem.
Programowanie w Asemblerze polega na odpowiednim operowaniu na rejestrach procesora. Pierwszymi rejestrami s▒:
- AX - jest rejestrem 16 bitowym, sk│ada siΩ z dw≤ch rejestr≤w AH (8 bitowy) i AL (8 bitowy), rejestr ten jest wykorzystywany najczΩ╢ciej do operacji arytmetycznych,
- BX - jest rejestrem 16 bitowym, sk│ada siΩ (tak jak AX) z dw≤ch rejestr≤w 8 bitowych: BH i BL. Wykorzystuje siΩ je przy adresowaniu pamiΩci.
- CX - 16 bitowy, dzieli siΩ na CH i CL. Wykorzystuje siΩ go jako licznik.
- DX - 16 bitowy, dzieli siΩ na DH i DL. Wykorzystywany zw│aszcza do odbierania i wysy│ania danych z port≤w.

To by│y podstawowe rejestry, na kt≤rych bΩdziesz operowa│. Istniej▒ jeszcze:
- SI - rejestr wskazuj▒cy miejsce w pamiΩci, z kt≤rego przesy│a siΩ dane
- DI - rejestr wskazuj▒cy miejsce w pamiΩci do kt≤rego przesy│a siΩ dane
- SP - rejestr wskazuj▒cy stos; wska╝nik stosu
- BP - rejestr u┐ywany do adresowania pamiΩci
- IP - rejestr wskazuj▒cy instrukcje; wska╝nik instrukcji
- CS - rejestr zawieraj▒cy segment aktualnie wykonywanego rozkazu
- DS - rejestr zawieraj▒cy segment z danymi
- ES - rejestr zawieraj▒cy segment wykorzystywany przy dzia│aniu z wiΩkszymi danymi
- SS - rejestr zawieraj▒cy segment stosu

Opr≤cz tych wszystkich rejestr≤w niezwykle wa┐n▒ rolΩ odgrywaj▒ znaczniki. Znaczniki s▒ bitami ustawianymi tylko wtedy, gdy zosta│ spe│niony jaki╢ warunek. A oto one:
- O - znacznik przeci▒┐enia, ustawiany przy wyst▒pieniu przeci▒┐enia w operacjach arytmetycznych
- D - znacznik kierunku okre╢laj▒cy, czy dane bΩd▒ przesy│ane wed│ug adres≤w rosn▒cych czy te┐ malej▒cych
- I - znacznik zezwolenia przerwania
- T - znacznik pracy krokowej, okre╢la, czy program zostanie wykonany instrukcja po instrukcji, krok po kroku czy te┐ wszystko na raz
- S - znacznik znaku zawieraj▒cy znak wyniku operacji arytmetycznej
- Z - znacznik zera ustawiany, je╢li ostatnia operacja arytmetyczna da│a w wyniku zero
- A - znacznik przeniesienia po│≤wkowego
- P - znacznik parzysto╢ci
- C - znacznik przeniesienia

Ok. To tyle wstΩpu. Czas wzi▒µ siΩ do pracy. Poni┐ej przyk│adowy programik i om≤wienie instrukcji w nim wykorzystywanych.

;
; Program NapisData utworzenia: 3.X.2000
;Autor: PhoeniX E-mail: red_red_phoenix@kki.net.pl
;Opis: Program za pomoc▒ przerwania 21H wy╢wietla serie napis≤w przy u┐yciu funkcji nr 9
;

Powy┐ej znajduje siΩ tzw. metka. Powinna ona zawieraµ informacjΩ o programie, np.: jego nazwΩ. Dobrze jest te┐ podaµ datΩ powstania programu oraz adres e-mail. Mo┐na te┐ zamie╢ciµ kr≤tki opis programu i jego ewentualne specyfikacje.

.Model Tiny
.Stack 80H
.Data
Napis_1 DB 'Napis pierwszy',13,10,'$'
Napis_2 DB 'Napis drugi',13,10,'$'
Napis_3 DB 'Napis trzeci',13,10,'$'
Napis_4 DB 'Napis czwarty','$'
Napis_5 DB 'Kolejny napis','$'
Napis_6 DB 'I jeszcze jeden napis',13,10,'$'
Napis_7 DB '',13,10,'$'

Polecenia zaczynaj▒ce siΩ od kropki to tzw. dyrektywy. S▒ one brane pod uwagΩ w pierwszej kolejno╢ci przez kompilator. Poprzez dyrektywy kompilator wie, kt≤ra czΩ╢µ programu znajduje siΩ w danym miejscu oraz jak siΩ ma na niego "patrzeµ". Pierwsza dyrektywa deklaruje wielko╢µ pamiΩci wykorzystywanej, a raczej zarezerwowanej dla tego programu. Dyrektywa .Stack okre╢la rozmiar pamiΩci przydzielonej na stos. Dyrektywa .Data informuje kompilator, ┐e w tym miejscu znajduj▒ siΩ zmienne [lub sta│e] wykorzystywane w programie. Napis_1 - nazwa zmiennej. DB - deklaruj bajt, DW oznacza z kolei - deklaruj s│owo (czyli 2 bajty), DD - deklaruje podw≤jne s│owo (4 bajty). Po instrukcji DB znajduje siΩ ci▒g znak≤w rozpoczynaj▒cy siΩ cudzys│owem i nim ko±cz▒cy. Liczby 13,10 to kod instrukcji maszynowej, kt≤ra informuje "program", ┐e nastΩpny tekst ma zostaµ wy╢wietlony w nastΩpnym wierszu. Znak $ (dolara) informuje o ko±cu │a±cucha.

.Code
czekaj proc
mov cx,99H
mov dx,99H
mov ah,86H
int 15H
ret
czekaj endp

Dyrektywa .Code informuje kompilator, ┐e w tym miejscu zaczyna siΩ w│a╢ciwy kod programu. NastΩpnie jest podana nazwa procedury (w tym wypadku: czekaj proc). Instrukcja proc informuje, ┐e tu siΩ zaczyna procedura, a instrukcja endp - oznacza jej koniec. W procedurze s▒ zawarte r≤┐ne instrukcje, dziΩki czemu nie musisz pisaµ wszystko na nowo, lecz wystarczy wywo│aµ procedurΩ. Efekt bΩdzie dok│adnie taki sam z tym, ┐e mniej pisania. instrukcja mov cx,99H powoduje umieszczenie w rejestrze cx warto╢ci 99H (H - oznacza, ┐e liczba jest podana w systemie szesnastkowym). NastΩpna instrukcja umieszcza 99H w rejestrze dx. Mov ah,86H-warto╢µ 86H zostaje umieszczona w rejestrze ah. rejestry (np. rejestr ax) dziel▒ siΩ na 2 czΩ╢ci: starsz▒ (np. ah) i m│odsz▒ (np. al). W starszej znajduje siΩ numer funkcji danego przerwania. Np. numer funkcji 86H przerwania 15H oznacza wykonanie pustej pΩtli trwaj▒cej dok│adnie tyle sekund, ile zosta│o podane w rejestrach cx i dx. W tym przypadku mamy 9,9 sekund. Funkcja ta jest wywo│ana przerwaniem 15H. Ka┐de przerwanie ma swoje specyficzne funkcje, kt≤re mo┐e wywo│aµ. Instrukcja ret oznacza powr≤t z procedury i przekazanie sterowania dalszej czΩ╢ci programu. Endp - ko±czy procedurΩ. 

przerwa proc
mov ax, seg napis_7
mov ds,ax
mov ah,9
mov dx,offset napis_7
int 21H
ret
przerwa endp

Mov ax,seg napis_7 - ustalenie segmentu, w kt≤rym znajduje siΩ zmienna napis_7. Mov ds,ax - umieszczenie danych w segmencie danych. Mov ah,9 - warto╢µ 9 zostaje umieszczona w rejestrze ah. Mov dx,offset napis_7 - ustalenie offsetu, w kt≤rym znajduje siΩ zmienna napis_7 (ustalenie offsetu i segmentu daje w wyniku rzeczywisty adres kom≤rki pamiΩci, gdzie znajduje siΩ zmienna napis_7). Int 21H - wywo│anie przerwania, kt≤re obs│uguje, miΩdzy innymi, wy╢wietlenie napisu (funkcja 9). Zauwa┐, ┐e wszystkie funkcje, kt≤re musz▒ zostaµ wykonane, musz▒ byµ umieszczone w starszej czΩ╢ci rejestru, w tym przypadku jest to ah. Instrukcja ret - powr≤t z procedury. Poni┐ej wszystkie procedury wykonuj▒ dok│adnie to samo, wiΩc nie bΩdΩ ich omawia│.

jeden proc 
mov ax,seg napis_1 
mov ds,ax 
mov ah,9 
mov dx,offset napis_1 
int 21H 
ret 
jeden endp 
dwa proc 
mov ax,seg napis_2 
mov ds,ax 
mov ah,9 
mov dx,offset napis_2 
int 21H 
ret 
dwa endp 
trzy proc 
mov ax,seg napis_3 
mov ds,ax 
mov ah,9 
mov dx,offset napis_3 
int 21H 
ret 
trzy endp 
cztery proc 
mov ax,seg napis_4 
mov ds,ax 
mov ah,9 
mov dx,offset napis_4 
int 21H 
ret 
cztery endp 
piec proc 
mov ax,seg napis_5 
mov ds,ax 
mov ah,9 
mov dx,offset napis_5 
int 21H 
ret 
piec endp 
szesc proc 
mov ax,seg napis_6 
mov ds,ax 
mov ah,9 
mov dx,offset napis_6 
int 21H 
ret 
szesc endp 

Start: 

call jeden 
call czekaj 
call przerwa
call dwa
call czekaj
call przerwa
call trzy
call czekaj
call przerwa
call cztery
call przerwa
call czekaj
call piec
call przerwa
call czekaj
call szesc
mov ah,4CH
int 21H
END Start

W Asemblerze istnieje co╢ w rodzaju kotwic. S▒ to tzw. etykiety. DziΩki nim, kompilator wie od czego mo┐e siΩ zaczynaµ wykonywanie programu. Instrukcja call jeden powoduje wywo│anie procedury o nazwie jeden. Dalej znajduj▒ siΩ nastΩpne instrukcje call wywo│uj▒ce odpowiednie procedury. Mov ah,4Ch - umieszczenie warto╢ci 4Ch w rejestrze ah. Int - 21H - wywo│anie przerwania 21H, kt≤re wykona funkcjΩ umieszczon▒ w rejestrze ah. W tym przypadku bΩdzie to zako±czenie programu. End Start - dyrektywa end informuje kompilator, ┐e w tym miejscu ko±czy siΩ kod ╝r≤d│owy programu. S│owo start umieszczone po instrukcji end "m≤wi", ┐e w│a╢ciwy program zaczyna siΩ od etykiety Start.

Tak. Jeste╢ a┐ tutaj? Nie znudzi│o CiΩ? To gratulujΩ! W ten oto spos≤b rozpocz▒│e╢/│a╢ przygodΩ z Asemblerem. Jak siΩ ona dalej potoczy - to zale┐y tylko i wy│▒cznie od Ciebie...

PhoeniX 
red_red_phoenix@kki.net.pl