Kurs Assemblera by Skowik3




Kurs Assemblera by Skowik

















var napis=new Array("W","S","T","E","P","","","",""," ","","","","","");
var kolory=new Array("EEEE00","FFCC00","FFBB00","FFAA00","FF9900",
"FF7700","FF5500","FF3300","FF1100","FF0011",
"FF0033","FF0055","FF0077","FF0099","FF00AA","FF00CC",
"EE00EE","CC00FF","AA00FF","9900FF","7700FF","5500FF","3300FF");
for(i=0; i< 15; i++)
document.write(napis[i].fontcolor(kolory[i]));


Kurs ten jest kompedium wiedzy wraz
przykładami na temat programowania w assemblerze. Znajdą tutaj informacje
początkujący, jak i zaawansowani programiści. Postaram się na ile to możliwe
wytłumaczyć wszystko od podstaw, krok po kroku.

Zacznijmy od tego, co będzie potrzebne do programowania w tym języku.
Assembler mimo iż jest językiem niskiego poziomu potrzebuje kompilatora, który
przetłumaczy kod zrozumiały przez nas, na kod maszynowy, czyli taki, jaki
rozumie komputer, a dokładnie procesor. Są takie programy, jak , 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. Możesz je sobie ściągnąć z
tej strony. Pliki TASM i TLINK znajdują się też w Borland Pascalu i Turbo C w
katalogach 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 (może to być
notatnik,lub edytor w NC) i zapiszesz pod 8 literową nazwą z rozszerzeniem
*.ASM, to by go skompilować piszesz:
TASM nazwa.ASM

Zostanie wygenerowany plik PRG.OBJ. Teraz trzeba go skonsolidować.
Piszemy:
TLINK nazwa.OBJ
Powstaje plik o rozszerzeniu EXE, który już możemy normalnie uruchomić. Jeśli
chcemy wygenerować plik COM, to piszemy:
TLINK /t PRG.OBJ
Teraz powstanie plik PRG.COMIstnieje jeszcze bardzo wiele innych
kompilatorów. Bardzo znanym jest A86 (do ściągnięcia z tej strony). Potrafi on
kompilować zbiory ASM od razu na COM-y lub OBJ. Piszemy wówczas:

A86 nazwa.ASM
Powstanie plik COM
Programy możemy też kompilować przy pomocy dwuch programów: SAC.EXE i
KOMPILUJ.EXE obydwa te programy muszą znajdować się w tym samym katalogu co TASM
i TLINK.Program SAC(do ściągnięcia wersja beta) jest programem pod systemy
WINDOWS 9.x , można w nim pisać ja w normalnym edytorze teksu , ma on jednakże
pewne ograniczenia co do długości nazwy pliku *.asm oraz długości ścieżki
dostępu(zbyt długa nazwa katalogu też powoduje błąd kompilacji).Program
kompiluj.exe jest bardzo prostym programem pod system DOS. Wymaga on jedynie
podania nazwy pliku który ma być skompilowany. Obydwa te programy są do
ściągnięcia z tej strony wraz z Tasmem Tlinkiem i Tdebagerem.(680 kB)

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

Etykieta jest opcjonalna, tzn. jej obecność nie jest obowiązkowa. Służy ona
do tego, by móc przekazywać sterowanie (skok) do danej instrukcji. Etykieta może
zajmować również oddzielną linię, np.:

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.Więcej o etykietach w dalszej części
kursu.

Systemy
liczboweAby wiedzieć o co chodzi w niektórych instrukcjach
assemblera lub wiedzieć gdzie nastąpił błąd w programie trzeba znać system
dwójkowy i szesnastkowy.

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
zawierać właśnie jedną z tych wartości. Jest wiele metod przeliczania. Poniższa
tabela powinna ułatwić przeliczanie z systemu binarnego na dziesiętny:






216

215

214

213

212

211

210

29

28
27

26

25

24

23

22

21

20


65536

32768

16384

8192

4096

2048

1024

512

256

128

64

32

16

8

4

2

1

Liczba 1011 będzie więc:
1*20+1*21+0*22+1*23=1*1+1*2+0*4+1*8=1+2+8=11
Numer bitu zawsze liczymy od prawej w lewo. Teraz każdy bit (po kolei od
prawej) mnożymy przez dwa do potęgi [numer_bitu]. Trzeba dodać, że bity
numerujemy od 0.
Aby 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 daną resztę. Teraz wykonujemy tą czynność tak długo,
aż dojdziemy do 0, np. liczbę 11 przeliczymy tak:
11 : 2 =5.5 (bit0=1)5 : 2 = 2.5 (bit1=1)2 : 2 = 1 (bit2=0)1 : 2 =
0.5 (bit3=1)0 - koniec
Bity w liczbach całkowitych spisujemy zawsze od dołu do góry.
A więc gdy spiszemy bity: 1011b = 11d
Jeśli chcemy zapisać liczbę binarną w asemblerze, to musimy w niej używać
tylko zer i jedynek oraz zakończyć ją znakiem B (binary), np.
MOV AX,1001B

System szesnastkowy
W Asemblerze używa się głównie 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ętny

Szesnastkowy


0

0


1

1


2

2


3

3


4

4


5

5


6

6


7

7


8

8


9

9


10

A


11

B


12

C


13

D


14

E


15

F


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 C3 w systemie dziesiętnym wynosi:
3*160+C*161=3*1+12*16=3+192=195

Każdą liczbę heksadecymalną w Asemblerze zapisujemy kończąc literką H i jeśli
dana liczba zaczyna się literą poprzedzamy ją cyfrą 0, np.:
MOV AH,34HMOV DX,0C2HMOV CX,3FH
Bardzo łatwe jest przechodzenie z systemu dwójkowego na szesnastkowy i
odwrotnie.Aby przejść z systemu dwójkowego na szesnastkowy należy pogrupować
sobie liczby w czwórki zaczynając od zerowego bitu a następnie każdą czwórkę
zamienić na system szesnastkowy. Jeżeli zdarzyłoby się że nie umiemy uzyskać
czwórki bitów to na początek do dajemy tyle zer ile brakowało nam do czwórki
bitów. np. mamy liczbe binarną: 1100011010B dzielimy tą liczbę na
czwórki 0011 0001 1010następnie czwórki zamieniamy 3 1 A wyszło nam
że liczba 1100011010B=31AHPrawda , że proste ? a długość zapisu zmniejszyła
się 4-krotnie i poprawiła się czytelność, dlatego w assemblerze używamy systemu
szesnastkowegoZamianę z systemu szesnastkowego na dwójkowy można
przeprowadzić równie łatwo.Każdą z liczb w systemie szesnastkowym
konwertujemy na system dwójkowy i zapisujemy obok siebie. Na przykład wybieramy
sobie dowolną liczbę niech będzie to 7F8h7 - 0111bF - 1111b8 -
1000bWięc liczba 7F8h-11111111000b
Powróćmy zatem do systemu dwójkowego. Do zapisu liczby w systemie dwójkowym
stosuje się trzy metody kodowania:

Znak moduł-ZM
Znak uzupełnienie jedynkowe-ZU1
Znak uzupełnienie dwójkowe-ZU2 Liczba dodatnia we wszystkich
tych trzech kodach zapisu ma jednakową postać. Różnice pojawiają się dopiero
przy liczbach ujemnych. W znak moduł liczby dodatnia i ujemna są takie same
jednakże liczba dodatnia poprzedzona jest 0 a ujemna 1Aby przejść do do kodu
ZU1 należy zanegować wszystkie bity liczbowe(uzupełniamy do 1).Aby przejść
do kodu ZU2 do najmniej znaczącego bitu liczby w kodzie ZU1 dodajemy
1(uzupełniamy do 2)Np. liczba -11

1.1011 (ZM)
1.0100 (ZU1)
1.0101 (ZU2)Dana liczba może być być liczbą dodatnią lub ujemną.
To jak zostanie potraktowana zależy od programisty. Dodawanie i odejmowanie
w kodzie ZU1 wykonywane jest na liczbach łącznie z bitem znakowym i należy
uwzględniać przepełnienia lub pożyczki wykonywane w trakcie operacji.
Przepełnienie należy dodać do najmniej znaczącej pozycji,a pożyczki odjąć od
najmniej znaczącej pozycji.Dodawanie i odejmowanie w kodzie ZU2 wykonywane
jest na liczbach łącznie z bitem znakowym i bez uwzględnienia przepełnienia lub
pożyczki.

Czasami w Assemblerze stosuje się kod binarno-dziesiętny czyli tzw BCD. Kod
BCD (Binary Coded Decimal) jest to sposób zapisania liczb całkowitych bez znaku,
dwucyfrowych w jednym bajcie. Polega on na tym, iż cztery pierwsze bity tego
bajta przypadają na pierwszą cyfrę, natomiast kolejne cztery na drugą.

Floating point numbers (Liczby zmiennopozycyjne-postać
znormalizowana)

Procesor standardowo pracuje tylko na liczbach całkowitych, dlatego by
obsługiwać liczby rzeczywiste trzeba użyć tzw. zmiennopozycyjny zapis
liczb.Każdą liczbę można zapisać jako:m*10c (gdzie m-mantysa, c -
cecha i 1

Wyszukiwarka

Podobne podstrony:
Kurs Assemblera by Skowik
Kurs Assemblera by Skowik2
Asembler Kurs Assemblera Podstawy
Sortowanie wyników ( sortowanie wyników order by kurs mysql ) webmade org
Found And Downloaded by Amigo
kod z WOŚP polecane chomiki by closer9
Found And Downloaded by Amigo
Found And Downloaded by Amigo
Assembly of outer membrane proteins in bacteria nad mitochondria
30 31 by darog83

więcej podobnych podstron