|
Incepand cu microprocesoarele pe 16 biti (8086, 8088, 80286), unitatea de prelucrare nu mai urmeaza strict schema ciclica descrisa la arhitectura von Neumann, de extragere a instructiunii, decodificare, executie s.a.m.d. Noutatea a fost divizarea unitatii de prelucrare in doua unitati (vezi figura 3.1):
- unitatea de executie (Execution Unit - EU)
- unitatea de interfata cu magistrala (Bus Interface Unit - BIU)
Fig. 3.1.
Dupa cum se observa, cele doua unitati sunt legate intre ele cu o conducta (pipeline) prin care sunt transferate instructiunile extrase din memoria program de catre BIU spre EU; aceasta din urma are numai rolul de a executa instructiunile extrase de BIU, EU neavand nici o legatura cu magistrala sistemului. In timp ce EU isi indeplineste sarcina, BIU extrage noi instructiuni pe care le organizeaza intr-o coada de asteptare (queue). La terminarea executiei unei instructiuni, EU are deja la dispozitie o noua instructiune din coada de asteptare mentinuta de BIU. Cele doua unitati, EU si BIU, lucreaza deci in paralel, existand momente de sincronizare si asteptare intre ele, atunci cand coada de instructiuni este goala, ceea ce se intampla insa foarte rar.
Functionarea paralela a celor doua unitati (BIU si EU) este transparenta utilizatorului. Aceasta arhitectura se mai numeste si arhitectura cu prelucrare secvential - paralela pipeline.
Unitatea de executie EU contine o unitate logico-aritmetica (ALU) de 16 biti, registrul indicatorilor conditionali, registrul operatorilor si registrii generali.
BIU contine indicatorul de instructiuni IP (Instruction Pointer), registrele de segmente, un bloc de control al magistralei si de generare de adrese si o memorie organizata sub forma unei cozi, in care sunt depuse instructiunile extrase (Instruction Queue).
Vom detalia in continuare blocurile de registri, aratand si rolul unora dintre acestia in cursul executiei programului. Avem urmatoarele categorii de registri pe 16 biti:
- registri generali
- registri de segment
- registru pointer de instructiune
- registrul indicatorilor de stare si control
Registrii generali sunt in numar de 8 si sunt impartiti in doua seturi a cate 4 registri (fig. 3.2):
- registrii de date AX, BX, CX, DX
- registrii de pointer si de index SP, BP, SI, DI
AH
AL
AX
BH
BL
BX
CH
CL
CX
DH
DL
DX
SP
BP
SI
DI
Fig. 3.2.
Fiecare registru de date este format din doi registri de cate 8 biti, care pot fi adresati si individual. Registrii pointer si index pot fi folositi numai pe 16 biti si pot participa la majoritatea operatiilor aritmetice si logice. De asemenea, registrii pointer si index (ca si BX) sunt utilizati si la adresarea memoriei.
Registrii de segment, la randul lor, sunt folositi exclusiv pentru adresarea locatiilor de memorie. Rolul lor in adresare este insa diferit de cel al registrilor prezentati mai sus si se refera la impartirea memoriei in segmente.
Un segment este o unitate logica de memorie care poate avea cel mult 64 Ko (locatii contigue), in timp ce cantitatea maxima de memorie acdresabila de un procesor Intel pe 16 biti este de 1 Mo . Fiecarui segment i se atribuie o adresa de baza, care este adresa locatiei de inceput a segmentului. Valoarea acestei adrese se afla memorata intr-un registru de segment. Exista 4 registri segment (conform figurii 3.3) si ei se gasesc localizati in BIU.
CS
DS
SS
ES
Fig. 3.3.
In memorie pot exista, in functie de pozitia lor relativa, segmente adiacente, partial suprapuse sau suprapuse complet si disjuncte.
Deci fiecare aplicatie (program aflat in memorie) are la dispozitie un spatiu de 64Ko pentru codul instructiunilor (segmentul de cod), 64 Ko pentru stiva (segment de stiva) si 128 Ko pentru date (segmentul de date si extra segmentul). Unele aplicatii pot insa gestiona un spatiu de memorie mult mai mare, facand gestionarea segmentelor dupa propriile necesitati.
Impartirea memoriei in segmente de 64Ko provine din faptul ca microprocesoarele pe 8 biti anterioare gestionau un spatiu de numai 64Ko. Proiectantii de la Intel au cautat ca si noile microprocesoare pe 16 biti sa foloseasca eventual programe scrise pentru microprocesoarele anterioare, adoptand aceasta solutie a segmentului, facand insa adresarea memoriei mai greu de inteles si limitata ca functionalitate.
Generarea adresei fizice
Fiecare locatie de memorie are doua tipuri de adresa:
- fizica
- logica
Adresa fizica este o valoare formata din 20 biti care identifica unic fiecare locatie din spatiul de adresare de 1 Mo. Adresa fizica se gasesste in domeniul 00000h-FFFFFh si se mai numeste adresa absoluta.
Pentru a nu depinde de locul unde se afla codul in memorie, se folosesc asa-zisele adrese logice, diferite de cele fizice. Adresa logica consta dintr-o valoare de baza de segment si o valoare de deplasament (offset). Pentru orice locatie de memorie, valoarea de baza a segmentului este adresa primului octet al segmentului care contine locatia. Aceasta adresa este exprimata in paragrafe (paragraful fiind o unitate de 16 biti) iar deplasamentul (offset) este distanta in octeti de la inceputul segmentului pana la locatia respectiva. Adresa de baza si deplasamentul sunt valori pe 16 biti fara semn.
Mai multe adrese logice pot corspunde aceeleiasi locatii fizice daca se afla in segmente diferite, dupa cum se observa din figura 3.4.
BIU genereaza intotdeauna o adresa fizica dintr-o adresa logica, dupa mecanismul prezentat in figura 3.5.
Fig. 3.4.
Fig. 3.5.
Se observa ca, in principiu, calculul adresei fizice se face prin deplasarea bazei segmentului (continuta intr-un registru segment) cu 4 pozitii spre stanga (ceea ce echivaleaza cu o inmultire cu 16) si adunarea valorii deplasamentului.
BIU obtine in mod diferit adresa logica a unei locatii de memorie, in functie de tipul de referire a memoriei. Instructiunile sunt intotdeauna incarcate din segmentul de cod curent, iar registrul IP contine deplasamentul instructiunii urmatoare fata de inceputul segmentului. Operatiile cu stiva lucreaza in segmentul de stiva curent, iar registrul SP contine deplasamentul fata de varful stivei. Variabilele se gasesc de obicei in segmentul de date, iar deplasamentul este dat dupa modul de adresare specificat in instructiune. Rezultatul este asa-numita adresa efectiva, despre care vom mai vorbi la prezentarea modurilor de adresare.
Acestea sunt atributiile segmentelor in mod implicit. Unele din aceste atributii pot fi schimbate.
Faptul ca memoria microprocesorului 8086 sau 8088 este segmentata face posibila scrierea de programe care sunt independente de pozitia lor in memorie, adica sunt relocabile dinamic. Aceste programe trebuie insa sa indeplineasca o suma de conditii. Daca aceste conditii sunt indeplinite, programul poate fi mutat oriunde in memorie. Un astfel de program poate fi facut sa ocupe o zona contigua de memorie, lasand spatiu nefragmentat si pentru alte aplicatii. De asemenea, acest fapt este important atunci cand programul este inactiv in memorie si sistemul de operare muta programul pe disc; atunci cand se doreste ca programul sa fie adus din nou in memorie, pentru a se relua executia sa, zona in care s-a aflat prima data este ocupata de un alt program. Prin simpla schimbare a valorilor registrelor de segment, programul poate rula din alta zona de memorie.
Pointerul de instructiuni (IP) este un registru pe 16 biti actualizat de BIU si contine deplasamentul (offsetul) instructiunii urmatoare fata de inceputul segmentului de cod curent. Programele nu au acces direct la el, dar exista instructiuni care il modifica si il incarca sau il descarca de pe stiva.
Registrul de stare si control (Flags register) contine 6 indicatori de stare si 3 indicatori de control, notati conform figurii 3.6.
Fig. 3.6.
EU pozitioneaza cei 6 indicatori de stare pentru a reflecta anumite stari ale unei operatii aritmetice sau logice. Un anumit set de instructiuni permit modificarea executiei unui program in functie de starea acestor indicatori - cum ar fi instructiunile de salt conditionat. Indicatorii de stare reflecta urmatoarele conditii:
- C (Carry) indica transportul in exterior al bitului cel mai semnificativ al rezultatului operatiilor aritmetice
- P (Parity) este pozitionat daca rezultatul are paritate para (contine un numar par de biti cu valoarea 1)
- A (Auxiliar Carry) este pozitionat daca a avut loc un transfer de la semioctetul inferior la semioctetul superior al rezultatului si este folosit in aritmetica zecimala
- Z (Zero) pozitionat daca rezultatul operatiei a fost zero
- S (Sign) este pozitionat daca cel mai semnificativ bit al rezultatului este 1 (prin conventie, 0 indica un numar pozitiv, iar 1 - un numar negativ)
- O (Overflow) - pozitionat cand dimensiunea rezultatului depaseste capacitatea locatiei de destinatie si a fost pierdut un bit
Pentru controlul unor operatii ale procesorului, pot fi modificati (prin program) trei indicatori de control:
- D (Direction) stabileste daca operatiile pe siruri lucreaza prin incrementare (cand are valoarea 0) sau prin decrementare (valoarea 0)
- I (Interrupt) este pozitionat pe 1 pentru a permite CPU sa recunoasca cererile de intrerupere externe mascabile
- T (trap) - cand este pozitionat pe 1, trece CPU in executia de pas cu pas, in scopul depanarii programului instructiune cu instructiune