Pregled 80x86 familije procesora

80x86 familija je startovana 1981 godine sa 8086 a novi modeli se proizvode i danas (2006). Oni su svi unazad kompatibilni, ali svaki novi model ima nove mogucnosti i vecu brzinu nego njegovi predhodnici. Danas postoji vrlo malo racunara koji u sebi sadrze 8088 i 8086 procesore, jer su oni prestari i prespori.

Predstavljanje brojeva u binarnom brojnom sistemu

Pre nego sto mozemo da razumemo kako se programira u asembleru moracemo da razumemo kako se brojevi predstavljaju u racunrima. Brojevi se predstavljaju u binarnom brojnom sistemu (sa osnovom dva). Postoji nekoliko termina kojima se opisuju razlicite brojcane velicine koje cu opisati ovde.

1 BIT: 0

Jedan bit je najmanji deo podatka koji postoji. Bit je ili jedan (1) ili nula (0).

1 NIBBLE(nibl): 0000
4 Bita

Nibl je cetiri bita ili pola bajta. Primetite da ima maksmalnu vrednost koje je 15 (1111 = 15). To je osnova za heksadecimalni sistem (sa osnovom 16) koji se koristi zato sto je lak za razumevanje. Heksadecimalni brojevi se krecu od 1 do F (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) i naglasavaju se tako sto se posle cifara pise "h": Fh = 15 decimalno. Heksadecimalni brojevi koji pocinju sa karakterom u prefiksu imaju nulu (0).

1 BYTE(bajt): 00000000
2 Nibla
8 Bita

Bajt ima 8 bita ili 2 nibla. Njegova maksimalna vrednost je FFh (255 decimalno). Zato sto se bajt sastoji od 2 nibla heksadecimalna reprezentacija su dve heksadecimalne cifre: 3Dh. Registri su takodje velicine jednog bajta, ali o tome cemo da pricamo kasnije.

1 WORD(rec): 0000000000000000
2 Bajta
4 Nibla
16 Bita

Rec predstavlja dva bajta koja se tretiraju zajedno. Rec ima maksimalnu vrednost FFFFh (65536 decimalno). Sobzirom da se rec sastoji od 4 nibla, predstavlja se pomocu 4 heksadecimalne cifre.To je takodje i velicina 16-bitnog registra.

Registri

Registri su mesto u CPU-u u koje mogu da se smeste brojevi i gde moze njima da se manipulise. Postoje tri velicine registara 8-bitni, 16-bitni i na 386 i visim procesorina 32-bitni. Postoje cetiri vrste registara: registri opste namene, segmentni registri, indeks registri i stek registri. Tim redom cemo ih i opisati.


Registri opste namene

Registri opste namene

Ovo su 16-bitni registri. Postoje cetiri registara opste namene: AX, BX, CX i DX. Oni su podeljeni na po dva 8-bitna registra. AX je podeljen na AH koji sadrzi visi bajt i na AL koji sadrzi nizi bajt. Na 386-ici i kasnijim procesorima postoje 32-bitni registri oni imaju ista imena kao i 16-bitni ali sa dodatnim slovom 'E': EAX. AL, AH, AX se mogu koristiti odvojeno, tj. mogu se tretirati kao odcvojeni registri za neke zadatake.

Ako je u AX smesten broj 24689,
to bi u registru izgledalo:

AH AL
01100000 01110001

AH je 96 a u AL mora da je 113. Ako dodate 1 na 24689 (24690) AL ce biti 114 a AH se nece promeniti. Registri SI, DI, SP i BP se mogu koristiti kao registri opste namene ali imaju i specificnu svrhu. Takoje, oni ne mogu da se podele na dva dela.

Indeks registri

Ponekad se i nazivaju pokazivacki registri i to su 16-bitni. Najcesce se koriste za string instrukcije. Postoje tri indeks registra: SI (source index), DI (destination index) i IP (instruction pointer). Na 386-ici i visim procesorima postoje i 32-bitni indeks registri: EDI i ESI. Takoje mozemo da koristimo i BX da bi smo indeksirali string.

IP je indeks registar ali moze se njime ne moze manipulisati direktno jer cuva adresu sledece instrukcije.

Stek registri

BP i SP su stek registri i koriste se kada se koristi stek.

Segmenti i offset

Dizajneri 8088 su zakljucili da niko nikada nece da koristi vise od jednog megabajta memorije pa su napravili cipove koji ne mogu da adresiraju vise od toga. Problem je ako hocemo da adresoramo ceo megabajt, za to nam treba 20 bita. Registri imaju najvise 16 bita i tu nam nastaje problem (dizajneri takodje nisu hteli da potrose celu rec (32 bita) na adresiranje). Zato su nasli "pametan" nacin da nam zagorcaju zivot: segmenti i offseti. Tako se moze adresirati sa dva registra ali samo 20 bita.

OFFSET = SEGMENT * 16
SEGMENT = OFFSET / 16 (najniza cetiri bita su izgubljena)

Jedan registar sadrzi segment a drugi registar offset. Ako ih "spojimo" dobijamo 20-bitnu adresu

SEGMENT 0010010000010000____
OFFSET ____0100100000100010
20-bit Address 00101000100100100010

DS sadrzi segment a SI sadrzi offset. Kako su oni po 16 bita adresa se preklapa. Eto kako se DS:SI koristi da bi se napravila 20-bitna adresa. Standardano predstavljanje za segment/offset par je: SEGMENT:OFFSET

Segment registri su: CS, DS, ES, SS. Na 386+ postoje i FS i GS.

Offset registri su: BX, DI, SI, BP, SP, IP. Na 386+ bilo koji registar opste namene (ne segment registar) se moze koristiti kao offset registar. (Osim IP, kome ne moze da se pristupa direktno).

Stek

Sobzirom da imamo samo 6 registara koji se koriste za skoro sve operacije sigurno se pitas kako da to prebrodis. Prosto je. Postoji nesto sto se zove stek, sto je u stvari oblast memorije u koju mozes da smestas i iz koje mozes da citas vrednosti i time sebi stvoris prostor za vise operanada za manipulaciju.

Ova oblast memorije je kao diskovi na stapu, onaj koji je stavljen poslednji, skida se prvi sa stapa.To se zove Last In First Out (LIFO).


Organizacija steka

Ako se nova vrednost stavi na stek, stek raste na dole. Kao sto se vidi stek pocinje na visim adresama i raste na dole. Mora da se pazi koliko se podataka stavlja na stek da se ne bi prepunio (overflow).

Sadrzaj