Intel 80x86 kompiuterių funkcionavimo pagrindai
description
Transcript of Intel 80x86 kompiuterių funkcionavimo pagrindai
Kokį procesorių studijuoti?
• Virtualų
• Modernų (naujausią)
• Itin paprastą, vieną pirmųjų
• Paprasčiausią iš dabar egzistuojančių šeimos
Intel 80x86 procesorių šeima
ProcesoriusDuomenų
magistralės plotis
Adresų magistralės
plotis
Adresų erdvės dydis
80186 16 20 220 = 1 M
80286 16 24 224 = 16 M
80386SX 16 24 224 = 16 M
80386DX 32 32 232 = 4 G
80486 32 32 232 = 4 G
80586 „Pentium“ 64 32 232 = 4 G
80186 procesorius
• 80186 turi 16 duomenų linijų, leidţiančių atlikti operacijas su teigiamais sveikaisiais skaičiais nuo 0 iki 216 – 1 = 65535 ar sveikuosius skaičius su ţenklu nuo -32768 iki 32767.
• Jis turi 20 adresų linijų, kurios suteikia 1 M adresų erdvę.
Valdymo įrenginys
Registrai
• 80x86 procesoriaus registrai yra sugrupuoti į dvi kategorijas:
▫ bendros paskirties;
▫ adresų.
• Bendros paskirties pagrindinis tikslas yra duomenų manipuliacija ir perdavimas;
• Adresų registrai saugo atminties adresus ir yra naudojami nurodyti į atminties vietas, kur duomenys bus saugomi ar iš kur bus nuskaitomi.
Bendros paskirties registrai
• Yra 8 bendros paskirties registrai:
▫ AH;
▫ AL;
▫ BH;
▫ BL;
▫ CH;
▫ CL;
▫ DH;
▫ DL.
• Kiekvienas iš šių registrų yra 8 bitų.
Bendros paskirties registrai
• Anksčiau mineta, kad 80186 procesorius yra 16 bitų procesorius. Tai kaip šie registrai gali būti tik 8 bitų?
• 80186 procesorius sukuria 16 bitų registrą sujungdamas du 8 bitų registrus.
• Pavyzdţiui AH ir AL registrai gali funkcionuoti kaip pora.
• Šis didesnis registras mums ţinomas kaip AX. • Šie du registrai sujungiami taip, kad 8 AH bitai būtų
aukščiausi reikšminiai, o 8 AL bitai – maţiausi reikšminiai AX registro bitai.
• Pavyzdţiui jei registras AH lygus 101100002 = B016, o AL lygus 010111112 = 5F16, tai virtualusis registras AX bus lygus 10110000010111112 = B05F16.
• AX yra vadinamas akomuliatoriaus (accumulator) registras, kuris daţniausiai yra naudojamas aritmetinių, loginių ir bendirms duomenų perdavimams.
• Daugelyje asemblerio kalbų aukštesnio lygio matematinės operacijos, tokios kaip daugyba ar dalyba, net neleidţiamos programuotojui nurodyti kitokiame nei AX registre.
• BX yra vadinamas pagrindo (base) registru, ir naudojamas kaip pagrindo adresas ar rodyklė į tokius duomenis kaip masyvas.
• Vėliau suţinosime, kad yra daugiau registrų, kurie naudojami kaip rodyklės, tačiau šie yra tam tikros paskirties rodyklės.
• BX yra labiau bendros paskirties rodyklės.
• CX vadinamas skaitliuko (counter) registru. Kuomet programa naudoja ciklą, ciklo indeksas daţniausiai yra saugomas šiame registre.
• Intel sukūrė nemaţai specialios paskirties registrų, kurie naudoja CX norint geriau valdyti „išėjimą“ iš ciklų.
• DX vadinamas duomenų (data) registru.
• Šis registras naudojamas su AX specialioms aritmetinėms funkcijoms, leidţiant išsaugoti tokius dalykus kaip labiausiai reikšminių bitų saugojimui sudauginus 16 bitų skaičius ir gavus 32 bitų skaičių, ar saugojant liekaną, padalinus skaičių.
Adresų registrai
• Ţemiau bendros paskirties registrų yra adresų registrai:
▫ SP;
▫ BP;
▫ DI;
▫ SI;
▫ IP.
• Jie yra 16 bitų registrai, skirti saugoti adresus, pagal kuriuos kreipiamasi į atminties vietas.
Adresų registrai
• Šie adresų registrai yra skirstomi į dvi grupes:
▫ Rodyklių registrai SP, BP ir IP;
▫ Indeksų registrai DI ir SI.
• Jie visi veikia tokia pačia maniera, t.y. nurodo į adresą atmintyje, o kiekvienas iš registrų turi specialią paskirtį.
• SP yra steko rodyklė (stack pointer) ir ji rodo į paskutinių saugomų steke duomenų adresą.
• Ką nors išsaugojus į steką, steko rokylė yra sumaţinama saugomos reikšmės dydţiu, t.y. SP yra sumaţinama 2 jei rašomas ţodis arba 4, jei rašomas dvigubas ţodis.
• Jei duomenys nuo steko nuskaitomi, tai ši rodyklė analogiškai sumaţinama.
• BP yra pagrindo rodyklė ir jis pagrinde naudojamas nurodyti į parametrus, kurie perduodami funkcijai ją iškviečiant.
• Pavyzdţiui jei funkcija myfunc(var1, var2) iškviečiama, tai var1 ir var2 yra talpinami steko laikinojoje atmintyje.
• BP nurodytas adresas į steką, kur kintamieji prasideda.
• IP yra instrukcijų registras. • Kaip jau minėjome prieš tai, centrinis procesorius
keliauja ţingsnis po ţingsnio per atmintį įkeliant, interpretuojant ir tuomet vykdant mechaninį kodą.
• Jis naudoja atminties adresus, laikomus IP registre kaip paţymėtą nurodymą kur gauti sekančią instrukciją.
• Kiekvieną kartą gavus instrukciją, IP reikšmė padidinama tiek, kad vėl rodytų į sekančią instrukciją, kurią reikės vykdyti.
• Kaikuriais atvejais instrukcijų dekoderiui reikia IP reikšmę padidinti keletą kartų, kad praleisti duomenis ar operandus, kurie seka po instrukcijos mašininiame kode, iki kol sutiks sekančią instrukciją.
• SI yra šaltinio indeksas (source index), o DI –tikslo indeksas (destination index).
• Juose taip pat talpinami adresai, kurie nurodo į atmintį.
• Jie naudojami eilučių operacijoms, kur eilutės gali būti kopijuojamos, ieškomos ar kitaip manipuliuojamos.
• SI nurodo į atminties vietas, iš kurių simboliai yra gaunami, o tuo tarpu DI nurodo į atminties vietas, kur simboliai bus saugomi.
Vėliavėlės
• 80x86 procesoriaus vėlevėlės yra 16 bitų registre.
• Ne visi 16 bitų yra naudojami ir nėra svarbu atsiminti tikslią bito pozicija kiekvienai vėliavėlei, esančiai registre.
• Svarbiau yra suprasti kiekvienos vėliavėlės paskirtį.
• Kaip pamenate, vėliavėlės parodo dabartinę procesoriaus būseną.
• 80x86 procesoriuose vėliavėlės yra suskirstytos į dvi kategorijas:
▫ valdymo vėliavėles;
▫ būsenos vėliavėles.
Valdymo vėliavėlės
• Valdymo vėliavėlės yra valdomos programine įranga, taip leidţiant keisti procesorius veikimą. Jų yra trys:▫ Spąstų vėliavėlė (TF – trap flag) yra naudojama klaidų
aptikimo tikslams, leidţiant kodą vykdyti po vieną instrukciją vienu metu. Tai leidţia programuotojui eiti kodu adresas po adreso, taip galint stebėti kaip vyksta kiekviena instrukcija.
▫ Krypties vėliavėlė (DF – direction flag) yra susieta su eilučių operacijomis. Jei tiksliau, tai DF nurodo ar eilutės bus perţiūrimos pagal ar prieš abėcelę. Ši vėlevėlė 80x86 procesoriaus naudojama automatizuoti eilučių operacijas.
▫ Pertraukimų vėliavėlė (IF – interrupt flag) naudojama įgalinti šią funkciją arba ne. Jei ši vėlevėlė nustatyta į loginį 1, tai pertraukimai apdorojami, o jei į loginį 0, tai maskuojami pertraukimai tiesiog ignoruojami.
Būsenos vėliavėlės
• Likusios vėliavėlės yra būsenos vėliavėlės. Jų yra šešios:• Perpildymo vėliavėlė (OF – Overflow flag) parodo kada
matematinėje operacijoje buvo perpildymas (netilpo į nustatytą dydį).▫ Ţenklo vėliavėlė (SF – Sign flag) atspindi ţenklo bitą
matematinėse ar loginėse operacijose, t.y. ši vėlevėlė lygi loginiam 0, kai rezultatas teigiamas ir loginiam 1 – kai neigiamas.
▫ Nulio vėliavėlė (ZF – Zero flag) yra prilyginama loginiam 1, kuomet matematinių ar loginių operacijų rezultatas yra lygus nuliui, kitu atveju ji lygi loginiam 0.
▫ Pagalbinio pernešimo vėliavėlė (AF – Auxiliary carry flag) lygi pernešinui iš 3 bitų kolonos, kuris pridedamas prie 4 bitų kolonos.
▫ Lygybės vėliavėlė (PF – Parity flag) nustatoma į loginį 1, jei rezultate yra lyginis vienetų skaičius, o jei vienetų skaičius nelyginis, ši vėlevėlė būna lygi loginiam 0.
▫ Pernešimo vėliavėlė (CF – Carry flag) vaizduoja pernešimą iš labiausiai reikšminio bito.
Pavyzdys
• Perpildymo vėliavėlė = 1; Buvo pernešimas, t.y. sudedant neigiamus skaičius rezultatas gavosi teigiamas skaičius.
• Ţenklo vėliavėlė = 0; Rezultatas yra teigiamas skaičius.• Nulio vėliavėlė = 0; Rezultatas nelygus nuliui.• Pagalbinio pernešimo vėliavėlė =0; Nebuvo pernešimo iš
ketvirtos kolonos (3 bito) į penktą koloną (4 bitą).• Lygybės vėliavėlė = 1; Rezultate yra keturi vienetai, o tai
lyginis vienetų skaičius.• Pernešimo vėliavėlė = 1; Buvo pernešimas.
Pavyzdţiui kaip atrodys vėliavėlės atlikus 8 bitų sudėtį 101101012 + 100101102?
Vidinės magistralės
• Vykdymo įrenginyje yra dvi vidinės magistralės, kurios naudojamos perduoti informaciją tarp jo komponentų.
• Pirmoji yra skirta keistis duomenimis ir adresavimo informacija tarp registrų ir aritmetinio-loginio įtaiso (ALU). Ji taip pat naudojama perduoti duomenis į atmintį ir iš atminties, naudojantis magistralės sąsajos įrenginiu.
• Kiekviena asemblerio kalbos instrukcija, kuri naudoja operandus, privalo perkelti tuos operandus iš jų šaltinio į paskyrimo vietą. Šie perdavimai vyksta duomenų magistralėje.
• Sekanti magistralė turi tik vieną tikslą: perduoti instrukcijas, kurios magistralės sąveikos įrenginio buvo išgautos instrukcijų dekoderiui, kuris yra vykdymo įrenginio valdymo sistemoje.
Magistralės sąveikos įrenginys
• Magistralės sąveikos įrenginys (BUI – Bus Interface Unit) valdo informacijos perdavimą tarp procesoriaus ir išorinių įrenginių, tokių kaip atmintis, Į/I portai ir saugojimo įrenginiai.
• Jis veikia kaip tiltas tarp vykdymo įrenginio ir išorinės magistralės.
• Dalis instrukcijų dekoderio yra patalpinta magistralės s1veikos įrenginyje.
• Tokia instrukcijų eilė elgiasi kaip buferis, leidţiantis instrukcijas statyti į eilę belaukiant kol jos bus aptarnaujamos vykdymo įrenginyje.
Magistralės sąveikos įrenginys
Pagrindinė BUI paskirtis yra paimti 16 bitų vykdymo įrenginio arba atminties rodyklę, ir ją modifikuoti taip, kad ji galėtų nurodyti į duomenis 20 bitų adresų erdvėje.
Segmentų adresavimas
• Kaip 16 bitų duomenų registrais galima nurodyti 20 bitų adresą adresų magistralei?
• Intel procesoriuje adresas nurodomas naudojant du adresų registrus, kur vienas nurodo segmentą, o kitas – vietą tame segmente
• Intel paremtoje operacinėje sistemoje gavus klaidą, kartais pateikiama kuriame adrese ji įvyko
• Tai pateikiama šešioliktaine forma 3241:A32E
Segmentų adresavimas
• Toks formatas pateikia segmento registrą (skaičius dvitaškio kairėje) ir rodyklės arba indekso registrą (skaičius dvitaškio dešinėje).
• Keturi šešioliktainės skaičių sistemos skaitmenys reiškia 16 bitų dvejetainį skaičių, o šių 16 bitų registrų kombinacija sukuria 20 bitų adresą
• Tai atliekama sudedant:
Segmentų adresavimas
• 20 bitų reikšmė, kuri gaunama prie segmento registro dešinėje prirašius keturis nulius, vadinama segmento adresu. Ji nurodo į maţiausią adresą į kurį segmento rodyklės kombinacija gali nurodyti. Šis adresas dar gali būti ţinomas, kaip segmento pagrindo adresas.
• 16 bitų reikšmė, saugoma rodyklės ar indekso registre, vadinama atšakos adresu. Jis vaizduoja atšaką nuo segmento adreso į adresą atmintyje, su kuriuo procesorius nori bendrauti.
• 20 bitų reikšmė, kuri gauta adresų sumavimo bloke, rodo į tam tikrą adresą procesoriaus adresų erdvėje. Šis adresas vadinamas fiziniu adresu ir tai tas pats adresas, kuris talpinamas adresų linijose atminties magistralėje.
Segmentų adresavimas
Segmentų adresavimo pliusai
• Naudojant 16 bitų registrus, galima nurodyti 20 bitų adresus
• Programa gali būti talpinama betkur, jei pirmąją adreso dalį nurodo operacinė sistema, o pati programa nurodo tik vietą tame segmente (kol įsitenka 64 K segmente)
Segmentų registrai• Kodo segmentas (CS – Code Segment). Šis registras saugo
segmento, priskirto saugoti programos kodą, pagrindo adresą. Jis yra suporuotas su instrukcijų rodykle (IP) nurodyti į sekančią instrukciją, kuri turi būti patalpinta į instrukcijų dekoderį vykdymui.
• Duomenų segmentas (DS – Data Segment). Šis registras nurodo segmento, skirto saugoti programos duomenims, pagrindo adresą. Jis daţniasuia siejamas su SI registru.
• Steko Segmentas (SS – Stack Segment). Šiame segmente saugomas steko segmento pagrindo adresas. Kaip prisimenate, yra du registrai, kurie naudoja steką. Pirmasis yra steko rodyklė, o SS ir SP kombinacija rodo į paskutinę įrašytą į laikinąją atmintį reikšmę. Kitas registras yra pagrindo rodyklė, kuris yra naudojamas nurodyti duomenų elementų bloko perdavimą funkcijai.
• Papildomas segmentas (ES – Extra Segment). Kaip DS, šis registras rodo į duomenų segmentą, priskirtą programai. Kadangi DS yra susietas su SI registru, tai ES susietas su DI registru.
Pavyzdys
• Jei CS lygus A48716, o IP lygu 143616, tai koks yra sekančios instrukcijos adresas fizinėje atmintyje?
• Tai išsiaiškiname prie A48716 dvejetainio kodo prirašę keturis nulius iš dešinės ir sudėję su 143616.
Kaip matome, gavome, kad uţrašas A487:1436 atitinka fizinį adresą A5CA616.
Instrukcijų eilė
• 80186 vykdymo procesą sudalina į tris ciklus: uţkrovimas, dekodavimas ir vykdymas. Kiekvienas iš šių ciklų apibudintas ţemiau.▫ Uţkrovimas – iš atminties gaunama kita instrukcija, kurią reikės
vykdyti. Uţ tai atsakingas BUI.▫ Dekodavimas – nustatoma kurias grandines suaktyvinti, kad būtų
vykdoma uţkrauta instrukcija. Ši funkcija yra vykdoma EU valdymo sistemos instrukcijų dekodavimo grandinėje.
▫ Vykdymas – vykdoma operacija, nurodyta instrukcijos, naudojant ALU, registrus ir duomenų perdavimo mechanizmus.
• BUI instrukcijų eilės tikslas yra saugoti uţkrautų instrukcijų, kurias turės vykdyti EU, seką. Kai kuriais atvejais išsišakojimai ar sugrįţimai iš funkcijos gali sugriauti instrukcijų eilę ir reikalauti numatytos vykdymo tvarkos keitimo. Aukštesnio lygio instrukcijų eilė gali su tuo susidoroti įkeliant abu galimus vykdymo kelius, leidţiant EU nustatyti kuris kelias bus reikalingas po dabar vykdomos instrukcijos.
Į/I• Norint bendrauti su išoriniais įrenginiais,
neuţimant 80x86 procesoriaus 1 M atminties erdvės erdvės, magistralėje yra pridėtos dvi papildomos valdymo linijos, kurios efektyviai tampa dviem magistralėmis – viena atminčiai, o kita Į/I.
• Antroji magistralė naudoja tas pačias adresų ir duomenų linijas, kurios yra naudojamos atminties magistralėje. Skirtumas yra tas, kad Į/I įrenginiai naudoja skirtingas valdymo linijas.
Į/I• Skaityti duomenis iš atminties, 80x86 procesorius naudoja
ţemą MRDS signalą• Įrašyti duomenis į atmintį 80x86 procesoriuje naudojamas
ţemas signalas MWTC• Kai abu MRDC ir MWTC signalai yra aukšti (1), atminties
įrenginiai yra neaktyvūs. • Skaitymo valdymas iš Į/I portų yra vadinamas IORC, kuris
taip pat yra ţemo lygio• Į/I portų rašymo valdymo signalas vadinamas IOWC. Jis taip
pat yra aktyvus, kuomet ţemas
Funkcija MRDC MWTC IORC IOWC
Skaitymas iš atminties 0 1 1 1
Rašymas į atmintį 1 0 1 1
Skaitymas iš Į/I įrenginio 1 1 0 1
Rašymas į Į/I įrenginį 1 1 1 0
Į/I• Nors atminis ir Į/I įrenginiai naudojasi tomis pačiomis
adresų ir duomenų linijomis, tačiau yra skirtumas tarp atminties ir Į/I įrenginių naudojimo. ▫ nepriklausomai nuo 80x86 procesoriaus kartos, tik
ţemiausios 16 adresų linijų yra naudojama Į/I portams. Tai reiškia, kad net jei adresų erdvė bus 4 G, Į/I portų adresų erdvė visvien bus tik 64 K. Tačiau tai nėra didelė problema, nes išorinių įrenginių poreikis neauga taip sparčiai, kaip kad atminties erdvė.
▫ programuotojui keliami kitokie reikalavimai. Mes dar nesusipaţinome su 80x86 asemblerio klabos instrukcijų rinkiniu, tačiau tikriausiai daugelis jūsų ţino, kad asemblerio kalboje duomenų perdavimui naudojama instrukcija MOV. Tačiau ši komanda negali būti naudojama duomenų perdavimui ar gavimui iš Į/I portų, nes ji naudoja MRDC ir MWTC signalus magistralės valdymui. Siųsti duomenis į Į/I portą asemblerio kalboje naudojama komanda OUT arba OUTS, o tuo tarpu skaitymui, komanda IN arba INS.