|
Structura procesoarelor familiei Intel (IA - Intel Architecture)
1. Scopul lucrarii
In cadrul lucrarii se urmareste prezentarea arhitecturii de baza a familiei de microprocesoare Intel x86, cunoscuta sub denumirea de Arhitectura Intel. Sunt analizate componentele de baza (registre, unitati aritmetice, unitate de control, unitate de adresare, magistrale, etc.), modul de executie a instructiunilor si modurile de adresare.
2. Consideratii teoretice
2.1 Evolutia familiei de procesoare Intel
Familia Intel x86 cuprinde mai multe tipuri de procesoare lansate de firma Intel incepind din 1978 si pina in prezent (1999). In tabelul de mai jos sunt prezentate procesoarele familiei impreuna cu principalele caracteristici de performanta.
Tip
Anul lansarii
Latime
registre (biti)
Latime mag. de date/adrese
Spatiu de adresare fizic/virt.
Alte caracteristici
8086
1978
16
16/20
1Mo
primul procesor pe 16 biti
8088
1980
16
8/20
1Mo
procesorul folosit pentru primul IBM -PC
80186
1982
16
16/20
1Mo
8086 cu suport I/O pe cip
80286
1982
16
16/24
16Mo
procesor pentru IBM-PC,varianta AT
80386
1985
32
32/32
4Go/64To
primul procesor pe 32 de biti
80486
1989
32
32/32
4Go/64To
incorporeaza coprocesorul matematic si unitatea de management a memoriei
Pentium
1992
32
64/32
4Go/64T
arhitectura pipeline superscalara
Pentium Pro
1995
32
64/32
4Go/64T
primul reprezentant al familiei P6 - realizeaza executia dinamica a instructiunilor
Pentium II, si III
1997,
1999
32
64/32
4Go/64T
facilitati suplimentare de control al consumului
Ceea ce face din aceste procesoare o familie este compatibilitatea arhitecturala de jos in sus, adica un program scris pentru o versiune mai veche de procesor se poate executa pe orice versiune ulterioara fara modificari. Aceasta compatibilitate este necesara din mai multe considerente:
- programele scrise pentru o anumita versiune de procesor pot fi reutilizate pentru versiunile mai noi; firmele de software pot sa investeasca mai mult pentru dezvoltarea unui program, bazindu-se pe pastrarea compatibilitatii
- programatorii sunt familiarizati cu o structura hardware relativ stabila; modificarile hardware se mentin pe cit posibil transparente pentru programatori si vizeaza mai ales aspecte de performanta (ex: executia mai rapida a instructiunilor)
Mentinerea compatibilitatii, insa, impune anumite restrictii care uneori pot sa limiteze performantele noilor versiuni (ex: numarul de registre interne, spatiul de adresare maxim, dimensiunea registrelor, etc.). In aceasta lucrare se prezinta cu precadere acele aspecte arhitecturale care s-au pastrat in decursul timpului la versiunile familiei Intel x86.
2.2 Componentele arhitecturii de baza
Procesorul I8086 (primul lansat din familie) contine doua unitati functionale autonome: unitatea de executie (EU - Execution Unit) si unitatea de interfatare a magistralei (BIU - Bus Interface Unit); ulterior functionalitatea acestor unitati a fost divizata pe mai multe unitati si s-au adaugat altele ca de exemplu: unitatea de decodificare a instructiunilor, unitatea de segmentare si de paginare, unitatea de management a memoriei cache si procesorul de virgula flotanta. Din punct de vedere al programatorului aceasta divizare pe unitati este mai putin vizibila; in schimb sunt vizibile urmatoarele componente: registrele generale, registrele de adresare, registrele speciale, magistralele interne de date si adrese, unitatile aritmetico-logice si altele. In figura de mai jos s-au reprezentat aceste componente in structura procesorului I8086.
AL
BH
BL
CH
CL
DH
DL
DS
SI
ES
DI
SS
BP
IP
SP
IR
Logica de c-da a magistralei
Reg. temporar
Unitatea de c-da
Coada de instructiuni
Reg. de stare
Figura 1 Arhitectura interna a procesorului 8086
Registrele generale, notate cu AX, BX,CX, DX, SP, BP, DI si SI sunt utilizate pentru pastrarea temporara a datelor in vederea efectuarii de operatii aritmetico-logice; registrele SP, BP, DI si SI pot fi utilizate si pentru adresarea memoriei, iar DX pentru adresarea porturilor de intrare/iesire. Lungimea lor este de 16 biti. Incepind de la versiunea '386 aceste registre au fost extinse la 32 de biti (denumirea noua: EAX, EBX, ..). Primele 4 registre pot fi adresate la nivel de octet (ex: AL, AH), cuvint (ex:AX, BX) sau dublu-cuvint(EAX, EBX).Celelalte se adreseaza pe cuvint sau dublu-cuvint. Pentru anumite tipuri de operatii se utilizeaza in mod implicit anumite registre. De exemplu:
- AX - pentru operatii de inmultire si impartire, si operatii pe siruri
- BX - pentru adresare bazata
- CX - pentru contorizare cicluri
- DX - pentru adresare porturi de intrare/iesire
- SP - pentru adresarea stivei
- BP - pentru adresare bazata
- DI, SI - pentru adresare indexata si pe siruri (Di - poantor sir destinatie; SI poantor sir sursa)
Registrul de stare program PSW: - contine indicatori de conditie (bistabile) a caror stare se modifica in urma executiei unor instructiuni. Acesti indicatori se pot utiliza pentru instructiunile de salt conditionat sau pentru a determina un anumit regim de executie a unui program. Semnificatia acestora este urmatoarea:
- O - Overflow - depasire capacitate (generat in urma unor operatii aritmetice)
- D - directie - determina directia de deplasare la adresarea pe siruri
- I - masca de intrerupere - daca este setat (I=1) atunci valideaza intreruperile mascabile, in caz contrar le blocheaza
- T - trasare - daca este setat (T=1) atunci se va genera o intrerupere dupa executia fiecarei instructiuni; se utilizeaza pentru depanarea programelor prin trasare.
- S - semn - indica semnul rezultatului unei operatii aritmetice (0- rezultat pozitiv, 1- rezultat negativ)
- Z - zero - indica un rezultat nul
- A - auxiliary - transport auxiliar
- C - Carry - transport de la nivelul cel mai semnificativ
Indicatorii introdusi la versiunile ulterioare vor fi prezentati in lucrarea 2.
Registrele segment, notate cu CS,DS,ES si SS sunt folosite pentru generarea adresei de memorie pentru instructiuni si date, prin procedeul de segmentare. Incepind de la versiunea '386 s-au mai adaugat inca 2 registre segment: FS si GS. Registrele segment se utilizeaza in mod implicit la urmatoarele adresari:
- CS - adresare instructiuni
- DS - adresare date
- SS - adresare stiva
- ES - adresare date pentru instructiuni pe siruri
Programatorul poate sa ceara utilizarea in mod explicit a unui registru segment printr-un prefix de instructiune; in limbaj de asamblare acest lucru se realizeaza prin plasarea denumirii registrului in fata adresei operandului (separate intre ele prin ":"); de exemplu:
MOV AX, ES:[100]
Registrele speciale IP, RI sunt registre folosite pentru executia instructiunilor, dar la care programatorul nu are acces direct
- RI- registru de pastrare a instructiunii curente
- IP - registru de pastrare a adresei instructiunii curente
Registrele de control: - sunt registre pentru controlul regimului de lucru al procesorului sau pentru controlul unor functii speciale (ex: segmentare, paginare, memorie cache). Aceste registre pot fi accesate numai in anumite conditii , de catre programe privilegiate.
Unitatea aritmetico-logica: efectueaza operatiile matematice si logice specificate prin instructiuni. Operanzii pot fi continuti in registre interne si locatii de memorie. Continutul porturilor de intrare/iesire nu se poate utiliza in mod direct la operatii aritmetico-logice. Operatiile se pot efectua pe octet , pe cuvint (16 biti) sau pe dublu-cuvint (32 biti), in reprezentare intreaga fara semn sau in compement fata de 2 (C2). Pentru operatii in virgula flotanta se utilizeaza Coprocesorul matematic. Initial aceasta unitate era un circuit separat de procesor, dar ulterior ( incepind cu '486) ea a fost inclusa in structura procesorului.
Unitatea de adresare: asigura calculul adresei operanzilor pe baza modului de adresare specificat in instructiune. Pentru adresare se utilizeaza registrele segment si anumite registre generale (ex: SI, DI, SP, BP, BX). La variantele mai noi exista unitati specializate pentru segmentare si paginare, care impreuna ofera suportul necesar pentru implementarea memoriei virtuale.
Unitatea de interfatare a magistralei: asigura legatura intre componentele interne ale procesorului si modulele sistemului de calcul, externe procesorului ( module de memorie si interfete de intrare/iesire); contine amplificatoare de magisrala pentru liniile de date, adrese si comenzi, si circuite de control al transferului de date pe magistrala.
2.2 Executia instructiunilor
Un program executabil contine coduri de instructiuni in limbaj masina si date. Pentru a putea fi executat programul ( sau cel putin secventa in curs de executie) trebuie sa se afle in memoria calculatorului. Executia unei instructiuni presupune mai multe faze: extragerea instructiunii, decodificarea, extragerea operanzilor, executia operatiei si salvarea rezultatului. In timpul executiei instructiunii microprocesorul comunica cu celelalte componente ale sistemului ( memorie, interfete de intrare/iesire) prin intermediul magistralei. Pe magistrala se transfera instructiuni si date, care se pastreaza in locatii de memorie si porturi de intrare/iesire. Pentru regasirea informatiilor se utilizeaza semnale de adresa si semnale de comanda. Aceste semnale determina spatiile de adresare ale procesorului: spatiul de memorie si spatiul de intrare/iesire.
Transferul de informatii intre procesor si celelalte componente de pe magistrala se realizeaza prin cicluri masina. Un ciclu masina poate sa dureze un numar variabil de perioade de ceas. Pe durata unui ciclu masina se transfera o singura data (octet, cuvint sau dublu-cuvint) a carei sursa sau destinatie se aflata la adresa specificata prin semnalele de adresa si de comanda.
Incepind cu procesorul Pentium mecanismul de transfer pe baza de cicluri masina a fost inlocuit cu cel bazat pe tranzactii. Avantajul utilizarii tranzactiilor consta in posibilitatea efectuarii simultane a mai multor transferuri de date.
2.3 Moduri de adresare
Citirea sau scrierea unei locatii de memorie necesita specificarea adresei acesteia. Modul de determinare a acestei adrese depinde de modul de adresare utilizat. Procesoarele din familia Intel x86 dispun de o gama variata de moduri de adresare, ceea ce ofera flexibilitate si eficienta in programare. Diversele moduri de adresare ofera suportul necesar pentru implemenatrea accesului la diferite structuri de date specifice limbajelor de nivel inalt (ex: variabile simple, tablouri, inregistrari, etc.).
Moduri pentru adresarea datelor:
a. Adresarea imediata: - operandul este continut in codul instructiunii
-exemplu:
MOV AX, 1234H ;1234H este o data imediata inclusa in codul instrictiunii
b. Adresarea de tip registru: - operandul este continut intr-un registru intern al procesorului
-exemplu:
MOV AX, BX ; registrele AX, si BX reprezinta destinatia si respectiv sursa transferului de date
c. Adresarea directa: - adresa operandului este specificata in codul instructiunii
-exemplu:
MOV AX, [1234H] ; 1234H este adresa operandului sursa
d. Adresarea indexata: adresa operandului este continuta intr-un registru index (SI sau DI); acest mod de adresare este specific pentru accesul la structuri de date de tip tablou (vector, matrice), la care elementele structurii se regasesc prin incrementarea unui index.
-exemplu:
MOV AX, [SI] ; registrul SI contine adresa operandului
MOV AX,[SI+1234H] ; registrul SI contine adresa relativa a operandului in raport cu adresa 1234H;
e. Adresarea bazata: adresa operandului sa afla intr-un registru de baza (BPsau BX); acest mod de adresare este specific pentru structuri de date de tip inregistrare (record); un element al inregistrarii se regaseste prin adunarea la adresa de inceput a inregistrarii (adresa de baza) a unei adrese relative.
-exemplu:
MOV AX,[BX+123H] ; registrul BX contine adresa de inceput a structurii de date iar 123H este adresa relativa a elementului cautat
f. Adresarea bazat indexata: este o combinatie a metodelor precedente; se utilizeaza pentru adresarea unor structuri de date complexe (ex: inregistrare de tablouri sau tablou de inregistrari)
-exemplu:
MOV AX, [BX+SI+1234H] ; adresa operandului se obtine prin insumarea continutului registrelor SI, BX si a adresei 1234H.
g. Adresarea de tip stiva: adresa este specificata in mod implicit; ea este continuta in registrul poantor de stiva (SP); la efectuarea unui transfer continutul registrului SP este actualizat prin incrementare sau decrementare pentru a indica catre virful stivei; singurele instructiuni care folosesc acest mod de adresare sunt cele de salvare pe stiva (PUSH) si de citire de pe stiva (POP).
-exemplu:
PUSH AX
POP AX
h. Adresarea pe siruri: este o forma speciala de adresare indexata ce permite parcurgerea unui sir de date prin executia ciclica a unei singure instructiuni; registrele folosite in mod implicit pentru adresare sunt: SI pentru sirul sursa si DI pentru sirul destinatie. Dupa efectuarea instructiunii registrele index sunt incrementate sau decrementate functie de starea indicatorului "D" din registrul de stare program (PSW). Registrul CX se utilizeaza pentru contorizarea numarului de cicluri efectuate; el se decrementeaza dupa fiecare executie de instructiune pina se ajunge la 0.
-exemplu:
MOVSW ; transfer pe cuvint
MOVSB ; transfer pe octet
obs: pentru ciclare se foloseste instructiunea prefix REP
Modurile de adresare prezentate mai sus determina adresa unui operand in cadrul unui segment (adresa offset). Pentru a determina adresa fizica a unei date trebuie sa se utilizeze informatia continuta in registrul segment folosit in mod implicit (CS - cod, DS - date, SS- stiva), sau specificat in mod explicit. In regimul de lucru "real" adresa fizica se calculeaza in felul urmator: adresa de segment (continuta intr-un registru segment) se deplaseaza la stinga cu 4 pozitii binare (o pozitie hexazecimala) dupa care se aduna la adresa de offset.
-exemplu (adresele sunt in hexazecimal):
Adresa de segment
1
2
3
4
Adresa de offset
5
6
7
8
Adresa fizica
1
7
9
B
8
In regimul de lucru protejat informatia continuta in registrele segment reprezinta "descriptori" de segment iar calculul adresei fizice este diferit (a se vedea lucrarea 2).
Moduri pentru adresarea instructiunilor:
a. Prin incrementare - adresa instrictiunii urmatoare se determina prin incrementarea registrului PC; este metoda implicita de adresare folosita pentru majoritatea instructiunilor cu exceptia celor de salt.
b. Prin adresare directa - adresa instructiunii urmatoare este continuta in instructiune. Acest mod se foloseste la instructiunile de salt.
-exemplu:
JMP 1234H ; salt la adresa 1234H
c. Prin apel direct de rutina: adresa de salt este continuta in instructiune; pe stiva se salveaza adresa de offset si adresa de segment a instructiunii urmatoare celei de apel.
-exemplu:
CALL 1234H ;salt la rutina de la adresa 1234H
d. Prin revenire din rutina:- adresa de salt se determina prin incarcarea registrelor PC si CS cu informatia aflata pe virful stivei (adresa salvata pe stiva la apelul rutinei).
-exemplu:
RET
e. Prin salt relativ: adresa de salt se determina prin adunarea la registrul PC a adresei relative continuta in instructiune; observatie: registrul PC contine adresa instructiunii imediat urmatoare; adresa relativa se exprima pe octet, ceea ce inseamna ca saltul trebuie sa se incadreze in limitele (-127 - +127).Acest mod de adresare se utilizeaza in cazul salturilor conditionate.
3. Mersul lucrarii
1. Se lanseaza un program de depanare a programelor scrise in limbaj de asamblare (ex: DEBUG, AFD, TD-turbodebug) si se identifica din documentatie comenzile ce permit:
- vizualizarea si editarea registrelor interne ale procesorului
- vizualizarea si editarea unor zone de memorie
- incarcarea, vizualizarea, editarea si executia programelor
2. Se va testa utilizarea explicita si implicita a registrelor interne ale procesorlului in diverse instructiuni (ex: utilizarea implicita a registrelor segment, transfer de siruri, buclare, etc.). Se va urmari modificarea indicatorilor de conditie in urma unor operatii aritmetice si logice.
3. Se vor scrie secvente de program prin care se testeaza modurile de adresare prezentate in paragraful anterior; la executia pas-cu-pas a acestor secvente se va urmari modul de modificare a registrelor si a locatiilor de memorie adresate dupa executia fiecarei instructiuni (ex: incrementare/decrementare registri index la adresarea pe siruri, decrementarea automata a registrului CX, modificarea registrului stiva SP si a memoriei stiva la executia instructiunilor PUSH, POP, CALL si RET, etc.).
4. Se vor implementa si testa rutinele date ca problema.
4.Probleme:
1.Sa se scrie o rutina pentru transferul unui bloc de date intre 2 zone de memorie
intrari: DS:SI- adresa de inceput a zonei sursa
ES:DI- adresa de inceput a zonei destinatie
CX - lungimea zonei
obs: se vor folosi diferite moduri de adresare
2. Sa se scrie o rutina de adunare a doi vectori
intrari: DS:SI - adresa de inceput a primului vector
ES:DI - adresa de inceput a celui de al doilea vector
DS:BX - adresa vectorului rezultat
CX - lungimea sirului
3. Sa se scrie o rutina pentru calculul minimului, maximului si a mediei unui sir de : octeti, cuvinte si dublu-cuvinte in reprezentare fara semn, si in complement fata de 2
intrari: DS:SI - adresa de inceput a sirului
CX- lungimea sirului
DL- dimensiunea unui element - 1- un octet, 2-cuvint, 4- dublucuvint
DH- forma de reprezentare - 0- fara semn, 1 cu semn
iesiri: variabilele MIN, MAX si MED
4. Sa se scrie o rutina de testare a functionarii corecte a registrelor interne ale procesorului si a indicatorilor de conditie. Indicatie: in registre se vor scrie succesiv datele 0000..,1111.,010101.,101010..; se vor executa instructiuni care modifica starea indicatorilor de conditie.
5. Sa se scrie o rutina de testare a unui segment de memorie. Rutina va fi apoi utilizata in cadrul unui program care determina zonele de memorie disponibile ale unui sistem de calcul. Indicatie: testarea se va face prin inscrierea in fiecare locatie de memorie a secventelor 0000., 1111., 01010. 1010,etc.;inscrierea se va face secvential (prin incrementarea adreselor) si aleatoriu.