Kurs programowania w asemblerze


Informacje podstawowe

Wstęp

Na łamach tego kursu postaram się wytłumaczyć podstawowe informacje na temat języka Asembler. Znajdą tutaj informacje zarówno początkujący, jak i zaawansowani programiści. Jednakże ze względu na to, że przychodziło wiele listów odnośnie tego kursu, że jest mało zrozumiały, postaram się tłumaczyć poszczególne zagadnienia dokładniej, od samych podstaw, krok po kroku.

Zacznijmy od tego, co nam będzie potrzebne, tzn. jakie narzędzia musimy posiadać, aby móc pisać programy. Asembler mimo iż jest językiem niskiego poziomu potrzebuje tzw. kompilatora, który przetłumaczy kod zrozumiały przez nas (kod asemblera), na kod maszynowy, czyli taki, jaki "rozumie" komputer, a dokładnie procesor. Są takie programy, jak HIEW, które potrafią tłumaczy kod asemblerowy na maszynowy podczas wprowadzania programu, jednak nie nadają się one dla początkujących. My nasze programy będziemy kompilować przy pomocy programu TASM i konsolidować programem TLINK. Jeśli masz zainstalowanego Turbo Pascal-a albo Borland C++, znajdziesz oba te narzędzia w katalogu BIN.

Kompilator TASM jest kompilatorem bardzo rozbudowanym. Posiada bardzo wiele funkcji. Można nim tworzyć programy z rozszerzeniem OBJ. Takich programów nie da się jeszcze uruchomić. Trzeba je później skonsolidować używając programu TLINK.

Jeśli więc napiszemy program w dowolnym edytorze ASCII i zapiszemy pod nazwą PRG.ASM, to by go skompilować piszemy:

TASM PRG.ASM

Zostanie wygenerowany plik PRG.OBJ. Teraz trzeba go skonsolidować. Piszemy:

TLINK PRG.OBJ

Powstaje plik PRG.EXE, który już możemy uruchomić. Jeśli chcemy wygenerować plik COM, piszemy:

TLINK /t PRG.OBJ

Teraz powstanie plik PRG.COM

Istnieje jeszcze bardzo wiele innych kompilatorów. Bardzo znany jest A86. Potrafi on kompilować zbiory ASM od razu na COM-y lub OBJ. Piszemy wówczas:

A86 PRG.ASM

Powstanie plik PRG.COM

Struktura programu

Każda linijka programu napisanego w asemblerze ma następującą budowę:

[ETYKIETA:] [KOD OPERACJI] [ARGUMENTY] [;KOMENTARZ]

Wszystkie elementy instrukcji mogą występować w dowolnym miejscu linii, ale w podobnej kolejności i każdy musi być oddzielony od sąsiednich przynajmniej jedną spacją (odstępem). Ogólna długość instrukcji nie może być dłuższa niż 128 znaków. Nie można również kontynuować jednej instrukcji w następnym wierszu. Każda linia, to jedno polecenie.

np.:

PRZESLIJ: MOV AX,LICZNIK ;odtwarza licznik

W powyższym przykładzie kodem operacji jest MOV, argumentami są: rejestr AX i adres pola o nazwie LICZNIK. Pierwszy argument nazywamy argumentem docelowym, zaś drugi źródłowym. Argument źródłowy nigdy nie zmienia swojej wartości, natomiast docelowy prawie zawsze. Instrukcja z przykładu ma etykietę o nazwie PRZESLIJ i komentarz opisujący jej sens. Początek komentarza zaczyna się zawsze średnikiem. Wszystko, co jest napisane za średnikiem nazywamy więc komentarzem i nie jest to brane pod uwagę podczas generowania kodu wynikowego.

PRZESLIJ:
MOV AX,LICZNIK

Każda etykieta zakończona jest dwukropkiem. W jej nazwie można używać liter, cyfr i znaków specjalnych. Nie można natomiast zacząć nazwę etykiety cyfrą. Trzeba ją poprzedzić innym znakiem.

Systemy liczbowe

By biegle władać asemblerem trzeba zapoznać się z przynajmniej dwoma systemami liczbowymi:

System dwójkowy

W systemie dwójkowym dostępne są tylko dwie wartości 0 i 1. Wystarczają one jednak na zapisanie dowolnej liczby. Najmniejszy składnik pamięci - bit może przyjmować właśnie jedną z tych wartości. Jest wiele metod przeliczania liczb pomiędzy systemami liczbowymi. Ja przedstawię chyba najprostsze. Poniższa tabela powinna ułatwić konwersje z systemu binarnego na dziesiętny:

27 26 25 24 23 22 21 20
128 64 32 16 8 4 2 1

Liczba 10112 będzie więc:

1*20+1*21+0*22+1*23=1*1+1*2+0*4+1*8=1+2+8=1110

Zacznijmy od tego, że numer bitu zawsze liczymy od strony prawej do lewej, rozpoczynając numerowanie od zera. Stąd, aby dokonać konwersji każdy bit (po kolei od prawej) mnożymy przez dwa do potęgi [numer_bitu]. Ot, cała sztuka! :)

By przeliczyć z systemu dziesiętnego na binarny można posłużyć się również tabelką. Jest jednak na to prostszy sposób. Daną liczbę dziesiętną dzielimy przez dwa. Jeśli wynik jest całkowity, to zapisujemy sobie 0, jeśli ma resztę, to zapisujemy 1 i "ucinamy" resztę. Teraz wykonujemy tą czynność tak długo, aż dojdziemy do 0, np. liczbę 1110 przeliczymy tak:

11 : 2 = 5.5 (bit3=1) 5 : 2 = 2.5 (bit2=1) 2 : 2 = 1 (bit1=0) 1 : 2 = 0.5 (bit0=1) 0 - koniec

Spisujemy bity: 10112 = 1110

Aby zapisać liczbę binarną w asemblerze, musimy przy jej zapisie używać tylko zer i jedynek oraz zakończyć ją znakiem B (binary), np.

MOV AX,1001B

System szesnastkowy

Podczas programowania w asemblerze bardzo często używa się systemu szesnastkowego. Ma on bardzo wiele zalet. Jest przejrzysty i prosty. W systemie tym mamy do dyspozycji cyfry od 0 do 9 i litery od A do F. Poniższa tabela pokazuje wartości dziesiętne poszczególnych liter:

DziesiętnySzesnastkowy
00
11
22
33
44
55
66
77
88
99
10A
11B
12C
13D
14E
15F

Przeliczać w tym systemie możemy tak jak w systemie binarnym przy pomocy tabelki. Mnożymy dany znak (licząc od prawej) prze 16 do potęgi [numer_znaku]., np. liczba C316 w systemie dziesiętnym wynosi:

3*160+C*161=3*1+12*16=3+192=19510

Każdą liczbę heksadecymalną zapisujemy w asemblerze kończąc ją literką H i jeśli dana liczba zaczyna się literą poprzedzamy ją cyfrą 0, np.:

MOV AH,34H 
MOV DX,0C2H 
MOV CX,3FH

W miarę zagłębiania się w zakątki asemblera, będziesz musiał poznać jeszcze inne elementy związane z systemami liczbowymi, m.in.:

W tym celu zajrzyj do strony SŁOWNIK.


Autor: Karol Wierzchołowski, opracowano: 12.01.2002 r. Wszelkie prawa zastrzeżone.
Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?