Cpu

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

MIKROPROTSESSORID

[Raivo Alla]
]

[Arengulugu./]
Mikroprotsessorite 1. põlvkond(Generation 1)

8086(1978a)-l on 16-bitised registrid ja 16-bitine väline andmesiin,


20-bitine adresseerimine annab 1MB adresseeritavat mälu.
Siit sündis kuulus 640K RAM limiit DOS-is, kuna 384K järelejäänud mälu
jäi riistvara ja video kasutada.
8088-l on 8 bitine väline andmesiin.
16-bitine register viitab mälusegmendile, mille suurus saab olla kuni
64kB.
Kasutades nelja sellist registrit samal ajal, olid 8086/8088
protsessorid võimelised adresseerima 256kB mälu, ilma segmente
vahetamata(trikk mida kutsuti registrite segmenteerimiseks).
Motorola 68000 kiip sisaldas 16 32-bitist registrit, seega oli 32-
bitine protsessor(!)
Need esimese põlvkonna protsessorid jooksid 4 kuni 8MHz sagedusel.Neil
nõudis ühe masinkeelse instruktsiooni täitmine mitu protsessori
takti(clock cycles).
Samuti puudus cache mälu.

2.põlvkond(Generation 2)

80286(1983a.) ehk lihtsalt 286 oli esimene protsessor, mis kasutas


protected mode’i.See võimaldas mälu kaitsa nii, et erinevad programmid
saavad joosta samaaegselt üksteist segamata. Protected mode kasutas
registrite sisu viitadena descriptor table' le, mis võimaldas 24-bitist
adresseerimist, seega võimaldades maksimaalse adresseeritava mälu
suuruseks 16MB. Nagu eelpool mainitud,lubas ka virtuaalset mälukasutust
ja sisaldas mitmeid kaitsemehhanisme.
286 jooksis sagedustel 8-16MHz.
Motorola 68020 kiip oli õige 32-bitine versioon 68000 protsessorist,
suutes adresseerida 4GB mälu.

3.põlvkond(Generation 3)

386(1986.a) oli IA-32 arhitektuuri esimene 32-bitine protsessor,


registrid 32-bitised, adreseeritav mälu 4GB.
32-bitise registri alumine pool sisaldas 16-bitist registrit nagu
eelnevatel generatsioonidel, et kindalustada ühilduvus vanemate
programmidega.
Võimaldas virtuaalset mälukasutust(paging) swap faili näol, mis lisas
füüsilisele RAM-ile lisamälu kõvakettamahust.Rakendustele jäi selline
trikk märkamatuks ja nad kasutasid nende käsutuses olevat RAMi nagu
oleks see füüsiliselt olemas.
Uuendus oli ka code-cache lisamine, mis puhverdas kuni 256 baiti koodi
kiibis eneses.
Motorola 68030 hõlmas endas samuti virtual memory, memory protection,
256 byte code cache , lisaks veel uuendus, mida kutsuti pipeline' ks,
mis suutis mitut instruktsiooni korraga täita.
Selle põlvkonna protsessorid jooksid 16-40MHz ja täitsid 10MIPS(10
milj. instruktsiooni sekundis).

4.põlvkond(Generation 4)

Inteli 486(1989.a) ja Motorola 68040.


Täiendatud pipeline- ühe instruktsiooni täitmiseks kulus kokkuvõttes
üks protsessoritakt.
Iga üksiku instruktsiooni täitmiseks läks ikka mitu takti, ent täites
selle aja jooksul mitu käsku, on resultaadiks 1 instruction per clock
cycle.
Lisati 8K cache mälu, mis võimaldas protsessori kiirust tunduvalt
tõsta.
Esmakordselt lisati protsessorisse FPU(floating-point unit)
ujukomaarvutusteks.Lisati ka uusi instruktsioone tulemaks toime uue
keerulisema süsteemiga.
Hilisematele 486-le lisati voolusäästlikuse funktsioonid.

5.põlvkond(Generation 5)

Selle põlvkonna protsessorid saavutasid selle, et täitsid ühe


protsessori takti jooksul rohkem kui ühe instruktsiooni.
Motorola ja Intel valisid erineva tee saavutamaks kiirusevõitu:
Motorola valis RISC(Reduced Instruction Set) ja Intel CISC(Complex
Instruction Set)
protsessori tee.
RISC plussiks oli see, et ta sisaldas lihtsaid käske, mis olid
täidetavad väheste protsessori taktide jooksul.Kuid praktikas ei andnud
RISC võitu, sest mingi asja tegemiseks kulus RISCil mitu käsku, samal
ajal kui CISC sai hakkama ühega.
Inteli Pentium(1993.a) sarnanes väga 486-e, kuid suutis täita
2instruktsiooi takti jooksul.
Oluline uuendus oli superskalaarsuse printsiip.
Selle põhimõte:
-võetakse kaks instruktsiooni mälust või code cachest
-dekodeeritakse need
-täidetakse esimene instruktsioon
-kui teine instruktsioon ei sõltu esimese tulemusest, täidetakse teine
Intel andis nimed kahele "torule", kus need täideti:u-pipe(u-toru) ja
v-pipe(v-toru).
v-pipe:paraleelselt täidetavad käsud(ühe käsu täitmise tulemusest ei
sõltu teise käsu täitmine),parallel order
u-pipe:serial order.
Superskalaarsus nõudis programmeerijatelt uut tüüpi koodi
kirjutamist.Kuna aga superskalaarsuse printsiip oli enamikule
programmeerijale uus, andis Pentium kiip vaod 20% kiiruse kasvu
võrreldes 486-ga(mitte 100% nagu oodati)

Cache mälu oli nüüd 16KB - 8K koodi jaoks ja 8 andmetele. Data cache
kasutas MESI protokolli, et kasutada effektiivset write-back mode'i.
Uue ja huvitava asjana lisati branch prediction: if-then-else
konstruktsioonide täitmise etteennustamine.
Välise andmesiini laiust suurendati 64bitini, protsessorisiseselt
liigutati andmeid isegi 128 ja 256 bitisel siinil.
APIC(Advanced Programmable Interrupt Controller) näol saadi mitme
protsessori tugi.
Pentiumi hilisele versioonile lisati ka MMX - tehnoloogia, mis oma 64-
bitiste registritega pidi hõlbustama multimeedia jooksutamist.

Selgub, et isegi kui suurendada protsessori kiirust 2X, jääb mälu


kiirus siiski samaks. Et RAMist midagi välja lugeda, magab prose
piltlikult maha näiteks 100 prose takti, jääb täitmata ligi 200
instruktsiooni.Lahendusena leiti, et L1 cache oma 16K ei suuda üksi
täita seda funtsiooni ja lisati ka 256K L2 cache, mis oli L1 kordi
aeglasem, ent siiski 10X kiirem kui RAM.

Motorola PowerPC 601 kiip suutis samuti täita 2 instr. takti


jooksul.PowerPC 603 ja hilisemad lisasid veel ühe arithmetic execution
uniti.

6.põlvkond(Generation 6)

Inteli P6 arhitektuur ja Motorola G3/G4


Kuna mitte alati ei kirjutanud programmeerijad effektiivset koodi ja
prose ootas mälu taga või ootas käsklusi, et viia tegevus lõpuni,
leiutasid Intel ja Motorola paar trikki.
Kiip suutis ise koodi oprimeerida, kui programmeerija seda ei teinud.
Veel mõned uuendused:
-L1 mälu.P6 prosedel 32K(16K data/16K code)
AMD Athlon suutis128K(64 data/64 code)
-laiendati dekooderit, mis suutis nüüd hallata 3 instruktsiooni
üheaegselt. Programmeerijale jälle õlule kohustus: kirjutada kood 3stes
gruppides.
-dekodeeritud instruktsioone suudetakse täita järjekorrast
sõltumatult(out-of-order)
-AMD Athlon lisas veel ühe FPU, mis lubas täita kuni 3 ujukomaarvutust
korraga.
-täiendatud branch prediction
-trikk nimega "register renaming" .Kui mingit sama registrit
kasutatakse järjest, siis nimetatakse sama registri kaks erinevat sisu
ümber erinevateks registriteks, et saaks toimuda superskalaarsuse või
out-of-order printsiip.
P6 arhitektuuri põhiveaks oli piirang dekooderil ehk nende 4-1-1
süsteem, mis lubab dekooderil dekodeerida korraga vaid ühe CISC-tüüpi
instruktsiooni(complex instruction) ja kaks RISC-tüüpi(simple
instruction).
Tavaliselt kirjutati koodi complex-simple-complex, nüüd sunniti seda
kirjutama complex-simple-simple.
P6 arhitektuuri perekonda kuuluvad sellised Inteli protsessorid nagu:
Pentium Pro, Pentium II, Pentium II Xeon,Celeron, Pentium III ja
Pentium III Xeon.

Jõudlust piiravaks teguriks oli protsessori pöördumine RAM-i


poole.Sedagi probleemi rünnati, suurendades FSB Pentium II-l ja
Celeronil 66MHz, Pentium III 100 ja 133MHz, AMD Athlonil aga kuni
200MHz-ni.
Pentium II ja III vändatud versioon Xeon erines vaid suure L2 cache
poolest- seda oli koguni 1 või siis 2MB.
Teoreetiliselt suudaks 1GHz P III protsessor täita 3 miljardit käsku
sekundis ehk 3000MIPS. Kuid praktikas, kui programmeerijad pole
arvetanud dekooderi 4-1-1 printsiipi, siis 2000MIPS.P6 arhitektuuril on
vaid üks mälulaadimis üksus ja üks FPU.

7.põlvkond?(Generation 7)

Selle üks väidetavaid esindajaid on Pentium IV kiip, mis omab küll 2


ALU(arithmetic-logic unit), kuid millel on vaid olematu 8K L1 cache!!!
L1 cache asemel 12K trace cache-cache dekodeeritud micro-op-ide jaoks.
Transistori suurus on vaid 0,13 mikromeetrit, uus
arhitektuur:NetBurst.400MHz-ne system bus.

[Mikroprotsessori arhitektuur.]

Sissejuhatus
Järgnevalt käsitleme mikroprotsessorit kui programmeeritavat seadet,
kõigepealt uurides tema programmeerimismudelit ja kuidas ta adresseerib
mälu.
Põhiliselt vaatleme Inteli protsessoreid. On kirjeldatud nii
programmeerimist protected kui real mode’s.
Real mode mälu paikneb 00000H-FFFFFH, kasutades vaid esimest 1MB mälust
ja on olemas kõikidel mikroprotsessoritel.
Protected mode memory asetseb ükskõik millisel aadressil mälusüsteemis
ja ta on olemas alates 80286 protsessoritest.
Protected mode mälu suurus oleneb, mitmebitilise protsessoriga on
tegemist.32-bitiste protsessorite puhul on see tavaliselt 4GB .

Programmeerimismudel.

Joonis illustreerib 8086


programmeerimismudelit läbi Pentium II
protsessori.Varasemad protsessorid
sisaldasid 16-bitiseid registreid, mis
on 32-bitiste registrite alamhulgad
nagu võite jooniselt näha.
See programmeerimismudel sisaldab 8,-
16-, ja 32-bitiseid registreid.
8-bitised registrid on
AH,AL,BH.BL,DH,DL.16-bitised registrid
on AX,BX,CX,DX,SP.BP,DI,SI,IP,FLAGS,
CS,DS,ES,SS,FS,GS.Laiendatud 32-
bitised registrid on EAX,EBX,ECX,EDX,
ESP,EBP,EDI,ESI,EIP ja EFLAGS.
Liigitatakse ka general purpose
registriteks ja multipurpose
registriteks.
Mitme-ja üldotstarbelised registrid.

EAX(accumulator) on 32-bitine register, sisaldades 16-bitist AX


registrit, mis omakorda sisaldab 8-bitiseid AH ja AL registreid.
Kui muudetakse vaid 16- või 8-bitist registrit, ei mõjuta see ülejäänud
bitte EAX registrist. Seda registrit kasutatakse arvude korrutamiseks ,
jagamiseks ja mõningateks erieesmärgilisteks instruktsioonideks.
EBX(base index) adresseeritakse kui EBX,BX,BH või BL registrit.
See register hoiab mõnikord offset-i aadressit, mis näitab mälusegmendi
paiknevust mälusüsteemis.Adresseeritakse ka andmete hoidmiseks.
ECX(count) on general-purpose register, mida kasutatakse enamasti
loendurina, võib hoida ka offset-aadressit.Instruktsioonid, mis
kasutavat loendurit on näiteks stringinstruktsioonid REP/REPE/REPNE või
shift-rotate instruktsioonid ja LOOP/LOOPD käsud.Shift,rotate kasutavad
loendurina CL registrit, stringinstruktsioonid CX registrit ja
LOOP/LOOPD CX või ECX registrit.
EDX(data) on general-purpose register, mis hoiab andmeid või
korrutus/jagamistehete väärtusi.
EBP(base pointer) ehk baasosundaja viitab asukohale mälus andmete
liigutamiseks mälus.
EDI(destination index) ehk lähteindeks hoiab tihti stringide sihtkoha
aadresse stringinstruktsioonide jaoks.
ESI(source index) ehk sihtindeks adresseerib stringide source-asukoha-
aadresse stringinstruktsioonide jaoks.
EIP(instruction pointer) viitab järgimise käsu aadressile mälus, mida
kutsutakse code segment. Adresseeritakse IP(16-bitti)-registrina kui
programmeeritakse real mode’s ja EIP(32-bitti) kui protected mode’s.
ESP(stack pointer) ehk pinuosundaja adresseerib mäluosa, mida
kutsutakse pinuks (stack).Pinumälu salvestab andmeid läbi pinuosundaja.

Lipuregistrid.

EFLAGS kontrollib mikroprotsessori tegevust.


Lipuregistrid muudavad oma väärtust mitmete aritmeetiliste-loogiliste
instruktsioonide täitmisel mikroprotsessori poolt.Andmesiirdamiskäskude
täitmisel ei muutu.
C(carry) ehk ülekandelipp.
P(parity) ehk paarsuslipp.Väärtus on 0, kui näiteks numbris on paaritu
arv 1-sid, väärtus on 1, kui 1-sid on paarisarv.
Kui numbris 1-sid pole, on even parity ehk siis väärtus on 1.
Paarsuslippu kasutatakse ka modemi programmeerimisel.
A(auxilary carry) ehk lisaülekandelipp.
Z(zero) ehk null-lipp näitab, kas aritmeetilise või loogilise tehte
tulemus on null. Kui Z=1, siis on null, kui Z=0, siis ei ole null.
S(sign) ehk märgilipp näitab, kas arv on positiivne või negatiivne.
Kui S=1, siis negatiivne, S=0 positiivne.
T(trap) ehk lõks. Kui lipp on püsti(1), siis rakendatakse debuggerit,
et leida vigu programmi käigus.Kui T=0, siis debugging disabletud.
I(interrupt) ehk katkestuslipp kontrollib INTR(interrupt request)
sisendit.Kui I=1, siis INTR lubatud. I lipu olekut seatakse käskude
STI(set I flag) ja CLI(clear I flag) poolt.
D(direction) ehk suunalipp valib kas suurendamismooodi (increment) või
vähendamismoodi(decrement) DI/SI registrite jaoks
stringinstruktsioonide täitmise ajaks. Kui D=1, siis decrement,D=0,
siis increment. D lippu sätitakse käskudega STD(set direction) ja
CLD(clear direction).
O(overflow) ehk ületäitumislipp tähistab registri ületäitumist mingi
arvutusoperatsiooni tagajärjel.
IOPL(I/O privilege level) kasutatakse protected mode operatsioonidel et
valida I/O seadmetele õige prioriteet.00 on kõrgeim IOPL prioriteet, 11
madalaim.
NT(nested task) ehk lipp pesitsevate ülesannete tarbeks(ülesanded
üksteise sees).Lipp on püsti, kui käesolev ülesanne on mingi teise
ülesande “sees”.
RF(resume) ehk resümee.Kasutatakse koos debugginguga, et kontrollida
programmi käiku peale järgnevat instruktsiooni.
VM(virtual mode) ehk virtuaalne mood.Kasutatakse protected mode
süsteemis, et kasutada virtual mode , ehk siis mitut 1MB segmenti
korraga.
AC(aligment check) ehk reastamiskontrolli lipp.
VIF(virtual interrupt flag) ehk virtuaalne katkestuslipp. On koopia
katkestuslipust, olemas Pentium ja Pentium II protsessoris.
VIP(virtual interrupt pending) ehk virtuaalse katkestusseisu lipp.Pakub
infot katkestuste kohta virtuaalmoodis ,Pentium ja Pentium II
protsessoris.
ID(identification) ehk identifikatsioon. Tähistab, et mikroprotsessor
sisaldab CPUID instruktsiooni, mis võimaldab tuvastada tootjat ja
versiooni numbrit.

Segmendiregistrid.

Segmendiregistrid määravad aadressid mälus teatud ülesannetele.


Real ja protected mode’s töötavad segmendiregistrid erinevalt.

CS(code segment) ehk koodisegment on osa mälus, kus hoitakse koodi,


mida kasutab mikroprotsessor.See register määrab algusaadressi mälus,
kust algab koodi hoidev sektsioon.Real moodis defineerib see 64K bloki.
Kaitstud moodis aga valib see kirjeldaja(descriptor), mis kirjeldab
algusaadressit ja vajatava mälusektsiooni pikkust. Kaitstud moodis saab
koodisegmendi piikus olla max. 4GB.
DS(data segment) ehk andmesegemnt on mälusegment, kus hoitakse andmeid,
mida programm kasutab. Nagu CS, nii ka DS suurus on vastavalt moodile
siis kas 64K või 4G.
ES(extra segment) ehk lisasegment on lisa andmesegment mida kasutatakse
mõnede stringinstruktsioonide puhul.
SS(stack segment) ehk pinusegment defineerib mälupiirkonna, mida
kasutatakse pinumälu jaoks.
FS ja GS on täiendavad segmendiregistrid kasutusel alates 386
mikroprotsessorist ja mida programmid võivad kasutada.
Real mode mälu adresseerimine.

Real mode võimldab adresseerida vaid 1MB mälu.


Segment-ja offsetregistrid.
Segmentregister defineerib mälu algusaadressi 64Kb blokil,
offsetregister valib ükskõik millise koha selle segmendi sees.

Absoluutaadressi saamiseks tuleb


segmentregistri sisu nihutada 4 baiti
vasakule (korrutada 16-ga ehk lisada
lõppu 0H) ja siis liita offset.
Nii moodustub 20-bitine aadress ja ongi
võimalik adresseerida 1MB mälu(220B=1MB)
Kui näiteks segmentregister sisaldab
1201H, siis see adresseerib mälu, mis
hakkab 12010H kohalt.
Segmentregister saab mälu osundada 16
baidiste blokkide, nn. paragrahvide
(paragraph) täpsusega.
Kui on teada 64K bloki algusaadress,
siis lõpuaadressi saab, lisades lihtsalt
FFFFH.Segment-ja offsetregister
kirjutatakse mõnikord, eraldades
kooloniga, näiteks: 1FFFF:2000
286 alates on ekstra 64K miinus 16baiti adresseeritav kui HIMEM.SYS
driver on installitud.Seda mälupiirkonda(0FFFF0H-10FFEFH) nimetatakse
high memory.

Default segment and offset registers.

Mikroprotsessoril on teatud reeglid, mis vaikimisi määravad


segmentregistrite ja offsetregistrite kombinatsioonid.
Näiteks koodisegmenti määravat registrit kasutatakse alati koos IP
registriga, et adresseerida järgmist käsku
programmis.See kombinatsioon on CS:IP või ka
CS:EIP, sõltuvalt mikroprotsessori
töörežiimist.
Koodisegmendi register määrab code segment’i
alguskoha ja instruction pointer määrab
järgmise instruktsiooni koodisegmendis.
Kui näiteks CS=1400H ja IP/EIP=1200H, siis
mikroprotsessor saab järgmise instruktsiooni
aadressilt 1400H+1200H ehk 15200H
Järgmine kombinatsioon on
SS:SP(SS:ESP) või SS:BP(SS:EBP).
Kui näiteks SS=2000H ja BP=3000H, siis
mikroprotsessor adresseerib vastava pinumälu
kohalt 23000H.
Veel on kombinatsioonid andmetele DS:BX(või
DS:DI või DS:SI) ja stringidele ES:DI.
8086-80286 lubavad 4 mälusegmenti ja 386
ülespoole 6 mälusegmenti. Muidugi, programmi
käsutuses saab olla tunduvalt rohkem kui 4 või
6 mälusegmenti, kuid vaid 4/6 segmenti saab
kasutuses olla korraga.Juuresolev joonis illustreerib 4-segmendilist
süsteemi.
Oletame, et rakendusprogramm nõuab 1000H
baiti mälu koodi jaoks, 190H baiti andmetele
ja 200H baiti pinumäluks(stack).Rakendus ei
nõua lisasegmendi(ES) kasutust. Kui selline
programm on DOS-i poolt mällu laaditud,
paikneb see esimeses vabas mäluruumis, mis
järgneb draiveritele ja teistele TPA
programmidele.(Vt. joonist)

SegmentAndOffsetAddressingAllowsRelocation.

Segment-ja offsetregistrite adresseerimine tundub küllalt keeruline.


Kuid seevastu lubab selline skeem programmil mälus
ümberpaikneda(relocate).Relocatable programm on programm, mis võib
paikneda ükskõik millises mäluosas ja relocatable andmed(data) on
andmed, mis võivad paikneda ükskõik millises mäluosas ilma selleks
programmis muutusi tegemata.See on ideaalne kasutuseks
arvutisüsteemides, kus mitte kõik masinad ei sisalda samu mäluruume.
Mälusegmenti saab liigutada ükskõik kuhu mälusüsteemis ilma et oleks
vaja offset-registrite sisu muuta.See teostatakse nii, et liigutatakse
kogu programm, blokina, uude piirkonda, muutes vaid segmentregistrite
sisu.

Mälu adresseerimine kaitstud režiimis (protected mode).

Kaitstud režiimis mälu adresseerimine lubab ligipääsu andmetele ja


programmidele, mis paiknevad kõrgemal kui see 1MB, mis oli real mode
kasutada.
Erinevus reaalmoodist on selles, kuidas mikroprotsessor tõlgendab
segmentregistrit mälu adresseerimisel. Segmentregister sisaldab
selektorit, mis valib kirjeldaja (descriptor) kirjeldajate tabelist
(descriptor table). Alates 80386-st on offset 32 bitine, mis võimaldab
adresseerida kuni 4GB suuruste segmentide sees(reaalmoodis 16-bitine
ehk siis 64KB segment). Selektor (mis on segmentregistris) valib välja
ühe 8192-st kirjeldajast vastavast tabelist. Kirjeldaja kirjeldab
piirkonda, pikkust ja juurdepääsu õigusi mälusegmendi kohta. On 2
kirjeldajate tabelit, globaalsed kirjeldajad ja lokaalsed kirjeldajad.
Globaalne kirjeldaja on opsüsteemi kirjeldaja (system descriptor),
lokaalne aga rakendusprogrammi kirjeldaja (application descriptor). Iga
programm saab siis kasutada kuni 16384 mälusegmenti samal ajal. Iga
kirjeldaja on 8 baiti lai, kirjeldajate tabelid
on kumbki 64 Kb suurused.

Baasaadress osundab mälusegmendi algust.286 on


see 24-bitine aadress, seega segment sai alata
ükskõik millisel baidil 16M mälupiirkonnas.
(segmentidele viitamisel ei kehti enam
paragraph ehk 16baidiste blokkide täpsusega
asukoha määramine.)386 ja kõrgemad MP-
d(mikroprotsessorid) kasutavad 32-bitist
aadressi.
Segmendi limiit (segment
limit) näitab viimast
offseti aadressi, mis
eksisteerib antud segmendis.
80286-s on 16 bitine limiit,
386-st alates 20 bitine.
Alates 386-st lisandub G
bitt (teralisuse bitt,
granularity bit). Kui G=0,
siis segmendi limiit on
00000H kuni FFFFFH, kui G=1,
siis segmendi limiit
korrutatakse 4Kb(liidetakse
XXXH;XXXH võib olla ükskõik
mis väärtus 000H ja FFFH
vahel), saadakse 4Kb
segmendi samm. AV näitab,
kas segment on kättesaadav
(AV=1) või mitte (AV=0). D
näitab kas käsud ja
registrid on 16 või 32
bitised (D=0 - 16 bitised,
D=1 - 32 bitised).
Juurdepääsu õiguste baidi
(access rights byte) bitid
on kirjeldatud joonisel. Need
bitid võimaldavad kontrolli
üle kogu segmendi. Kontroll
sõltub, kas tegemist on andme- või koodsegmendiga. Kirjeldajad
valitakse kirjeldajate tabelist segmentregistri abil.

Näide1:
Baasaadress(Base)=10000000H,G=0,Limit=001FFH,
End=Base+Limit=10000000H+001FFH=100001FFH
Näide2:
Baasaadress(Base)=10000000H,G=1,Limit=001FFH,
End=Base+Limit=10000000H+001FFXXXH=101FFFFFH

Joonisel on toodud,
kuidas
segmentregister
töötab kaitstud
moodis. Lisaks 13
bitisele
selektorile (valib ühe
8192-st kirjeldajast) on TI
bitt (TI=0, globaalne
kirjeldaja; TI=1, lokaalne
kirjeldaja) Soovitud
privileegi tase (reguested
privilege level, RPL)
määratakse ära 2-e bitiga.
Kõrgeim on 00 ja madalaim
11. Kasutatakse
mitmekasutaja keskkondades.
Kõrvaloleval joonisel on
näidatud, kuidas
segmentregister, mis
sisaldab selektorit valib
kirjeldaja globaalsest
kirjeldajate tabelist.
Globaalsed ja lokaalsed
kirjeldajate tabelid on
mälusüsteemis olemas. Et
neile ligi pääseda ja muuta
nende tabelite aadresse,
sisaldab MP programmselt
nähtamatuid registreid.
Neid registreid ei saa
otseselt adresseerida(ehkki
mõned neist on siiski
programmselt juhitavad).

Järgnev joonis illustreerib programmselt nähtamatuid registreid 286-PII


MP-tes.

Need registrid kontrollivad MP


tööd kaitstud moodis. Osa
nendest pole programselt
juhitavad. Iga segmentregister
sisaldab lisaks 16 bitisele
nähtavale osale veel 64 bitti
(alates 80386-st, 80286-l on
see 50 bitti) infot mis
sisaldab baasaadressi (32
bitti), limiiti (20 bitti) ja
juurdepääsuõigusi (12 bitti).

Need registrid laetakse


kirjeldajate tabelist kui
segmentregister muutub. Nii
pole vaja iga mälupöördumisega
lugeda infot kirjeldajate
tabelist. Lisaks on nähtamatud
GDTR (global descriptor table
register) ja IDTR (interrupt
descriptor table register).
GDTR sisaldab kirjeldajate tabeli baasaadressi ja limiiti. Viimane on
16 bitti, seega tabeli suurus on 64 Kb. Kui MP läheb üle kaitstud moodi
laetakse GDTR ja IDTR sisu. IDTR registris sisaldub info
katkestustöötlusprogrammide aadresside kohta. LDTR (local descriptor
table register) sisaldab vastavat infot lokaalse kirjeldajate tabeli
kohta. TR (task register) hoiab selektorit, mille abil pääseb juurde
kirjeldajale, mis defineerib ülesande. See register võimaldab
mitmeülesande (multitasking) süsteemides lihtsalt lülituda ümber eri
programmide vahel.

Memory paging.

Mälu tabuleerimine(memory paging) võimaldab virtuaalmälu kasutust.


Muidu lineaarne aadress, mis genereeritakse programmide poolt
konverteeritakse memory paging üksuse polt otse füüsiliseks.
See tegevus, mida nimetataksegi mälu tabuleerimiseks, toimib nii reaal-
kui ka kaitstud moodis.
See mehhanism lubab mälul paikneda ka piirkondades, kus tegelikult
mingit mälu ei ole. Mälu tabuleerimist kontrollivat MP
kontrollregistrid.
Register CR3 sisaldab lehekülje
suunaja (directory) baasaadressi ja
PCD (page cache disable) ja PWT
(page write through) bitte, mis
kontrollivad MP vastavate pinnide
tööd. Kui PCD=1 siis PCD pinn läheb
kõrgeks siinitsükli ajaks. See
võimaldab välisriistvaral
kontrollida L2 vahemälu (cache
memory). Lineaarne aadress, mis
genereeritakse programmide poolt
jagatakse kolmeks sektsiooniks:
page directory entry (lehekülje
kausta sisend), page table entry
(lehekülje tabeli sisend) ja page
offset entry (lehekülje offseti
sisend).
Alumisel joonisel on toodud näide, kuidas see jagamine toimub.

Et kiirendada mälu
tabuleerimist, on alates 80486-
st sisse viidud TLB
(translation look-aside buffer)
vahemälublokk. Selles hoitakse
32-e viimati külastatud
mälulehekülje aadressi. Alates
Pentiumist on oma TLB nii
andme- kui ka käsustiku jaoks.
Kõrvaloleval joonisel näidatakse,
kuidas töötavad page directory,
page tables ja memory pages.On
ainult üks lehekülje suunaja(page
directory) , mis sisaldab 1024 32-
bitist aadressi, mis viitavad
1024-le võimalikule lehekülje
tabelile(page
table).
Leheküljesuunaja ja iga lehekülje
tabel on igaüks suurusega 4KB.
Kui näiteks tabuleerida 4GB mälu,
läheb vaja 4Kb suunaja jaoks ja
4Kb * 1024 = 4Mb lehekülje
tabelite jaoks. DOS-is kasutab
EMM386.exe leheküljetabeleid, et
ümber defineerida mälupiirkond
C8000H-EFFFFH kui ülemine
mälublokk.EMM386.exe lubab ligi 16MB lisamälule(extended memory)

[MASINKEEL.]
Masinkood on binaarne ehk kahendkoodis kirjutatud instruktsioonide
jada, mis täidab teatud ülesannet ja on ainukene otsene viis MP-le
öelda, mida me temast tahame.
Masinkeelsed instruktsioonide pikkus varieerub vahemikus 8086-Pentium
II ühest kuni 13 baidini.On üle 100 000 erineva masinkeelse
instruktsiooni variatsiooni, võib öelda, et kindlat nimekirja pole
olemas, see täieneb üha.
8086-80286 on 16-bitised instruktsioonid,386 ja kõrgematel 32-bitised.
386 ja kõrgemad MP-d eeldavad, et kõik reaalmoodi instruktsioonid on
16-bitised, kaitstud moodis võib olla valitud kas 16-bitine või 32-
bitine instruktsioonide mood.

Esimesed kaht baiti 32-bitises moodis kutsutakse override


prefix’ks(ülekattev eesliide) ja neid ei pruugi alati olemas olla.
Esimene on operandi aadressi, mida instruktsioon kasutab, suuruse jaoks
ja teine registri suuruse määramiseks.Kui 386-Pentium II opereerivad
16-bitises moodis(reaal-või kaitstud moodis) ja kasutatakse 32-bitist
registrit, siis register-size-prefix(66H) lisatakse instruktsiooni
ette.Kui opereeritakse 32-bitises moodis(protected mode only) ja
kasutatakse 32-bitist registrit, register-size-prefix’it ei eksisteeri.
Kui 32-bitises moodis kasutatakse 16-bitist registrit, on register-
size-prefix olemas, et valida 16-bitist registrit.
Address size-prefix(67H) kasutamist vaatleme hiljem.
Opcode ehk opkood valib
operatsiooni(liitmine,lahutamine jne.), mida
MP peab sooritama.Opkood on enamasti kas 1
või 2 baiti pikk.Siin, joonisel, on esimesed
6 bitti opkoodi jaoks ja kaks järgijäänud
bitti näitavad suunda D(direction).Mitte
segi ajada instruktsiooni moodi bitiga või
suunalipu bitiga(kasutatakse
stringinstruktsioonides).
Need kaks suunabitti kontrollivad
andmevoogu, näidates kas andmed on baitides või sõnades(word=16
bitti).386 ja kõrgemates MP-s valitakse word ja doubleword(DW), kui
W=1.Instruktsioonimood ja registrisuuruse-eesliide(register-size
prefix) otsustavad, kas W tähistab 16 või 32 bitti.
Kui W=0, siis on andmed alati ühebaidilised.
Kui D=1, siis andmed liiguvad väljalt R/M
väljale REG, mis aseb instruktsiooni teises
baidis.Kui D=0, siis andmed REG väljalt R/M
väljale.W-bit on olemas enamustes
instruktsioonides, D-bitt aga põhiliselt MOV
ja mõnes teistes instruktsioonides.

MOD-väli:
MOD-väli määrab adresseerimismoodi valitud
instruktsiooni jaoks ja kas displacement on
olemas antud juhul.
Kõrvalolev tabel on 16-bitise
instruktsioonmoodi jaoks, 32-bitise moodi
tabel on sarnane, ainult et 10 tähistab 32-
bitist displacementi.Kui MOD väljal on 11,
siis valitakse registri adresseerimine mälu
adresseerimise asemel.Kui väljal 00,01,10, siis valitakse üks
mäluadresseerimismoodidest.
MOV AL,[DI] on üks näide, kus valitakse 00(no displacement),
MOV AL,[DI+2] 8-bitine displacement ja MOV AL,[DI+1000H] 16-bitine
displacement.
REG ja R/M väljade
tähendused, registrite
valimine:
Üleval on toodud üks näide, kuidas MP loeb kahebaidilisest binaarsest
käsust välja meile arusaadava instruktsiooni.
Mälu adresseerimine.
Kui MOD väli sisaldab 00, 01,10, saab R/M väli
teise tähenduse.
Toodud tabel näitab 16-bitise
instruktsioonimoodi R/M adresseerimismoode.

Special adressing mode.


Näiteks MOV [1000H],DL ja MOV NUMB,DL on instruktsioonid, mis kasutavad
spetsiaalset adresseerimismoodi.Esimene instruktsioon liigutab registri
DL sisu mälukohale 1000H, teine liigutab registri DL sisu sümboolsesse
andmesegment kohal NUMB.
Spetsiaalne adresseerimine kasutab alati MOD=00(no displacement) ja R/M
koodi 110.Ilma displacementita(andmete liigutamisega nende kohalt) ei
saa tegelikult kasutada adresseerimismoodi [BP] (R/M code 110), st. et
kasutatakse 8-bitist displacementi ja adresseerimismood kirjutab [BP]
asemel [BP+0], kus vaja.

Kui spetsiaalset
adresseerimist poleks,
tõlgendataks seda kui
käsku MOV [BP],DL, mis
oleks kolme-, mitte
neljabaidine
instruktsioon.
(jooniselt Byte 4 jääks
ära)
32-bitine adresseerimismood.
Järgnev joonis toob ära 32-bitise moodi R/M kooditabeli.Pane tähele, et
kui R/M=100, siis ilmub instruktsiooni
a lisabait, mida kutsutakse scaled-index
byte(skaalaindeksi bait).Seda baiti
kasutatakse peamiselt siis, kui kaks
registrit liidetakse kokku et saada
mäluaadress instruktsioonis.
Kuna see bait lisatakse instruktsioonile,
on 7 bitti opkoodi jaoks ja 8 bitti
skaalaindeksi baidis. St. et scaled-index
instruktsioonil on 219(32K) erinevat
variatsiooni.
Seega on üle 32 000 MOV instruktsiooni variandi.

Pildil on skaalaindeksi baidi formaat, valitud


R/M koodi 100 poolt, vasemad kaks bitti valivad
skaalaindeksi kordaja.Index ja Base väljad
sisalavad mõlemad registri numbrit.

Instruktsioon MOV EAX,[EBX+4*ECX] on kodeeritult 67668B048BH.Pane


tähele, et nii address size(67H) kui ka register size(66H) ülekatvad
eesliidesed(override perfixes) on esindatud.Selline kodeerimine esineb
kui 386 ja kõrgemad MP-d töötavad 16-bitises moodis. Kui MP opereeriks
32-bitises moodis, siis mõlemad eesliidesed jääks ära ja käsk näeks
välja selline: 8B048BH.Skaalaindeksiga adresseerimine võib muidugi
kasutada ka üksikute registrite korrutisi skaalaindeksi kordajaga.
(Näide: MOV AL,[2*ECX], kahekordne ECX registrisisu kopeeritakse AL
registrisse)
Immediate instruction.(vahetu käsk)
Olgu käsk MOV WORD PTR [BX+1000H],1234H 16-bitise vahetu adresseerimise
näide.See instruktsioon liigutab 1234H sõna-suurusesse(16-bitti)
mäluruumi, mis asub aadressil 1000H+BX+DX*10H.
See kuuebaidine instruktsioon kasutab kaks baiti opkoodi,W-biti,MOD-ja
R/M välja jaoks.Kaks baiti kuuluvad andmetele(1234H) ja kaks baiti
displacementile 1000H.
WORD PTR direktiiv tähendab, et see instruktsioon liigutab sõnasuurust
andmehulka.Kui andmed oleksid baidisuurused, siis oleks WORD PTR asemel
BYTE PTR.Võimalik on ka DWORD PTR(doubleword).
See direktiiv on vajalik vaid siis, kui pole kindel kui suur on
liigutatac andmekogus, instruktsioon MOV [BX],AL on kindel ühe-baidi
liigutus, seal pole seda direktiivi mõtet kasutada.
MOV [BX],I pole korrektne määrang, sest see võib olla nii baidi-,sõna,-
kui ka topeltsõnasuurune liigutus.Õige oleks niisiis kirjutada
MOV BYTE PTR [BX],I või MOV WORD PTR [BX],I või MOV DWORD PTR [BX],I.

Kui segmentregistri sisu liigutatakse MOV,PUSH


või POP instruktsiooniga, siis REG väljalt
valitakse register.
Masinkeeles näeks instruktsioon MOV BX,CS
välja selline:10001100 11001011.

You might also like