ARHITECTURA MICROPROCESORULUI 8086
1. Structura microprocesorului
Aceasta structura este ilustrata in figura 2.14. Microprocesorul dispune de mai multi registri generali pe 16 biti. El este format din doua componente mari:
EU (Executive Unit) care executa instructiunile masina prin intermediul componentei ALU (Aritmetic and Logic Unit).
BIU (Bus Interface Unit) este componenta care pregateste executia fiecarei instructiuni masina. In esenta, aceasta componenta citeste o instructiune din memorie, o decodifica si calculeaza adresa din memorie a unui eventual operand. Configuratia rezultata este depusa intr-o zona tampon cu dimensiunea de 6 octeti, de unde va fi preluata de EU.
Cele doua componente lucreaza in paralel, in sensul ca in timp ce EU executa instructiunea curenta, BIU pregateste instructiunea urmatoare. Cele doua actiuni sunt sincronizate, in sensul ca cea care termina prima asteapta dupa cealalta.
Fig. 2.14. Arhitectura microprocesorului 8086
2. Registrii generali EU
Registrul AX este registrul acumulator. El este folosit de catre majoritatea instructiunilor ca unul dintre operanzi.
Registrul BX este folosit in principal ca registru de baza. Folosirea lui in aceasta acceptiune va fi descrisa in sectiunea 7.
Registrul CX este folosit in principal ca registru de numarare (registru contor) pentru instructiunile care au nevoie de indicatii numerice.
Registrul DX este un registru de date. Impreuna cu registrul AX se foloseste in calculele ale caror rezultate depasesc dimensiunea unui cuvint.
Fiecare dintre registrii AX, BX, CX, DX au capacitatea de 16 biti. Fiecare dintre ei poate fi privit in acelasi timp ca fiind format prin concatenarea (alipirea) a doi (sub)registri. Subregistrul superior contine cei mai semnificativi 8 biti (partea HIGH) ai registrului de 16 biti din care face parte. Exista astfel registrii AH, BH, CH, DH. Subregistrul inferior contine cei mai putin semnificativi 8 biti (partea LOW) ai registrului de 16 biti din care face parte. Exista astfel registrii AL, BL, CL, DL.
Registrii SP si BP sunt registri destinati lucrului cu stiva. O stiva se defineste ca fiind o zona de memorie in care se pot depune succesiv valori, extragerea lor ulterioara facandu-se in ordinea inversa depunerii.
Registrul SP (Stack Pointer) puncteaza spre elementul ultim introdus in stiva (elementul din varful stivei).
Registrul BP (Base pointer) puncteaza spre primul element introdus in stiva (indica bazei stivei). Rolul lui va fi evidentiat in capitolul 8, sectiunea 8.3.
Registrii DI si SI sunt registrii de index utilizati de obicei pentru accesarea elementelor din siruri de octeti sau de cuvinte. Denumirile lor (Destination Index si Source Index) precum si rolurile lor vor fi clarificate in capitolul 4, sectiunea 4.4.2.
3. Flagurile
Un flag este un indicator reprezentat pe un bit. O configuratie a registrului de flaguri indica un rezumat sintetic a executiei fiecarei instructiuni. Pentru 8086 acest registru (notat FLAGS in figura 2.14) are 16 biti dintre care sunt folositi numai 9. Structura in detaliu a registrului FLAGS este data in figura 2.15.
Fig. 2.15. Structura registrului de flaguri 8086
CF (Carry Flag) este flagul de transport. Are valoarea 1 in cazul in care in cadrul operatiei s‑a facut transport in afara domeniului de reprezentare a rezultatului. De exemplu, daca se efectueaza urmatoarea adunare intre doi octeti:
1001 0011 +
0111 0011
-‑‑‑‑‑‑‑‑-----
1 0000 0110
rezulta un transport de cifra semnificativa. Valoarea 1 este depusa automat in CF. In absenta transportului, in CF se va depune valoarea 0.
PF (Parity Flag) este flagul de paritate. Valoarea lui se stabileste in asa fel incat impreuna cu numarul de biti 1 din reprezentarea rezultatului instructiunii sa rezulte un numar impar de cifre 1.
AF (Auxiliary Flag) indica valoarea transportului de la bitul 3 la bitul 4 al rezultatului executiei instructiunii. De exemplu, in adunarea de mai sus transportul este 0.
ZF (Zero Flag) primeste valoarea 1 daca rezultatul instructiunii este egal cu zero si valoarea 0 la rezultat diferit de zero.
SF (Sign Flag) primeste valoarea 1 daca rezultatul executiei instructiunii este un numar strict negativ si valoarea 0 in caz contrar.
TF (Trap Flag) este un flag de depanare. Daca are valoarea 1, atunci masina se opreste dupa fiecare instructiune.
IF (Interrupt Flag) este flag de intrerupere. Asupra acestui flag vom reveni in capitolul 7.
DF (Direction Flag) este folosit cand se opereaza asupra sirurilor de octeti sau de cuvinte. Daca are valoarea 0, atunci deplasarea in sir se face de la inceput spre sfarsit, iar daca are valoarea 1 este vorba de deplasari de la sfarsit spre inceput.
OF (Overflow Flag) este flag pentru depasire. Daca rezultatul ultimei instructiuni nu a incaput in spatiul rezervat operanzilor, atunci acest flag va avea valoarea 1, altfel va avea valoarea 0.
Semnificatiile de mai sus sunt generale. De fapt, fiecare instructiune isi specifica modul propriu de setare si interpretare a flagurilor.
4. Registrii de adresa si calculul de adresa
Prin definitie, adresa unei locatii de memorie este numarul de octeti consecutivi aflati intre inceputul memoriei RAM si inceputul locatiei respective.
Data fiind capacitatea de 1 Mo a memoriei microcalculatoarelor care folosesc 8086, o adresa trebuie sa se reprezinte pe 20 de biti. Capacitatea registrilor si a cuvintelor este de 16 biti. Problema care apare este cum se poate obtine o adresa de 20 de biti folosind cuvinte de cate 16 biti?
Memoria se adreseaza deci pe 20 de biti si exista doar registri de 16 biti. Pentru rezolvarea situatiei a aparut conceptul de segment de memorie. Segmentul de memorie reprezinta o succesiune continua de octeti care are urmatoarele proprietati: incepe la o adresa multiplu de 16 octeti, are lungimea multiplu de 16 octeti si are lungimea de maximum 64 Ko. Deoarece adresa de inceput a fiecarui segment este un multiplu de 16, cei mai putin semnificativi 4 biti ai adresei sunt zero! Atunci cand nu sunt posibile confuzii, vom spune simplu segment unei configuratii de 16 biti care localizeaza inceputul unui segment.
Vom numi offset sau deplasament adresa unei locatii fata de inceputul unui segment. Deoarece un segment are maximum 64Ko, sunt suficienti 16 biti pentru a reprezenta orice offset.
Vom numi specificare de adresa o pereche de numere de cate 16 biti, unul reprezentand adresa de inceput a segmentului, iar al doilea deplasamentul in cadrul segmentului. In scriere hexazecimala o adresa se exprima sub forma:
s3s2s1s0 : o3o2o1o0
Deci determinarea adresei din specificarea de adresa se face conform regulii:
a4a3a2a1a0 := s3s2s1s00 + o3o2o1o0
unde a4a3a2a1a0 este adresa calculata (scrisa in hexazecimal). Deci configuratia de 16 biti s3s2s1s0 care localizeaza inceputul segmentului este inmultita cu 16 (i se adauga o cifra 0 in baza 16, sau 4 cifre 0 in baza 2) si la rezultat se aduna valoarea offsetului o3o2o1o0. Acest calcul este efectuat de catre componenta ADR din BIU.
Spre exemplu, specificarea 7BC1 : 54A3 indica adresa 810B3, ca rezultat al sumei 7BC10 + 54A3.
Este usor de observat ca exista mai multe specificari pentru aceeasi adresa. De exemplu, adresa de mai sus poate fi specificata si prin 810B : 0003. In acest fel este posibila suprapunerea mai multor segmente in aceeasi arie de memorie.
Acest mecanism de adresare este tipic pentru 8086 si poarta numele de mod de adresare real (Real Address Mode).
Incepand cu 80286, mai apare modul de adresare protejat (Protected Virtual Address Mode), iar incepand cu 80386 mai apar inca doua moduri de adresare:
‑ mod paginat;
‑ mod virtual 8O86;
Ultimele trei moduri au fost introduse pentru a permite adresarea de catre IBM‑PC a mai mult de 1 Mo. Asupra lor vom reveni in cadrul capitolului 10.
Arhitectura 8086 permite existenta a patru tipuri de segmente:
segment de cod, care contine instructiuni masina;
segment de date, care contine date asupra carora se actioneaza in conformitate cu instructiunile;
segment de stiva
segment suplimentar (extrasegment).
Fiecare program este compus din unul sau mai multe segmente, de unul sau mai multe dintre tipurile de mai sus. In fiecare moment al executiei este declarat activ cate un singur segment din fiecare tip. Registrii CS (Code Segment), DS (Data Segment), SS (Stack Segment) si ES (Extra Segment) din BIU retin adresele de inceput ale segmentelor active, corespunzator fiecarui tip. Deci registrii CS, DS, SS si ES contin (de fapt) adresele de inceput ale segmentelor active: de cod, de date, de stiva si suplimentar. Registrul IP contine offsetul instructiunii curente in cadrul segmentului de cod curent, el fiind manipulat exclusiv de catre BIU.
5. Reprezentarea instructiunilor masina
O instructiune masina 8086 are maximum doi operanzi. Pentru cele mai multe dintre instructiuni, cei doi operanzi poarta numele de sursa, respectiv destinatie. Dintre cei doi operanzi, maximum unul se poate afla in memoria RAM. Celalalt se afla fie intr-un registru al EU, fie este o constanta intreaga. Astfel, o instructiune apare sub forma:
numeinstructiune destinatie, sursa
Formatul intern al unei instructiuni este variabil, el putand ocupa intre 1 si 6 octeti. Semnificatia generala a octetilor reprezentarii este urmatoarea:
Primul octet, numit cod identifica instructiunea de executat. Al doilea octet, numit octetmod specifica pentru unele dintre instructiuni natura si locul operanzilor (registru, memorie, constanta intreaga etc.). Unele instructiuni folosesc acest octet pentru a reprezenta in el o constanta scurta (short), adica o constanta care poate lua valori intre -128 si 127.
Majoritatea instructiunilor folosesc pentru reprezentare fie numai octetul cod, fie octetul cod urmat de octetmod.
Urmatorii maximum patru octeti, daca apar, identifica fie o adresa de memorie, fie o constanta reprezentata pe mai mult de un octet. De aici se deduce o restrictie suplimentara privind operanzii: nu este permisa folosirea unei adrese de memorie daca celalalt operand este o constanta reprezentata pe mai mult de un octet.
6. Adrese FAR si NEAR
Asa cum am vazut in sectiunea 4., pentru a adresa o locatie din memoria RAM sunt necesare doua cuvinte: unul care sa indice segmentul, altul care sa indice offsetul in cadrul segmentului. Pentru a simplifica referirea la memorie, microprocesorul preia, in lipsa unei alte specificari, adresa segmentului din unul dintre registrii de segment CS, DS, SS sau ES. Alegerea implicita a unui registru de segment se face dupa niste reguli proprii instructiunii folosite.
Prin definitie, o adresa in care se specifica doar offsetul, urmand ca segmentul sa fie preluat implicit dintr-un registru de segment poarta numele de adresa NEAR (adresa apropiata). O adresa NEAR se afla intotdeauna in interiorul unuia din cele patru segmente active.
O adresa in care programatorul specifica explicit adresa de inceput a segmentului poarta numele de adresa FAR (adresa indepartata). O adresa FAR se poate specifica in trei moduri:
s3s2s1s0
: specificare_offset unde s3s2s1s0
este o
CS : specificare_offset sau
DS : specificare_offset sau
ES : specificare_offset sau
SS : specificare_offset;
VARDOUBLE unde prin VARDOUBLE se indica numele (adresa) unei variabile de tip dublu cuvant, care contine o adresa FAR.
Formatul intern al unei adrese FAR este: la adresa mai mica se afla cuvantul care indica offsetul, iar la adresa mai mare cu 2 (cuvantul care urmeaza) se afla cuvantul care indica segmentul.
Dupa cum se observa, si reprezentarea adreselor respecta principiul reprezentarii little-endian expus in capitolul 1, paragraful 1.3.2.3: partea cea mai putin semnificativa are adresa cea mai mica, iar partea cea mai semnificativa are adresa cea mai mare.
Faptul ca o instructiune foloseste o adresa FAR sau NEAR se reflecta in continutul octetilor care codifica instructiunea. In capitolul 4 vom vedea cum poate fi specificata natura adresei in limbaj de asamblare, lasand astfel pe seama asamblorului codificarea instructiunii.
7. Calculul offsetului unui operand. Moduri de adresare
In cadrul unei instructiuni exista mai multe moduri de a calcula offsetul unui operand pe care aceasta il solicita:
modul registru, daca pe post de operand se afla un registru al masinii;
modul imediat, atunci cand in instructiune se afla chiar valoarea operandului (nu adresa lui si nici un registru in care sa fie continut);
modul adresare la memorie, daca operandul se afla efectiv undeva in memorie. In acest caz, adresa offsetului lui se calculeaza dupa urmatoarea formula:
adresa_offset = [ BX | BP ] + [ SI | DI ] + [ constanta ]
Deci adresa_offset se obtine adunand urmatoarele trei elemente, sau numai unele dintre ele:
continutul unuia dintre registrii BX sau BP
continutul unuia dintre registrii SI sau DI;
valoarea unei constante.
De aici rezulta urmatoarele moduri de adresare la memorie:
directa, atunci cand apare numai constanta;
bazata, daca in calcul apare BX respectiv BP;
indexata, daca in calcul apare SI respectiv DI;
Cele trei moduri de adresare a memoriei pot fi combinate. De exemplu, poate sa apara adresare directa bazata, adresare bazata si indexata etc.
La instructiunile de salt mai apar doua tipuri de adresari.
Adresa relativa indica pozitia urmatoarei instructiuni de executat, in raport cu pozitia curenta. Pozitia este indicata prin numarul de octeti de cod peste care se va sari, numar ce ia valori intre -128 si 127. O astfel de adresa mai poarta numele de adresa scurta (SHORT Adress).
Adresarea indirecta apare atunci cand locul viitoarei instructiuni este indicat printr-o adresa, aflata intr-o locatie, a carei adresa este data ca operand instructiunii de salt. Desenul din figura 2.16 sugereaza acest mecanism.
Fig. 2.16. Adresarea indirecta
Adresarea indirecta asigura o mai mare flexibilitate in controlul succesiunii instructiunilor. De exemplu, in figura 2.16 continutul locatiei Y poate sa difere de la un moment la altul a executiei programului, ceea ce permite executia la momente diferite a unor instructiuni diferite in urma saltului indirect prin Y.
Adresarea indirecta poate fi la randul ei adresare indirecta NEAR sau adresare indirecta FAR.
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |