Sunteți pe pagina 1din 149

Mircea DOBRICEANU

SISTEME CU
MICROPROCESOARE

MANUAL

pentru învăţământ cu frecvenţă redusă


Prof. univ. dr. ing. Mircea DOBRICEANU

SISTEME CU MICROPROCESOARE

MANUAL

pentru învăţământ cu frecvenţă redusă


Referenţi ştiinţifici:
Prof. univ. dr. ing. Alexandru BITOLEANU – Universitatea din
Craiova
Prof. univ. dr. ing. Dan SELIŞTEANU – Universitatea din Craiova

Copyright  2012 Universitaria


Toate drepturile sunt rezervate Editurii Universitaria Craiova

Descrierea CIP a Bibliotecii Naţionale a României

DOBRICEANU, Mircea

SISTEME CU MICROPROCESOARE /
Mircea DOBRICEANU – Craiova: Universitaria, 2012

ISBN 978-

Apărut: 2012
TIPOGRAFIA UNIVERSITĂŢII DIN CRAIOVA
Str. Brestei, nr. 156A, Craiova, Dolj, România
Tel.: +40 251 598054

Tipărit în România
Cuprins

SISTEME CU MICROPROCESOARE

CUPRINS

Unitatea
de Titlu Pagina
învăţare
INTRODUCERE 9

1 CONCEPTE GENERALEPRIVIND MICROPROCESOARELE 13


Obiectivele unităţii de învăţare nr. 1 14
1.1. Definiţii şi terminologie 14
1.2. Arhitecturile von Neumann şi Harvard 19
1.3. Arhitectura de bază a unui microprocesor 20
1.3.1. Structura standard a microprocesorului 20
1.3.2. Unitatea aritmetică şi logică (ALU) 22
1.3.3. Unitatea de comandă şi control 23
1.3.4. Grupul de registre 25
1.4. Principiul de funcţionare al microprocesorului 29
Lucrare de laborator: 30
Test de autoevaluare 30
Lucrare de verificare – unitatea de învăţare nr. 1 31
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 31
Concluzii 32
Bibliografie – unitatea de învăţare nr. 1 32

2 MICROPROCESOARELE INTEL 80x86: ARHITECTURI ŞI 33


MAGISTRALE
Obiectivele unităţii de învăţare nr. 2 34
2.1. Arhitectura INTEL 80x86 34
2.2. Magistrale 40
2.2.1. Aspecte generale 40
2.2.2. Magistrala de date 41
2.2.3. Magistrala de adrese 42
2.2.4. Magistrala de control 43
Lucrare de laborator 44
Test de autoevaluare 45
Lucrare de verificare – unitatea de învăţare nr. 2 45
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 45
5
SISTEME CU MICROPROCESOARE
Cuprins
Concluzii 45
Bibliografie – unitatea de învăţare nr. 2 46

3 MICROPROCESOARELE INTEL 80x86:REGISTRELE ŞI 47


ORGANIZAREA MEMORIEI
Obiectivele unităţii de învăţare nr. 3 48
3.1. Registrele 48
3.1.1. Aspecte generale 48
3.1.2. Registrele de uz general 49
3.1.3. Registrele de segment 54
3.1.4. Registrele de uz special 56
3.2. Organizarea memoriei 58
Lucrare de laborator 63
Test de autoevaluare 63
Lucrare de verificare – unitatea de învăţare nr. 3 63
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 64
Concluzii 64
Bibliografie – unitatea de învăţare nr. 3 64

4 MICROPROCESOARELE INTEL 80x86: SETUL DE 65


INSTRUCŢIUNI
Obiectivele unităţii de învăţare nr. 4 66
4.1. Aspecte generale privind programarea în limbaje de asamblare 66
4.2. Precizări privind reprezentarea numerelor în sistemele cu 68
microprocesoare
4.3. Tipuri de date utilizate în limbaje de asamblare 71
4.4. Setul de instrucţiuni al microprocesoarelor INTEL 80x86 73
4.4.1. Sintaxa unei instructiuni în limbaj de asamblare 73
4.4.2. Grupe de instrucţiuni 74
Lucrare de laborator 85
Test de autoevaluare 85
Lucrare de verificare – unitatea de învăţare nr. 4 85
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 86
Concluzii 86
Bibliografie – unitatea de învăţare nr. 4 86

5 MICROPROCESOARELE INTEL 80x86: TEHNICI DE ADRESARE 87


A MEMORIEI
Obiectivele unităţii de învăţare nr. 5 88
5.1. Tehnici de adresare a memoriei 88
5.1.1. Aspecte generale 88
5.1.2. Moduri de adresare 89
5.2. Ciclurile de bază ale unui microprocesor 93
5.3. Moduri de operare 96
5.4. Execuţia instrucţiunilor 98
Lucrare de laborator 102
Test de autoevaluare 102
6
SISTEME CU MICROPROCESOARE
Cuprins
Lucrare de verificare – unitatea de învăţare nr. 5 103
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 103
Concluzii 103
Bibliografie – unitatea de învăţare nr. 5 104

6 MICROPROCESOARELE INTEL 80x86: LUCRUL CU STIVE ŞI 105


SUBRUTINE
Obiectivele unităţii de învăţare nr. 6 106
6.1. Caracteristici ale convertoarelor analog numerice (CAN) 106
6.1.1. Aspecte generale 106
6.1.2. Instrucţiuni pentru lucru cu stiva 109
6.2. Lucrul cu subrutine 111
6.2.1. Aspecte generale 111
6.2.2. Instrucţiuni pentru lucru cu subrutine 112
6.2.3. Transferul de parametri între program şi subrutine 116
Lucrare de laborator 116
Test de autoevaluare 117
Lucrare de verificare – unitatea de învăţare nr. 6 117
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 117
Concluzii 117
Bibliografie – unitatea de învăţare nr. 6 118

7 MICROPROCESOARELE INTEL 80x86:SISTEMUL DE 119


ÎNTRERUPERI
Obiectivele unităţii de învăţare nr. 7 120
7.1. Aspecte generale 120
7.2. Întreruperi software 123
7.3. Întreruperi hardware 125
7.4. Controlerul de intreruperi I8259A 127
Lucrare de laborator 129
Test de autoevaluare 129
Lucrare de verificare – unitatea de învăţare nr. 7 129
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 129
Concluzii 130
Bibliografie – unitatea de învăţare nr. 7 130

8 TEHNICI PENTRU ÎMBUNĂTĂŢIREA PERFORMANŢELOR 131


MICROPROCESOARELOR
Obiectivele unităţii de învăţare nr. 8 132
8.1. Paralelismul - tehnica unei prelucrări mai rapide 132
8.2. Coada pentru preluare anticipată ("prefetch queue") 136
8.3. Pipeline - suprapunerea execuţiei mai multor instrucţiuni 138
8.4. Memoria cache - căi multiple de acces la memorie 142
8.5. Arhitectura VLIW 143
8.5.1. Prezentare generală 143
8.5.2. Prezentare funcţională 144
8.6. Multiprocesarea 147
7
SISTEME CU MICROPROCESOARE
Cuprins
8.6.1. Prezentare generală 147
8.6.2. Arhitecturi de sisteme multiprocesor 148
Lucrare de laborator 149
Test de autoevaluare 149
Lucrare de verificare – unitatea de învăţare nr. 8 150
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 150
Concluzii 150
Bibliografie – unitatea de învăţare nr. 8 150

8
SISTEME CU MICROPROCESOARE
Introducere

SISTEME CU MICROPROCESOARE

INTRODUCERE

„Sisteme cu microprocesoare” este una din disciplinele domeniu (DD21), din planul de
învăţământ (semestrul 7).

Structura acestei discipline este indicată în următorul tabel.


Numărul orelor pe semestru/activităţi
Total SI S L P
56 28 - 28 -

Obiectivele acestei discipline vizează acumularea unor cunoştinţe care să ofere


studenţilor o serie de competenţe generale şi specifice, în concordanţă cu planul de
învăţământ:

a) competenţe generale:
- obţinerea de experienţă în abordarea unor subiectelor tehnice complexe într-un timp
relativ scurt, privind sistemele cu microprocesoare;
- familiarizarea cu cele mai importante arhitecturi de microprocesoare;
- dezvoltarea gândirii logice, înţelegerea conceptului de sistem cu microprocesor.

b) competenţe specifice:
- înţelegerea conceptelor precum: magistrala, memorie, interfaţarea acestora,
întreruperi etc;
- înţelegerea execuţiei unei instrucţiuni ciclu cu ciclu;
- însurşirea metodelor atât teoretice cât şi practice în domeniul sistemelor cu
microprocesoare.

Disciplina conţine 8 unităţi de învăţare, enumerate în tabelul următor.

9
SISTEME CU MICROPROCESOARE
Introducere

Nr. Denumirea unităţii de învăţare


crt.
1. Concepte generale privind microprocesoarele
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
6. Microprocesoarele INTEL 80x86: lucrul cu stive şi subrutine
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

Laboratorul se efectuează pe parcursul a 14 săptămâni (2 ore în fiecare săptămână


distribuite conform calendarului disciplinei).
Şedinţele de laborator sunt în concordanţă cu unităţile de învăţare. Denumirile lor sunt
detaliate în următorul tabel.

Nr.
Denumirea şedintei de laborator
crt.
1. Instructajul de protecţia muncii; Prezentarea lucrarilor de laborator;
2. Programarea în limbaj de asamblare folosind simulatorul SMS32: utilizarea
registrelor interne;
3. Programarea în limbaj de asamblare folosind simulatorul SMS32: accesul la
memorie;
4. Programarea în limbaj de asamblare folosind simulatorul SMS32: utilizarea stivei şi
lucrul cu subrutine;
5. Programarea în limbaj de asamblare folosind simulatorul SMS32: programarea unor
sisteme reale simulate;
6. Programarea în limbaj de asamblare folosind simulatorul SMS32: programarea
folosind întreruperile;
7. Introducere în sisteme cu microprocesoare;
8. Microsistem cu microprocesor – modul Z3EV: descriere şi funcţionare hardware;
9. Microsistem cu microprocesor – modul Z3EV descriere şi funcţionare software;
10. Microsistem cu microprocesor – modul Z3EV: programarea microsistemului folosind
consola;
11. Microsistem cu microprocesor – modul Z3EV: programarea microsistemului folosind
PC;
12. Microsistem cu microprocesor – modul Z3EV: Programare avansată. Gestionarea
întreruperilor;
13. Microsistem cu microprocesor – modul Z3EV: interfaţa de comunicaţie paralelă;
14. Evaluare finală

Disciplina este prevăzută cu examen care se va susţine în sesiunea de examene.


Modalitatea de evaluare şi notare la această disciplină se face conform celor indicate
în continuare (la forma de învăţământ zi această disciplină este prevăzută cu 2 ore de
laborator/săptămână).
10
SISTEME CU MICROPROCESOARE
Introducere

răspunsurile la examen 60%


Stabilirea notei finale activităţi aplicate atestate la laborator 30%
(procentaje) teste pe parcursul semestrului 10%
teme de control -

Pentru aprofundarea noţiunilor cuprinse în unităţile de învăţare studenţii pot consulta o


serie de poziţii bibliografice (indicate la fiecare unitate de învăţare în parte), dintre care cele
mai reprezentative sunt următoarele:
1. Dobriceanu Mircea; Sisteme cu microprocesoare; Manual universitar pentru
învăţământul cu frecvenţă redusă, Editura Universitaria Craiova, 2012
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare, Editura Universitaria
Craiova, 2003. p. 304, ISBN 973-8043-289-8
3. Rotar Dan; Arhitectura sistemelor de calcul, Editura ALMA MATER, 1997
4. Muscă Gheorghe; Programarea în limbaj de asamblare, Editura Teora, 1997

După cum se observă, disciplina este prevăzută cu un curs multiplicat, curs în format
electronic postat pe sit-ul facultăţii şi platforme de laborator corespunzătoare şedinţelor
enumerate anterior.

Instrucţiuni pentru parcurgerea materialului de studiu


Pentru a putea parcurge în mod corespunzător materialul ce va fi prezentat în
continuare, studenţii trebuie sa posede cunoştinţe temeinice acumulate în anii anteriori de
studiu întrucât „Echipamente electrice şi electronice pentru autovehicule” este în corelaţie cu
alte discipline din planul de învăţământ, studiate anterior: „Electronică analogică”, „Măsurări
electrice şi electronice”, etc.
Studenţii vor primi gratuit, la începutul anului de studiu, cursul în format tipărit.
În plus, ei vor primi şi parola care le va oferi acces la baza de date cu informaţii
arhivate pe sit-ul facultăţii, corespunzătoare acestei discipline.
Pentru a putea descărca şi utiliza materialul electronic, studenţii trebuie să dispună de
un calculator compatibil IBM PC cu conexiune la INTERNET. Facultatea le oferă aceste
facilităţi prin intermediul reţelelor de calculatoare din cadrul laboratoaelor de informatică.

Materialul corespunzător disciplinei „Sisteme cu microprocesoare” este structurat în 8


unităţi de învăţare ( 4 unităţi de învăţare de câte 3 ore fiecare şi 4 unităţi de învăţare de câte 4

11
SISTEME CU MICROPROCESOARE
Introducere
ore fiecare), corespunzătoare celor 14 cursuri de câte 2 ore de la specializarea
Electromecanică zi. Ca urmare, se recomandă cate 2 ore de studiu individual pe săptămână.
Eventuale neclarităţi vor fi lămurite în cadrul şedinţelor de laborator, care sunt corelate
cu unităţile de învăţare.
În plus sunt prevăzute consultaţii periodice, al căror program se va afişa la avizierul
laboratorului.

12
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

Unitatea de învăţare nr. 1

CONCEPTE GENERALE
PRIVIND MICROPROCESOARELE

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 1 14
1.1. Definiţii şi terminologie 14
1.2. Arhitecturile von Neumann şi Harvard 19
1.3. Arhitectura de bază a unui microprocesor 20
1.3.1. Structura standard a microprocesorului 20
1.3.2. Unitatea aritmetică şi logică (ALU) 22
1.3.3. Unitatea de comandă şi control 23
1.3.4. Grupul de registre 25
1.4. Principiul de funcţionare al microprocesorului 29
Lucrare de laborator 30
Test de autoevaluare 30
Lucrare de verificare – unitatea de învăţare nr. 1 31
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 31
Concluzii 32
Bibliografie – unitatea de învăţare nr. 1 32

13
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
OBIECTIVELE unităţii de învăţare nr. 1

Principalele obiective ale Unităţii de învăţare nr. 1 sunt:


• Însuşirea cunoştinţelor referitoare la terminologia utilizată
în lucrările din domeniul microprocesoarelor
• Însuşirea noţiunilor fundamentale referitoare la arhitectura
şi funcţionarea microprocesoarelor

1.1. Definiţii şi terminologie


În cele ce urmează se prezentă câteva definiţii strict necesare pentru înţelegerea
noţiunilor de bază privind termeni şi notaţii utilizate în lucrările din domeniul
microprocesoarelor.
 Circuit integrat - componentă electronică de mici dimensiuni, (cu suprafaţa măsurată în
milimetri pătraţi) ce conţine un număr de tranzistoare elementare interconectate; el poate
avea funcţii cablate sau programate. Circuitele integrate sunt clasificate în mai multe
categorii, în funcţie de densitatea de integrare:
 circuite integrate simple;
 circuite integrate pe scară medie (MSI - Medium Scale Integration);
 circuite integrate pe scară largă (LSI - Large Scale Integration);
 circuite integrate pe scară foarte largă (VLSI - Verry Large Scale Integration), etc.
 Unitate centrală sau Unitate centrală de procesare - acea componentă a unui calculator
care realizează prelucrarea datelor pe baza unui program şi controlul întregului sistem. Se
utilizează frecvent notaţia CPU (Central Processing Unit) ceea ce desemnează de data
aceasta în mod exclusiv un microprocesor.
 Microprocesor - este un circuit integrat VLSI complex care poate efectua operaţii
aritmetice şi logice sub controlul unui program memorat, fiind definit ca unitatea centrală a
unui calculator.
 Microcalculator - sistem de calcul în care unitatea centrală este un microprocesor; un
microcalculator mai cuprinde: blocuri de memorie, circuite pentru transferul informaţiei
(porturi de intrare - ieşire) şi dispozitive periferice - tastatură, monitor, unitate de discuri,
imprimantă etc.

14
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
 Hardware - ansamblu de elemente care compun un calculator (structuri mecanice, cabluri,
cutii, circuite, etc.).
 Software - reprezintă un sistem de programe cu care este dotat un calculator.
 Sistem de operare - totalitatea programelor care permit utilizatorului accesul deplin la
toate resursele sistemului. Conţine programe cu denumiri specifice după funcţiile realizate,
care asigură accesul la echipamentele periferice (tastatură, monitor, unităţi externe de
memorie etc.) organizarea informaţiei sub formă de fişiere şi o gamă largă de operaţii
asupra acestora (deschiderea, închiderea, transferul, afişarea, crearea, ştergerea,
modificarea şi altele). Cele mai răspândite sisteme de operare sunt MS-DOS, WINDOWS
şi LINUX.
 Instrucţiunea - reprezintă cea mai simplă operaţie (comandă) pe care o poate transmite
programatorul către o unitate centrală (care poate fi un microprocesor). Unitatea centrală
poate recunoaşte şi executa numai instrucţiunile codificate pentru care a fost construită;
acestea formează setul de instrucţiuni caracteristic unităţii centrale.
Un şir de instrucţiuni, organizate logic după un algoritm, formează un program; prin
intermediul programului, utilizatorul transmite sistemului de calcul o anumită sarcină
privind prelucrarea datelor (task).
 Memoria - este un şir finit de locaţii numerotate. O locaţie este definită de două entităţi
informaţionale: conţinutul şi adresa.
 Conţinutul este un şir de cifre binare 0 sau 1 (Binary Digit = bit) care poate reprezenta o
dată (un număr sau un caracter în cod binar, o stare, etc.) sau o comandă (instrucţiune).
Numărul de cifre binare dintr-o locaţie reprezintă dimensiunea locaţiei (formatul
memoriei)
 Adresa este numărul de ordine al unei locaţii de memorie; adresa permite identificarea
fiecărei locaţii în şirul ordonat de locaţii ce alcătuiesc memoria unui sistem de calcul.
Structura memoriei organizată pe locaţii, cu delimitarea anumitor zone este numită
"harta memoriei". Se pot evidenţia două astfel de zone:
- Memoria de date (locaţiile conţin "date");
- Memoria de programe (locaţiile conţin instrucţiuni codificate).
Memoria sistemului este organizată sub forma unei matrice, cu liniile având un număr de
celule (biţi), egal cu cel al cuvântului de instrucţiune sau de date, fiecărei linii îi
corespunde, în mod unic, o adresă proprie. Selectarea unei astfel de celule permite accesul
de la microprocesor la această celulă de memorie sau însens invers, sensul transferului de
informaţie fiind indicat de unitatea de comandă şi control.

15
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
Apariţia unei operaţii cu memoria de la o anumită adresă va determina activarea tuturor
celulelor de memorie elementare de la adresa respectivă (de pe linia cu aceeaşi adresă). Prin
intermediul semnalului R/W (citeşte/scrie), unitatea de comandă şi control va indica operaţia
ce se execută, deci sensul fluxului de informaţie (de la microprocesor la memorie, pentru
operaţie de scriere, sau de la memorie la microprocesor, pentru o operaţie de citire).
Microprocesorul poate conţine pe cip atât memorie ROM (eventual programe), cât şi
memorie RAM (de uz general, sau, sub denumirea de registre, celule cu destinaţie specială în
memorarea, decodificarea şi executarea instrucţiunilor, a operaţiilor aritmetice si logice etc.).
O memorie ROM poate fi doar citită; informaţia din ea este permanentă şi nu dispare la
încetarea alimentarii calculatorului. Memoria RAM permite scrierea şi citirea informaţiilor.
Ea este o memorie volatilă (se pierde informaţia din ea, prin oprirea alimentarii circuitului).
 Magistrala - reprezintă legaturi multiple şi complexe între diferitele părţi funcţionale ale
microprocesorului.
Magistralele conectează semnalele de date, adrese, control, ale unei secţiuni, cu
semnalele omologe ale celorlalte secţiuni, constituind calea de legătura dintre ele.
Exista două seturi de magistrale în orice sistem microprocesor:
 magistrale interne (reprezentând canalele de legătura între diversele unităţi funcţionale
din unitatea centrala (CPU) a sistemului);
 magistrale externe (reprezentând caile de comunicaţie între CPU şi componentele
externe acestuia).
Fiecare grup de magistrale poate fi subdivizat în trei categorii, după tipul informaţiei
transferate:
 magistrale de adrese;
 magistrale de date;
 magistrale de control.
O magistrală poate avea mai multe linii, permiţând transferul simultan al unui cuvânt de
informaţie (adresă sau dată), caz în care magistrala se numeşte magistrală paralelă. Există
deasemenea magistrale seriale, pentru care datele sunt transmise multiplexat în timp (un
cuvânt este transmis bit cu bit, pe aceeaşi linie), care sunt, in mod evident, mult mai lente
decât magistralele paralele. Practic, toate magistralele interne ale CPU, cât şi cele externe care
conectează CPU cu memoria, şi cu majoritatea interfeţelor de intrare/ieşire ale sistemului,
sunt organizate ca magistrale paralele. Legaturi seriale se utilizează mai ales pentru
transmiterea datelor la/de la echipamente aflate la distanţă de CPU (terminale, linii telefonice,
etc.).

16
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
Deoarece unitatea centrală nu poate alimenta simultan un număr prea mare de circuite
exterioare (există valori limitate ale curenţilor pe care acesta îi suportă sau generează), este
necesară amplificarea semnalelor de pe magistralele sistemului. Aceasta adaptare a
semnalelor este efectuată cu diferite tipuri de circuite, distingându-se în esenţă următoarele:
 circuite tampon amplificatoare de magistrala (drivere);
 circuite tampon bidirecţionale (buffere bidirecţionale);
 circuite pentru reţinerea datelor (latch).

Magistrala de date este destinată atât transferului unidirecţional de instrucţiuni de la


memorie (citire a programului), cât şi celui bidirecţional, de date între memorie, unitatea
centrală şi/sau interfeţele de intrări/ieşiri (informaţia parcurge magistrala în ambele sensuri,
sau de la procesor la una dintre unităţile externe acestei unităţi, sau de la una dintre aceste
unităţi spre procesor). Direcţia transferului de informaţie este supervizată de către unitatea de
comandă şi control a microprocesorului, prin generarea de semnale specifice (citire sau
scriere). Lungimea cuvântului microprocesorului determină numărul de linii de conexiune din
magistrala de date (8, 16, 32, etc.).

Magistrala de adrese este o magistrală unidirecţionala. Ea vehiculează codul binar


reprezentând locaţia (adresa) datei ce se va utiliza în cadrul operaţiei ce se execută. Astfel, ea
poate selecta adresa celulei de memorie de la care se citeşte o noua instrucţiune sau dată, sau
la care se memorează un rezultat. Multe microprocesoare utilizează magistrala de adrese şi
pentru configurarea adresei echipamentului de intrare - ieşire, selectat la o operaţie de INPUT
sau OUTPUT. Este sarcina unităţii de comandă şi control de a delimita şi indica, prin
generarea de semnale de control specifice, dacă este vorba de o operaţie de citire sau scriere
din memorie sau intrare - ieşire.
Adresabilitatea unui microprocesor este dată de numărul de biţi ai magistralei de adrese.
Un număr uzual de 65536 (64 ko) celule de memorie vor necesita 16 linii de adresă pe această
magistrală. (216=65536). În general, se vor putea adresa 2N celule de memorie prin intermediul
a N linii de adresă.

Magistrala de control furnizează informaţii suplimentare necesare pentru indicarea


operaţiei ce se efectuează. Numărul de semnale de pe aceasta magistrală depinde de numărul
de semnale de control necesare pentru microprocesorul utilizat. Tipice sunt semnalul de ceas
al sistemului (care asigură funcţionarea secvenţiala cu o periodicitate fixă a întregului sistem
microprocesor), semnalele de citire/scriere în memorie, citire/scriere pentru intrare/ieşire din
sistem etc.

17
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
Corelate cu magistrala de adrese, semnalele de pe magistrala de control permit selecţia
unică a echipamentului sau a celulei de memorie căreia/de la care, prin intermediul
magistralei de date, se transmite/preia informaţia, conform operaţiei ce se execută.
Conectarea pe liniile magistralelor, în sensul transferului de informaţie pe magistrală,
este efectuată prin circuitele tampon respective, care sunt selectate (deschise) doar în cazul
adresării circuitului respectiv.

De reţinut !
Microprocesor - este un circuit integrat VLSI complex care poate
efectua operaţii aritmetice şi logice sub controlul unui program memorat,
fiind definit ca unitatea centrală a unui calculator.
Reprezentarea informaţiei se face prin cuvinte de instrucţiuni şi
respectiv cuvinte de date.
Fiecare instrucţiune din programul microprocesorului va fi formată din
unul sau mai multe cuvinte de instrucţiune. Acestea "spun" procesorului
ce are de făcut. Cuvântul de instrucţiune constă din doua părţi:
 codul operaţiei (care indică ce operaţie se va executa);
 operanzii (care indică asupra cui se va efectua operaţia conţinută în
codul operaţiei).
Instrucţiunile sunt memorate în ordinea executării, iar microprocesorul
le citeşte şi le execută secvenţial. În esenţă, se citeşte un cuvânt de
instrucţiune, se decodifică, obţinându-se operanzii, locaţia lor şi se
execută operaţia indicată. Apoi se trece la o nouă instrucţiune etc.
Un şir de instrucţiuni, organizate logic după un algoritm, formează un
program; prin intermediul programului, utilizatorul transmite sistemului
de calcul o anumită sarcină privind prelucrarea datelor (task).
Fiecare cuvânt de instrucţiune sau date are asociat, în mod unic, un
număr care reprezintă adresa sa.
A citi o anumita instrucţiune sau data din memorie va însemna, în mod
practic, a se activa, prin intermediul funcţiilor de control, acea celula de
memorie, a cărei adresă este cea dorită.
Magistralele reprezintă legaturi multiple şi complexe între diferitele părţi
funcţionale ale microprocesorului.

18
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

1.2. Arhitecturile von Neumann şi Harvard


Modul de conectare şi funcţionarea componentelor de bază ale unui sistem de calcul, s-au
bazat şi se bazează încă, în marea majoritate a structurilor utilizate, pe aşa numita arhitectura
de tip von Neumann utilizată practic în exclusivitate la realizarea microprocesoarelor uzuale
(Fig.1.1).

Logica de
Unitate
control
control
Memorie Unitatea aritmetică
Program şi logică (ALU)
şi Date
Unitate intrare/ieşire
(I/O)

Fig. 1.1. Arhitectura Von Neumann

Configuraţiile numerice ce folosesc microprocesoare realizate utilizând structura


corespunzătoare arhitecturii von Neumann nu fac distincţie între memoria pentru program şi
cea pentru date, structura de memorie fiind exterioară microprocesorului şi accesată prin
magistrale unice de adrese şi date, multiplexate sau nu. În această arhitectură unitatea
aritmetică şi logică va executa câte o singură instrucţiune la un moment dat, într-o secvenţă de
program. Deşi mai lentă decât în sistemele în care se execută mai multe instrucţiuni deodată
(procesare paralelă) arhitectura von Neumann este mai simplu de implementat.
Arhitecturile recentelor tipuri de microprocesoare au elemente de prelucrare paralelă, ca
şi în cazul procesoarelor numerice de semnal DSP (Digital Signal Processors), conform cu
aşa numita arhitectură Harvard care prezintă secţiuni de memorie diferite pentru program şi
date şi deci implicit magistrale de date şi adrese separate pentru fiecare secţiune (Fig.1.2).

Logica de
Unitate
control
control
Memorie Unitate intrare/ieşire Memorie
Program (I/O) Date
Unitatea aritmetică
şi logică (ALU)

Fig. 1.2. Arhitectura Harvard


Arhitectura Harvard permite o paralelizare completă a lanţului de citire/decodificare
instrucţiuni respectiv efectuare operaţii de calcul şi transfer al datelor în sistem. Acest mod de
19
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
operare (tip pipeline) conduce la creşteri sensibile ale performanţelor (viteza de procesare)
respectivelor sisteme, faţă de cele “clasice”, realizate în arhitectură von Neumann.

De reţinut !
Arhitectura de tip von Neuman, conţine o singură memorie şi o singură
magistrală pentru transferul datelor din şi dinspre unitatea centrală de
procesare.
Magistrala unică de date şi instrucţiuni este numită magistrală
bidirecţională şi ea oferă anumite avantaje sistemului, din punctul de
vedere al flexibilităţii modului de lucru cu exteriorul. Câteva din aceste
avantaje ale unei magistrale unice de date şi instrucţiuni sunt:
 se foloseşte o memorie unică pentru stocarea datelor şi instrucţiunilor
(memoria principală, externă procesorului). Rezultă simplificarea
UCP din punctul de vedere al automatului de adresare a memoriei şi
al numărului de registre implicate.
 folosirea unei memorii unice, unde se stochează atât date cât şi
instrucţiuni creşte flexibilitatea sistemului, pentru că nu există
restricţii privind adresele de stocare a datelor şi instrucţiunilor în
memoria principală.
Acest mod de organizare are şi dezavantaje, din punctul de vedere al
vitezei de lucru şi din punctul de vedere al unei relative creşteri în
complexitate a unităţii de control, care trebuie să interpreteze în mod
corect cuvintele citite din memorie ca fiind date, sau instrucţiuni.
Arhitectura Harvard prezintă memorii separate de date şi program şi
deci implicit magistrale de date şi adrese separate pentru fiecare tip de
memorie oferind viteză crescută.

1.3. Arhitectura de bază a unui microprocesor


1.3.1. Structura standard a microprocesorului

Deşi există o mare varietate de microprocesoare, produse de diferite firme, cu multe


deosebiri în structura şi tehnologia lor de fabricaţie, toate au o schemă structurală comună,
rezultată din operaţiile de bază pe care le efectuează. Caracteristicile structurale şi funcţionale
comune rezultă din filosofia proiectării microprocesoarelor, ca instrumente complexe pentru

20
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
realizarea unor sisteme numerice flexibile, rapide, puternice şi la un preţ de cost deosebit de
avantajos.
Arhitectura standard a unui microprocesor (Fig.1.3) are blocurile componente:
 unitatea aritmetică şi logică (ALU);
 unitatea de comandă şi control;
 grupul de registre.
Blocurile componente sunt conectate între ele şi înspre/dinspre exterior prin intermediul
magistralelor de date şi de adrese iar accesul la magistrale este realizat de semnalele de
control generate de unitatea de comandă şi control.

Memorie
de
instructiuni
(ROM)
Magistrală Magistrală
externă externă
de date de adrese
Memorie
de
date
n-biţi (RAM) m-biţi

Registre generale
Registrul I/O .. Registrul adrese
.
Mag. internă adrese m-biţi
Mag. internă date n-biţi

Registrul de
instrucţiuni (IR) Numărător de
Registrul indicatori
de condiţii adrese (PC)

... OPCODE Adresă


operand
Unitatea
aritmetică
şi Decodificatorul
logică instrucţiunii (ID)
(ALU)

Unitatea de comandă şi
control TACT
Registru
acumulator

Microprocesor
Fig. 1.3. Arhitectura standard a unui microprocesor

21
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

De reţinut !
Microprocesorul operează în mod secvenţial, determinat de către un
program memorat, format din instrucţiuni.
Majoritatea modelelor de microprocesoare au circuitele logice interne
împărţite în cinci părţi componente principale: unitatea de control;
unitatea aritmetică şi logică (ALU); unitatea de intrare/ieşire (I/O);
memorie internă / registre; magistrale. Uneori, primele două sunt apelate
împreună sub numele unitate centrală de prelucrare, deşi acelaşi termen
este folosit adeseori ca sinonim al întregului procesor. Toate cele cinci
părţi ale microprocesorului interacţionează, unitatea de intrare/ieşire se
află sub controlul unităţii de control, iar operaţiile unităţii de control pot
fi determinate de rezultatele calculelor executate de ALU

1.3.2. Unitatea aritmetică şi logică (ALU)

Unitatea aritmetică şi logică care procesează informaţia realizând operaţii aritmetice şi


logice, fiind un circuit combinaţional, prezintă două intrări şi o ieşire necesitând atât pentru
cuvintele de intrare, cât şi pentru cele de ieşire registre de memorare temporară. Unul din
cuvintele de intrare este preluat de pe magistrala internă de date a microprocesorului unde a
fost depus de către un alt registru sau a fost adus din memoria externă, iar celălalt cuvânt de
intrare se află într-un registru numit registru acumulator, cuvântul rezultat în urma procesării
va fi încărcat tot în registrul acumulator, deci registrul acumulator conţine unul din operanzi
înainte de procesare, precum şi rezultatul în urma procesării.
Comenzile necesare procesării, de exemplu: încărcarea celor doi operanzi,
executarea operaţiei şi încărcarea acumulatorului cu rezultatul procesării
sunt primite de la unitatea de comandă şi control.

De reţinut !
Unitatea aritmetică şi logică execută prelucrarea datelor realizând
următoarele funcţii:
 funcţii aritmetice: adunare, scădere, înmulţire, împărţire;
 funcţii logice: SI, SAU, SAU EXCLUSIV, NU şi complement.
Fiecare funcţie este activată de o instrucţiune corespunzătoare care
furnizează şi operanzii implicaţi în operaţie.

22
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

1.3.3. Unitatea de comandă şi control


Coordonează funcţionarea tuturor unităţilor interne pentru execuţia operaţiilor conţinute
în mod codificat în instrucţiuni.
Funcţiile unităţii de comandă sunt:
 Extragerea instrucţiunii din memoria externă.
Se ''citeste'' instrucţiunea din zona care conţine programul aflat în execuţie. Instrucţiunea
are două zone de informaţie:
 zona de cod, care conţine operaţia caracteristică instrucţiunii;
 zona de date (adresă operanzi).
 Decodificarea instrucţiunii.
Fiecare instrucţiune are ca efect o succesiune specifică de operaţii elementare, numite
microoperaţii. Secvenţa de microoperaţii este generate de unitatea de comandă pe baza
codului instrucţiunii; determinarea acestei secvenţe în funcţie de cod, este numită
''decodificare''.
 Execuţia propriu-zisă constă în activarea succesivă a unităţilor interne pentru efectuarea
operaţiilor din secvenţa corespunzătoare instrucţiunii.
Codul instrucţiunii permite obţinerea tuturor informaţiilor necesare execuţiei operaţiilor
impuse de instrucţiune:
 numărul de octeţi din formatul instrucţiunii;
 tipul operaţiei principale (adunare, scădere, transfer, salt etc.);
 numărul operanzilor implicaţi în operaţie;
 adresa fiecărui operand ( dacă este operand aflat temporar într-un registru intern, se
specifică acest registru; dacă este operand în memorie, se specifică adresa sau cum se
obţine adresa lui).
Fiecare instrucţiune corespunde unei operaţii fundamentale, care, în general se
realizează în mai multe etape (Fig.1.4).
Execuţia unei instrucţiuni este un şir de operaţii elementare:
 starea - corespunde unei perioade de tact (T) şi este durata unei operaţii elementare
(de exemplu, incrementarea unui registru);
 ciclul maşină - conţine 3…5 stări şi corespunde unei etape din execuţia unei
instrucţiuni (de exemplu, citirea unei locaţii de memorie, transferul de date între un
registru intern şi o locaţie de memorie etc.); o instrucţiune conţine 1 - 5 cicluri maşină,
dintre care primul ciclu maşină este de citire memorie (citirea codului instr.).

23
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

Fig. 1.4. Diagramele de timp pentru semnalul de tact şi ciclu maşină

În desfăşurarea în timp a unei instrucţiuni, unitatea de comandă şi control selectează şi


adresează unităţile interne ale microprocesorului care realizează funcţii specifice rolului lor.
Realizarea concretă a unităţii de comandă şi control este specifică fiecărui
tip de microprocesor şi determină multe din performanţele sale.
Ca structură, unitatea de comandă şi control este un automat secvenţial cu
număr finit de stări, care funcţionează pe baza unui microprogram introdus
în procesul de fabricaţie. Acest microprogram nu poate fi modificat de
utilizator şi corespunde setului de instrucţiuni, fiind un interpretor de
instrucţiuni. De aceea, setul de instrucţiuni este fix pentru fiecare tip de
microprocesor.

De reţinut !
Unitatea de control este cea care supervizează funcţionarea corectă a
ansamblului de elemente unite în structura microprocesorului în corelaţie
cu restul microsistemului. Comenzile generate de unitatea de control
rezultă în urma decodificării instrucţiunii, a cererilor de întrerupere
primite de la elementele microsistemului şi a impulsurilor de tact. În
general, unitatea de control este implementată prin microprograme, adică
algoritmul de funcţionare este înscris ca o succesiune de cuvinte într-o
memorie ROM (Read Only Memory).
Pe măsură ce complexitatea microprocesoarelor a crescut, unitatea de
control a devenit tot mai sofisticată.

24
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

1.3.4. Grupul de registre


În componenţa microprocesorului se pot considera două categorii de registre:
 registre speciale;
 registre de uz general.
Registrele speciale numite şi registre de lucru, sau registre interne ale
microprocesorului, au funcţii predefinite specifice în funcţionarea acestuia. Deşi uneori pot fi
setate la valori iniţiale specificate, aceste registre nu sunt accesibile prin program, la execuţia
instrucţiunilor. În această categorie sunt: registrul acumulator, registrul numărător de adrese
al programului, registrul indicatorilor de condiţii, registrul de instrucţiuni, registrul de
adresare a memoriei şi registrul de intrare/ieşire.

 Registrul acumulator – A(Acumulator). Acumulatorul este registrul cel mai


frecvent utilizat, fiind conectat la magistrala internă de date şi la unitatea aritmetică
şi logică. Când se prelucrează două cuvinte, la început un cuvânt se află în
acumulator, iar după prelucrare rezultatul dintre cele două cuvinte este trecut din
unitatea aritmetică şi logică tot în acumulator. De asemenea registrul acumulator
participă la transferul informaţiei între o sursă (locaţie de memorie, port de
intrare/ieşire-I/O) şi o destinaţie (locaţie de memorie, port de intrare/ieşire-I/O).
Transferul are loc în două etape: cuvântul de la sursă este deplasat în acumulator iar
apoi din acumulator este deplasat la destinaţie. Numărul de celule ale acumulatorului
este egal cu lungimea cuvântului prelucrat de microprocesor care în cazul structurii
prezentate este n. Există structuri de microprocesoare care pot conţine mai multe
acumulatoare, existând şi instrucţiuni diferite pentru fiecare din acumulatoare, iar
acumulatoarele pot fi considerate şi împreună pentru a se putea lucra cu cuvinte de
lungime multiplu de n-biţi. Avantajul mai multor acumulatoare rezultă din
posibilitatea de a lucra acumulator la acumulator.

 Registrul numărător de adrese al programului - PC (Program Counter). Programul


ce constă din succesiunea de instrucţiuni ce trebuie executate de microprocesor este
înscris în locaţii de adrese succesive ale unei memorii externe. Adresa locaţiei ce
conţine instrucţiunea care trebuie adusă din memoria externă este înscrisă în registrul
numărător de adrese al programului. Conţinutul de m-biţi al numărătorului de adrese
este automat mărit cu o unitate după ce instrucţiunea a fost adusă din memorie,
pregătindu-se astfel adresa pentru instrucţiunea următoare. Numărătorul de adrese

25
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
este un numărător cu prescriere, rezultă că se pot introduce şi alte valori decât cele
ale numărării în ordine naturală, deci se pot efectua salturi în citirea locaţiilor
memoriei. Prin comanda de RESET (iniţializare) aplicată microprocesorului la
punerea în funcţiune după conectarea tensiunii sau se aplică din exterior, numărătorul
este încărcat cu o adresă fixată de către producător 0000.
 Registrul indicatorilor de condiţii - F(Flag). Reprezintă un grup de bistabile
(fanioane, steguleţe) asamblate sub forma unui registru şi citite simultan vor genera,
împreună cu conţinutul acumulatorului, cuvântul de stare al programului PSW
(Program Status Word). Din starea biţilor registrului F se poate afla dacă rezultatul
operaţiei efectuate este 0 sau nu, dacă el este un număr pozitiv sau negativ, dacă
numărul biţilor din rezultat ce au valoarea 1 este un număr par sau impar etc.
Semnificaţia principalilor biţi indicatori de condiţii (de stare) întâlniţi la majoritatea
microprocesoarelor este:
- Carry (CF), Indicatorul de transport: este utilizat pentru a indica depăşirea
preciziei de lucru a microprocesorului, în urma efectuării unei operaţii aritmetice
(de exemplu, adunarea a două numere a căror sumă depăşeşte dimensiunea
cuvântului de date al procesorului). Rezultatul se va memora în aceste cazuri în
acumulator, cu excepţia bitului cel mai semnificativ, memorat in indicatorul de
transport (carry), utilizat astfel ca o extensie a acumulatorului. Acest bit poate fi
astfel ulterior testat, sau utilizat în operaţii ulterioare ale ALU. Avem:
CF = 1, dacă rezultatul ultimei operaţii în ALU a generat transport;
CF= 0, dacă rezultatul ultimei operaţii în ALU nu a generat transport.
Carry poate fi iniţializat uzual (0 sau 1), prin instrucţiuni specifice ale
microprocesorului. Valoarea sa se va modifica însă, în cursul efectuării de operaţii
în ALU.
- Zero (ZF), Indicatorul de zero: este utilizat pentru a indica faptul că rezultatul
unei operaţii aritmetice sau logice a fost 0 sau nu. Acest bit nu poate fi iniţializat
direct printr-o instrucţiune specifică. Avem:
ZF = 1, dacă s-a obţinut rezultat nul la ultima operaţie aritmetică sau logică;
ZF = 0, dacă nu s-a obţinut rezultat nul la ultima operaţie aritmetică sau logică.
- Paritate (PF, Indicatorul de paritate: este utilizat pentru a indica tipul sumei
modulo 2 a rezultatului ultimei operaţii efectuate în ALU. Astfel:
PF = 0, dacă rezultatul are un număr impar de biţi cu valoarea 1;
PF = 1, dacă rezultatul are un număr par de biţi cu valoarea 1.

26
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
Acest bit este uzual testat în cadrul programelor de verificare a corectitudinii
informaţiilor codificate, sau la transmisii de date.
- Semn (SF), Indicatorul de semn: este utilizat pentru a indica semnul rezultatului
unei operaţii efectuate în ALU. Astfel:
SF = 0, dacă s-a obţinut un rezultat pozitiv (sau zero);
SF = 1, dacă s-a obţinut un rezultat negativ.
Semnul rezultatului este decis în funcţie de valoarea celui mai semnificativ bit al
sau, considerat ca bit de semn, numerele fiind tratate ca numere reprezentate în
complement faţă de doi.
Se pot adăuga şi alţi biţi de condiţie care să reflecte dacă anumite funcţiuni
sau stări hardware ale microprocesorului sunt îndeplinite sau nu, iar unele
microprocesoare posedă instrucţiuni ce pot înscrie anumiţi biţi de condiţie.

 Registrul de instrucţiuni - IR (Instruction Register). După ce un cuvânt instrucţiune


este adus din memorie prin registrul I/O pe magistrala internă de date a
microprocesorului, acesta va fi înscris în registrul de instrucţiuni care păstrează
instrucţiunea pe durata executării acesteia. Instrucţiunea este divizată este divizată în
două câmpuri: câmpul codului operaţiei OPCODE şi câmpul operandului (adresa
operandului). Biţii din codul operaţiei se aplică decodificatorului instrucţiunii care,
apoi prin unitatea de control, va genera toate semnalele de control necesare execuţiei
instrucţiunii reprezentată de codul operaţiei. Câmpul adresa operandului se aplică
registrului de adresă pentru a forma adresa din memorie unde se află operandul
necesar operaţiei specificate de OPCODE.

 Registrul de adresare a memoriei. Este conectat la magistrala externă de adresare a


memoriei care transferă conţinutul registrului numărător de adrese ce conţine un
cuvânt binar de m biţi şi care reprezintă adresa unei locaţii de memorie sau adresa unui
port I/O. Încărcarea registrului de adrese se poate face nu numai de la numărătorul de
adrese ci şi de la alte elemente ale microprocesorului, rezultând că pe magistrala de
adrese se pot aplica şi cuvinte de adresă diferite de conţinutul registrului numărător de
adresă.

 Registrul de intrare/ieşire. Realizează legătura între magistrala de date interioară a


microprocesorului şi magistrala de date exterioară, deci vehiculează cuvintele de date
şi instrucţiuni.

27
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
Registrele de uz general sunt adresabile de către utilizator, şi pot fi folosite pentru
stocarea şi manevrarea datelor programului - operanzi, date, adrese de memorie conţinând
date utile programului, etc. Uzual, aceste registre conţin informaţiile cele mai utilizate de
către program. Aceasta conduce la o sporire a vitezei de lucru globale a sistemului, deoarece
timpii de acces la registrele interne sunt sensibil mai reduşi decât timpii de acces la memoria
externa a sistemului. Aceste registre sunt conectate atât la alte registre interne ale
microprocesorului, cât şi la magistralele externe, prin intermediul magistralelor interne şi al
circuitelor tampon.
În cazul cel mai general microprocesorul poate conţine, atât memorie ROM
şi RAM, pe lângă, registre (fizic tot memorie RAM). Registrele alcătuiesc un
element cu totul aparte faţă de memorie, din punctul de vedere al
programării microprocesorului. Astfel, datele memorate de către registre
pot fi manipulate, modificate, operate în ALU, prin instrucţiuni specifice de
operare cu registrele, sau coordonat de către secţiunea de CONTROL.
Totodată, aceste instrucţiuni sunt cele mai rapide. O operaţie tipică cu un
registru durează câteva zeci de nanosecunde, faţă de sute de nanosecunde
necesare atunci când se operează cu memoria externă.

De reţinut !
Se pot considera două categorii de registre ale unui microprocesor:
 registre speciale au funcţii predefinite specifice în funcţionarea
microprocesorului; aceste registre nu sunt accesibile prin program, la
execuţia instrucţiunilor.
 registre de uz general sunt utilizate pentru manipularea şi memorarea
temporară a datelor. În general, orice registru de acest tip este
accesibil programatorului, prin instrucţiuni specifice, fiind posibile:
- încărcarea cu un cuvânt dorit de date, deplasarea informaţiei între
registre, sau între registre şi memorie, rotirea conţinutului
acestora;
- tratarea unei perechi de registre ca reprezentând date pe cuvinte
cu lungime dublă (la registre de 8 biţi, perechi de 16 biţi) şi
posibilitatea operării cu acestea.

28
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

1.4. Principiu de funcţionare al microprocesorului


La un moment dat numărătorul de adrese PC conţine adresa la care în memorie se află
instrucţiunea ce trebuie să fie executată. Acest cuvânt de adresă este pus pe magistrala de
adrese şi aplicat memoriei de programe care trimite instrucţiunea în registrul de instrucţiuni şi
în acelaşi timp unitatea de control incrementează numărătorul de adrese pentru instrucţiunea
următoare. Există şi anumite instrucţiuni de salt care modifică ordinea de numărare naturală
din numărătorul de adrese caz în care se prescrie adresa la care se face saltul pentru
instrucţiunea următoare de executat.
Execuţia unei instrucţiuni (ciclu instrucţiune) se descompune în:
 etapa de aducere a instrucţiunii din memorie (fetch) identic ca procedură pentru orice
instrucţiune;
 etapa de execuţie a instrucţiunii care necesită un timp variabil în funcţie de complexitatea
instrucţiunii.
Biţi din câmpul de cod al instrucţiunii (operaţiei) denumit OPCODE se aplică
decodificatorului de instrucţiuni - ID (Instruction Decoder) care, prin unitatea de control, va
genera semnalele de control asociate execuţiei operaţiei respective.
Câmpul cu adresa operandului este aplicat registrului de adrese pentru localizarea
adresei din memorie de unde trebuie luat operandul necesar operaţiei în curs de execuţie.
În executarea unei instrucţiuni unitatea de control primeşte, pe lângă ieşirile
decodificatorului, la aplicarea câmpului OPCODE, şi impulsuri de ceas (tact).
O instrucţiune este constituită din mai mulţi octeţi, ceea ce rezultă că desfăşurarea
ciclului instrucţiune poate necesita unul sau mai multe apeluri la memorie sau la un dispozitiv
intrare/ieşire. Fiecare apel la memorie sau la un dispozitiv intrare/ieşire al unei instrucţiuni
defineşte un interval de timp numit ciclu maşină (Machine Cycle), deci un ciclu instrucţiune
cuprinde unul sau mai multe cicluri maşină. Fiecare ciclu maşină se desfăşoară în mai multe
perioade de tact, o perioadă constituind o stare (State).
Impulsurile de tact care sincronizează activitatea unităţii de comandă şi control sunt
generate de un circuit specializat inclus sau nu în microprocesor numit generator de tact
(Clock Driver).
Unitatea de comandă şi control generează la rândul ei un semnal de sincronizare
(SYNCRO) corelat cu tactul sistem, care permite sincronizarea blocurilor exterioare
microprocesorului (memorie, periferice) cu etapele consecutive din derularea unei
instrucţiuni. Cunoscând numărul de stări necesare acesteia şi frecvenţa tactului se poate

29
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
determina durata în unităţi de timp a realizării instrucţiunii respective.
Pentru scurtarea timpului de realizare a instrucţiunii, ciclurile instrucţiune se suprapun.
Deoarece etapele de transfer pentru fetch şi pentru execuţie nu se suprapun se poate realiza în
paralel (pipeline) executarea instrucţiunii curente cu aducerea instrucţiunii următoare. Această
metodă (tip conductă) este curent folosită la microprocesoarele moderne de mare viteză
extinzându-se paralelismul la grupuri de instrucţiuni care sunt aduse, în timp ce alte grupuri
sunt executate.

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„INTRODUCERE ÎN SISTEME CU MICROPROCESOARE
Descriere şi funcţionare - Hardware”.
Obiectivele laboratorului sunt:
 Să cunoască resursele hardware ale microsistemului;
 Să înţeleagă modul de lucru cu microsistemul;
 Să înveţe să folosească microsistemul pentru a realiza programe de
operare cu acesta.
Studenţii utilizează un microsistem experimental Sistem cu
Microprocesor 32 biţi - modul Z3EV
Microsistemul de învăţare cu microprocesor pe 32 biţi este un sistem
didactic cu microprocesor, bazat pe procesorul Intel 80386EX, care
acoperă toată problematica apărută în timpul studierii sistemelor cu
microprocesor
Microsistemul conţine toate componentele tipice necesare studierii unui
astfel de sistem: microprocesor, memorie RAM şi EPROM, tastatură şi
display cu cristale lichide, interfaţă paralelă şi serială, intrări şi ieşiri
analogice

Test de autoevaluare
1. Ce este hardware-ul? Dar software-ul?
2. Ce este microprocesorul? Dar microcalculatorul?
3. Ce înseamnă memoria şi care sunt tipurile de memorie dintr-un
sistem cu microprocesor?

30
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

4. Ce înseamnă magistrală (bus) şi care sunt magistralele dintr-un sistem


cu microprocesor?
5. Care sunt componentele principale ale arhitecturii von Neumann?
6. Care sunt componentele principale ale arhitecturii Harvard?
7. Care sunt părţile componente ale unui microprocesor?
8. Ce rol are unitatea aritmetică şi logică în cadrul unui microprocesor?
9. Ce rol are unitatea de commandă şi control în cadrul unui
microprocesor?
10. Care sunt şi ce rol îndeplinesc registrele în cadrul unui
microprocesor?
11. Care sunt indicatorii de condiţii ai unui microprocesor?
12. Cum funcţionează un microprocesor?

Lucrare de verificare la Unitatea de învăţare 1


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Definiţii şi terminologie utilizate în sisteme cu microprocesoare.
2. Arhitecturile von Neumann şi Harvard: scheme bloc, principia de
funcţionare.
3. Structura standard a microprocesorului: schemă bloc, rolul blocurilor
componente.
4. Principiul de funcţionare al microprocesorului.

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare

Răspunsurile la întrebările din testul de evaluare se găsesc în textul


unităţii de învăţare.

31
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele

Concluzii
Microprocesoarele reprezintă unităţi centrale integrate într-un singur
circuit integrat pe scară foarte largă (VLSI – Very Large Scale
Integration), care au căpătat o largă dezvoltare o dată cu dezvoltarea
tehnologiei de integrare şi cu răspândirea utilizării sistemelor cu
microprocesor în cele mai diverse domenii de activitate.

Bibliografie

1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,


Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8

32
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale

Unitatea de învăţare nr. 2

MICROPROCESOARELE INTEL 80x86:


ARHITECTURI ŞI MAGISTRALE

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 2 34
2.1. Arhitectura INTEL 80x86 34
2.2. Magistrale 40
2.2.1. Aspecte generale 40
2.2.2. Magistrala de date 41
2.2.3. Magistrala de adrese 42
2.2.4. Magistrala de control 43
Lucrare de laborator 44
Test de autoevaluare 45
Lucrare de verificare – unitatea de învăţare nr. 2 45
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 45
Concluzii 45
Bibliografie – unitatea de învăţare nr. 2 46

33
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
OBIECTIVELE unităţii de învăţare nr. 2

Principalele obiective ale Unităţii de învăţare nr. 2 sunt:


• Cunoaşterea arhitecturilor privind microprocesoarele
80x86;
• Cunoaşterea şi diferenţierea magistralelor pentru
microprocesoarele 80x86;

2.1. Arhitectură INTEL 80x86

Microprocesoarele INTEL 80x86 au evoluat continuu (Tab. 2.1), cea ce a dus la apariţia
a noi membrii care au contribuit la creşterea performanţelor hardware şi software a acestor
componente. Principalul avantaj al acestor microprocesoare costă în păstrarea compatibilităţii
software între diferitele generaţii începând cu microprocesorul 8086, adică un program scris
pentru o versiune mai veche de procesor se poate executa pe orice versiune ulterioară fără
modificări, ceea ce a permis dezvoltarea continuă a aplicaţiilor pentru aceste microprocesoare.

Tab.2.1. Evoluţia microprocesoarelor INTEL 80x86


Tip Anul Latime Laţime Spaţiu de Alte caracteristici
lansării registre mag. de adresare
(biţi) date/ad fizic/virt.
rese
4004 1971 4 4 4KB 45 instrucţiuni, tehnologie PMOS,
primul dispozitiv programabil folosit în
calculatoare
8008 1972 8 8 16KB 45 instrucţiuni, tehnologie PMOS, lent
8080 1973 8 12 64KB ciclul maşină 2 microsecunde, 500000
instrucţiuni-secundă, de 10 ori mai rapid
decât 8008, tehnologie NMOS, folosit ca
microprocesor pentru
microcolculatoarele anilor 70, necesită 3
tensiuni de alimentare
8085 1975 8 12 64KB ciclul maşină,3 microsecunde, 246
instrucţiuni, doar o sursă de alimentare
de 5 V, vândut în 100 mil de exemplare
8086 1978 16 16/20 1Mo primul procesor pe 16 biţi, ciclul maşină
400 nanosecunde, memorie cache pentru
instrucţiuni 6 octeţi, mai multe registre
şi instrucţiuni adiţionale, 0,33
MIPS(milioane de instrucţiuni pe
secundă), tehnologie 3 microni
34
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
8088 1980 16 8/20 1Mo procesorul folosit pentru primul IBM –
PC, memorie cache pentru instrucţiuni 4
octeţi
80186 1982 16 16/20 1Mo 8086 cu suport I/O pe cip, conţine
hardware de tipul numărătoarelor
programabile, controler de întreruperi,
etc., nu a fost folosit în PC-uri, ideal
pentru sistemele care necesită minum de
hardware
80286 1983 16 16/24 16Mo procesor pentru IBM-PC,varianta AT,
puţine instrucţiuni pentru accesarea
celor 15 MB suplimentari, ciclul maşină
în 250 ns, axat pe facilităţile
implementării multiprocesării
(multitasking), 0,9 MIPS, tehnologie 1,5
microni
80386 1986 32 32/32 4Go/64GB primul procesor pe 32 de biti,
înbunătăţirea lucrului cu pagini virtuale
de memorie, include circuite pentru
managementul memoriei interne şi
suplimentare, paginarea memoriei şi
controlul permisiunilor I/O, 5 MIPS,
tehnologie 1 micron
80486 1989 32 32/32 4Go/64GB incorporeaza coprocesorul matematic şi
unitatea de management a memoriei,
memorie cache 8KB încorporată,
aproape jumate din instrucţiuni pot fi
executate într-un ciclu maşină faţa de
două cicluri la 80386, 20 MIPS,
tehnologie 0,8 microni
80586 1992 32 64/32 4Go/64GB arhitectura pipeline superscalara,
Pentium versiuni pe 120 şi 133 MHz, două unităţi
pentru prelucrarea numerelor întregi,
memorie cache 16 KB (câte 8 KB pentru
fiecare unitate), 133 MIPS, , tehnologie
0,5 microni
80586 1995 32 64/36 4Go/64GB primul reprezentant al familiei P6 –
Pentium realizează execuţia dinamică a
Pro instrucţiunilor, memorie cache L1 - 16
KB (câte 8 KB pentru fiecare unitate),
256 KB memorie cache L2, foloseşte
trei motoare de execuţie, 200 MIPS,
tehnologie 0,35 microni
80686 1997 32 64/36 4Go/64GB facilităţi suplimentare de control al
Pentium consumului, memorie cache L1 - 32 KB
II (câte 16 KB pentru fiecare unitate), 512
KB memorie cache L2 (133 MHz),
folosit pentru aplicaţii de nivel înalt, 400
MIPS, , tehnologie 0,25 microni
80686 1999 32 64/36 4Go/64GB două magistrale independente (poate
Pentium accesa simultan memoria cache L2 şi
III memoria), 256 KB memorie cache L2
integrată, frecvenţa de tact până la 1GB,
550 MIPS, , tehnologie 0,18 microni

35
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
80786 2002 64 64/36 64GB frecvenţa de tact până la 3,46GB,
Pentium suportă Hyper-Threading,
IV 1MB/512KB/256KB L2 memorie cache,
(Itanium) specializat pentru sreaming video, jocuri
şi aplicaţii DVD, 1500000 MIPS,
tehnologie 0,18 microni
80886 2004 64 64/36 125000000 MIPS, tehnologie 0,13
Pentium microni, tehnologia pipeline, frecvenţă
IV de lucru foarte mare, SSE3, design
(Nortwoo VLIW cu emulator x86 , controler de
d) memorie on-die
80886 2006 64 64/40 1-4 nuclee, +125000000 MIPS,
Core 2 tehnologie 0,09-0,065 microni, 2x1-
4MB memorie cache L2, frecvenţă 2,66-
3,6 GHz, cu 33% mai multe instrucţiuni
pe ciclu la aceeaşi frecvenţă, mai multe
instrucţiuni executate simultan, controlul
consumului, advanced smart cache,
smart memory acces, advanced digital
media boost,
80986 2007 64 64/48 +125000000 MIPS, tehnologie 0,045
Dual Core microni, mnemorie cache 2-6MB, 3-4
MB L3 cache, structură monolitică
quad-core, SSE4a, HyperTransport 3
sau QuickPath, controler memorie
integrat, on-die L3 cache
I5 2008 64 64/48 3-8MB L3 cache, 2sau 4 nuclee, Out-of-
order (executarea intrucţiunilor într-o
ordine dictată de introducerea datelor,
care duce la creşterea vitezei),
superscalar, 64-bit (integer
CPU), hardware-based encryption,
consum redus de energie,
adaptive power management
I7 2009 64 64/48 3-8MB L3 cache, 2, 4 sau 6 nuclee,
tehnologie 0,045sau 0,032 microni,
magistrale QPI 3xDDR3, DMI, FDI,
PCI-e 2xDDR3
Sandy 2011 64 64/48 3-17 MB cache (i3-i7), Direct Media
Bridge Interface, integrated GPU, 2-6 nuclee,
design modular
Intel 2013 Very wide vector unit, instrucţiuni
Larabee LRBni (8× 64-bit)
Intel 2014 FMA3 instructions, DDR4
Haswell

Compatibilitatea software între diferitele generaţii este necesară din mai multe
considerente:
 programele scrise pentru o anumită versiune de procesor pot fi reutilizate pentru versiunile
mai noi; firmele de software pot să investeasca mai mult pentru dezvoltarea unui program,
bazându-se pe păstrarea compatibilităţii;

36
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
 programatorii sunt familiarizaţi cu o structură hardware relativ stabilă; modificările
hardware se menţin pe cât posibil transparente pentru programatori şi vizează mai ales
aspecte de performaţă (ex: execuţia mai rapidă a instrucţiunilor).

Se prezintă arhitectura de bază a familiei de microprocesoare Intel 80x86 (Fig.2.1),


procesorul I8086 (primul lansat din familie) care conţine două unităţi funcţionale autonome:
 unitatea de execuţie (EU – Execution Unit) care efectuează execuţia instrucţiunilor;
 unitatea de interfaţă cu magistralele externe (BIU – Bus Interface Unit) extrage
instrucţiunile, citeşte operanzii şi scrie rezultatele în memorie.

Unitatea de execuţie (EU) Unitatea de interfaţă (BIU)

Fig. 2.1. Arhitectura microprocesorului INTEL 8086

 Unitatea de interfaţă cu magistralele (BIU) realizează conectarea microprocesorului cu


exteriorul prin intermediul magistralelor de adrese (20 de linii) şi de date (16 linii). De
asemenea, unitatea de interfaţă generează semnalele de comandă pentru realizarea
operaţiile de citire şi scriere cu memoria sau cu porturile. Unitatea de interfaţă realizează
extragerea în avans a instrucţiunilor din memorie, pe care le stochează într-un fişier de
instrucţiuni care este de fapt o listă de tip FIFO (First In First Out). Dacă în acest fişier sunt
cel puţin două locaţii libere şi unitatea de execuţie nu solicită transfer de operanzi cu

37
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
exteriorul, unitatea de interfaţă va iniţia un ciclu maşină de extragere în avans a unei
instrucţiuni din memorie, de la adresa următoare. Se asigură astfel un important câştig de
timp, prin suprapunerea execuţiei cu extragerea instrucţiunilor, operaţie care necesită timp
de acces la memorie şi timp de transfer. Instrucţiunile de salt pot modifica succesiunea
normală prin comutarea execuţiei la o adresă ''de salt''; în această situaţie, unitatea de
interfaţă iniţializează fişierul prin ştergerea instrucţiunilor existente şi încărcarea lui cu o
nouă secvenţă de instrucţiuni extrase începând cu adresa de salt. Dacă în timpul execuţiei
unei instrucţiuni unitatea EU solicită un operand din memorie, unitatea de interfaţă
calculează adresa fizică (20 de biţi) în funcţie de modul de adresare comandat, utilizând
registrele proprii şi unitatea aritmetică proprie şi generează semnalele de comandă pentru
transferul operandului către unitatea de execuţie.
 Unitatea de execuţie (EU) extrage succesiv instrucţiunile din registrul de instrucţiuni, le
decodifică pe baza unui microprogram rezident şi le execută prin intermediul registrelor de
uz general şi unităţii aritmetice si logice. Dacă pentru execuţia unei instrucţiuni este
necesar accesul la memorie sau la porturi I/O, unitatea de execuţie transmite către unitatea
de interfaţă o adresă de 16 biţi (adresă efectivă sau offset) ce va fi utilizată pentru operaţiile
de transfer. Unitatea de execuţie dispune de un bloc de comandă care coordonează
funcţionarea unităţii. În acest bloc există o memorie ROM în care este stocat microcodul
de interpretare şi execuţie pentru fiecare instrucţiune.

Ulterior funcţionalitatea unităţilor EU şi BIU a fost divizată pe mai multe unităţi şi s-au
adăugat altele ca de exemplu: unitatea de decodificare a instrucţiunilor, unitatea de
segmentare şi de paginare, unitatea de management a memoriei cache şi procesorul de virgulă
flotantă (Fig.2.2).
Procesorul 80386 a fost primul din cadrul familiei 80x86 care a utilizat o formă de
prelucrare paralelă. Arhitectura acestui procesor cuprinde un număr de şase unităţi care
funcţionează în paralel. Acestea sunt următoarele:
 Unitatea de interfaţă cu magistrala, care realizează accesul la memorie şi la dispozitivele de
I/E;
 Unitatea de încărcare a instrucţiunilor, care primeşte codul instrucţiunilor de la unitatea de
interfaţă cu magistrala şi le depune într-o coadă de 16 octeţi;
 Unitatea de decodificare a instrucţiunilor, care decodifică codul obiect al instrucţiunilor şi
generează un microcod pentru execuţia acestora;
 Unitatea de execuţie, care execută microcodul corespunzător fiecărei instrucţiuni;

38
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
 Unitatea de segmentare, care translatează adresele logice în adrese liniare şi efectuează
testele necesare protecţiei;
 Unitatea de paginare, care translatează adresele liniare în adrese fizice, efectuează testele
necesare protecţiei paginilor de memorie şi conţine o memorie cache cu informaţii despre
până la 32 de pagini cel mai recent accesate.

Fig. 2.2. Arhitectura microprocesorului INTEL 80386

Structura hardware generală a unui sistem cu microprocesor se bazează pe o arhitectură


von Neumann, (Fig. 2.1).
Memorie

CPU Magistrala sistem

Dispozitive
I/O

Fig. 2.1. Structura de principiu a arhitecturii Intel 80x86

O arhitectură von Neumann are trei componente principale:


 unitatea centrală - CPU (Central Processing Unit) conţinând elementele de calcule
aritmetice, logice şi funcţiile de control;
39
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
 memoria (RAM - pentru citire / scriere, şi ROM - doar citire); ;
 dispozitivele de intrare/ieşire - pentru controlul perifericelor.
Cele trei componente sunt interconectate prin intermediul magistralei de sistem (System Bus).
În cazul arhitecturii von Neumann toate acţiunile au loc la nivelul unităţii centrale
(CPU), toate calculele se efectuează aici, datele şi instrucţiunile stau în memorie până când
unitatea centrală are nevoie de ele. Pentru unitatea centrală, dispozitivele I/O sunt similare
memoriei pentru că ea poate memora (scrie) date pe un dispozitiv de ieşire sau poate citi date
de pe un dispozitiv de intrare. Singura diferenţă aparentă în cadrul familiei Intel 80x86 este
asocierea acestora cu cea ce există în exteriorul sistemului (lumea exterioară).

De reţinut !
Primul procesor lansat INTEL 8086 conţine două unităţi funcţionale
autonome: unitatea de executie (EU – Execution Unit) şi unitatea de
interfaţare a magistralei (BIU – Bus Interface Unit); ulterior
funcţionalitatea acestor unităţi a fost divizată pe mai multe unităţi şi s-au
adăugat altele ca de exemplu: unitatea de decodificare a instrucţiunilor,
unitatea de segmentare şi de paginare, unitatea de management a
memoriei cache şi procesorul de virgulă flotantă. Din punct de vedere al
programatorului această divizare pe unităţi este mai puţin vizibilă; în
schimb sunt vizibile urmatoarele componente: registrele generale,
registrele de adresare, registrele speciale, magistralele interne de date şi
adrese, unităţile aritmetico-logice şi altele.

2.2. Magistrale
2.2.1. Aspecte generale

Magistralele reprezintă legaturi multiple şi complexe între diferitele părţi funcţionale ale
microprocesorului.
Microprocesoarele INTEL 80x86 prezintă trei magistrale majore:
 magistrala de date;
 magistrala de adrese;
 magistrala de control.

40
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
Aceste magistrale sunt în general diferite de la un procesor la altul, ele fiind
clasificate după natura informaţiei vehiculate. De exemplu implementarea
magistralelor de date este diferită la 8088 comparativ cu 80386, dar în
ambele cazuri se vehiculează date între unitatea centrala, memorie şi
dispozitivele I/O.
Din punct de vedere electric, nivelele logice implicate pentru componentele tipice
conectate la aceste magistrale în cazul lui 80x86, sunt compatibile TTL.

2.2.2. Magistrala de date

Magistrala de date (Data Bus) are dimensiunea (numărul de linii, care reprezintă
”lăţimea” magistralei) diferită în cadrul familiei 80x86, ea definind într-un fel şi "mărimea"
procesorului. Într-un sistem 80x86, magistrala de date poate avea 8, 16, 32 sau 64 biţi (linii de
date):
 procesoarele 8088 şi 80188 au magistrala de date de 8 biţi;
 procesoarele 8086, 80186, 80286 si 80386SX au o magistrala de 16 biţi;
 procesoarele 80386DX, 80486 şi Pentium Overdrive au magistrala date de 32 biţi
 procesoarele Pentium, Pentium Pro, Pentium II, Pentium III, şi Pentium IV au magistrala
de date de 64 biţi (variantele ulterioare au magistrale mai mari).
Existenţa unei magistrale de 8 biţi nu înseamnă că un procesor este limitat doar la un tip
de date de 8 biţi (adică un octet sau un byte). Înseamnă de fapt ca procesorul poate accesa
doar un octet într-un ciclu de memorie (în cazul MVN). Astfel cei 8 biţi ai magistralei de date
la un 8088 pot transmite doar jumătate din informaţie în unitatea de timp (ciclu de memorie)
comparativ cu magistrala de date de 16 biţi de la 8086. Aceste este motivul pentru care
procesoarele cu o magistrală de date de 16 biţi sunt în mod natural mai rapide decât cele cu o
magistrală de 8 biţi.
Dimensiunea magistralei de date afectează performanţele sistemului mai mult decât
dimensiunea oricărei alte magistrale.
Legat tot de "mărimea" procesorului (care poate fi 8, 16, 32 sau 64 biţi) una din
modalităţile de definire consideră că ea este dată de dimensiunea celui mai mare registru
întreg de uz general al unităţii centrale. Astfel 8088 deşi are o magistrală de date de 8 biţi este
un procesor de 16 biţi, iar Pentium cu o magistrală de date de 64 de biţi este un procesor de 32
de biţi. Trebuie făcută distincţia între registru întreg, respectiv virgulă fixă, pentru a nu lua în
considerare registrele unităţii de prelucrare în virgula mobilă (FPU), atunci când ea există,
registrele care pot avea o dimensiune mai mare.
41
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
Deşi este evident posibil să prelucrăm şi date pe 12 biţi cu un 80x86, formatul preferat
este cel de 16 biţi deoarece oricum procesorul preia şi manipulează 16 biţi de date, preluarea
făcându-se întotdeauna în grupe de 8 biţi. Astfel manipularea datelor în formate multiplu de 8
biţi este întotdeauna cea mai eficientă. Deşi procesoarele familiei 80x86 cu magistrale de date
de 16, 32 sau 64 de biţi pot prelucra date cu dimensiuni până la acelea ale magistralei, ele pot
accesa şi unităţi mai mici de 8, 16 sau 32. Orice, se poate face cu o magistrală mai mică se
poate face şi cu una mai mare diferind doar timpul în care se accesează datele.

De reţinut !
Magistrala de date este utilizată de CPU pentru a citi şi scrie date de la
memorie şi porturile I/O.
Dimensiunea magistralei de date afectează performanţele sistemului mai
mult decât dimensiunea oricărei alte magistrale.
Magistrala de date este bidirecţională: transferă date între componentele
sistemului.

2.2.3. Magistrala de adrese

Magistrala de adrese (Address Bus) este cea prin intermediul căreia se diferenţiază
locaţiile de memorie sau dispozitivele I/O în cazul unui transfer de date, asociindu-le acestora
o adresă unică. Când doreşte să acceseze o locaţie de memorie sau un anumit dispozitiv I/O,
procesorul plasează pe magistrala de adrese o valoare (o adresă), circuitele asociate memoriei
sau dispozitivelor I/O recunosc această adresă şi fac ca acestea să citească informaţia de pe
magistrala de date sau să plaseze informaţia pe aceiaşi magistrală. Folosind n linii de adresă
(magistrala de adresă de n biţi) procesorul poate furniza 2n valori distincte ale adresei.
Primii membrii ai familiei 80x86, 8086 şi 8088 au magistrale de adrese de 20 biţi, astfel
încât spaţiul de adresă are 220 = 1.048.576 locaţii de memorie distincte, un spaţiu de adrese
limitat conform cerinţelor actuale. Acest dezavantaj a fost corectat la variantele ulterioare
după cum este prezentat în tabelul 2.2.

Tab. 2. 2 - Corelaţia dimensiunii memoriei adresabilă cu tipul procesorului


Procesor Linii Adrese Memorie maxim adresabilă
8088 20 1,048,576 1M
8086 20 1,048,576 1M
80188 20 1,048,576 1M
80186 20 1,048,576 1M
80286 24 16,777,216 16M

42
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
80386SX 24 16,777,216 16M
80386DX 32 4,294,976,296 4G
80486 32 4,294,976,296 4G
Pentium 32 4,294,976,296 4G
Pentium Pro 36 68,719,476,736 64G
Pentium II 36 68,719,476,736 64G
Pentium III 36 68,719,476,736 64G

De reţinut !
Magistrala de adrese este utilizată de CPU pentru a indica adresa locaţiei
de memorie care va fi citită sau scrisă. Numărul locaţiilor de memorie
care pot fi apelate de CPU depinde de numărul liniilor de adresă
Magistrala de adrese este unidirecţională: preia semnale de la
microprocesor şi le trimite mai departe către memorie şi porturile I/O.

2.2.4. Magistrala de control

Magistrala de control (Control Bus) reprezintă un set variat de semnale prin care
procesorul comunică cu restul sistemului.
În primul rând trebuie să existe semnale care să stabilească sensul transferului de date
de la procesor (scriere –Write) sau către procesor (citire - Read), astfel există două linii de
semnal Read şi Write care stabilesc sensul transferului de date. În afară de acestea mai există
ceasuri de sistem, linii de întrerupere, de stare şi altele.
Componenţa acestei magistrale este diferită în cadrul familiei dar anumite linii de
control sunt comune.
Semnalele Read şi Write mai sus menţionate controlează deci sensul accesului pe
magistrala de date, ele fiind active în "0" şi mutual exclusive.
Semnalele de tip activare byte/octet, respectiv semnalele de tip Byte Enable, permit
procesoarelor cu magistrale de date de 16, 32 sau 64 biţi să acceseze date cu dimensiuni mai
mici decât magistrala.
Familia 80x86 are două spaţii distincte de adresă: pentru memorie şi pentru
dispozitivele I/O.
În timp ce magistrala de adrese pentru memorie are dimensiuni diferite, cea pentru I/O
are întotdeauna 16 biţi, permiţând accesarea a 65.536 locaţii sau porturi I/O diferite, un număr
mai mult decât suficient.
Deşi familia 80x86 suportă două spaţii de adresă diferite, nu există două magistrale de

43
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale
adrese separate pentru memorie şi I/O. Se utilizează aceiaşi magistrală de adrese dar se
folosesc linii de control diferite pentru Read şi Write din spaţiul de memorie al dispozitivelor
I/O, acestea fiind active tot în "0" şi mutual exclusive. Când aceste semnale sunt active, sunt
luaţi în considerare numai cei mai puţin semnificativi 16 biţi ai magistralei de adrese.
Aceste semnale sunt la rândul lor mutual exclusive cu cele pentru accesarea memoriei.

De reţinut !
Magistrala de control permite microprocesorului să indice memoriei şi
dispozitivelor periferice operaţia curentă.
Semnale curente de control sunt: citirea memoriei, scrierea memoriei,
citirea I/O, scrierea I/O.
Magistrala de control este bidirecţională: preia şi transmite semnale de
control şi stare în/între sistem şi I/O.

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„INTRODUCERE ÎN SISTEME CU MICROPROCESOARE
Descriere şi funcţionare - Software”.
Obiectivele laboratorului sunt:
 Să cunoască resursele hardware ale microsistemului;
 Să înţeleagă modul de lucru cu microsistemul;
 Să înveţe să folosească microsistemul pentru a realiza programe de
operare cu acesta.
Studenţii utilizează un microsistem experimental Sistem cu
Microprocesor 32 biţi - modul Z3EV
Microsistemul de învăţare cu microprocesor pe 32 biţi este un sistem
didactic cu microprocesor, bazat pe procesorul Intel 80386EX, care
acoperă toată problematica apărută în timpul studierii sistemelor cu
microprocesor
Microsistemul conţine toate componentele tipice necesare studierii unui
astfel de sistem: microprocesor, memorie RAM şi EPROM, tastatură şi
display cu cristale lichide, interfaţă paralelă şi serială, intrări şi ieşiri
analogice

44
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale

Test de autoevaluar
1. Precizaţi avantajele compatibilităţii software între diferitele
generaţii de microprocesore INTEL 80x86
2. Explicaţi care este diferenţa între EU şi BIU şi care este rolul
fiecăruia.
3. Enumeraţi unităţile care funcţionează în paralel la microprocesorul
80386.
4. Câte magistrale are microprocesorul 8086?
5. Care sunt caracteristicile şi rolul magistralei de date?
6. Care sunt caracteristicile şi rolul magistralei de adrese?
7. Care sunt caracteristicile şi rolul magistralei de control?

Lucrare de verificare la Unitatea de învăţare 2


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Arhitectura microprocesoarelor 80x86;
2. Magistralele microprocesoarelor 80x86.

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii
1. Majoritatea calculatoarelor personale existente în prezent pe piaţă
sunt echipate cu microprocesoarele compatibile Intel 80x86;
2. Calculatoarele cu microprocesoare 80x86 pot rula trei sisteme de
operare foarte răspândite: DOS, Windows, Linux;
3. Aplicaţiile care rulează pe aceste calculatoare necesită de multe ori
module scrise în limbaj de asamblare, ceea ce impune cunoaşterea
acestuia.
45
SISTEME CU MICROPROCESOARE
2. Microprocesoarele INTEL 80x86: arhitecturi şi magistrale

Bibliografie

1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,


Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Rotar Dan; Microprocesorul. Programarea în limbaj de asamblare
a microprocesoarelor: 80x86; TMS 320F240; PIC 16F87x, Editura
ALMA MATER

46
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

Unitatea de învăţare nr. 3

MICROPROCESOARELE INTEL 80x86:


REGISTRELE ŞI ORGANIZAREA MEMORIEI

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 3 48
3.1. Registrele 48
3.1.1. Aspecte generale 48
3.1.2. Registrele de uz general 49
3.1.3. Registrele de segment 54
3.1.4. Registrele de uz special 56
3.2. Organizarea memoriei 58
Lucrare de laborator 63
Test de autoevaluare 63
Lucrare de verificare – unitatea de învăţare nr. 3 63
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 64
Concluzii 64
Bibliografie – unitatea de învăţare nr. 3 64

47
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
OBIECTIVELE unităţii de învăţare nr. 3

Principalele obiective ale Unităţii de învăţare nr. 3 sunt:


• Cunoaşterea rolului şi a tipurilor de registre specifice unităţii
centrale ale microprocesoarele 80x86;
• Cunoaşterea modului de organizare a memoriei
microprocesoarele 80x86

2.3. Registrele
2.3.1. Aspecte generale

Din punct de vedere al programatorului cele mai utilizate componente ale unităţii
centrale sunt registrele şi acestea au o importanţă deosebită în programarea în limbaj de
asamblare.
Fiecare procesor din familia 80x86 conţine un set de registre. Particularitatea acestei
familii de procesoare este reprezentată de faptul că un procesor conţine un superset de regiştrii
ai procesorului precedent. Punctul de plecare îl reprezintă setul de registre al unităţilor
centrale ale procesoarelor 8088, 8086, 80188 şi 80186 deoarece cele patru tipuri de
procesoare au acelaşi tip de registre.
Fabricantul acestor procesoare, firma INTEL, împarte registrele unităţii centrale ale
microprocesoarele 80x86 în trei categorii (Fig. 3.1):
 registre de uz general;
 registre de segment;
 registre de uz special.
Registrele de uz general sunt folosite pentru a memora variabilele locale cât
şi rezultatele intermediare ale calculelor. Deşi aceste registre sunt denumite
“de uz general”, fiecare dintre ele se utilizează într-un anumit scop implicit
dar destinaţia acestora poate fi schimbată explicit de programator. Registrele
segment sunt utilizate pentru accesarea unor blocuri de memorie numite
segmente. Registrele de uz special au destinaţii diverse. Dintre acestea, două
prezină o importanţă deosebită şi vor fi prezentate pe scurt în continuare.

48
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

31 0 15 0
EAX CS
EBX DS
ECX SS
EDX ES
ESI FS
EDI GS
EBP
Registrele de segment
ESP
Registrele de uz general
31 0
EEFLAGS
EIP
Registrele cu destinaţie specială
Fig 3.1. Registrele familiei Intel 80x86

2.3.2. Registrele de uz general

Registrele de uz general sunt în număr de 8, fiecare de 32 de biţi, care pot fi utilizate de


orice aplicaţie: EAX, EBX, ECX, EDX, ESI, EDI, EBP şi ESP. Prefixul E provine de la
"extended - extins" şi este folosit pentru a diferenţia registrele de 32 de biţi (atunci când
acestea există) de cele de 16 biţi: AX, BX, CX, DX, SI, DI, BP şi SP. Există şi 8 registre de 8
biţi : AL, AH, BL, BH, CL, CH, DL şi DH. Acestea nu sunt registre separate, notaţiile fiind
“mai degrabă” alternative. Nu există 24 de registre independente, registrele de 32 de biţi sunt
suprapuse peste cele de 16 biţi iar o parte dintre aceste la rândul lor sunt suprapuse peste cele
de 8 biţi (Fig. 3.2).
Fiecare dintre cei 8 registre de uz general AX, BX, CX, DX, SP, BP, DI,SI sunt registre
pe 16 biţi pentru microprocesorul 8086, iar de la procesorul 80386 încoace au devenit registre
pe 32 de biţi, denumiţi, respectiv: EAX, EBX, ECX, EDX, ESP, EBP, EDI, ESI. Mai mult,
cei mai puţin semnificativi 8 biţi ai regiştrilor AX, BX, CX, DX formează respectiv regiştrii
AL, BL, CL, DL (litera L provine de la Low), iar cei mai semnificativi 8 biţi ai aceloraşi
regiştri formează regiştrii AH, BH, CH, DH (litera H provine de la High).
Modificarea unuia dintre registre înseamnă modificarea a cel puţin unui alt
registru şi cel mult a altor trei registre. De exemplu modificare lui EAX
poate afecta AL, AH şi AX.
Registrele de 16 biţi sunt mapate direct pentru 8086/88 şi 80286, iar cele de
32 de biţi există doar la procesoarele cu arhitectură IA 32.

49
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
Deşi în calcule se pot folosi oricare din aceste registre, multe instrucţiuni
lucrează mai eficient iar altele chiar impun utilizarea unui anumit registru.

32 biţi

EAX 32 biţi
AX
ESI
AH AL SI
16 biţi
16 biţi
EBX
BX
EDI
BH BL DI
8 biţi
EDX
DX
EBP
DH DL BP

ECX
CX
ESP
CH CL SP

Fig. 3.2. Interdependenţa registrelor de uz general

Fiecare dintre registre pot fi folosite pentru orice operaţie posibilă, dar sunt folosite de
către programatori în următoarele scopuri:

 AX (EAX) (Accumulator Register - registru acumulator) utilizat pentru păstrarea


temporară a datelor (operanzi şi rezultat) în vederea efectuării de operaţii aritmetice, logice
şi de deplasare. Totdeauna operaţiile de înmulţire şi împărţire presupun implicarea
registrului AX. În plus, registrul AX este folosit şi pentru toate transferurile de date de
la/către porturile de Intrare/Ieşire. Poate fi accesat pe porţiuni de 8, 16 sau 32 de biţi, fiind
referit drept AL (cei mai puţin semnificativi 8 biţi din AX), AH (cei mai semnificativi 8
biţi din AX), AX (16 biţi) sau EAX (32 de biþi).
Se prezintă un exemplu de instrucţiuni ce utilizează registrul AX. De remarcat este
faptul că transferurile de date se fac pentru instrucţiunile (denumite şi mnemonice) Intel de la
dreapta spre stânga, ( exact invers decât la Motorola).
Instrucţiunea: MOV AX, 1234H încarcă valoarea 1234H (4660 în zecimal) în registrul
acumulator AX. După cum spuneam, cei mai puţini semnificativi 8 biţi ai registrului AX sunt
identificaţi de AL (A-Low) iar cei mai semnificativi 8 biţi ai aceluiaşi registru sunt identificaţi
ca fiind AH (A-High). Acest lucru este utilizat pentru a lucra cu date pe un octet, permiţând ca
50
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
registrul AX să fie folosit pe postul a doi regiştri separaţi (AH şi AL). Aceeaşi regulă este
valabilă şi pentru regiştrii de uz general BX, CX, DX.
Următoarele trei instrucţiuni setează registrul AH cu valoarea 2, incrementează cu 1
această valoare şi apoi o copiază în registrul AL:
MOV AH, 2
INC AH
MOV AL, AH
Valoarea finală a registrului AX va fi 33 (AH = AL = 3).

 BX (EBX) (Base Register - registru de bază) folosit la stocarea adreselor de memorie


(accesarea indirectă a memoriei), pentru a face referire la diverse structuri de date, cum ar
fi vectorii stocaţi în memorie.
O valoare reprezentată pe 16 biţi stocată în registrul BX poate fi utilizată ca fiind o
porţiune din adresa unei locaţii de memorie ce va fi accesată. Spre exemplu, următoarele
instrucţiuni încarcă registrul AH cu valoarea din memorie de la adresa 22.
MOV AX, 0
MOV DS, AX
MOV BX, 22
MOV AH, [ BX ]
Se observă că am încărcat valoarea 0 în registrul DS înainte de a accesa locaţia de memorie
referită de registrul BX. Acest lucru este datorat segmentării memoriei; implicit, atunci
când este folosit ca pointer de memorie, BX face referire relativă la registrul de segment
DS (adresa la care face referire este o adresă relativă la adresa de segment conţinută în
registrul DS).

 CX (ECX) (Count Register - registru contor) joacă rol de contor în bucle, adică
contorizează numărul de iteraţii a unei instrucţiuni de ciclare LOOP sau specifică numărul
de caractere dintr-un şir.
Rolul de contor al registrului CX se observă din exemplul următor:
MOV CX, 10
start:

<instrucţiuni ce se vor executa de 10 ori>

SUB CX, 1

51
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
JNZ start
Deoarece valoarea iniţială a lui CX este 10, instrucţiunile cuprinse între eticheta start şi
instrucţiunea JNZ se vor executa de 10 ori (până când registrul CX devine 0).
Instrucţiunea SUB CX, 1 decrementează registrul CX cu valoarea 1 iar instrucţiunea JNZ
start determină saltul înapoi la eticheta start dacă CX nu are valoarea 0.
În limbajul microprocesorului există şi o instrucţiune specială legată de ciclare. Aceasta
este instrucţiunea LOOP, care este folosită în combinaţie cu registrul CX. Liniile de cod
următoare sunt echivalente cu cele anterioare, dar aici se utilizează instruxţiunea LOOP:
MOV CX, 10
start:

<instrucţiuni ce se vor executa de 10 ori>

LOOP start
Se observă că instrucţiunea LOOP este folosită în locul celor două instrucţiuni SUB şi
JNZ anterioare; LOOP decrementează automat registrul CX cu 1 şi execută saltul la
eticheta specificată (start) dacă CX este diferit de zero, totul într-o singură instrucţiune.

 DX (EDX) (Data Register – registru de date) are în general două destinaţii: el stochează
depăşirile pentru anumite operaţii aritmetice sau stochează adresa portului I/O pentru
accesarea perifericelor.
Instrucţiunea IN AL, DX copiază o valoare de tip Byte dintr-un port de intrare, a cărui
adresă se află în registrul DX.
Următoarele instrucţiuni determină scrierea valorii 100 în portul I/O 1001:
...
MOV AL, 100
MOV DX, 1001
OUT DX, AL

Referitor la operaţiile de înmulţire şi împărţire, atunci când împărţim un număr pe 32 de
biţi la un număr pe 16 biţi, cei mai semnificativi 16 biţi ai deîmpărţitului trebuie să fie în
DX. După împărţire, restul împărţirii se va afla în DX. Cei mai puţin semnificativi 16 biţi
ai deîmpărţitului trebuie să fie în AX iar câtul împărţirii va fi în AX. La înmulţire, atunci
când se înmulţesc două numere pe 16 biţi, cei mai semnificativi 16 biţi ai produsului vor fi
stocaţi în DX iar cei mai puţin semnificativi 16 biţi în registrul AX.
52
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
 SI (ESI) şi DI (EDI) (Source Index - index sursă şi Destination Index - index destinaţie)
prezintă mai multe destinaţii: pot fi folosite ca pointer (indicator) la adresarea indirectă a
memoriei (similar cu registrul BX pentru a referi adrese de memorie) sau pot fi folosite în
operaţiile cu şiruri.
Un exemplu de utilizare pentru registru SI îl reprezintă secvenţa de instrucţiuni următoare
în ccare se încarcă valoarea (pe 8 biţi) din memorie de la adresa 25 în registrul AL.
MOV AX, 0
MOV DS, AX
MOV SI, 25
MOV AL, [ SI ]
Un exemplu de utilizare pentru registrul DI (se utilizează în mod asemănător ca
registrul SI) îl reprezintă secvenţa de instrucţiuni următoare în care se adună la registrul BL
valoarea pe 8 biţi stocată la adresa 1007
MOV AX, 0
MOV DS, AX
MOV DI, 1007
ADD BL, [ DI ]

 BP (EBP) (Base Pointer – indicator de bază) este similar cu registrul BX, folosit pentru
accesarea perametrilor şi a variabilelor locale dintr-o procedură.
 SP (ESP) (Stack Pointer – indicator stivă) conţine adresa de memorie a stivei programului
în curs de execuţie. Acest registru nu trebuie întrebuinţat în alte scopuri.

Pentru a exemplifica rolul regiştrilor BP şi SP, se prezintă porţiunea de memorie


denumită stivă (stack).
Stiva (Fig. 3.3) reprezintă o porţiune specială de locaţii adiacente din memorie. Aceasta
este conţinută în cadrul unui segment de memorie şi identificată de un selector de segment
memorat în registrul SS (cu excepţia cazului în care se foloseşte modelul nesegmentat de
memorie în care stiva poate fi localizată oriunde în spaţiul de adrese liniare al programului).
Stiva este o porţiune a memoriei unde valorile pot fi stocate şi accesate pe principul
LIFO (Last In – First Out), în care ultima valoare stocată în stivă este prima ce va fi citită din
stivă.
Stiva este utilizată la apelul unei proceduri sau la întoarcerea dintr-un apel de procedură
(principalele instrucţiuni folosite sunt CALL şi RET).

53
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

Segmentul de stivă
Baza stivei
(valoarea iniţială SP sau
ESP)

Variabile locale pentru Instrucţiunea POP determină


procedura apelată poziţionarea vârfului stivei la o
adresă mai mare

Parametrii transmişi
procedurii apelate Instrucţiunea PUSH determină
poziţionarea vârfului stivei la o
adresă mai mică
Registrul BP (EBP) Indicator de revenire instructiune

Registrul SP (ESP) Vârful stivei


Registrul SP (ESP) este setat să facă
referire la adresa de întoarcere din
procedură

Fig. 3.3. Structura stivei

De reţinut !
Începând de la versiunea ‘386 registrele de uz general au fost extinse la
32 de biţi (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP). Primele 4
registre pot fi adresate la nivel de octet (ex: AL, AH, BL, BH, CL, CH,
DL, DH), cuvînt (ex: AX, BX, CX, DX ) sau dublu-cuvint(EAX, EBX,
ECX, EDX). Celelalte se adresează pe cuvât sau dublu-cuvint.

2.3.3. Registrele de segment

Registrele de segment sunt asociate unui anumit tip de informaţie memorată: program
(cod), date (variabile) şi stivă.
Registrele de segment sunt registre de 16 biţi care conţin adresa de bază (de început) a
unui segment de memorie.
Memoria direct adresabilă de 1 MB necesită o magistrală de adrese de 20 biţi.
Registrele interne ale procesorului fiind de 16 biţi, soluţia găsită se numeşte segmentarea
memoriei; în acest caz memoria de 1MB este împărţită în 16 segmente de câte 64 KB (16*64
KB = 1024 KB = 1 MB), fiecare segment fiind astfel adresabil cu 16 biţi.

54
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
Procesorul poate să utilizeze simultan atâtea segmente de memorie câte registre de
segment posedă.
Adresele de început (de bază) ale celor 4 segmente sunt conţinute în cele 4 registre de
segment (Cod, Date, Stivă şi de Date suplimentare).
 CS (Code Segment - segment de cod) conţine selectorul de segment pentru segmentul de
cod, acolo unde sunt memorate instrucţiunile care se execută. Procesorul preia
instrucţiunile din segmentul de cod, folosind o adresă logică formată din selectorul de
segment din CS şi conţinutul lui EIP. EIP conţine adresa liniară în interiorul segmentului
de cod pentru următoarea instrucţiune ce trebuie executată. CS nu poate fi încărcat în mod
explicit de programul aplicaţie, este încărcat implicit de instrucţiuni sau de operaţii interne
ale procesorului care modifică fluxul program (salturi, apeluri de subrutine, întreruperi).
 DS (Data Segment - segment de date), ES (Extra Segment - segment de date ), FS (Extra
Segment) şi GS (Extra Segment) conţin selectori de segment pentru 4 segmente de date.
Disponibilitatea simultană a 4 segmente de date permite un acces eficient şi sigur la diferite
tipuri de structuri de date. De exemplu se pot crea 4 segmente separate de date: unul
pentru structurile de date din modulul curent, altul pentru datele exportate dintr-un modul
de nivel superior, un al treilea pentru structurile de date create dinamic şi un al patrulea
pentru date comune cu un alt program. Pentru a accesa segmente de date adiţionale,
aplicaţia trebuie să încarce selectorii de segment corespunzători în aceste registre.
 SS (Stack Segment – sment de stivă ) conţine selectorul pentru segmentul de stivă. Toate
operaţiile cu stiva folosesc registrul SS pentru identificarea segmentului de stivă. Spre
deosebire de registrul CS, registrul SS poate fi încărcat explicit, cea ce permite aplicaţiilor
să creeze stive multiple şi să comute între ele.
Cele patru registre de segment CS, DS, SS şi ES sunt aceleaşi cu registrele
de segment de la 8086/88 şi 80286 pe când FS şi GS au apărut odată cu
IA32 (80386), fiind registrele de segment de uz general similari lui ES.
Registrele de segment CS, DS, SS, ES, FS, şi GS conţin o valoare pe 16 biţi
utilizată ca un selector de segment. Acesta este un indicator (pointer) special
care identifică un segment în memorie.
Pentru a accesa un segment particular din memorie, selectorul de segment pentru acel
segment trebuie să fie prezent în registrul de segment corespunzător. Atunci când scriem
codul pentru o aplicaţie în limbaj de asamblare, selectorii de segment se creează folosind
directive ale asamblorului şi simboluri. Asamblorul şi link-editorul creează apoi valorile
actuale pentru selectorii de segment pe baza acestora.

55
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

De reţinut !
Pentru a adresa o instrucţiune, microprocesorul combină conţinutul
registrului segment de cod CS cu al registrului indicator de adresă, IP,
obţinând o adresă fizică de 20 biţi .
Registrul DS conţine adresa de început a segmentului de date, SS conţine
adresa de început a segmentului stivă iar ES conţine adresa de început a
unui segment de date suplimentar.
Segmentul de cod conţine instrucţiuni iar ultimele trei segmente de
memorie sunt dedicate operanzilor (date).

2.3.4. Registrele de uz special

Există două registere cu destinaţie specială:


 FLAGS (Flags Register – registru indicator de condiţii), (EFLAGS, la procesoarele pe
32 de biţi) sunt utilizaţi pentru a memora informaţii despre starea generală a
sistemului, proprietăţi ale rezultatului unor operaţii aritmetice sau logice, precum şi
pentru exercitarea unor acţiuni de control al activităţii procesorului (Fig.3.4).

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Overflow (depăşire)
Direction (direcţie)
Intrerrupt (întrerupere)
Trap (pas cu pas)
Sign (semn)
Zero
Auxiliary Carry (transport auxiliar)
Parity (paritate)
Carry (transport)

Fig. 3.4. Biţi registrului FLAGS

56
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

 Carry Flag (indicatorul de transport) se activează (în ''1'' logic) la apariţia unui bit
de transport (depăşirea lungimii normale a rezultatului) la adunare sau de împrumut
la scădere; este asociat rezultatului unei operaţii aritmetice sau logice şi se
comportă ca al noulea bit (b8) al acestuia.
 Parity Flag (indicator de paritate) se activează (în ''1'' logic) când rezultatul unei
operaţii aritmetice sau logice este un octet cu număr par de biţi.
 Auxiliary Flag (indicator de transport auxiliar) se activează când apare transport sau
împrumut în operaţiile aritmetice şi logice între biţii 3 şi 4.
 Zero Flag (indicator de zero) se activează (în ''1'' logic) dacă rezultatul unei
operaţii aritmetice sau logice este zero.
 Sign Flag (indicator de semn) conţine bitul cel mai semnificativ al rezultatului, deci
copiază bitul de semn; va fi ''1'' pentru rezultat negativ şi ''0'' pentru un rezultat
pozitiv.
 Overflow Flag (indicator de depăşire) se activează (în ''1'' logic) când apare
depaşirea capacităţii registrului ce conţine rezultatul, ca urmare a unei operaţii
aritmetice cu operanzi cu semn; va fi ''1'' când apare transport sau împrumut în/din
rangul de semn.
 Trap Flag (indicator pentru modul de lucru ''pas cu pas'') dacă este poziţionat în ''1''
logic, microprocesorul nu mai lucrează la viteza data de semnalul de tact ci în
ritmul impus de utilizator. Acest mod de lucru este deosebit de util la depanarea
programelor.
 Interrupt Flag (indicator pentru controlul întreruperilor) dacă este poziţionat în ''1''
logic (prin instrucţiunea corespunzătoare), sunt validate cererile de întrerupere de
tip INTR (mascabile); invalidarea acestora se face prin poziţionarea lui IF în ''0'',
caz în care cererile INTR nu vor fi luate în consideraţie.
 Direction Flag (indicator de ''direcţie"), are efect în operaţiile cu şiruri. Dacă este
poziţionat în ''1'', după fiecare transfer, adresa operandului din şir se incrementează
(creşte cu 1) iar dacă este poziţionat în ''0'' adresa se decrementează.

 IP (instruction pointer – indicator de instrucţiune ) (EIP, la procesoarele pe 32 de biţi) este


folosit pentru a stoca adresa următoarei instrucţiuni ce va fi executată de către
microprocesor. Pe măsură ce o instrucţiune este executată, indicatorul de instrucţiune este
incrementat şi se va referi la următoarea adresă de memorie (unde este stocată următoarea
instrucţiune ce va fi executată). De regulă, instrucţiunea ce urmează a fi executată se află la

57
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
adresa imediat următoare instrucţiunii ce a fost executată, dar există şi cazuri speciale
(rezultate fie din apelul unei subrutine prin instrucţiunea CALL, fie prin întoarcerea dintr-o
subrutină, prin instrucţiunea RET). Indicatorul de instrucţiuni nu poate fi modificat sau citit
în mod direct; doar instrucţiuni speciale pot încărca acest registru cu o nouă valoare.
Registrul indicator de instrucţiune nu specifică pe de-a întregul adresa din memorie a
următoarei instrucţiuni ce va fi executată, din aceeaşi cauză a segmentării memoriei. Pentru
a aduce o instrucţiune din memorie, registrul CS oferă o adresă de bază iar registrul
indicator de instrucţiune indică adresa de deplasament plecând de la această adresă de
bază.

De reţinut !
Există două registere cu destinaţie specială:
FLAGS (Flags Register – registru indicator de condiţii), utilizaţi pentru a
memora informaţii despre starea generală a sistemului, proprietăţi ale
rezultatului unor operaţii aritmetice sau logice, precum şi pentru
exercitarea unor acţiuni de control al activităţii procesorului.
IP (instruction pointer – indicator de instrucţiune) folosit pentru a stoca
adresa următoarei instrucţiuni ce va fi executată de către microprocesor.

2.4. Organizarea şi adresarea memoriei


Memoria adresată de unitatea centrală prin intermediul magistralei de adrese se numeşte
memorie fizică. Memoria fizică este organizată ca o secvenţă de octeţi (8biţi, byte). Fiecare
octet are asignată o adresă unică numită adresă fizică. Spaţiul de adrese fizice se întinde de la
0 la maxim 232 -1 (4GB). Practic orice sistem de operare proiectat să lucreze cu un procesor
IA32 va folosi facilităţile oferite de sistemul de gestiune al memoriei (memory management).
Printre caracteristicile acestuia se numără segmentarea şi paginarea, care permit ca memoria
să fie gestionată eficient şi fiabil.
În continuare se prezentă metodele de bază pentru adresarea memoriei folosite de
sistemul de gestiune al memoriei.
Când un program utilizează sistemul de gestiune al memoriei, el nu va adresa direct
memoria fizică. Accesul la aceasta se va face folosind unul din cele trei modele de memorie
posibile: plată, segmentată, adresă reală.

58
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
 În cazul modelului plat memoria apare programatorului ca un singur spaţiu de adrese
continuu numit spaţiu de adrese liniar. Codul (instrucţiunile), datele (variabilele) şi stivele
pentru proceduri (subrutine) sunt toate conţinute în acest spaţiu. Spaţiul liniar de adrese
este adresabil la nivel de octet (byte), cu adrese succesive de la 0 la maxim 2n -1. O adresă
de octet în spaţiul liniar este numită adresă liniară.

 Pentru modelul de memorie segmentat memoria apare programatorului ca un grup de spaţii


de adresă independente numite segmente. În acest model codul, datele şi stivele sunt, tipic,
conţinute în segmente separate.
Pentru a adresa un octet dintr-un segment, programul utilizează o adresă logică, care
constă dintr-un selector de segment şi un offset (decalaj):
 selectorul de segment identifică segmentul care va fi accesat;
 offsetul identifică octetul adresat în spaţiul de adresă al segmentului.
Programele rulând pe o Arhitectură Intel 32 pot accesa până la 16383 de segmente de tipuri
şi mărimi diferite şi fiecare segment poate avea până la 232 octeţi. Intern, toate segmentele
definite pentru un sistem (program) sunt mapate în spaţiul de adrese liniar al procesorului.
Astfel procesorul translatează fiecare adresă logică într-o adresă liniară pentru a accesa o
locaţie de memorie. Această translaţie este transparentă pentru aplicaţie (program).
Principala justificare pentru modelul segmentat este creşterea fiabilităţii (siguranţei de
funcţionare) programelor şi sistemului în ansamblu. De exemplu prin plasarea stivei
programului într-un segment separat ne asigurăm că aceasta nu va creşte în spaţiul de
memorie al codului şi/sau datelor, suprascriind instrucţiunile sau variabilele. Plasând
codul, datele şi stivele sistemului de operare în segmente separate le protejează de
programul aplicaţie şi invers, efectul final este cel de izolare a eventualelor greşeli de
programare.
Indiferent de model (plat sau segmentat) arhitectura Intel oferă şi facilităţi pentru a diviza
spaţiul liniar de adrese în pagini şi de a mapa aceste pagini într-o memorie virtuală.
Dacă un sistem de operare foloseşte mecanismul de paginare al arhitecturii Intel, existenţa
paginilor este transparentă pentru aplicaţie.

 Modelul mod adresă reală este modelul de memorie pentru procesorul 8086 (8088, 80186,
80188). El este disponibil la toate variantele de procesoare ulterioare pentru a asigura
compatibilitatea codului vechilor programe scrise pentru procesoarele 8086.
Modul adresă reală foloseşte o implementare specifică a memoriei segmentate în care
spaţiul liniar de adrese pentru program (aplicaţie) şi/sau sistemul de operare constă într-un

59
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
set de segmente fiecare având dimensiunea până la 64Kocteţi (Fig. 3.5).
Dimensiunea maximă a spaţiului de adrese liniar este de 220 (1024KB = 1MB)

a. Model plat
Adresă liniară
Spaţiu de
adrese
liniar

b. Model segmentat Segmente

Spaţiu de
Offset adrese
Adresă logică liniar
Selector segment

c. Model pentru modul adresă reală


Spaţiu de
Offset adrese
liniar
Adresă logică divizat în
Selector segment segmente
egale

Fig. 3.5. Organizarea memoriei

Modul în care este generată adresa fizică de memorie (acest mod fiind şi cel mai simplu) în
cazul modelului mod adresă reală (8086/88, 80186/188), constă în însumarea (sumator de 20
de biţi) offset-ului cu selectorul de segment, acesta din urmă fiind deplasat spre stânga cu 4
poziţii înainte de însumare iar transportul este ignorat (fig. 3.6).
Deplasare (shift) stânga cu 4 biţi
19 0 15 0
1 2 3 4 0 1 2 3 4 Segment

15 0 15 0
+ 0 0 7 7 0 0 7 7 Offset

Adresă logică
19 0
= 1 2 3 B 7 Adresă fizică

Memorie

Fig. 3.6. Generarea adresei fizice de memorie


60
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
În cazul modelului segmentat, o unitate dedicată a procesorului numită unitate de
segmentare translatează adresa logică din program într-o adresă liniară.
Locaţiile segmentelor în spaţiul de adresă liniar sunt memorate în structurile de date
numite descriptori de segment. Unitatea de segmentare calculează adresa folosind descriptorii
de segment şi offsetul, extras din instrucţiune. Adresa liniară este trimisă la o unitate de
paginare şi la unităţile de cache. Când un segment este adresat pentru prima oară descriptorul
său de segment este memorat într-un registru al procesorului. Un program poate avea până la
16383 segmente. La un moment dat pot fi memoraţi în registrele procesorului până la 6
descriptori de segment.
Se prezintă relaţiile între adresa logică, cea liniară şi cea fizică (Fig. 3.7).

31 12 11 0
Offset
Adresă fizică Adresă de bază pagină
Pagină

Translatare unitate de
paginare
31 22 21 12 11 0
Offset Director Offset Tabelă Offset
Adresă liniară
Pagini Pagini Pagină

Translatare unitate de
segmentare
47 32 31 0
Selector
Segment Offset Segment

Adresă logică

Fig. 3.7. Relaţiile între adresa logică, liniară şi fizică

Unitatea de paginare permite accesarea unor structuri de date mai mari decât memoria
fizică (RAM) disponibilă, asigurând păstrarea acestora parţial în memorie şi parţial pe un
suport extern (hard disk). Paginarea împarte spaţiul de adrese liniar în blocuri de 4KB numite
pagini. Ea foloseşte structuri de date particulare (în memorie) numite tabele de pagini pentru
maparea spaţului liniar de adrese în spaţiul fizic. Adresa fizică este plasată pe magistrala de
adrese a procesorului prin intermediul unităţii de cache care o utilizează şi ea. Unitatea de
paginare identifică şi problemele care pot apărea, cum ar fi un acces la o pagină care nu există
în memorie, generând un eveniment numit eroare pagină ("page fault"). Într-o astfel de
situaţie sistemul de operare poate încerca să aducă pagina respectivă de pe suportul extern
(disk). Dacă este necesar poate şi elibera spaţiu de memorie trimiţând altă pagină pe disk.

61
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
Dacă paginarea nu este activă, adresa fizică este identică cu adresa liniară. Spre deosebire
de segmentare, paginarea este invizibilă (transparentă) pentru aplicaţii, dar nu furnizează o
protecţie similară acesteia. Paginarea este vizibilă doar pentru sistemul de operare care o
foloseşte pentru a satisface cerinţele de memorie ale aplicaţiilor.

De reţinut !
Una dintre cele mai importante caracteristici ale memoriei este modul de
organizare al ei şi implicit modul de accesare a informaţiei din memorie.
Memoria este organizată ca un set de locaţii (celule) de memorare
numerotate consecutiv începând de la 0.
Adresa fizică a unei locaţii de memorie este reprezentată printr-un număr
asociat locaţiei respective, iar mulţimea totală a adreselor fizice
reprezintă spaţiul de adrese fizice al memoriei care este limitat de
dimensiunea magistralei de adrese.
O adresă logică este o adresă utilizată într-o instrucţiune dintr-un
program iar mulţimea totală a acestora reprezintă spaţiul adreselor
logice. Organizarea acestui spaţiu defineşte arhitectura memoriei şi este
de o importanţă majoră pentru orice programator.
Maparea este procesul prin care adresele logice pot fi translatate în
adrese fizice, adică este un mecanism de realocare a spaţiului de adrese
logice peste spaţiul de adrese fizice.
Segmentarea memoriei este un mecanism de management al memoriei
care permite programatorilor să-şi partiţioneze programele în module
care pot opera independent unul de celălalt şi care pot creşte sau
descreşte în dimensiune.
În acest mod memoria este divizată logic în mai multe părţi numite
segmente de memorie. În fiecare segment adresarea componentelor sale
(cuvinte de memorie) este liniară. O adresă de memorie este compusă în
acest caz din selectorul segmentului de memorie şi deplasamentul
(offset-ul) din cadrul segmentului respective.
Unitatea de paginare permite accesarea unor structuri de date mai mari
decât memoria fizică (RAM) disponibilă, asigurând păstrarea acestora
parţial în memorie şi parţial pe un suport extern (hard disk).

62
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„PROGRAMAREA ÎN LIMBAJ DE ASAMBLARE FOLOSIND
SIMULATORUL SMS32: utilizarea registrelor interne”.
Obiectivele laboratorului sunt:
 Prezentarea şi descrierea simulatorului SMS32;
 Setul de instrucţiuni pentru simulatorul SMS32;
 Necesitatea şi explicarea programării în limbaj de asamblare;
 Iniţiere în limbaj de asamblare.
Studenţii utilizează un program care este un simulator al structurii
minimale a unui microprocesor pe 8 biţi. Acest simulator constă dintr-o
unitate centrală (CPU), o unitate de memorie RAM de 256 biţi şi 16
porturi I/O (Intrare/Ieşire) din care sunt folosite numai 5 porturi.
Folosind acest simulator se pot rula programe diverse, care apoi pot fi
folosite într-un sistem real, care va avea în locul memoriei RAM o
memorie ROM, în aceasta fiind înscris un singur program.

Test de autoevaluare
1. Care sunt registrele unităţii centrale ale microprocesoarele 80x86 şi
ce rol îndeplinesc?
2. Ce este stiva şi când se utilizează aceasta?
3. Care sunt biţii registrului indicator de condiţii?
4. Ce este memoria fizică?
5. În ce constă modelul de memorie plat?
6. În ce constă modelul de memorie segmentat?
7. În ce constă modelul mod adresă reală?
8. Ce rol are unitatea de paginare?

Lucrare de verificare la Unitatea de învăţare 3


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Registrele unităţii centrale ale microprocesoarele 80x86;
2. Organizarea memoriei la microprocesoarele 80x86.

63
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii
1. Particularitatea microprocesoarelor INTEL 80x86 este reprezentată
de faptul că un procesor conţine un superset de regiştrii ai
procesorului precedent.
2. Una dintre cele mai importante caracteristici ale memoriei este
modul de organizare al ei şi implicit modul de accesare a informaţiei
din memorie.

Bibliografie

1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,


Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Rotar Dan; Microprocesorul. Programarea în limbaj de asamblare
a microprocesoarelor: 80x86; TMS 320F240; PIC 16F87x, Editura
ALMA MATER

64
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

Unitatea de învăţare nr. 4

MICROPROCESOARELE INTEL 80x86


SETUL DE INSTRUCŢIUNI

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 4 66
4.1. Aspecte generale privind programarea în limbaje de asamblare 66
4.2. Precizări privind reprezentarea numerelor în sistemele cu 68
microprocesoare
4.3. Tipuri de date utilizate în limbaje de asamblare 71
4.4. Setul de instrucţiuni al microprocesoarelor INTEL 80x86 73
4.4.1. Sintaxa unei instructiuni în limbaj de asamblare 73
4.4.2. Grupe de instrucţiuni 74
Lucrare de laborator 85
Test de autoevaluare 85
Lucrare de verificare – unitatea de învăţare nr. 4 85
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 86
Concluzii 86
Bibliografie – unitatea de învăţare nr. 4 86

65
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

OBIECTIVELE unităţii de învăţare nr. 4

Principalele obiective ale Unităţii de învăţare nr. 4 sunt:


• Cunoaşterea avantajului şi respectiv dezavantajului
programării în limbaj de asamblare;
• Cunoaşterea sintaxei unei instrucţiuni şi a grupelor de
instrucţiuni;

4.1 . Aspecte generale privind programarea în limbaj de


asamblare

Un microprocesor poate fi programat:


 folosind programarea în cod maşină;
 folosind programare în limbaj asamblare;
 folosind un limbaj de programare de nivel înalt;
 folosind o combinaţie a celor trei metode.
Totalitatea instrucţiunilor pe care un procesor le poate recunoaşte şi executa, formează
setul de instrucţiuni al microprocesorului respectiv.
Un program scris în limbaj de asamblare este salvat într-un fişier cu extensia .asm.
Acest tip de fişier poate fi editat cu orice tip de editor de text, de exemplu Notepad.
Programarea în limbaj de asamblare presupune folosirea unui set de instrucţiuni
specifice fiecărui tip de microprocesor.
Codurile instrucţiunilor se formulează în limbaj de asamblare ca şi cuvinte cheie,
prescurtate de obicei, care exprimă funcţia reprezentată de codul respectiv. Aceste cuvinte se
numesc mnemonici.
Orice program scris în limbaj de asamblare va fi transformat prin diverse operaţii în
limbaj ”cod maşină”. Acesta foloseşte instrucţiuni codate în binar fiind de fapt singurul limbaj
înţeles de procesor.
Programarea în limbaj de asamblare este ”superioară” programării în cod maşină şi
”inferior” programării într-un limbaj de nivel ”înalt”.

66
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
Deşi programarea în limbaj de asamblare este mult mai meticuloasă şi mai restrictivă
este necesară folosirea lui în cazul controlării unui proces real unde viteza de execuţie este
esenţială.
Deoarece se cunoaşte cu exactitate numărul de “cicluri maşină” necesar execuţiei unei
instrucţiuni în limbaj de asamblare, deci implicit timpul real de execuţie, poate fi determinat
timpul de execuţie al unui program, factor esenţial în cadrul unui proces real, respectiv
execuţie în timp real. Aceasta este principalul motiv pentru care programarea în limbaj de
asamblare este actuală. Datorită apariţiei a noi procesoare cu frecvenţe de tact foarte mari
acest aspect pare rezolvat, totuşi preţul unui asemenea procesor nu se justifică în folosirea
unor sisteme de comandă simple în cele mai multe cazuri.

Avantaje ale limbajului de asamblare:


 viteza foarte mare de execuţie a programelor (unele programe scrise şi optimizate în
asamblare au viteza de executie până la 5-10 de ori mai mare decat cele scrise în C sau
Pascal);
 mărimea codului executabil este foarte mică;
 ajută utilizatorul să înţeleagă mai bine cum funcţionează microprocesorul şi să scrie
programe eficiente şi în limbaj de programare de nivel înalt.
Dezavantaje ale limbajului de asamblare:
 nu este portabil; un program scris pentru calculatoare IBM PC nu va rula pe un Apple
Macintosh (diferă unele instructiuni);
 un program în asamblare este mai greu de scris şi ia mai mult timp decât un program scris
în Pascal sau C;
 un program scris în asamblare este mai greu de depanat.

Etapele elaborării unui program pentru microprocesorul 8086, lucrând pe un calculator


compatibil IBM PC sunt:
 se scrie programul în limbaj de asamblare cu ajutorul unui editor de texte, obţinându-se un
fişier text numit fişier sursă care are cel mai adesea extensia .asm;
 translatarea fişierului sursă în format binar se face cu ajutorul programului asamblor care
semnalează eventualele erori de sintaxă ale programului şi generează, în cazul în care
programul este corect din punct de vedere sintactic, un fişier în cod binar.
În funcţie de necesităţile programatorului, asamblorul poate genera două tipuri de fişiere:
 fişiere în cod obiect absolut, direct executabile de către unitatea centrală, care sunt
aşezate în memorie la adresa de unde vor fi executate (fişierul generat conţine adresele

67
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
absolute ale programului) şi care vor avea extensia .com sau .exe
 fişiere în cod obiect relativ, care conţin codul obiect dar adresele sunt relative
(simbolice) şi care nu pot fi executate direct dar pot fi puse în biblioteci (pentru o
utilizare ulterioară).
 dacă s-a obţinut fişierul în cod obiect absolut (extensia .com sau .exe) se poate trece la
lansarea în execuţie în scopul verificării şi eventual a depanării funcţionării logice a
acestuia (cu ajutorul unui program de depanare – debugger);
 dacă s-a obţinut un fişier în cod obiect relocabil, fişierul poate fi adăugat unei biblioteci
(library) cu ajutorul unui program bibliotecar (librarian) sau se poate genera programul în cod
obiect absolut cu ajutorul unui editor de legături (linkeditor). Editorul de legături caută în
biblioteci legăturile solicitate, adaugă în programul în cod obiect absolut secvenţele extrase din
biblioteci, semnalează eventualele referinţe nerezolvate şi, în cazul în care nu au fost erori,
generează codul obiect absolut.

De reţinut !
Un program scris în limbaj de asamblare este salvat într-un fişier cu
extensia .asm
Programarea în limbaj de asamblare presupune folosirea unui set de
instrucţiuni specifice fiecărui tip de microprocesor.
Programarea în limbaj de asamblare este ”superioară” programării în cod
maşină şi ”inferior” programării într-un limbaj de nivel ”înalt”.

4.2. Precizări privind reprezentarea numerelor în sistemele cu


microprocesoare
Un microprocesor primeşte, prelucrează şi furnizează informaţii numai în cod binar,
deoarece semnalele cu care acesta lucrează pot lua numai două valori: nivel ridicat şi nivel
coborât.
Sistemul de numeraţie în baza 2 foloseşte numai două valori pentru reprezentarea stării
unei variabile: 0 şi 1. Aceste două valori se mai numesc şi cifre binare sau, pe scurt, biţi.
În vorbirea uzuală există mai multe cuvinte care sunt asociate acestor două valori, în
funcţie de semnificaţia pe care le-o acordăm:
Bitul 1 adevărat pornit ridicat setat +5 V setat
Bitul 0 fals oprit coborât resetat 0V şters
68
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

Microprocesorul 8086 foloseşte grupuri de câte 8 sau 16 linii sau semnale logice, cărora
le corespund grupuri de 8 biţi (octeţi sau bytes) şi respectiv 16 biţi (cuvinte sau words). Când
ne referim la un octet, trebuie să avem în vedere atât numărul de biţi cât şi ordinea în care
aceştia sunt aranjaţi în cadrul octetului. Poziţia fiecărui bit o numim rang şi acesta indică
ponderea bitului respectiv în cadrul valorii numerice a octetului. Ponderea unui bit este egală
cu 2rangul bitului
Ca şi în zecimal, rangul cel mai mic (0) şi ponderea cea mai mică (20=1) o are ultima
cifră binară din dreapta. Ponderea creşte treptat, odată cu rangul, de la dreapta la stânga,
ultima cifră binară având rangul maxin (7) şi ponderea maximă (27). De aceea, bitul de rang 0
se mai numeşte şi cel mai puţin semnificativ bit (LSB - Least Significant Bit), iar bitul de rang
7 poarta numele de cel mai semnificativ bit (MSB - Most Significant Bit).
Exemplu, în cazul octetului 10001101:

Rang 7 6 5 4 3 2 1 0
Pondere 27 26 25 24 23 22 21 20
Valoare
128 64 32 16 8 4 2 1
pondere
Octet 1 0 0 0 1 1 0 1

Spunem că biţii de rang 7, 4, 3, 2 şi 0 au valoarea 1, iar biţii de rang 6, 5 şi 0 au valoarea


0. Valoarea numerică a octetului este egală cu suma tuturor biţilor înmulţiţi fiecare cu
ponderea sa, ceea ce este echivalent su suma ponderilor tuturor biţilor 1 ai octetului respectiv.
Pentru exemplul considerat, valoarea numerică este 128+8+4+1 = 141 în zecimal.
Aceleaşi reguli se aplică şi pentru cuvinte de 16 biţi, cu obsevaţia că în acest caz bitul cel
mai semnificativ este cel de rang 15. în plus, cei 16 biţi sunt adeseori considerati ca fiind
formaţi din doi octeţi: octetul superior sau MSB şi cel inferior sau LSB.

Pondere 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20


Rang 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
octetul superior (MSB) octetul inferior (LSB)

Reprezentarea binară este destul de dificil de folosit, în special pentru numere mari, din
cauza numărului ridicat de cifre binare necesare pentru codificarea lor. O reprezentare mai
compactă este reprezentarea în baza 16 sau hexazecimală, care aduce numărul de cifre chiar
sub cel cu care suntem obişnuiţi din reprezentarea zecimală.
Avantajul ei este acela că trecerea de la reprezentarea binară la cea hexazecimală este
imediată, fiind bazată pe gruparea biţilor câte 4, începând cu LSB. În mod similar, trecerea de
la hexazecimal la binar se face uşor, prin expandarea separată a cifrelor hexazecimale în

69
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
grupuri de 4 biţi şi concatenarea acestora.
Exemplu, şirul de biţi 1001101001110100 poate fi reprezentat în hexazecimal astfel:

Binar: 1001 1010 0111 0100


Hexazecimal: 9 A 7 4

Pentru a evita confuziile, numerele reprezentate în binar sau în hexazecimal


vor fi urmate de o literă care să indice baza de reprezentare:
B sau b - pentru codificarea binară (1011b = 0Bh = 10)
H sau h - pentru hexazecimal (1001h = 0001 0000 0000 0001b).
O problemă importantă o constituie codificarea adreselor şi precizarea lungimii
intervalelor de adrese.
Spre exemplu, aşa cum s-a arătat anterior, microprocesorul 8086 dispune de o
magistrală de adrese formată din 16 linii. Cu ajutorul acestor linii pot fi accesate un număr de
216 = 65536 de locaţii de memorie de 8 biţi. Aceasta înseamnă că adresa cu valoarea numerică
cea mai mică (0) se poate scrie pe 16 biţi în hexazecimal sub forma 0000h, respectiv 16 biţi 0.
Adresa maximă este 65535 şi poate fi scrisă în hexazecimal ca FFFFh, respectiv 16 biţi 1.
O altă problemă o constituie modul de execuţie a operaţiilor logice de către
microprocesorul 8086. Acestea sunt trei operaţii cu doi operanzi: AND, OR şi XOR şi una cu
un singur operand: NOT. Ele se execută separat asupra biţilor de pe acelaşi rang ai
operanzilor, respectiv asupra fiecărui bit separat (NOT), ca în exemplele de mai jos:

01101010 01101010 01101011


11000001 11000001 11000001 01101010
AND -------------- OR -------------- XOR -------------- NOT --------------
01000000 11101011 10101010 10010101

Operaţiile aritmetice în baza 2 sau baza 16 se efectuează în mod similar cu cele din baza
10. Spre exemplu, operaţiile aritmetice pe care le poate efectua 8086 sunt cele de adunare
(ADD) şi de scădere (SUBstract) cu doi operanzi în baza 2:

01101010 11000100
01000001 01101110
ADD ----------------- ADD ------------------
10101011 100110010

Scăderea se efectuează prin adunarea descăzutului cu opusul scăzătorului:


Descăzut - Scăzător = Descăzut + (-Scăzător)
Opusul unui număr în baza 2 se mai numeşte şi complementul faţă de 2 (CM2).
Complementul faţă de 2 se calculează apelând la complementul faţă de 1 (CM1):

70
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
CM2 = CM1 + 1
01101011 11000101
01000001 11101110
SUB ----------------- SUB ---------------
000101010 111010111
fără împrumut cu împrumut
Scăderile din exemplele de mai sus se efectuează prin parcurgerea următorilor paşi:

CM1 10111110 00010001


01101011 11000101
CM2 10111111 00010010
ADD --------------- ADD --------------------------
100101010 11010111
cu transport fără transport

Se observă că dacă apare transport la adunare înseamnă că nu apare împrumut la scădere


şi invers.
Operaţiile de adunare şi scădere se pot face şi în baza 16, într-un mod asemănător cu
cele din baza 10, dacă ţinem cont că între rangurile hexazecimale transportul şi împrumutul se
referă la 16 unităţi în loc de 10.

De reţinut !
Pentru a evita confuziile, numerele reprezentate în binar sau în
hexazecimal vor fi urmate de o literă care să indice baza de reprezentare:
B sau b - pentru codificarea binară, H sau h - pentru hexazecimal
Octetul este o unitate de măsură a informaţiei. Pentru măsurarea
diferitelor cantităţi de informaţie se pot folosi multiplii octetului.
Unităţile de informaţie folosesc ca factor de multiplicare 210=1024:
1 Koctet = 210 octeţi = 1024 octeţi;
1Moctet = 210 Kocteţi = 220 octeţi;
1Goctet = 210 Mocteţi = 220 Kocteţi = 230 octeţi;
1Toctet = 210 Goctet=220 Mocteţi=230 Kocteţi=240 octeţi

4.3. Tipuri de date utilizate în limbaje de asamblare


Tipurile fundamentale de date (Fig. 4.1) pentru Arhitectura Intel 32 sunt:
 octet - byte (8 biţi);
 cuvânt - word (2 octeţi - 16 biţi);

71
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
 dublu cuvânt - double word (4 octeţi - 32 de biţi);
 quadruplu cuvânt - quad word (8 octeţi - 64 de biţi);
 dublu cvadruplu cuvânt - double quad word (16 octeţi - 128 de biţi).

7 0
Byte

15 87 0
Word Hi Lo
31 16 15 0
Doubleword Hi Lo

63 32 31 0
Quadword Hi Lo
Double Quadword
127 64 63 0
Hi Lo

Fig. 4.1. Tipuri de date

Tipul quad word a apărut în arhitectura Intel odată cu 80486, iar double quad word
odată cu Pentium III cu extensia SSE.
Cel mai puţin semnificativ octet ocupă cea mai mică adresă în memorie (Low), adresa
respectivă fiind şi adresa operandului.
Deşi tipurile fundamentale de date pentru o arhitectură Intel sunt cele menţionate mai
sus, anumite instrucţiuni suportă o interpretare suplimentară a acestor tipuri pentru a permite
operaţii asupra unor tipuri numerice de date: întregi cu sau fără semn şi numere în virgulă
mobilă.
 La numerele întregi fără semn (unsigned integer) au formatul de reprezentare nativ,
coincid cu tipurile fundamentale iar la numerele întregii cu semn (signed integer), cel mai
semnificativ bit al tipului respectiv, este bitul de semn (de exemplu bitul 15 la signed word
sau bitul 63 la signed quadword), valoarea fiind reprezentată în cod binar complement faţă
de 2.
 La formatul virgulă mobilă (floating point), reprezentarea este conformă standardului
IEEE 754, existând trei formate:
 simplă precizie (single precision) lungime 32 biţi , precizie 24 biţi;
 dublă precizie (double precision) lungime 64 biţi , precizie 53 de biţi;
 precizie extinsă (extended double precision) lungime 80 de biţi, precizie 64 biţi.
Precizia se referă la numărul de biţi al mantisei normalizate.

72
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

4.4. Setul de instrucţiuni al microprocesoarelor INTEL 80x86


4.4.1. Sintaxa unei instrucţiuni în limbaj de asamblare

O instructiune ocupă o linie de program şi se compune din mai multe câmpuri, după
cum urmeaza (parantezele drepte indică faptul că un anumit câmp poate să lipsească):
[<eticheta>:] [<mnemonica>] [<operand_1> [,<operand_2>]] [;<comentariu>]
 <eticheta> - este un nume simbolic (identificator) dat unei locaţii de memorie care conţine
instrucţiunea care urmează; scopul unei etichete este de a indica locul în care trebuie să se
facă un salt în urma executării unei instrucţiuni de salt; eticheta poate fi o combinaţie de
litere, cifre şi anumite semne speciale (ex: _ ), cu restricţia că prima cifră să fie o literă;
 <mnemonica> - este o combinaţie de litere care simbolizează o anumită instrucţiune (ex:
add pentru adunare, mov pentru transfer, etc.); denumirile de instrucţiuni sunt cuvinte
rezervate şi nu pot fi utilizate în alte scopuri;
 <operand_1> - este primul operand al unei instrucţiuni şi în acelasi timp şi destinaţia
rezultatului; primul operand poate fi un registru, o adresă, sau o expresie care generează o
adresă de operand; adresa operandului se poate exprima şi printr-un nume simbolic
(numele dat unei variabile);
 <operand_2> - este al doilea operand al unei instrucţiuni; acesta poate fi oricare din
variantele prezentate la primul operand şi în plus poate fi şi o constantă;
 <comentariu> - este un text explicativ care arată intenţiile programatorului şi efectul
scontat în urma execuţiei instrucţiunii; având în vedere că programele scrise în limbaj de
asamblare sunt mai greu de interpretat se impune aproape în mod obligatoriu utilizarea de
comentarii; textul comentariului este ignorat de compilator; comentariul se consideră până
la sfârşitul liniei curente.
Într-o linie de program nu toate câmpurile sunt obligatorii: poate să
lipsească eticheta, operanzii, comentariul sau chiar instrucţiunea. Unele
instrucţiuni nu necesită nici un operand, altele au nevoie de unul sau doi
operanzi.
Primul operand este destinaţia, iar al doilea este sursa.
Constantele numerice care apar în program se pot exprima în zecimal
(modul implicit), în hexazecimal (constante terminate cu litera 'h') sau în
binar (constante terminate cu litera 'b'). Constantele alfanumerice (coduri
ASCII) se exprima prin litere între apostrof sau text între ghilimele.

73
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

De reţinut !
Sintaxa unei instrucţiuni în limbaj de asamblare este:
[<eticheta>:] [<mnemonica>] [<operand_1>[,<operand_2>]] [;<comentariu>]
Primul operand este destinaţia, iar al doilea este sursa.
Într-o linie de program nu toate câmpurile sunt obligatorii: poate să
lipsească eticheta, operanzii, comentariul sau chiar instrucţiunea.
Unele instrucţiuni nu necesită nici un operand, altele au nevoie de unul
sau doi operanzi.

4.4.2. Grupe de instrucţiuni


Setul de instrucţiuni este organizat în 6 grupe:
1. instrucţiuni de transfer, care deplasează date între memorie sau porturi de intrare/ieşire şi
registrele procesorului, fără a executa prelucrarea datelor;
2. instrucţiuni aritmetice şi logice, care prelucrează date în format numeric;
3. instrucţiuni pentru şiruri, specifice operaţiilor cu date alfanumerice;
4. instrucţiuni pentru controlul programului, care în esenţă se reduc la salturi şi la apeluri
de proceduri;
5. instrucţiuni specifice întreruperilor, hard şi soft;
6. instrucţiuni pentru controlul procesorului.
În continuare se prezentă instrucţiunile comune majorităţii microprocesoarelor şi care se
utilizeaza mai des şi au importanţă din punct de vedere al structurii şi al posibilităţilor
procesorului

A. Instrucţiuni de transfer presupun o copiere a unui octet sau a unui cuvânt de la o sursă la
o destinaţie. Destinaţia poate fi un registru, o locaţie de memorie sau un port de ieşire iar
sursa poate fi un registru, o locaţie de memorie, constante sau un port de intrare.
Transferurile de tip memorie-memorie nu sunt permise (cu excepţia instrucţiunilor pentru
şiruri). La fel nu sunt permise transferurile directe între doua registre segment. Ambii
operanzi ai unui transfer trebuie sa aiba aceeaşi lungime (numar de biţi).

A1. Instrucţiuni de transfer generale: MOV, XCHG, PUSH, POP

 Instrucţiunea MOV (Move Data – Transferă date)


74
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
Este cea mai utilizată instrucţiune de transfer. Sintaxa ei este:
[<eticheta>:] MOV <operand_1>, <operand_2> [;<comentariu>]
unde:
<operand_1> = <registru>|<reg_segment>|<adresa_offset>|<nume_variabila>|<expresie>
<operand_2> = <operand_1>|<constanta>
<registru> = EAX|EBX|.....ESP|AX|BX|....SP|AH|AL|....DL
<expresie> = [[<registru_index>][+<registru_baza>][+<deplasament>]]
aici parantezele drepte marcate cu bold sunt necesare şi conţin:
<registru_index> = SI| DI |ESI | EDI
<registru_baza> = BX|BP |EBX| EBP
<deplasament> = <constanta>
Următoarele operaţii nu sunt permise:
 sursa şi destinaţia nu pot fi ambele operanzi în memorie;
 nu pot fi folosite registrele FLAGS şi IP;
 operanii nu pot avea dimensiuni diferite;
 registrul CS nu poate apare ca destinaţie.
Exemple de instrucţiuni corecte:
MOV AX, BX
MOV AL, CH
MOV SI, 1234h
Exemple de erori de sintaxă:
MOV AX, CL ; operanzi inegali ca lungime
MOV AL, 1234h ; dimensiunea constantei este mai mare decât cea a registrului
MOV DS, ES ; două registre segment

 Instrucţiunea XCHG (Exchange Data – Interschimbă date)


Această instrucţiune schimbă între ele conţinutul celor doi operanzi.

XCHG <operand_1>, <operand_2>

Exemple:
XCHG AL, BH
XCHG AX,BX
Instrucţiunea XCHG este utilă la interschimbarea a două cantităţi aflate în memorie. Dacă
operand 1 şi operand 2 sunt doi operanzi aflaţi în memorie, care trebuie interschimbaţi,
secvenţa standard de interscmbare (folosind un registru) este:

75
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
MOV registru, operand1
XCHG registru, operand2
MOV operand1, registru

 Instrucţiunile PUSH (Push Data – Salvează date în stivă) şi POP (Pop Data – Refă
date din stivă)
Cele două instrucţiuni operează în mod implicit cu vârful stivei.
 Instrucţiunea PUSH pune un operand în stivă;
 POP extrage o valoare de pe stivă şi o depune într-un operand.
În ambele cazuri registrul indicator de stivă (SP) se modifică corespunzător (prin
decrementare şi respectiv incrementare) astfel încât registrul SP să indice poziţia curentă a
vârfului de stivă.
Sintaxa instrucţiunilor este:
PUSH <operand_1>
cu semnificaţia: ‘‘copiază sursă (operand 1) în vârful stivei’’, concret execuţia instrucţiunii
se face după secvenţa
(SP) (SP) – 2
SS : (SP) + 1 : (SP) operand 1
POP <operand_1>
cu semnificaţia: ‘‘copiază conţinutul vârfului stivei în destinaţie (operand 1) ’’, concret
execuţia instrucţiunii se face după secvenţa
operand 1 SS : (SP) + 1 : (SP)
(SP) (SP) + 2
Transferul se face numai pe 16 biţi. Aceste instrucţiuni sunt utile pentru salvarea temporară
şi refacerea conţinutului unor registre. Aceste operaţii sunt necesare mai ales la apelul de
rutine şi la revenirea din rutine.

A2. Instrucţiuni de transfer specifice adreselor: LEA, LDS, LES

Aceste istrucţiuni transferă o adresă efectivă într-un registru general, sau o adresă completă pe
32 de biţi într-o pereche de registre.

 Instrucţiunea LEA (Load Effective Address – Încarcă adresă efectivă), LDS (Load
Data Segment – Încarcă DS ) şi LES (Load Extra Segment – Încarcă ES)
Aceste instrucţiuni permit încărcarea într-un registru a unei adrese de variabile.

76
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
 Prima instrucţiune LEA încarcă în registrul exprimat ca prim operand adresa de
offset a variabilei din operandul 2.
 Următoarele două instrucţiuni încarcă atât adresa de offset cât şi adresa de segment;
LDS încarcă segmentul în registrul DS,
LES încarcă segmentul în registrul ES. Sintaxa ei este:
LEA <operand_1>,< operand _2>
LDS < operand _1>,< operand _2>
LES < operand _1>, < operand _2>
în care operand 1este un registru iar operand 2 este un operand aflat în memorie
Exemple:
LEA SI, Var1 ; SI<= offset(Var1)
LDS BX, text ; DS<= segment(text), BX<=offset(text)
LEA DI, [BX+100] ; DI<= BX+100

A3. Instrucţiuni de transfer specifice acumulatorului: IN, OUT, XLAT

 Instrucţiunea IN (Input Data – Citeşte date de la port de intrare)


Sintaxa ei este:
IN< operand _1>,< operand _2>
în care operand 1 este registrul AL sau AX iar operand 2 este un port ce poate să fie o
constantă cuprinsă între 0...255, fie registrul DX. La variantele noi de procesoare registrele
AL sau AX pot fi substituite cu orice registre de uz general.

 Instrucţiunea OUT (Output Data – Scrie date la port de ieşire)


Sintaxa ei este:
IN< operand _1>,< operand _2>
în care operand 1 este registrul AL sau AX iar operand 2 este un port de ieşire specificat la
fel ca la instrucţiunea IN.
Instrucţiunile IN şi OUT sunt singurele instrucţiuni propriu-zise care pot realiza
interacţiunea procesorului cu alte dispozitive.

 Instrucţiunea XLAT (Translate - Translatează)


Instrucţiunea nu are operanzi iar semnificaţia este:
(AL) DS : ((BX) + (AL))
adică se aduce în AL conţinutul octetului de la adresa (BX)+(AL). Această instrucţiune
este folosită împreună cu tabele de translatare utile în conversia unor tipuri de date.

77
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

A4. Instrucţiuni de transfer specifice flagurilor: LAHF, SAHF, PUSHF, POPF

 Instrucţiunea LAHF (Load AH with FLAGS – Încarcă AH cu FLAGS)


Înstrucţiunea nu are operanzi, iar semnificaţia este exprimată de denumire: se încarcă
registrul AH cu partea mai puţin semnificativă a registrului de flaguri
AH FLAGS 0...7

 Instrucţiunea SAHF (Store AH into FLAGS – Depune AH în FLAGS)


Este perechea instrucţiunii LAHF, semnificaţia fiind:
FLAGS 0...7 AH

 Instrucţiunea PUSHF (Push Flags – Salvează FLAGS în stivă)


Nu are operanzi, iar efectul este plasarea registrului FLAGS în vârful stivei:
(SP) (SP) – 2
SS : (SP) + 1 : (SP) FLAGS

 Instrucţiunea POPF (Pop FLAGS – Reface FLAGS din stivă)


Este perechea instrucţiunii PUSHF:
FLAGS SS : (SP) + 1 : (SP)
(SP) (SP) + 2
Cu excepţia instrucţiunilor SAHF şi POPF, nici o instrucţiune de transfer nu
modifică indicatorii de condiţii

B. Instrucţiuni aritmetice şi logice


A doua categorie importantă de instrucţiuni o constituie instrucţiunile aritmetice şi logice.
Rezultatul operaţiei este totdeauna depus într-unul din operanzi. La instrucţiunile cu doi
operanzi, rezultatul este depus în primul operand. Instrucţiunile modifică indicatorii de
condiţii CF (Flagul Carry - transport), AF (Flagul Auxiliarry Carry – transport auxiliar), ZF
(Zero), SF (Flagul Sign - semn), PF (Flagul Parity - paritate), OF (Flagul Overflow –
depăşire), motiv pentru care acestea mai sunt numite şi flaguri aritmetice.

B1. Instrucţiuni aritmetice


Aceste instrucţiuni efectuează cele patru operaţii aritmetice de bază: adunare, scădere,
înmulţire şi împărţire. Rezultatul acestor instrucţiuni afectează starea indicatorilor de condiţie.

78
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

 Instrucţiunile ADD şi ADC


Aceste instrucţiuni efectuează operaţia de adunare a doi operanzi, rezultatul plasându-se în
primul operand. A doua instrucţiune ADC (ADD with carry – Adună cu transport) în plus
adună şi conţinutul indicatorului de transport CF. Această instrucţiune este utilă pentru
implementarea unor adunări în care operanzii sunt mai lungi de 32 de biţi.
Sintaxa lor este:
ADD <operand_1>,< operand _2>
ADC < operand _1>,< operand _2>

Semnificaţia este:
<operand_1> <operand_1> + < operand _2>
<operand_1> <operand_1> + < operand _2> + <CF>
Indicatori de condiţii afectaţi: AF,CF, PF, SF, ZF, OF, (toţi)

 Instrucţiunile SUB şi SBB


Aceste instrucţiuni implementează operaţia de scădere. A doua instrucţiune, SBB (Subtract
with borrow – Scade cu împrumut) scade şi conţinutul indicatorului CF, folosit în acest caz pe
post de bit de împrumut. Ca şi ADC, SBB se foloseşte pentru operanzi de lungime mai mare.
Sintaxa lor este:
SUB <operand_1>,< operand _2>
SBB < operand _1>,< operand _2>
Semnificaţia este:
<operand_1> <operand_1> - < operand _2>
<operand_1> <operand_1> - < operand _2> - <CF>
Indicatori de condiţii afectaţi: AF,CF, PF, SF, ZF, OF, (toţi)

 Instrucţiunile MUL şi IMUL


Aceste instrucţiuni efectuează operaţia de înmulţire, MUL pentru întregi fără semn şi IMUL
(Integer Multiply – Înmulţeşte cu semn) pentru întregi cu semn. De remarcat că la operaţiile
de înmulţire şi împărţire trebuie să se ţină cont de forma de reprezentare a numerelor (cu semn
sau fără semn), pe când la adunare şi scădere acest lucru nu este necesar. Pentru a evita dese
depăşiri de capacitate s-a decis ca rezultatul operaţiei de înmulţire să se păstreze pe o lungime
dublă faţă de lungimea operanzilor. Astfel dacă operanzii sunt pe octet rezultatul este pe
cuvânt, iar daca operanzi sunt pe cuvânt rezultatul este pe dublu-cuvânt. De asemenea se
impune ca primul operand şi implicit şi rezultatul să se păstreze în registrul acumulator. De

79
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
aceea primul operand nu se mai specifică.
Sintaxa lor este:
MUL <operand_2>
IMUL < operand_2>
Semnificaţia este:
<acumulator extins> <acumulator> * < operand _2>
în care ambii operanzi se consideră numere fără semn
<acumulator extins> <acumulator> * < operand _2>
în care ambii operanzi se consideră numere cu semn
Indicatori de condiţii afectaţi: dacă extensia acumulatorului (adică AH sau DX) este diferită
de 0, atunci CF şi OF sunt 1, astfel CF şi OF sunt 0. Restul flagurilor sunt nedefinite.

 Instrucţiunile DIV şi IDIV


Aceste instrucţiuni efectuează operaţia de împărţire pe întregi fără sem şi respectiv cu semn.
Pentru a creşte plaja de operare se consideră că primul operand, care în mod obligatoriu
trebuie să fie în acumulator, are o lungime dublă faţă de al doilea operand. Primul operand nu
se specifică.
Sintaxa lor este:
DIV <operand_2>
IDIV < operand_2>
Semnificaţia este:
<acumulator > <acumulator extins> / < operand _2>
<extensia acumulatorului > <acumulator extins> MOD< operand _2>
în care ambii operanzi se consideră numere fără semn
<acumulator > <acumulator extins> / < operand _2>
<extensia acumulatorului > <acumulator extins> MOD< operand _2>
în care ambii operanzi se consideră numere cu semn iar împărţirea se face cu semn.
Indicatori de condiţii afectaţi: toate flagurile sunt nedefinite

 Instrucţiunile INC şi DEC


Aceste instrucţiuni realizează incrementarea şi respectiv decrementarea cu o unitate a
operandului. Aceste instrucţiuni sunt eficiente ca lungime şi ca viteză. Ele se folosesc pentru
contorizare şi pentru parcurgerea unor şiruri prin incrementarea sau decrementarea adreselor.
Sintaxa lor este:
INC <operand_1>

80
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
DEC < operand_1>
Semnificaţia este:
< operand_1> < operand_1> + 1
< operand_1> < operand_1> - 1
Indicatori de condiţii afectaţi: AF, PF, SF, ZF, OF, (fără CF)

 Instrucţiunea NEG
Această instrucţiune realizează schimbarea semnului unui operand
Sintaxa este:
NEG <operand_1>
Semnificaţia este:
< operand_1> 0 - < operand_1>
Indicatori de condiţii afectaţi: AF,CF, PF, SF, ZF, OF, (toţi)

 Instrucţiunea CMP
Sintaxa este:
CMP <operand_1>,<operand_2>
Iar semnificaţia este execuţia unei scăderi temporare <operand_2> - <operand_1> fără a se
modifică vreun operand, dar cu poziţionarea indicatorilor de condiţii.
Indicatori de condiţii afectaţi: AF, PF, SF, ZF, OF, (toţi)

B2. Instrucţiuni logice


Aceste instrucţiuni implementează operaţiile de bază ale logicii booleene. Operaţiile
logice se efectuează la nivel de bit, adică se combină printr-o operaţie logică fiecare bit al
operandului 1 cu bitul corespunzător din operandul al doilea. Rezultatul se generează în
primul operand.
 Instrucţiunile AND, OR, NOT şi XOR
Aceste instrucţiuni implementează cele patru operaţii de bază: ŞI, SAU, Negaţie şi SAU-
Exclusiv.
Sintaxa este:
AND <operand_1>,< operand_2>
OR < operand_1>, < operand_2>
NOT < operand_1>
XOR < operand_1>,< operand_2>
Semnificaţia este:

81
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
< operand_1> < operand_1> AND < operand_2>
< operand_1> < operand_1> OR < operand_2>
Instrucţiunea realizează negarea tuturor biţilor operand 1, deci calculul complementului faţă
de 1
< operand_1> < operand_1> XOR < operand_2>
Indicatori de condiţii afectaţi:, PF, SF, ZF, CF = 0, OF = 0, AF nedefinit

Se prezintă în continuare sub formă tabelară exemple de instrucţiuni caracteristice


familiei INTEL 80X86, fiecare categorie de instrucţiuni este însoţită de specificarea explicită
a rolului funcţional şi a indicatorilor de condiţii care sunt modificaţi sau nu, în urma execuţiei.
Tab. 4.1 - Instrucţiuni de transfer. Nu setează registrul indicator de stare.
Instrucţiune Cod proc. Explicaţie
MOV AL,15 D0 00 15 AL=15 Copiază numărul 15 în registrul AL
MOV D1 01 15 BL=[15] Copiază conţinutul celulei de memorie
BL,[15] RAM cu adresa [15] în registrul BL
MOV D2 15 03 [15]=CL Copiază registrul CL în celula de
[15],CL memorie RAM cu adresa 15
MOV D3 03 00 DL=[AL] Copiază conţinutul celulei de memorie
DL,[AL] RAM a cărei adresă este conţinută în registrul AL
în registrul DL
MOV D4 03 00 [CL]=AL Copiază registrul Al în celula de
[CL],AL memorie RAM a cărei adresă este conţinută în
registrul CL

Tab. 4.2 - Instrucţiuni aritmetice şi logice. Setează registrul indicator de stare.


Instrucţiune Cod proc. Explicaţie
ADD AL,BL A0 00 01 AL=AL+BL Adună registrul AL cu registrul BL,
rezultatul fiind pus în registrul AL
SUB BL,CL A1 01 02 BL=BL-CL Scade din registrul BL registrul CL,
rezultatul fiind pus în registrul BL
MUL CL,DL A2 02 03 CL=CL*DL Înmulţeşte registrul CL cu registrul
DL, rezultatul fiind pus în registrul DL
DIV DL,AL A3 03 00 DL=DL/AL Împarte registrul DL cu registrul AL,
rezultatul fiind pus în registrul DL
MOD AL,BL A6 00 01 AL=AL mod BL Împarte registrul AL cu registrul
BL, restul împărţirii fiind pus în registrul AL
INC DL A4 03 DL=DL+1 Incrementează registrul DL
DEC AL A5 00 AL=AL-1 Decrementează registrul AL
AND AL,BL AA 00 01 AL=AL AND BL Se execută operaţia logică AND
între registrele AL şi BL, rezultatul fiind pus în
registrul AL
OR CL,BL AB 02 01 CL=CL OR BL Se execută operaţia logică OR între
82
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
registrele CL şi BL, rezultatul fiind pus în registrul
CL
XOR AL,BL AC 00 01 AL=AL XOR BL Se execută operaţia logică XOR
între registrele AL şi BL, rezultatul fiind pus în
registrul AL
NOT BL AD 01 BL = NOT BL Se execută operaţia logică NOT
pentru registrul BL, rezultatul fiind pus în registrul
BL
ROL AL 9A 00 Rotate bits left. LSB := MSB Se roteşte
conţinutul acumulatorului AL (la nivel de bit) spre
stânga
ROR BL 9B 01 Rotate bits right. MSB := LSB Se roteşte
conţinutul acumulatorului AL (la nivel de bit) spre
dreapta
SHL CL 9C 02 Shift bits left Discard MSB Se deplasează biţii
acumulatorului AL spre dreapta
SHR DL 9D 03 Shift bits right Discard LSB Se deplasează biţii
acumulatorului AL spre stânga

Tab. 4.3 - Instrucţiuni aritmetice şi logice imediate. Setează registrul indicator de stare.
Instrucţiune Cod proc. Explicaţie
ADD AL,12 B0 00 12 AL=AL+12 Adună registrul AL cu 12 rezultatul
fiind pus în registrul AL
SUB BL,15 B1 01 15 BL=BL-CL Scade din registrul BL 15, rezultatul
fiind pus în registrul BL
MUL CL,3 B2 02 03 CL=CL*3 Înmulţeşte registrul CL cu 3, rezultatul
fiind pus în registrul DL
DIV DL,2 B3 03 02 DL=DL/2 Împarte registrul DL 2, rezultatul fiind
pus în registrul DL
MOD AL,10 B6 00 10 AL=AL mod 10 Împarte registrul AL cu 10, restul
împărţirii fiind pus în registrul AL
INC DL A4 03 DL=DL+1 Incrementează registrul DL
DEC AL A5 00 AL=AL-1 Decrementează registrul AL
AND AL,0F BA 00 0F AL=AL AND 0F Se execută operaţia logică AND
între registrul AL şi 0F, rezultatul fiind pus în
registrul AL
OR CL,F0 BB 02 F0 CL=CL OR F0 Se execută operaţia logică OR între
registrul CL şi F0, rezultatul fiind pus în registrul
CL
XOR AL,AA BC 00 AA AL=AL XOR AA Se execută operaţia logică XOR
între registrul AL şi AA, rezultatul fiind pus în
registrul AL

Tab. 4.4 - Instrucţiuni de comparare. Setează registrul indicator de stare.


Instrucţiune Cod proc. Explicaţie
CMP AL,BL DA 00 01 Setează 'Z' dacă AL=BL, setează 'S' dacă AL<BL

83
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
CMP BL,13 DA 01 13 Setează 'Z' dacă BL=13, setează 'S' dacă BL<13
CMP CL,[20] DA 02 20 Setează 'Z' dacă CL=[20] – celula de memorie
RAM cu adresa 20, setează 'S' dacă CL<[20]

Tab. 4.5 - Instrucţiuni de salt. Nu setează registrul indicator de stare.


În funcţie de dimensiunea şi direcţia saltului, codul generat este diferit. Instrucţiunile de salt
modifică registrul indicator IP. Saltul maxim posibil este între 127 şi -128
Instrucţiune Cod proc. Explicaţie
JMP etichetă C0 12 Incrementează IP cu 12
C0 FE Decrementează IP cu 2 (complement faţă de 2)
JZ etichetă C1 09 Incrementează IP cu 9 dacă flag-ul Z este setat
C1 9C Decrementează IP cu 100 dacă flag-ul Z este setat
JNZ etichetă C2 04 Incrementează IP cu 4 dacă flagul Z nu este setat
C2 F0 Decrementează IP cu 16 dacă flagul Z nu este setat
JS etichetă C3 09 Incrementează IP cu 9 dacă flag-ul S este setat
C3 E1 Decrementează IP cu 31 dacă flag-ul S este setat
JNS etichetă C4 04 Incrementează IP cu 4 dacă flag-ul S nu este setat
C4 E0 Decrementează IP cu 32 dacă flag-ul S nueste setat
JO etichetă C5 09 Incrementează IP cu 9 dacă flag-ul O este setat
C5 DF Decrementează IP cu 33 dacă flag-ul O este setat
JNO C6 04 Incrementează IP cu 9 dacă flag-ul O nu este setat
AGAIN C6 FB Decrementează IP cu 33 dacă flag-ul O nu este
setat
Tab. 4.6 - Instrucţiuni pentru subrutine şi întreruperi. Nu setează registrul indicator de stare.
Instrucţiune Cod proc. Explicaţie
CALL 30 CA 30 Salvează registrul IP în stivă şi face salt la adresa
30 (alep subrutină)
RET CB Caută registrul Ip în stivă şi face salt la el (revenire
din subrutină)
INT 01 CC 01 Rulează codul de la adresa 01 şi salvează adresa de
revenire în stivă
IRET CD Termină tratarea întreruperii şi continuă de la
adresa salvată în stivă

Tab. 4.7 - Instrucţiuni de manipulare a stivei. Nu setează registrul indicator de stare.


Instrucţiune Cod proc. Explicaţie
PUSH BL E0 01 Salvează registrul BL în stivă
POP CL E1 02 Restaurează registrul CL
PUSHF EA Registrul de stare este salvat în stivă
POPF EB Restaurează registrul de stare din stivă

Tab. 4.8 - Instrucţiuni de Intrare/Ieşire. Nu setează registrul indicator de stare.


Instrucţiune Cod proc. Explicaţie

84
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
IN 0C F0 0C Citeşte data de la portul I/O 0C şi o scrie în
registrul AL
OUT 0E F1 0E Trimite conţinutul registrului AL la portul I/O 0E
Tab. 4.9 - Instrucţiuni diverse. Setează registrul indicator de stare. CLI şi STI setează fanionul I.
Instrucţiune Cod proc. Explicaţie
NOP FF Nu se execută nimic timp de un ciclu (ciclu gol)
STI FC Activează sistemul de întreruperi
CLI FD Dezactivează sistemul de întreruperi
ORG 30 Generează cod începând cu adresa 30 (pentru
subrutine)
DB “sir" Încarcă în memorie şirul de caractere “sir”
DB 0D Încarcă în memorie numărul hexazecimal 0D

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„MICROSISTEM CU MICROPROCESOR 32 BIŢI – modul Z3EV
Descriere, construcţie si funcţionare. Programarea microsistemului
folosind consola”.
Obiectivele laboratorului sunt:
 Studiul programului Monitor al modulului Z3EV
 Studierea conţinutului registrelor şi a memoriei;
 Crearea şi rularea unui program asamblare folosind consola;
 Studierea semnalelor de bază ale microprocesorului.

Test de autoevaluare
1. Care sunt etapele elaborării unui program pentru microprocesorul
8086?
2. Care este sintaxa unei instructiuni în limbaj de asamblare?
3. Care este setul de instrucţiuni al microprocesorului INTEL 80x86?
4. Enumeraţi instrucţiunile de transfer şi rolul acestora.
5. Enumeraţi instrucţiunile aritmetice şi logice şi rolul acestora.
6
Lucrare de verificare la Unitatea de învăţare 4
Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Instrucţiunile de transfer;
2. Instrucţiunile aritmetice şi logice.

85
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii
 Programele în limbaj de asamblare se scriu în mod text pentra ca
apoi sa fie traduse într-o formă binară corespunzătoare limbajului
maşină;
 Limbajul de asamblare este tradus în limbaj maşină de către
assembler;
 Limbajele de asamblare încă solicită programatorului cunoaşterea
de multe detalii hardware;
 Limbajul de asamblare împreună cu limbajul maşină formează
categoria limbajelor de nivel scăzut

Bibliografie
1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,
Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Muscă Gheorghe; Programarea în limbaj de asamblare, Editura
Teora, 1997

86
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

Unitatea de învăţare nr. 5

MICROPROCESOARELE INTEL 80x86


TEHNICI DE ADRESARE A MEMORIEI

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 5 88
5.1. Tehnici de adresare a memoriei 88
5.1.1. Aspecte generale 88
5.1.2. Moduri de adresare 89
5.2. Ciclurile de bază ale unui microprocesor 93
5.3. Moduri de operare 96
5.4. Execuţia instrucţiunilor 98
Lucrare de laborator 102
Test de autoevaluare 102
Lucrare de verificare – unitatea de învăţare nr. 5 103
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 103
Concluzii 103
Bibliografie – unitatea de învăţare nr. 5 104

87
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
OBIECTIVELE unităţii de învăţare nr. 5

Principalele obiective ale Unităţii de învăţare nr. 5 sunt:


• Cunoaşterea tehnicilor de adresare a memorie;
• Descrierea şi exemplificarea modului de aducere din
memoria principală şi de execuţie a instrucţiunilor;
• Cunoaşterea modurilor de lucru ale microprocesorului

5.1. Tehnici de adresare a memoriei


5.1.1. Aspecte generale
Din analiza formatelor de instrucţiuni, am observat că pentru a defini complet operaţia
de executat este nevoie să cunoaştem locul unde sunt amplasaţi operanzii, adică adresele lor.
În general, un operand se poate afla în registre sau în memoria de lucru.
Adresa unui registru se poate codifica pe un număr redus de biţi (uzual 3 sau 4
biţi), ce poate face parte chiar din câmpul destinat codului operaţie.
Adresa locaţiei de memorie unde se află operandul este precizată într-un câmp separat,
ce face parte din corpul instrucţiunii.
Modul în care operanzi sunt aduşi la cunoştinţa unităţii centrale, calea pe care i se
comunică adresa la care se află locat operandul căutat, se numeşte tehnică de adresare.
Există o gamă relativ importantă de moduri de adresare. În funcţie de tipul
microprocesorului, se implementează prin setul de instrucţiuni unele dintre aceste moduri de
adresare. O posibilitate de apreciere a performanţelor unui microprocesor este dată şi de
modurile de adresare ale acestuia. Cu cât gradul de sofisticare oferit de modurile de adresare
creşte, cresc şi posibilităţile şi flexibilitatea programatorului de a realiza programe mai
eficiente, compacte, performante. Totodată, intervin şi elemente subiective, legate de opţiunile
personale ale programatorului, de experienţa şi capacitatea sa de a găsi soluţia optimă pentru
implementarea unei aplicaţii date.
În continuare se vor prezenta cele mai întâlnite moduri de adresare, utilizate la diferite

88
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
tipuri de microprocesoare, însoţite de explicaţii şi exemplificări ale utilizării lor. Pentru
fiecare mod de adresare se va explica felul în care se obţine operandul unei instrucţiuni a
microprocesorului.

De reţinut !
Modurile de adresare specifică modul în care se calculează adresa
operandului aflat în memorie. Se folosesc denumirile de adresă de
segment pentru adresa de început a segmentului în care se găseşte
operandul şi adresă efectivă pentru deplasamentul operandului în cadrul
segmentului respectiv. Adresa de segment şi adresa efectivă formează
adresa fizică. Adresa de segment este furnizată de unul din registrele de
segment.

5.1.2. Moduri de adresare

Principalele moduri de adresare întâlnite la majoritatea microprocesoarelor sunt:


 Adresarea imediată
În cazul adresării imediate, operandul apare în instrucţiune, reprezentând chiar
operandul necesar pentru execuţia instrucţiunii respective. Această valoare este definită încă
din faza de scriere a programului, fiind dată de programator în corpul instrucţiunii,
reprezentând în general valori constante, fixe, ale programului. Acest mod de adresare este cel
mai simplu mod de manipulare a unei valori constante de către programator, necesitând un
timp redus de execuţie deoarece nu se accesează magistrala de date.
Adresarea imediată este utilă în compararea conţinutului unui registru cu o valoare
constantă, în vederea luării unei decizii în program, fără a mai necesita utilizarea de memorie
RAM suplimentară. Principala limitare a acestui mod de adresare este dată de faptul că,
valoarea operandului, fiind conţinută în corpul instrucţiunii, este fixă pentru un program dat,
şi nu mai poate fi modificată în cursul rulării acestuia
Exemple:
LD A,55h ; instrucţiunea încarcă registrul A cu valoarea 55h.
AND 8Eh ; instrucţiunea execută operaţia logică AND între registrul A şi numărul
8Eh.
ADD BX, 2 ; adună 2 la BX.

89
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
 Adresarea registru
Adresarea registru se caracterizează prin faptul că operandul (operanzii) sunt conţinuţi
în registrele de uz general ale microprocesorului.
Deoarece numărul de registre de uz general ale unui microprocesor este relativ redus,
registrul (registrele) care alcătuiesc operanzii instrucţiunii sunt conţinute chiar în corpul
instrucţiunii. Aceasta permite ca instrucţiunea să fie scurtă şi să se execute foarte rapid
(datorită vitezei de execuţie sporite, la accesarea registrelor interne ale microprocesorului).
Din acest moti, registrele sunt cel mai bun loc de plasare al variabilelor cel mai des utilizate
Exemple:
MOV AX, BX ;copiază conţinutul registrului BX în registrul AX
MOV DL, AL ;copiază conţinutul registrului AL în registrul DL

 Moduri de adresare pentru date aflate sau care doresc să fie plasate în memorie
Există în principal trei moduri de adresare pentru accesarea datelor în memorie:
adresarea directă, adresarea indirectă şi adresarea indexată.
Modurile de adresare reprezintă, în acest caz, diferite modalităţi de a specifica adresa
datei mai precis a ofsetului acesteia.
Ofsetul sau deplasamentul reprezintă distanţa în octeţi de la începutul unui segment
până la locaţia de memorie în care este conţinută data.
Ofsetul datei din memorie va fi calculat de unitatea de execuţie pe baza modului de
adresare specificat în instrucţiune, iar rezultatul se numeşte adresa efectivă
De menţionat că datele se pot afla sau se doresc a fi plasate în memorie, în segmente de
date (Data Segment) sau stivă (Stack Segment)
Adresa de bază a segmentului de date este conţinută în registrul DS, iar cea a
segmentului de stivă curent este conţinută în registrul SS.

 Adresarea directă
În acest mod de adresare, ofsetul date este specificat direct în instrucţiune printr-o
valoare numerică sau printr-un nume simbolic.
Exemple:
MOV BL, [50h] ; conţinutul locaţiei de memorie având ofsetul 50h este
; încărcat în registrul BL (Fig.5.1)

Este mai comod ca ofsetul să se specifice printr-un nume simbolic, reprezentând numele
unei variabile simple (Fig.5.2)

90
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
MOV var, BL ; conţinutul registrului BL este copiat în locaţia de memorie al
; cărei ofset este specificat prin variabila ‘‘var’’

DS

ofset

[50h] BL

Fig.5.1. Reprezentarea grafică a modului de execuţie a instrucţiuni MOV BL, [50h]

DS

ofset

var BL

Fig.5.2. Reprezentarea grafică a modului de execuţie a instrucţiuni MOV var, BL

Variabilele pot desemna date reprezentate în memorie pe unul sau mai mulţi octeţi, după cum
sunt declarate. Se consideră un exemplu în care variabila este de tip cuvânt (doi octeţi)
(Fig.5.3).
MOV var, BX ; conţinutul registrului BX este copiat în memorie în două locaţii
; începânt cu ofsetul dat de variabila ‘‘var’’

DS

ofset

var BL

Fig.5.3. Reprezentarea grafică a modului de execuţie a instrucţiuni MOV var, BX


91
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

 Adresarea indirectă (prin registru)


În acest caz, ofsetul datei este conţinut într-un registru (Fig.5.4).
Exemplu:
MOV [BX], AX ; registru AX este încărcat în conţinutul unei locaţii de
; memorie, al cărei deplasamenteste dat de registrul BX

DS

ofset

[BX] AX

Fig.5.4. Reprezentarea grafică a modului de execuţie a instrucţiuni MOV [BX], AX

 Adresarea indexată
Ofsetul operandului se obţine adunând conţinutul unui registru index (SI sau DI) un cu
deplasament constant. Deplasamentul este specificat fie printr-o constantă, fie printr-un
simbol. Acest mod de adresare este util la accesarea elementelor unei tabele.
În exemplul următor, conţinutul registrului AL este încărcat la locaţia de memorie al
cărui ofset este dat de suma dintre deplasamentul depl şi conţinutul registrului index SI
(Fig.5.5).

DS

depl

[SI] AL
ofset=depl + [SI]

Fig.5.5. Reprezentarea grafică a modului de execuţie a instrucţiuni MOV [BX], AX

92
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

De reţinut !
Procedeele prin care se realizează în mod concret calculul adreselor
(pentru instrucţiuni, respectiv operanzi) sunt cunoscute sub numele
generic de moduri de adresare.
În vederea prezentării modurilor de adresare se va face apel la noţiunile
de adresă de segment (AS), desemnând adresa de început a segmentului
în care se găseşte operandul, respectiv de adresă efectivă (AE),
specificând deplasamentul operandului în cadrul segmentului ce îl
conţine. Pe baza AS şi AE se constituie adresa fizică (AF),
Modurile de adresare întâlnite la majoritatea microprocesoarelor sunt:
 Adresarea imediată;
 Adresarea registru;
 Adresarea direct;
 Adresarea indirectă (prin registru);
 Adresarea indexată.

5.2. Ciclurile de bază ale unui microprocesor


Microprocesorul este din punct de vedere al modulului de eşalonare în timp a
activităţilor sale, un dispozitiv sincron: toate operaţiile sale interne şi externe se întâmplă
sincron cu fronturile semnalului de tact. Semnalul de tact este un semnal electric
dreptunghiular generat extern, care este folosit pentru sincronizarea proceselor din sistem.
Entitatea care însumează toate activităţile care se desfăşoară în timpul unei
perioade a semnalului de ceas (tact) se numeşte ciclu de tact.
Entitatea care reuneşte toate activităţile care se desfăşoară pe parcursul
execuţiei unei instrucţiuni a cărui cod este locat în memorie, se numeşte
ciclu instrucţiune.
De exemplu cea mai simplă instrucţiune pentru microprocesorul 8086 - SCF - durează 4
perioade ale semnalului de tact, iar cea mai complexă - 23 de perioade ale semnalului de tact.
Practic fiecare instrucţiune este descompusă în operaţii simple (primare) executabile pe
perioada unei perioade a semnalului de tact.
În timp ce durata unui ciclu instrucţiune variază de la o clasă la alta, durata ciclului de
tact este unică pentru un microcalculator dat, perioada T a semnalului de tact fiind unitatea de

93
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
măsură a timpului elementar consumat de procesor.
Analizând modul de execuţie al celei de-a doua instrucţiuni ( SET 0 (IX+59H) ), se
poate observa că cei 23 tacţi se compun din mai multe activităţi care pot fi grupate astfel:
 se efectuează 4 citiri din memorie pentru citirea instrucţiunii (este o instrucţiune pe 4
octeţi);
 se efectuează o citire din memorie de la adresa IX+59H;
 se rescrie la această adresă, octetul în care deja b 0 = 0
Se observă că pentru a efectua instrucţiunea analizată microprocesorul va realiza 6
accese la memorie, din care 5 sunt de tip citire, iar unul de scriere.
Pentru a conferi un plus de modularitate şi flexibilitate în execuţia instrucţiunilor, precum
şi pentru a uşura implementarea hardware-ului din chip, ciclul instrucţiune a fost subdivizat în
câteva tipuri de activităţi procesor intermediare.
Suma activităţilor procesor care rezolvă o activitate intermediară bine
definită, având o finalitate clară, în cursul execuţiei unei instrucţiuni, se
numeşte ciclu maşină.
Principalele cicluri maşină sunt:
 citirea şi decodificarea codului instrucţiune (fetch) – o instrucţiune constă dintr-o
succesiune de octeţi (1-4 pentru microprocesorul 8086), din care unul reprezintă
obligatoriu codul instrucţiune. Abia după citirea şi decodificarea acestui cod,
microprocesorul va şti ce are de făcut pentru a executa instrucţiunea.
 citirea unui octet de date (memory read) – datele numerice care apar în câmpul unei
instrucţiuni se citesc din memorie şi se depun într-unul din registre interni ai
microprocesorului. Operaţia fiind mai simplă şi deci mai scurtă în timp, decât cea
precedentă, a dus la realizarea a două tipuri de ciclu maşină de citire din memorie
 ciclul de citite a codului operaţiei (fetch)
 ciclul de citire a datelor numerice (read)
 scrierea unui octet în memorie (memory write) – ciclul maşină care rezolvă operaţia se
numeşte ciclu maşină de scriere în memorie: write.
Folosind aceste trei cicluri maşină marea majoritate a instrucţiunilor unui microprocesor
pot fi implementate. În funcţie de microprocesor există şi alte tipuri de cicluri maşină.
Sintetizăm funcţionarea microprocesorului astfel:
 instrucţiunile se execută în cicluri de instrucţiune (IC);
 ciclurile instrucţiune sunt constituite dintr-un număr întreg de cicluri maşină (MC);
 ciclurile maşină sunt constituite dintr-un număr întreg de cicluri de tact (CC).

94
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
Ştiind durata reală a unul tact microprocesor se poate determina timpul necesar
execuţiei fiecărei instrucţiuni. Aceşti timpi de execuţie sunt daţi în documentaţia de firmă a
microprocesorului.
Ştiind timpul de execuţie al oricărei instrucţiuni se poate determina cu precizie timpul
necesar execuţiei unui program sau a unui modul din el. Pentru comanda unui proces real
acest lucru este esenţial.
Pentru comanda unui proces real se impune respectarea timpilor de lucru impuşi de
proces. Deci anumite module din program vor trebui optimizate pentru a se încadra în aceste
limite din punct de vedere al timpului de execuţie al instrucţiunilor componente.

De reţinut !
 Ciclul instrucţiune: Secvenţa de operaţii necesare pentru adresarea,
aducerea şi execuţia unei instrucţiuni.
 Un ciclu instrucţiune conţine mai multe cicluri maşină
 Ciclul maşină: intervalul de timp necesar pentru terminarea unei
operaţii intermediare: citire memorie, scriere memorie, citire IO,
scriere IO
 Ciclul de fetch instrucţiune = primul ciclu maşină al oricărui ciclu
instrucţiune
 De obicei un ciclu maşină implică un transfer al procesorului cu
exteriorul.
 Un ciclu maşină conţine mai multe stări UCP.
 Stare (timp de ciclu al UCP)
 Este timpul UCP (tUCP) necesar pentru executarea unei operaţii
elementare şi bine definite (este inversul frecvenţei la care lucrează
procesorul)
 O operaţie elementară (micro-operaţie) se referă de obicei la un
transfer între două registre
 Starea este unitatea de timp de bază pentru măsurarea duratei
activităţilor UCP

95
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

5.3. Moduri de operare


Arhitectura Intel suportă trei moduri de operare:
 protejat;
 adresă reală;
 gestiune sistem.
Modul de operare determină ce instrucţiuni şi caracteristici de lucru sunt disponibile precum
şi modelele de memorie disponibile.
 Modul protejat (Protected Virtual Address Mode - mod adresă virtuală protejată) este
modul în care toate instrucţiunile şi caracteristicile de prelucrare sunt disponibile,
permiţând obţinerea performanţelor maxime. Modul protejat prezintă un mecanism
sofisticat pentru protejarea datelor, integritatea sistemului, concurenţa taskurilor şi
gestiunea memoriei incluzând şi cea a memoriei virtuale. În modul protejat, în cazul
microprocesorului 80286, spaţiul adreselor fizice este mărit de la 1 Moctet la 16 Mocteţi,
în timp ce spaţiul adreselor virtuale a fost mărit la 1 Goctet. În acest mod, programele
folosesc adrese virtuale, translatarea lor în adrese fizice făcându-se automat pe baza unor
tabele cu descriptori de segmente. Acest mecanism permite implementarea eficientă a
sistemelor cu memorie virtuală în care utilizatorul vede memoria internă şi cea externă ca o
singură memorie. Modul protejat permite implementarea sistemelor multitasking, oferind
câte un segment de stare ataşat fiecărui task, care sunt structuri manevrate hardware şi
conţin stările curente (incluzând toţi regiştrii) ale taskurilor. Selectoarele acestor segmente
de stare identifică unic taskul ataşat. De asemenea, este facilitată şi comutarea taskurilor,
care poate fi invocată printr-o singură instrucţiune. Fiecare task din sistem poate avea
propriul lui spaţiu de adrese logice, existând de asemenea un mecanism evoluat pentru
comunicarea între taskuri, sincronizarea lor, partajarea memoriei etc.

 Modul real (Real Address Mode – mod adresă real) este cel în care se intră după
iniţializarea microprocesorului. De regulă, sub sistemul de operare DOS microprocesorul
se află în modul real. Specific acestui mod de funcţionare este faptul că microprocesorul nu
poate rula decât un singur program odată. Există posibilitatea rulării programelor sub
sistemul de operare DOS şi în alte moduri ale microprocesorului, dar acest lucru necesită
extensii ale sistemului de operare (existând în acest sens programe specifice).

 Modul gestiune sistem (system management) reprezintă o caracteristică unică a


procesoarelor Intel, începând cu I386SL.Acest mod asigură sistemului de operare o

96
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
modalitate transparentă de a implementa funcţii specifice platformei de calcul, cum ar fi
gestiunea puterii consumate (power management – gestionarea puterii) sau securitatea
sistemului. Trecerea în acest mod se face sub controlul unui semnal extern, printr-o cerere
de întrerupere externă dedicată. La comutarea în acest mod procesorul comută pe un spaţiu
de adrese separat numit SMRAM (System Management RAM) similar modelului adresă
reală. În acelaşi timp ce salvează întregul context al programului care rulează sau al task-
ului curent. Codul specific acestui mod poate fi apoi executat în mod transparent. La
revenirea din acest mod procesorul îşi restaurează contextul avut înainte de intrarea în
acest mod.
De reţinut !
Microprocesoarele de tip INTEL, începând cu microprocesorul de tip
80386 au patru moduri de funcţionare de bază: modul real, modul
virtual, modul protejat şi modul nativ.
 Modul real este un mod uniproces, în care se execută un singur proces
(program sau task) la un moment dat (acest mod se întâlneş începând
de la 8086).
 Modul virtual care permite execuţia mai eficientă a programelor scrise
pentru procesoarele 8086 şi 8088 pe noul procesor de 32 de biţi.
Magistrala externă de adrese a fost extinsă la 32 de biţi, spaţiul
adreselor fizice fiind astfel de 4 GB. Spaţiul adreselor virtuale este de
64 TB. Dimensiunea fiecărui segment nu mai este limitată la 64 KB,
dimensiunea maximă a unui segment fiind de 4 GB (începând de la
80386).
 Modul protejat este modul care utilizează conţinutul registrelor de
segment ca selectori sau pointeri în tabele ale descriptorilor de
segment. Descriptorii furnizează adrese de bază de 24 de biţi,
permiţând adresarea unei memorii fizice de până la 16 MB.
Procesorul dispune de o unitate de gestiune a memoriei virtuale, cu
care poate translata adrese pentru o memorie virtuală de 1 GB în
spaţiul adreselor fizice de 16 MB (începând de la 80286).
 Modul nativ foloseşte întreaga putere a microprocesorului. Memoria
virtuală permite ca dimensiunea unui program să fie limitată de
spaţiul pe disc şi nu de dimensiunea memoriei interne. Mecanismele
de protecţie sunt destul de puternice pentru a evita accidentele între
taskuri sau între utilizatori (începând de la 80386).
97
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

5.4. Execuţia instrucţiunilor


Pentru a pune în evidenţă o parte din problemele proiectării unei unităţi centrale
eficiente vom considera 4 instrucţiuni 80x86 reprezentative: MOV, ADD, LOOP şi JNZ
(Jump on Not Zero). Pentru că MOV şi ADD au fost prezentate anterior ne vom concentra
asupra noilor instrucţiuni LOOP şi JNZ. Ambele instrucţiuni sunt instrucţiuni de salt
condiţionat.
 JNZ testează starea indicatorului de condiţie Zero din EEFLAGS sau din PSW. Se
execută saltul dacă indicatorul de condiţii respectiv este 0 sau instrucţiunea următoare
dacă indicatorul de condiţii este 1. Programul specifică instrucţiunea de destinaţie a
saltului prin "distanţa" dintre instrucţiunea JNZ şi destinaţie, exprimată ca un întreg
cu semn.
 LOOP decrementează valoarea registrului ECX şi transferă controlul unei instrucţiuni
ţintă (destinaţie), tot în domeniul -128 ..+127 faţă de instrucţiunea LOOP, dacă după
decrementare ECX este diferit de zero.
Instrucţiunile 80x86 nu se execută într-un singur ciclu de ceas al procesorului.

Exemple:
A. instrucţiunea MOV, care este relativ simplă, ar presupune următorii paşi de execuţie:
- preia octetul cu codul instrucţiunii ( fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octetv;
- decodifică instrucţiunea pentru a vedea ce face;
- dacă e necesar, preia (fetch) operand de 16 biţi din memorie;
- dacă e necesar, actualizează EIP pentru a indica dincolo de operand;
- dacă e necesar, calculează adresa operandului (de exemplu EBX+deplasament);
- preia (fetch) operandul;
- memorează valoarea preluată într-un registru.
Dacă alocăm câte un ciclu de ceas pentru fiecare din paşii de mai sus, o instrucţiune poate
dura de la 5 până la 8 cicluri de ceas (trei din paşii de mai sus sunt opţionali depinzând de
modul de adresare al operanzilor).
B. instrucţiunea ADD este mai complexă ea presupunând următorii paşi (se presupune un
ADD reg, reg):
- preia octetul cu codul instrucţiunii ( fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octet;

98
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
- decodifică instrucţiunea;
- ia valoarea operandului sursă (registru) şi o trimite la ALU;
- ia valoarea operandului destinaţie (registru) şi o trimite la ALU;
- comandă ALU pentru adunare;
- memorează rezultatul înapoi în primul operand (registru) ;
- actualizează indicatorii de condiţie conform rezultatului operaţiei de adunare.
Unitatea aritmetică şi logică (Arithmetic Logic Unit - ALU) este o componentă esenţială
a oricărui CPU, la nivelul ei executându-se toate operaţiile aritmetice şi logice.
Dacă operandul sursă este în memorie (ADD reg, mem), secvenţa este mai complicată:
- preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octet;
- decodifică instrucţiunea;
- dacă e necesar, preia un deplasament pentru a-l utiliza în calculul adresei efective;
- dacă e necesar, actualizează EIP pentru a indica dincolo de valoarea deplasamentului;
- ia valoarea operandului sursă din memorie şi o trimite la ALU;
- ia valoarea operandului destinaţie (registru) şi o trimite la ALU;
- comandă ALU pentru adunare;
- memorează rezultatul înapoi în primul operand (registru) ;
- actualizează indicatorii de condiţie conform rezultatului operaţiei de adunare.

Cea mai complicată secvenţă avem când sursa este o constantă (ADD mem, const):
- preia octetul cu codul instrucţiunii ( fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octet;
- decodifică instrucţiunea;
- dacă e necesar, preia un deplasament pentru a-l utiliza în calculul adresei efective;
- dacă e necesar, actualizează EIP pentru a indica dincolo de valoarea deplasamentului;
- preia valoarea constantă din memorie şi o trimite la ALU;
- actualizează EIP pentru a indica în memorie dincolo de valoarea constantei;
- ia valoarea operandului destinaţie din memorie şi o trimite la ALU;
- comandă ALU pentru adunare;
- memorează rezultatul înapoi în primul operand (memorie);
- actualizează indicatorii de condiţie conform rezultatului operaţiei de adunare.
De menţionat că sunt şi alte forme ale instrucţiunii ADD cu secvenţele lor de faze, dar
cele prezentate sunt cele mai semnificative. Aşa cum se vede din exemple pot fi necesare până
la 11 faze pentru finalizarea instrucţiunii. Aici este şi avantajul conceptului RISC, marea

99
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
majoritate a procesoarelor RISC având una sau două forme de ADD (registru-registru şi
poate constantă - registru). De asemenea se vede că din punct de vedere al timpului de
execuţie varianta ADD reg, reg este cea mai avantajoasă.

C. instrucţiunea JNZ ar presupune următoarea secvenţă de faze:


- preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octet;
- decodifică instrucţiunea;
- preia octetul de deplasament pentru a determina distanţa de salt şi-l trimite la ALU;
- actualizează EIP pentru a indica următorul octet;
- testează flagul Zero pentru a vedea dacă este 0;
- dacă Zero = 0, atunci trimite EIP la ALU;
- dacă Zero = 0, comandă ALU să adune deplasamentul cu EIP;
- dacă Zero = 0, copiază rezultatul adunării înapoi în EIP.
Se observă că instrucţiunea JNZ necesită mai puţini paşi atunci când condiţia de salt
nu este îndeplinită. Aceasta este tipic pentru toate instrucţiunile de salt condiţionat.
Dacă fiecare pas va corespunde unui ciclu de ceas, un JNZ va dura între 6 şi 9 cicluri
de ceas, funcţie de efectuarea sau nu a saltului propriu-zis. Pentru că JNZ nu permite tipuri
diferite de operanzi există o singură secvenţă de paşi (spre deosebire de ADD).

D. instrucţiunea LOOP poate folosi o secvenţă cum ar fi:


- preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
- actualizează EIP pentru a indica următorul octet;
- decodifică instrucţiunea;
- preia valoarea lui ECX şi o trimite la ALU;
- comandă ALU să decrementeze această valoare (ECX) ;
- trimite rezultatul înapoi în ECX şi setează un flag special dacă valoarea nu e 0;
- preia octetul de deplasament pentru a determina distanţa de salt şi-l trimite la ALU;
- actualizează EIP pentru a indica următorul octet;
- testează flagul special pentru a vedea dacă ECX a fost diferit de zero;
- dacă flagul este setat, trimite (copiază) EIP la ALU;
- dacă flagul este setat, comandă ALU să adune deplasamentul cu EIP;
- dacă flagul este setat, copiază rezultatul adunării înapoi în registrul EIP.
Deşi un anume procesor 80x86 poate să nu execute paşii concreţi menţionaţi mai sus,
toate instrucţiunile presupun executarea unei anume secvenţe de operaţii.

100
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei
Fiecare operaţie necesită un anumit timp pentru execuţie, în general un ciclu de ceas
per operaţie sau fază cum vom mai numi paşii de mai sus. Este evident că, odată cu numărul
de paşi, creşte şi timpul de execuţie al instrucţiunii. Acesta este motivul pentru care, în
general, instrucţiunile complexe se execută mai lent decât instrucţiunile simple.

De reţinut !
Din cele prezentate rezultă că execuţia unei instrucţiuni cuprinde
următoarele operaţii de bază:
 extragere cod operaţie – transferul din memoria de program în
registrul de instrucţiuni al primului cuvânt din codul maşină al
instrucţiunii, cuvânt care conţine codul operaţiei de executat prin
instrucţiune;
 decodificare – analiza cuvântului cod operaţie cu circuitele pentru
decodificarea instrucţiunilor şi transferul rezultatului decodificării la
unităţii de control şi sincronizare;
 transfer operanzi - transferul operanzilor între componentele SMPU
(memorie de program, memorie de date, registre, porturi de I/E) în
scopul execuţiei instrucţiunii;
 execuţie – execuţia operaţiei aritmetice, logice sau de transfer
precizată de codul operaţie al instrucţiunii.
Instrucţiunile 80x86 nu se execută într-un singur ciclu de ceas al
procesorului.
Execuţia unei instrucţiuni începe cu extragere cod operaţie şi
decodificare, continuând cu o secvenţă specifică de operaţii de bază
de transfer operanzi execuţie. Astfel este necesară funcţionarea
secvenţială şi sincronizată a microprocesorului, care se obţine prin
comanda componentelor sale de către unitatea de control şi
sincronizare. Viteza de execuţie a instrucţiunilor este funcţie de
frecvenţa semnalului de tact a microprocesorului. În general o
operaţie de bază se efectuează în 3 – 12 perioade ale semnalului de
tact. Intervalul corespunzător efectuării unei operaţii de bază se
numeşte ciclu maşină al sistemului. Ciclurile maşină corespunzătoare
unei instrucţiuni definesc un ciclu de instrucţiune.

101
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„PROGRAMAREA ÎN LIMBAJ DE ASAMBLARE FOLOSIND
SIMULATORUL SMS32: accesul la memorie.
Obiectivele laboratorului sunt:
 Studiul memoriei simulatorului;
 Tehnici de adresare;
 Instrucţiuni de comparare;
 Instrucţiuni de salt

Test de autoevaluare
1. În ce constă adresarea imediată?
2. În ce constă adresarea registru?
3. În ce constă adresarea directă?
4. În ce constă adresarea indirectă (prin registru) ?
5. În ce constă adresarea indexată?
6. Definiţi ciclul instrucţiune, ciclul maţină, starea.
7. În ce constă modul de funcţionare real?
8. În ce constă modul de funcţionare virtual?
9. În ce constă modul de funcţionare protejat?
10. În ce constă modul de funcţionare nativ?
11. Care sunt paşi de execuţie pentru instrucţiunea MOV?
12. Care sunt paşi de execuţie pentru instrucţiunea ADD?
13. Care sunt paşi de execuţie pentru instrucţiunea LOOP?
14. Care sunt paşi de execuţie pentru instrucţiunea JNZ?

102
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

Lucrare de verificare la Unitatea de învăţare 5


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Tehnici de adresare a memoriei;
2. Ciclurile de bază ale unui microprocesor;
3. Moduri de operare;
4. Execuţia instrucţiunilor: MOV şi ADD;
5. Execuţia instrucţiunilor: LOOP şi JNZ.

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii
Execuţia unei instrucţiuni presupune următoarele etape: extragerea
instrucţiunii, decodificarea, extragerea operanzilor, execuţia operaţiei
şi salvarea rezultatului. În timpul execuţiei instrucţiunii
microprocesorul comunică cu celelalte componente ale sistemului
(memorie, interfeţe de intrare/ieşire) prin intermediul magistralei.
Pe magistrală se transferă instrucţiuni şi date, care se pastrează în
locaţii de memorie şi porturi de intrare/ieşire. Pentru vehicularea
informaţiilor se utilizează semnale de adresa şi semnale de comandă.
Transferul de informaţii între procesor şi celelalte componente cuplate
prin intermediul magistralei se realizează prin cicluri maşină. Un ciclu
maşină poate sa dureze un numar variabil de perioade de ceas. Pe
durata unui ciclu maşină se transfeă o singură dată (octet, cuvânt sau
dublu-cuvânt) a carei sursă sau destinaţie se află la adresa specificată
prin semnalele de adresă şi de comandă.

103
SISTEME CU MICROPROCESOARE
5. Microprocesoarele INTEL 80x86: tehnici de adresare a memoriei

Bibliografie

1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,


Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Rotar Dan; Arhitectura sistemelor de calcul, Editura ALMA
MATER, 1997

104
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

Unitatea de învăţare nr. 6

MICROPROCESOARELE INTEL 80x86


LUCRUL CU STIVE ŞI SUBRUTINE

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 6 106
6.1. Lucrul cu stiva 106
6.1.1. Aspecte generale 106
6.1.2. Instrucţiuni pentru lucru cu stiva 109
6.2. Lucrul cu subrutine 111
6.2.1. Aspecte generale 111
6.2.2. Instrucţiuni pentru lucru cu subrutine 112
6.2. 3. Transferul de parametri între program şi subrutine 116
Lucrare de laborator 116
Test de autoevaluare 117
Lucrare de verificare – unitatea de învăţare nr. 6 117
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 117
Concluzii 117
Bibliografie – unitatea de învăţare nr. 6 118

105
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
OBIECTIVELE unităţii de învăţare nr. 6

Principalele obiective ale Unităţii de învăţare nr. 6 sunt:


• Cunoaşterea structurii, rolului şi a instrucţiunilor pentru
lucrul cu stiva
• Cunoaşterea rolului şi a instrucţiunilor pentru lucrul cu
subrutinele

6.1. Lucrul cu stiva


6.1.1. Aspecte generale

Stiva este o zonă de memorie liniară, formată din locaţii de memorie amplasate la
adrese consecutive, cu acces pe la un singur capăt (top of stack – vârful stivei), prin
intermediul registrului SP (Stack Pointer – indicator al vârfului stivei). Deoarece funcţionarea
stivei implică atât operaţii de citire (extragere), cât şi de scriere (depunere) în stivă, stiva
trebuie organizată într-o zonă de memorie de tip RAM (Fig. 6.1).

Vârful iniţial al stivei (stiva goală)

Stiva creşte
Sensul crescător al
adreselor
SP – Vârful curent al stivei

Memorie RAM

Fig.6.1. Stiva microprocesorului

Rolul stivei este acela de a furniza o cale comodă de a stoca temporar informaţii (date
sau adrese) în memorie fără a reţine pentru fiecare, adresa exactă la care sunt stocate. Ceea ce
trebuie reţinut este doar ordinea în care informaţiile sunt stocate, deoarece ele vor fi extrase
din stivă în ordinea inversă celei în care au fost depuse.
Practic putem considera stiva ca un grup de registre organizaţi într-o structura LIFO
(Last In First Out - Ultimul Intrat Primul Ieşit). Deci dacă adăugăm o înregistrare în stivă
106
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
aceasta se va adăuga peste precedentele. Pentru a extrage o anumită înregistrare din stivă
trebuie extrase mai întâi toate înregistrările depuse după aceasta şi deci care se află deasupra
acesteia (Fig. 6.2).

C000h SP=C000h C000h


BFFFh BFFFh
BFFEh BFFEh SP=BFFEh
BFFDh BFFDh
BFFCh Depunere în stivă BFFCh
BFFBh BFFBh

Extragere din stivă Depunere în stivă

C000h C000h
BFFFh BFFFh
BFFEh SP=BFFEh BFFEh
BFFDh BFFDh
BFFCh BFFCh SP=BFFCh
BFFBh Extragere din stivă BFFBh

Fig.6.2. Depunerea şi extragerea din stivă

Registrul SP conţine întotdeauna adresa de început (vârful stivei). La fiecare depunere


în stivă valoarea registrului SP este incrementată pentru a corespunde acestei noi înregistrări.
Stiva este o zonă de memorie, care poate fi definită folosind aceleaşi directive de
asamblare ca şi în cazul altor variabile, cu o singură menţiune: dacă pentru variabilele
obişnuite se marchează printr-o etichetă adresa de început a zonei de memorie rezervate
(adresa mai mică), pentru stivă se marchează adresa de după cea a ultimei locaţii rezervate,
care va constitui vârful stivei şi va iniţializa registrul SP. Motivul îl constituie faptul că stiva
creşte în sensul descrescător al adreselor.

De ce sunt necesare stivele ?


Stivele sunt strict necesare în lucrul cu subrutine (proceduri şi funcţii), când trebuie eliberate
registrele interne în vederea apelării unei subrutine care va încărca registrele cu propriile sale
date. Conţinutul registrelor este însă necesar la revenirea din subrutină. De aceea eliberarea
registrelor se face prin salvarea lor în stivă, într-o anumită ordine şi refacerea lor din stivă la
revenirea din subrutină în programul apelant.

107
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

De reţinut !
 Stivele sunt formate în memoria RAM şi sunt adresabile cu registrul
segment SS si registrul pointer SP. Registrul SS conţine adresa de
bază a stivei iar SP conţine adresa relativă (deplasamentul sau offset-
ul) faţă de bază, a vârfului stivei.
 Un program poate utiliza mai multe stive, fiecare cu lungimea
maximă de 64 KB. Stivele au locaţii de 16 biţi şi funcţionează ca liste
LIFO (Last In First Out), adică ultimul operand introdus în stivă este
primul care poate fi extras.
 Un cuvânt este salvat în stivă la adresa relativă (SP-2); citirea din
stivă se face prin copiere de la adresa (SP), după care se face
actualizarea registrului pointer SP: (SP+2). Locaţiile din stivă sunt de
16 biţi şi ca urmare operanzii care se introduc şi se extrag în/din stivă
sunt cuvinte de 16 biţi iar adresele a două locaţii consecutive diferă
prin 2 ( în fiecare locaţie sunt doi octeţi).
 Se pot introduce în stivă operanzi de 16 biţi din registre cu excepţia
lui CS şi operanzi de 16 biţi din memorie. Extragerea din stivă se face
prin copiere într-un registru de 16 biţi, cu excepţia lui CS, sau în
memorie.
 Salvarea în stivă se face cu instrucţiunea PUSH iar extragerea din
stivă cu POP. Decrementarea registrului SP la introducere şi
incrementarea sa la scoatere se fac automat. Programatorul trebuie să
fixeze doar baza stivei în SS şi limita superioară a stivei, în SP. Toate
operaţiile cu stiva se realizează apoi foarte simplu, prin instrucţiunile
PUSH si POP. Adresele la care se fac transferurile se calculează
automat şi nu prezintă nici un interes. Tot ceea ce contează este
ordinea în care se face introducerea în stivă, deoarece la extragere
aceasta se inversează.

108
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

6.1.2. Instrucţiuni pentru lucru cu stiva


 Instrucţiunea PUSH (Push Data – Salvează date în stivă)
Sintaxa instrucţiunii este:
PUSH <operand_2>
în care operand 2 (sursa) este un operand pe 16 biţi (registru general de 16 biţi, registru de
segment sau locaţie de memorie), iar semnificaţia este ‘‘copiază operand 2 în vârful
stivei’’. Concret execuţia instrucţiunii se face după secvenţa:
(SP) (SP) – 2
SS :((SP) + 1 : (SP)) operand 2
ceea ce înseamnă că se decremntează SP cu 2 şi în octeţii de la adresele (SP) + 1 şi (SP)
din segmentul de stivă se copiază operandul 2 (sursa).
Copierea respectă regula de memorare a cantităţilor pe mai mulţi octeţi şi anume partea
mai puţin semnificativă (partea low) se memorează la adrese mici.
O exprimare detailată a instrucţiunii este:
(SP) (SP) – 2
SS : ((SP) + 1) high (operand 2)
SS : ((SP)) low (operand 2)
Exemple:
PUSH BX
PUSH ES
PUSH [BX]
PUSH [BX+8]

 Instrucţiunea POP (Pop Data – Refă date din stivă)


Sintaxa instrucţiunii este:
POP <operand_1>
în care operand 1 (destinaţia) este un operand pe 16 biţi (registru general de 16 biţi,
registru de segment sau locaţie de memorie), iar semnificaţia este ‘‘copiază conţinutul
vârfului stivei în operand 1’’. Registrul CS nu poate apare ca destinaţie. Concret execuţia
instrucţiunii se face după secvenţa:
operand 1 SS : ((SP) + 1 : (SP))
(SP) (SP) + 2
ceea ce înseamnă că se transferă octeţii de la adresele (SP) + 1 şi (SP) din segmentul de
stivă în operandul 1 (destinaţie) şi apoi se incrementează SP cu 2.

109
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
O exprimare detailată a instrucţiunii este:
high (operand 1) SS : ((SP) + 1)
low (operand 1) SS : ((SP))
(SP) (SP) + 2
Exemple:
POP BX
POP ES
POP ES: [DI]
POP [BP + 5]

Din analiza instrucţiunilor PUSH şi POP reiese că o secvenţă de refaceri ale unor cantităţi
salvate în stivă ( de exemplu conţinutul unor registre) trebuie scrisă în ordine inversă.
Exemplu:
Secvenţa de salvare este
PUSH AX
PUSH BX
PUSH CX
Secvenţa de refacere trebuie să fie
POP CX
POP BX
POP AX
Dacă registrele de mai sus conţin valorile AX = 2345h, BX = 6789h, CX = ABCDh, iar
registrul SP conţine înainte de salvări valoarea 1122h, atunci imaginea stivei va fi (Fig. 6.3).

1116 AB SP după PUSH CX


CD
1118 67 SP după PUSH BX
89
1120 23 SP după PUSH AX
45
1122 SP inţial

Fig.6.3. Utilizarea instrucţiuni PUSH

110
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

De reţinut !
 La operaţiile cu stiva trebuie avut grije ca o secvenţă de refacere să
aducă indicatorul SP la valoarea de dinainte de secvenţa de salvare.
Acest lucru impune ca numărul operaţiilor POP să coincidă cu cel al
operaţiilor PUSH
 Nu este indicat să se modifice explicit locaţiile aflate în josul stivei,
adică la valori mai mari sau egale decât valoarea curentă a registrului
SP. În aceste locaţii se pot afla informaţii a căror alterare ar putea
afecta execuţia programului.
 PUSCH şi POP se mai pot folosi la transferul indirect al unor registre:
PUSH DS
POP ES
copiază conţimutul registrului DS în ES, lăsând indicatorul SP
neschimbat.

6.2. Lucrul cu subrutine


6.2.1. Aspecte generale
Setul de instrucţiuni al microprocesoarelor poate conţine şi instrucţiuni pentru lucrul cu
subrutine.
Lucrul cu subrutine s-a dezvoltat din necesitatea de a utiliza într-un program aceeaşi
secvenţă de instrucţiuni în mod repetat. Pentru evitarea unei astfel de repetiţii secvenţa de
instrucţiuni este tratată ca o parte distinctă a programului la care se face salt de câte ori este
nevoie în program de aceasta.
Deoarece în timpul execuţiei unei subrutine conţinutul registrelor din procesor se
alterează (îşi modifică valoarea), dacă la revenirea din subrutină conţinutul acestora nu este
restaurat, programul va folosi date eronate.
Pentru a evita acest lucru registrele care trebuie să-şi păstreze conţinutul vor fi salvaţi în
stivă şi restauraţi din aceasta.
La apelul succesiv a mai multor subrutine, adresele de revenire ale acestora sunt depuse
în stivă în ordine inversă a succesiunii salturilor (ultima adresă de revenire de la ultima
subrutină apelată este în vârful stivei, iar cea mai veche este cea mai depărtată, spre baza
stivei).

111
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
Ca mod de lucru pentru apelul unei subrutine se poate respecta algoritmul:
 se apelează subrutina cu comanda CALL, automat în stivă este pusă adresa de revenire;
 salvăm în stivă registrele care ne interesează;
 se execută instrucţiunile din corpul subrutinei;
 se restaurează registrele salvate;
 se revine din subrutină cu instrucţiunea RET.

De reţinut !
 Subrutinele se utilizează pentru o structurare şi organizare mai bună a
programelor.
 Subrutinele reprezintă porţiuni de program utilizate frecvent pentru a
efectua anumite operaţii specifice.
 Subrutinele sunt apelate din diferite locuri ale programului, evitându-
se astfel repetarea unei aceleaşi secvenţe de instrucţiuni.
 O subrutină poate apela o altă subrutină, ceea ce impune utilizarea
unui mecanism specific pentru a se putea cunoaşte adresa de revenire,
la terminarea execuţiei unei subrutine, la punctul din program de unde
se făcuse apelarea ei.

6.2.2. Instrucţiuni pentru lucru cu subrutine


Procedurile se definesc în textul sursă astfel:
nume_proc PROC [FAR | NEAR]
.
.
.
RET
nume_proc ENDP
unde nume_proc este numele procedurii, iar parametrii FAR sau NEAR (opţionali)
indică tipul procedurii.
Procedurile sunt de două tipuri: FAR şi NEAR. O procedură FAR poate fi apelată şi din
alte segmente de cod decât cel în care este definită, pe când o procedură NEAR poate fi
apelată numai din segmentul de cod în care este definită.
Dacă nu se precizează parametrii FAR sau NEAR, tipul procedurii este dedus
dindirectivele simplificatede definire a segmentelor (funcţie de modelul de memorie folosit).
112
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
În mod corespunzător, există apeluri de tip FAR, respectiv NEAR, precum şi
instrucţiuni de revenire de tip FAR, respectiv NEAR.
Instrucţiunea RET (Return) provoacă revenirea în programul apelat. Se poate scrie o
instrucţiune return explicită în formele RETN (Return Near) sau RETF (Return Far) sau RET
caz în care tipul instrucţiunii Return este dedus din tipul procedurii (FAR sau NEAR).

 Instrucţiunea CALL (Apel de procedură)


Poate avea una din formele:
CALL nume_proc
CALL FAR PTR nume_proc
CALL NEAR PTR nume_proc
În primul caz, tipul apelului este dedus din tipul procedurii, iar în celelalteeste specificat
explicit (Far sau NEAR).
Tipul apelului trebuie să coincidă cu tipul procedurii şi cu tipul instrucţiunilor Return
din interiorul procedurii, altfel se ajunge la funcţionări necorespunzătoare ale programului.
Semnificaţia instrucţiunii CALL este următoarea:
 CALL de tip NEAR
(SP) (SP) - 2
SS: ((SP) + 1) : (SP)) (IP)
(IP) ofsetul primei instrucţiuni din procedură
Descrierea prezentată mai sus pune în evidenţă că se salvează în stivă contorul program
curent, asemănător instrucţiunii PUSH (se decrementează registrul SP cu 2 şi se înscrie
conţinutul lui IP în vârful stivei). Registrul IP conţine totdeauna adresa instrucţiunii care
urmează (în memorie), după instrucţiunea care se execută în mod curent. Practic se salvează
în stivă adresa instrucţiunii de după instrucţiunea CALL. Această adresă este numită adresă de
revenire.
După această salvare, se încarcă în IP adresa (deplasamentul) primei instrucţiuni din
procedură, ceea ce înseamnă un transfer al controlului către procedură.
De reţinut că în momentul intrării în procedură, în vârful stivei există adresa de
revenire. Această adresă nu trebuie modificată deoarece revenirea în programul apelat nu mai
este posibilă.
De observat că în secvenţa de apel a procedurii, registrul CS nu se modifică, ceea ce
înseamnă că se rămâne în acelaşi segment de cod.

113
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

 CALL de tip FAR


(SP) (SP) - 2
SS: ((SP) + 1) : (SP)) (CS)
(SP) (SP) - 2
SS: ((SP) + 1) : (SP)) (IP)
(CS) adresa de segment a primei instrucţiuni din procedură
(IP) ofsetul primei instrucţiuni din procedură
Ceea ce este diferit faţă de apelul de tip NEAR este faptul că salvează adresa completă
de revenire (pe 32 de biţi), prin plasarea în stivă atât a registrului IP cât şi a registrului CS.
Similar, transferul contorului se face prin modificarea explicită a perechi de registre (CS:IP)
Instrucţiunea CALL de tip FAR este aceea instrucţiune care modifică explicit registrul CS.
 Instrucţiunea RET (Return – revenire din procedură)
Poate avea una din formele:
RETN [N]
RETF [N]
RET [N]
În care parantezele drepte pun în evidenţă ca N este o constantă intreagă opţională.
În cea de-a treia formă tipul instrucţiunii (NEAR sau FAR) este dedus din tipul procedurii.
Semnificaţia este următoarea:
 Return de tip NEAR
(IP) SS: ((SP) + 1) : (SP))
(SP) (SP) + 2
[(SP) (SP) + N]
Rezultă din semnificaţia instrucţiunii Return că se reface registrul (IP), prin copierea vârfului
stivei şi incremetarea registrului SP cu 2. Dacă SP are aceiaşi valoare ca la intrarea în
procedură şi conţinutul stivei nu a fost alterat în timp, atunci se copiază în IP adresa de
revenire, ceea ce provoacă transferul controlului la instrucţiunea care urmează instrucţiunii
CALL care a provocat apelul procedurii. Dacă în formatul instrucţiunii RET există constanta
opţională N, atunci se adună această constantă la registrul SP.
 Return de tip FAR
(IP) SS: ((SP) + 1) : (SP))
(SP) (SP) + 2
(CS) SS: ((SP) + 1) : (SP))
(SP) (SP) + 2
114
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
[(SP) (SP) + N]
Se reface din stivă perechea de registre (CS:IP), cu actualizarea registrului SP şi dacă este
prezentă constanta N, se adună N la SP.

Principalele caracteristici ale subrutinelor:


 o subrutină este o succesiune de instrucţiuni cu unul sau mai multe puncte de intrare
etichetate şi cu unul sau mai multe puncte de ieşire;
 realizează o anumită funcţie: operaţii I/O, conversii al formatului datelor, operaţii
aritmetice în virgulă fixă sau mobilă, etc.;
 poate fi apelată ori de câte ori este nevoie;
 pentru ea se alocă memorie numai o singură dată;
 la terminare trebuie să se reîntoarcă în programul apelant, indiferent de locul de unde este
apelată;
 poate primi parametri din programul apelant şi îi poate furniza rezultate acestuia prin
registre, prin stivă sau prin locaţii fixe de memorie;
 registrele modificate de subrutină trebuie să fie cunoscute programului apelant, care trebuie
să ia măsurile necesare pentru salvarea informaţiilor care trebuie păstrate.
Pentru păstrarea vizibilităţii codului sursă fiecare subrutină trebuie documentată la
definire, precizându-i-se:
 numele şi funcţia îndeplinită;
 modul în care sunt primiţi parametrii de intrare;
 modul în care rezultatele sunt returnate programului apelant;
 registrele modificate în cadrul subrutinei.

De reţinut !
Este important de reţinut că instrucţiunile CALL şi RET sunt instrucţiuni
pereche: ele salvează, respectiv refac adresa de revenire. Pentru că
mecanismul de apel/revenire să funcţioneze corect, trebui îndeplinite
condiţiile:
 tipul instrucţiunii CALL şi tipul instrucţiunii RET trebuie să coincide
(FAR sau NEAR);
 registrul SP din momentul execuţiei instrucţiunii RET să aibe aceeaşi
valoareca la intrarea în procedură (să indice adresa de revenire);
 adresa de revenire salvată în stivă să nu fi fost alterată de către
procedură.

115
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

6.2. 3. Transferul de parametri între program şi subrutine


Deoarece, în general, subrutinele execută operaţii asupra unor parametri, aceştia trebuie
transmişi subrutinelor de către programul principal şi subrutinele transmit programului
principal rezultatul obţinut.
Acest transfer de parametri se poate face:
 prin intermediul registrelor - este o metodă foarte simplă dar numărul de parametrii este
limitat de numărul registrelor;
 prin intermediul memoriei RAM – este o metodă complexă care necesită cunoaşterea
precisă a adreselor parametrilor, dar permite transmiterea unui număr nelimitat de
parametri;
 transferul parametrilor prin intermediul stivei – este cea mai folosită metodă, evitându-se
calculul adreselor care le impune folosirea memoriei RAM şi permiţând un număr foarte
mare de parametri.
În acest caz subrutina foloseşte anumite date, din locaţii de memorie specificate, ale
căror valori vor fi stabilite înaintea apelului subrutinei.
De exemplu în cazul unei subrutine de adunare a două numere, acestea trebuie luate din
locaţii de memorie specificate. Înainte de fiecare apel în aceste locaţii de memorie se încarcă
cele două numere ce trebuie adunate.

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„PROGRAMAREA ÎN LIMBAJ DE ASAMBLARE FOLOSIND
SIMULATORUL SMS32: utilizarea stivei şi lucrul cu subrutine”.
Obiectivele laboratorului sunt:
 Studiul stivei simulatorului;
 Instrucţiuni pentru lucru cu stiva;
 Lucrul cu subrutine;
 Instrucţiuni pentru lucru cu subrutine;
 Transferul de parametri între program şi subrutine

116
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

Test de autoevaluare
1. Care este structura şi rolul stivei?
2. De ce sunt necesare stivele ?
3. Care sunt instrucţiunile pentru lucrul cu stiva?
4. Care este rolul subrutinei?
5. Care sunt principalele caracteristici ale subrutinelor?
6. Care sunt instrucţiunile pentru lucrul cu subrutinele?

Lucrare de verificare la Unitatea de învăţare 6


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Lucrul cu stinva: structură, instrucţiuni.
2. Lucrul cu subrutinele: caracteristici, instrucţiuni.

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii

1. Stivele sunt strict necesare în lucrul cu subrutine (proceduri şi


funcţii), când trebuie eliberate registrele interne în vederea apelării
unei subrutine care va încărca registrele cu propriile sale date.
2. Subrutina este o succesiune de instrucţiuni cu unul sau mai multe
puncte de intrare etichetate şi cu unul sau mai multe puncte de
ieşire, realizează o anumită funcţie şi poate fi apelată ori de câte ori
este nevoie iar la terminare trebuie să se reîntoarcă în programul
apelant, indiferent de locul de unde este apelată

117
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine

Bibliografie

1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,


Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Muscă Gheorghe; Programarea în limbaj de asamblare, Editura
Teora, 1997
4. Rotar Dan; Arhitectura sistemelor de calcul, Editura ALMA
MATER, 1997

118
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

Unitatea de învăţare nr. 7

MICROPROCESOARELE INTEL 80x86


SISTEMUL DE ÎNTRERUPERI

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 7 120
7.1. Aspecte generale 120
7.2. Întreruperi software 123
7.3. Întreruperi hardware 125
7.4. Controlerul de intreruperi I8259A 127
Lucrare de laborator 129
Test de autoevaluare 129
Lucrare de verificare – unitatea de învăţare nr. 7 129
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 129
Concluzii 130
Bibliografie – unitatea de învăţare nr. 7 130

119
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

OBIECTIVELE unităţii de învăţare nr. 7

Principalele obiective ale Unităţii de învăţare nr. 7 sunt:


• Cunoaşterea principiului de funcţionare al unui sistem de
întreruperi;
• Analiza sistemului de întreruperi al familiei de procesoare
Intel 80x86;

7.1. Aspecte generale


Prin întrerupere înţelegem fenomenul la apariţia căruia microprocesorul, la cererea unui
eveniment extern, abandonează programul în curs de rulare, deserveşte evenimentul extern,
executând un program dedicat, după care se reîntoarce la programul abandonat, reluându-i
execuţia din punctul în care ea fusese suspendată.
Se prezintă o clasificare a întreruperile ce se poate realiza după mai multe criterii
(Fig.7.1)

Nedezactivabile

Externe

Dezactivabile
Hardware

Interne

Întreruperi

Utilizator

Software
BIOS

Sistem

DOS

Fig. 7.1. Clasificarea întreruperilor


120
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

După cum se observă din clasificarea prezentată întreruperile sunt de tip software, care
se activează prin execuţia instrucţiunea INT, INTO folosite în cadrul programului, şi
hardware care se activează de către un eveniment extern provocate de semnale electrice care
se aplică pe intrările de întreruperi INT (dezactivabile sau mascabile) şi NMI (nedezactivabile
sau nemascabile) ale procesorului şi respectiv interne care apar ca urmare a unor condiţii
speciale de funcţionare a procesorului (cum ar fi execuţia pas cu pas a programelor).
Întreruperea hardware dezactivabile sunt controlate de unul sau mai multe circuite
specializate (controlere de întreruperi 8259A) care acceptă fiecare cel mult opt cereri de
întreruperi, pe care le transmit către linia INT a procesorului.
Arhitectura Intel 80x86 acceptă 256 de nivele de intrerupere distincte. Fiecare din aceste
niveluri poate avea asociată o procedură numită rutină de tratare. Adresele acestor rutine sunt
trecute într-o aşa numită tabelă de întreruperi, aflată la adrese fizice 00000 – 003FFh,
ocupând deci 1024 octeţi.Fiecare nivel ocuupă 4 octeţi, primii reprezintă ofsetul iar ur mătorii
adresa de segment a procedurii (Fig.7.2).

00000
Ofset Adresă procedură de tratare
nivel 0
Segment

Ofset Adresă procedură de tratare


nivel 1
Segment

Ofset Adresă procedură de tratare


nivel 256
Segment
003FF

Fig.7.2. Tabela de întreruperi

121
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

La apariţia unei întreruperi, au loc următoarele acţiuni:


 se salvează în stivă registrele FLAGS, CS, IP (în această ordine);
 se şterg bistabilii IF şi TF;
 se furnizează procesorului un întreg pe 8 biţi (deci în gama 0...255), numit vector de
întrerupere, care identifică nivelul asociat întreruperii;
 se execută un salt indirect intersegment la adresa de început a rutinei de tratare, prin
intermediul tabelei de întreruperi.

De reţinut !
Un calculator poate sa identifice mai multe tipuri de intrerupere numite
nivele de întrerupere. Pentru fiecare nivel se poate defini câte o rutina de
tratare a intreruperii respective. Adresele de început ale acestor rutine se
pastrează într-o tabela de pointeri denumita tabela de intreruperi. Aceste
rutine sunt activate la apariţia şi acceptarea de catre calculator a
întreruperii corespunzator. Funcţie de cerintele aplicaţiei executate,
anumite nivele de întrerupere pot fi invalidate, temporar sau pe toată
durata aplicaţiei. O întrerupere invalidată (sau mascată) nu este
recunoscută de către calculator.
La activarea unui semnal de întrerupere se testează dacă nivelul
corespunzator este validat şi dacă nu sunt în curs de deservire alte
întreruperi mai prioritare; în caz afirmativ are loc întreruperea temporară
a secvenţei curente de execuţie, se salvează în stivă adresa instrucţiunii
urmatoăre şi se face salt la rutina de tratare a întreruperii. Dupa execuţia
rutinei de întrerupere se revine la secvenţa întreruptă prin incarcarea
adresei salvate în stivă.
Adesea, pentru controlul întreruperilor externe se utilizeaza un circuit
specializat denumit controlor de întreruperi. Un astfel de circuit
deserveşte un set de semnale de întrerupere. Funcţiile tipice ale unui
astfel de controlor sunt: detecţia condiţiei de producere a unei intreruperi
(ex: front crescator al semnalului de intrerupere), arbitrarea cererilor
multiple, mascarea unor întreruperi, evidenţa intreruperilor deservite, etc.

122
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

7.2. Întreruperi software


Instrucţiunile specifice întreruperilor sunt: INT, IRET,INTO
 Instrucţiunea INT (Interrupt – Întrerupere software)
Sintaxa instrucţiunii este:
INT n
Unde n este o constantă întreagă în domeniul 0...255.
Semnificaţia este următoarea:
(SP) (SP) – 2
SS :((SP) + 1 : (SP)) (FLAGS)
IF 0, TF 0
(SP) (SP) – 2
SS :((SP) + 1 : (SP)) (CS)
(CS) (4*n +2)
(SP) (SP) – 2
SS :((SP) + 1 : (SP)) (IP)
(IP) (4*n )
Se încarcă în CS şi IP, conţinutul de la adresele fizice 4*n +2 şi 4*n adică cei patru
octecţi corespunzători nivelului n din tabela de întreruperi.

 Instrucţiunea IRET (Interrupt Return – revenire din întrerupere)


Datorită proceselor ce se desfăşoară la apariţia unei întreruperi, o procedură de tratare nu
se poate încheia cu instrucţiunea RETF, deoarece trebuie refăcut registrul de indicatori de
condiţie. Rezultă de aici că procedurile de tratare a întreruperilor se încheie întotdeauna cu
instrucţiunea IRET. Această instrucţiune este fără operanzi şi are următoarea semnificaţie:
(IP) SS :((SP) + 1 : (SP))
(SP) (SP) + 2
(CS) SS :((SP) + 1 : (SP))
(SP) (SP) + 2
(FLAGS) SS :((SP) + 1 : (SP))
(SP) (SP) + 2
Rezultă din cele prezentate mai sus că bistabilii IF şi TF care au fost şterşi la apariţia
întreruperii, sunt refăcuţi aşa cum erau înainte de întrerupere, odată cu ceilalţi bistabili din
registrul FLAGS.

123
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

 Instrucţiunea INTO (Interrupt if Overflow – întrerupere în caz de depăşire)


Înstrucţiunea este fără operanzi şi are următoarea semnificaţie:

dacă OF = 1, atunci se execută secvenţa corespunzătoare unei instrucţiuni INT 4

Codificarea instrucţiunilor INT este pe doi octeţi, cu excepţia instrucţiunii INT 3, la care
codificarea este pe un singur octet, deoarece nivelurile 2 şi 3 sunt în general utilizate de
programele de depanare (debuggere).
Nivelurile predefinite de întrerupere sunt prezentate în tabelul 7.1
Tab.7.1. Numele şi descrierea nivelului de întrerupere
Numărul
Numele rutinei Descriere
întreruperii
INT 00h IMONITOR Împărţire prin zero. Redă controlul monitorului.
INT 01h rezervat Execuţie pas cu pas
INT 02h neutilizat Întrerupere non-mask
INT 03h rezervat Puncte de întrerupere a execuţiei programului în vederea depanării
INT 04h neutilizat Depăşire
INT 05h neutilizat
INT 06h neutilizat
INT 07h IMONITOR Întrerupe execuţia programului utilizator şi redă controlul monitorului
INT 08h IKEYBOARD Citeşte o tastă de la tastatură
INT 09h IDIS_BYTE Trimite un octet pentru afişare alfa-numerică pe ecran
INT 0Ah IDIS_CHAR Trimite un caracter ASCII pentru afişare pe ecran
INT 0Bh IDIS_OUTS Trimite un şir de caractere pentru a fi afişat pe ecran
INT 0Ch IDIS_CODE Trimite comenzi către ecran
INT 0Dh IWAIT_MS Temporizări în ms
INT OEh IAD_READ Cisteşte informaţii de la CAN
INT 0Fh IDA_WRITE Comandă convertorul numeric/analogic
INT 10h IBUZZER comandă buzzer-ul
INT 11h neutilizat
INT 12h IPARAL Pentru interfaţa de comunicaţie paralelă
INT 13h neutilizat
INT 14h ISERIAL Pentru interfaţa de comunicaţie serială

În cazul în care apar mai multe întreruperi simultan, procesorul le tratează în funcţie de
prioritatea fiecăreia. Prima întrerupere tratată este cea cu prioritatea cea mai mare, după care,
va fi tratată cea cu prioritatea imediat inferioară, etc
Priorităţile întreruperilor sunt prezentate în tabelul 7.2:
Tab.7.2. Priorităţile întreruperilor
Întreruperea Prioritatea întreruperii
Împărţire prin zero, INT nn, INTO maximă
NMI
INTR
pas cu pas minimă

124
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

De reţinut !
O întrerupere este un proces complex ce poate fi descompus în operaţii
simple. Instrucţiunea INT n comandă procesorului să citească conţinutul
locaţiei de memorie RAM n. După salvarea în stivă a adresei returnate
registrul indicator de instrucţiune este setat la această adresă. Codul
întreruperii, care începe la această adresă, este executat. Când execuţia
acestuia se termină instrucţiunea IRET cauzează întoarcerea din
întrerupere. Registrul indicator de instrucţiune este setat la adresa
salvată anterior în stivă. Instrucţiunile INT şi IRET nu setează registrul
indicator de condiţie. Procesorul depune în stivă adresa indicatorului de
instrucţiune incrementată cu 2 IP+2. Ulterior procesorul va reveni la
această adresă. Registrul indicator de instrucţiune IP este setat la adresa
memorată în locaţia 02. Procesorul execută instrucţiunile de la această
adresă până la întâlnirea instrucţiunii IRET. El extrage după aceea
următoarea adresă a instrucţiunii de executat din stivă, programul
reluându-se de unde a fost întrerupt.

7.3. Întreruperi hardware


Într-un sistem bazat pe un procesor Intel 80x86 deservirea unei întreruperi hardware se
desfaşoară dupa urmatorul scenariu:
1. se activeaza un semnal de întrerupere care indică un anumit eveniment;
2. controlerul de întreruperi testează dacă întreruperea este validată (este nemascată) şi
dacă nu este în curs de desfăşurare o altă rutină de întrerupere cu prioritate mai mare;
3. dacă condiţiile de la pasul 2 sunt îndeplinite atunci se activează linia de întrerupere
catre procesor:
- dacă întreruperea este mascată, atunci este ignorată;
- dacă întreruperea este nemascată, dar este în curs de desfăşurare o intrerupere mai
prioritară atunci se aşteaptă terminarea acesteia, după care se continua cu pasul 3;
cererea de intrerupere se memoreaza într-un registru al controlerului destinat
acestui scop;
4. procesorul testează intrarea de întrerupere la încheierea execuţiei instrucţiunii în curs
de desfăşurare;
5. dacă întreruperea este validată (indicatorul IF este setat) atunci se salvează în stivă

125
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

adresa instruţiunii imediat urmatoare şi conţinutul registrului de stare; în caz contrar


întreruperea este ignorată (nu se memoreaza);
6. se lansează procedura de identificare a sursei de întrerupere (mai exact a nivelului de
întrerupere); pentru aceasta se generează două cicluri INTA (Interrupt Acknowlidge)
7. controlerul de întreruperi plasează vectorul întreruperii curente pe magistrala de date
pe durata celui de-al doilea ciclu INTA
8. procesorul foloseşte vectorul de intrerupere ca index în tabela de întreruperi pentru
determinarea adresei rutinei de tratare a intreruperii;
9. procesorul execută un salt la adresa extrasă din tabela de intreruperi
10. se execută rutina de întrerupere;
11. înainte de încheierea rutinei de întrerupere, prin program, se anunţă controlerul de
întreruperi asupra încheierii întreruperii curente printr-o comandă EOI – End Of Interrupt;
prin aceasta se permite controlerului deservirea unei noi întreruperi, mai puţin prioritare
12. rutina de întrerupere se încheie cu o instructiune IRET, execuţia ei va determina
refacerea registrului de stare cu informaţia salvată în stivă şi execuţia unui salt la secvenţa
intreruptă; adresa de revenire se extrage tot din stivă;
13. se continuă execuţia secventei întrerupte.

De reţinut !
Întreruperile hardware sunt scurte fragmente de cod care
furnizează servicii puternice care pot fi activate de componentele
hardware. De exemplu când imprimanta nu mai are hârtie aceasta trimite
un semnal procesorului. Procesorul întrerupe procesul curent şi tratează
această întrerupere. În acest caz rularea codului întreruperii va avea ca
efect afişarea mesajului „Paper Out”. Când execu ț
se termină se reia programul întrerupt.
Întreruperile hardware sunt ignorate dacă bitul indicator I din
registrul de stare nu este setat. Pentru a seta acest bit folosiţi
instrucţiunea de setare a acestuia STI. Pentru a deseta bitul indicator I
folosiţi instrucţiunea CLI.
Întreruperile hardware sunt activate de harddisk, imprimate,
apăsarea tastelor, mişcarea mouse-ului şi alte evenimente.
Întreruperile pot stabili priorităţi de tratare a evenimentelor, de
exemplu harddisk-ul fiind prioritar imprimantei. Este opţiunea
programatorului să optimizeze procesele prin folosirea întreruperilor.
126
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

7.4. Controlerul de întreruperi I8259A


Controlerul de întreruperi I8259A a fost proiectat pentru microprocesoarele din familia
Intel: 8080, 8085, 8086, 8088, 80286,... Acest circuit poate deservi maxim opt linii de
întrerupere.
Pentru extinderea numarului de întreruperi, mai multe controlere se pot conecta în
cascadă.
Se prezintă modul de conectare a controlorului într-un sistem cu microprocesor, la care
legătura dintre controler şi microprocesor se realizează prin grupul de semnale INTR şi
INTA\. (Fig.7.3).

Fig.7.3. Schema bloc a unui sistem de intreruperi cu 8259A

Controlerul I8259A activează semnalul INTR în cazul în care sunt îndeplinite


urmatoarele condiţii:
 există o cerere de întrerupere pe una din intrrile IRQ0-7 (Interrupt ReQuest);
 nu este in curs de deservire o întrerupere mai prioritară;
 intrarea pe care a apărut întreruperea este nemascată;
 controlerul este validat.
Controlerul I8259A se intercalează între microprocesor şi sursele de întreruperi, iar
dintre funcţiile pe care le îndeplineşte amintim:
 multiplexarea întreruperilor de la diferite surse la pinul corespunzător al
microprocesorului;
 rezolvarea priorităţilor în cazul apariţiei întreruperilor simultane;

127
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

 generarea adresei rutinei de tratare a întreruperii;


 mascarea anumitor întreruperi;
 evidenţa întreruperilor deservite, etc
Circuitul I8259A suportă mai multe moduri de lucru. Acestea pot fi selectate cu ajutorul
a două categorii de cuvinte de comandă:
 cuvinte de iniţializare (folosite o singură dată la pornirea sistemului) – ICW 0-4
(Initialization Command Word);
 cuvinte de operare (folosite pentru modificarea dinamică a modului de lucru) – OCW 0-3
(Operation Command Word).

De reţinut !
Întreruperile hardware nemascată sunt generate la aplicarea unui
semnal la pinul INTR al microprocesorului. Deoarece microprocesorul
are un singur terminal INTR, rezultă că o întrerupere hardware poate fi
creată de către o singură periferică a microprocesorului.
Pentru a elimina acest neajuns, se utilizează dispozitive externe,
special dedicate prelucrării mai multor întreruperi. Unul dintre aceste
dispozitive este controlerul de întreruperi I8259A.
Controlerul extern are 8 linii de intrare pentru întreruperi. În
momentul apariţiei unui semnal de întrerupere pe o linie din cele 8,
controlerul anunţă microprocesorul despre apariţia întreruperii prin
intermediul liniei INTR şi transmite tipul întreruperii pe magistrala de
date (numărul de ordine al întreruperii, ce poate fi cuprins între 0 şi 255).
Aceste întreruperi pot fi dezactivate prin utilizarea instrucţiunii
CLI (clear interrupt) sau activate prin utilizarea instrucţiuni STI (set
interrupt).
Microprocesorul 80386EX nu are prezent fizic pinul INTR, dar are
un controler de întreruperi format din două controlere 8259A conectate
în cascadă.

128
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„PROGRAMAREA ÎN LIMBAJ DE ASAMBLARE FOLOSIND
SIMULATORUL SMS32: sistemul de întreruperi”.
Obiectivele laboratorului sunt:
 Prezentarea sistemului de întreruperi al unui procesor;
 Studiul întreruperilor comparativ cu procedurile;
 Studiul întreruperilor software SMS32;
 Studiul întreruperilor hardware SMS32.

Test de autoevaluar
1. Ce se înţelege prin întrerupere?
2. Cum se clasifică sistemul de întreruperi la microprocesoarele
INTEL 80x86?
3. În ce constau întreruperile software?
4. În ce constau întreruperile hardware?
5. Care sunt instrucţiunile specifice întreruperilor software?
6. Care sunt nivelurile predefinite de întrerupere?
7. Ce rol area controlerul de întreruperi I8259A

Lucrare de verificare la Unitatea de învăţare 7


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Întreruperi software;
2. întreruperi hardware;
3. Controlerul de întreruperi I8259A.

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare

Răspunsurile la întrebările din testul de evaluare se găsesc în textul


unităţii de învăţare.

129
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi

Concluzii
Sistemul de întreruperi este acea parte a unui sistem de calcul
care permite detectia unor evenimente externe sau interne şi
declanşarea unor acţiuni pentru tratarea lor.
Majoritatea sistemelor de întrerupere utilizează un sistem de
priorităţi pentru a stabili ordinea de deservire a cererilor concurente de
întrerupere. Prioritatea se stabileşte pe baza importanţei acordate
evenimentului tratat şi a restricţiilor de timp în soluţionarea
întreruperii. Politica de priorităţi trebuie să asigure soluţionarea
echitabilă şi în timp util a tuturor cererilor.
Un calculator poate sa identifice mai multe tipuri de întrerupere
(numite nivele de intrerupere). Pentru fiecare nivel se poate defini câte
o rutină de tratare a întreruperii respective.

Bibliografie
1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,
Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8
3. Muscă Gheorghe; Programarea în limbaj de asamblare, Editura
Teora, 1997
4. Rotar Dan; Arhitectura sistemelor de calcul, Editura ALMA
MATER, 1997

130
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

Unitatea de învăţare nr. 8

TEHNICI PENTRU ÎMBUNĂTĂŢIREA


PERFORMANŢELOR
MICROPROCESOARELOR

Cuprins Pagina
Obiectivele unităţii de învăţare nr. 8 132
8.1. Paralelismul - tehnica unei prelucrări mai rapide 132
8.2. Coada pentru preluare anticipată ("prefetch queue") 136
8.3. Pipeline - suprapunerea execuţiei mai multor instrucţiuni 138
8.4. Memoria cache - căi multiple de acces la memorie 142
8.5. Arhitectura VLIW 143
8.5.1. Prezentare generală 143
8.5.2. Prezentare funcţională 144
8.6. Multiprocesarea 147
8.6.1.Prezentare generală 147
8.6.2.Arhitecturi de sisteme multiprocesor 148
Lucrare de laborator 149
Test de autoevaluare 149
Lucrare de verificare – unitatea de învăţare nr. 8 150
Răspunsuri şi comentarii la întrebările din testul de autoevaluare 150
Concluzii 150
Bibliografie – unitatea de învăţare nr. 8 150

131
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
OBIECTIVELE unităţii de învăţare nr. 8

Principalele obiective ale Unităţii de învăţare nr. 8 sunt:

• Explicarea fundamentelor privind implementarea paralelismului


la nivelul instrucţiunii;
• Cunoaşterea rolului buffer-lui de decodificare anticipată a
instrucţiunilor;
• Cunoaşterea rolului memoriei cache;
• Cunoaşterea arhitecturi VLIW

8.1. Paralelismul - tehnica unei prelucrări mai rapide

Una din ideile care stă la baza arhitecturii procesoarelor RISC era aceea de a executa o
instrucţiune per ciclu de ceas. Chiar dacă instrucţiunile RISC erau simplificate, execuţia unei
instrucţiuni presupunea mai mulţi paşi. Soluţia acestei probleme, aplicată apoi într-o anumită
măsură şi la procesoarele 80x86, a fost paralelismul în execuţia paşilor.
Să considerăm secvenţa pentru o instrucţiune MOV reg, reg:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 actualizează EIP pentru a indica următorul octet;
 decodifică instrucţiunea;
 preia (fetch) operandul sursă;
 memorează valoarea preluată în registrul destinaţie.
Execuţia acestei instrucţiuni presupune cinci faze, cu o anumită dependenţă între ele.
De exemplu, preluarea opcodului de CPU din memorie înainte de a actualiza pe EIP pentru a
indica următorul octet. De asemenea trebuie decodificată instrucţiunea înainte de a prelua
registrul sursă, deoarece CPU nu ştie că e nevoie de un registru sursă înainte de decodificare.
Nu în ultimul rând CPU trebuie să preia registrul sursă înainte de a-l memora în registrul
destinaţie. Cele mai multe din fazele de execuţie ale acestei instrucţiuni MOV sunt
secvenţiale, CPU trebuind să execute o fază înainte de a trece la următoarea. Singura excepţie
este "actualizează EIP ...", deoarece niciuna din fazele următoare nu depinde de acest pas. Ea
poate fi a treia, a patra sau a cincea fază fără a afecta rezultatul final al instrucţiunii. Mai mult

132
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
această fază se poate executa simultan (în acelaşi timp) cu oricare dintre paşii menţionaţi, fără
a afecta operaţia în sine:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 decodifică instrucţiunea;
 preia (fetch) operandul sursă şi actualizează EIP pentru a indica următorul octet;
 memorează valoarea preluată în registrul destinaţie.
Prin efectuarea a două faze în paralel putem deci reduce timpul de execuţie al acestei
instrucţiuni cu un ciclu de ceas.
Instrucţiunea MOV EAX, [EBX+deplasament], de tip MOV reg, mem, are secvenţa:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 actualizează EIP pentru a indica următorul octet;
 decodifică instrucţiunea;
 preia (fetch) deplasamentul operandului din memorie;
 actualizează EIP pentru a indica dincolo de deplasament;
 calculează adresa operandului (EBX + deplasament);
 preia operandul;
 memorează valoarea preluată în registrul destinaţie.
Şi aici există posibilitatea suprapunerii unor faze, cum ar fi:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 actualizează EIP pentru a indica următorul octet şi actualizează EIP pentru a inica
următorul octet;
 preia (fetch) deplasamentul operandului din memorie;
 calculează adresa operandului (EBX + deplasament) şi actualizează EIP pentru a indica
dincolo de deplasament;
 preia operandul;
 memorează valoarea preluată în registrul destinaţie.
În acest exemplu s-a redus numărul paşilor de la 8 la 6 cicluri de ceas prin suprapunerea
actualizării EIP cu alte două operaţii.
Ca un ultim exemplu să considerăm instrucţiunea ADD [EBX + deplasament], const, de
tip MOV mem, const , instrucţiunea cu cel mai mare număr de paşi de până acum:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 actualizează EIP pentru a indica următorul octet;
 decodifică instrucţiunea;
 preia deplasamentul pentru a-l utiliza în calculul adresei efective;

133
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
 actualizează EIP pentru a indica dincolo de valoarea deplasamentului;
 preia valoarea constantă (sursă) din memorie şi o trimite la ALU;
 calculează adresa operandului destinaţie EBX + deplasament;
 ia valoarea operandului destinaţie din memorie şi o trimite la ALU;
 comandă ALU pentru adunare;
 memorează rezultatul înapoi în memorie;
 actualizează indicatorii de condiţie conform rezultatului operaţiei de adunare;
 actualizează EIP pentru a indica în memorie dincolo de valoarea constantei.
Putem suprapune cel puţin trei paşi, observând că anumite faze nu depind de rezultatul
precedentei:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 decodifică instrucţiunea şi actualizează EIP pentru a indica următorul octet;
 preia deplasamentul pentru a-l utiliza în calculul adresei efective;
 actualizează EIP pentru a indica dincolo de valoarea deplasamentului;
 preia valoarea constantă din memorie şi o trimite la ALU;
 calculează adresa operandului destinaţie EBX +deplasament;
 ia valoarea operandului destinaţie din memorie şi o trimite la ALU;
 comandă ALU pentru adunare;
 memorează rezultatul înapoi în memorie şi actualizează indicatorii de condiţie conform
rezultatului operaţiei de adunare şi actualizează EIP pentru a indica în memorie dincolo de
valoarea constantei.
Nu am putut suprapune una din operaţiile "actualizează EIP ..." pentru că faza
precedentă şi fazele ulterioare folosesc valoarea lui EIP înainte şi după actualizare.
Se mai poate observa că în secvenţa: preluare a constantei din memorie şi apoi calcul
al adresei efective, niciuna din cele două operaţii nu depinde de cealaltă, astfel că pot fi
interschimbate. Rezultă următoarea secvenţă:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie
 decodifică instrucţiunea şi actualizează EIP pentru a indica următorul octet;
 preia deplasamentul pentru a-l utiliza în calculul adresei efective;
 actualizează EIP pentru a indica dincolo de valoarea deplasamentului;
 calculează adresa operandului destinaţie EBX +deplasament;
 preia valoarea constantă din memorie şi o trimite la ALU;
 ia valoarea operandului destinaţie din memorie şi o trimite la ALU;
 comandă ALU pentru adunare;

134
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
 memorează rezultatul înapoi în memorie şi actualizează indicatorii de condiţie conform
rezultatului operaţiei de adunare şi actualizează EIP pentru a indica în memorie dincolo de
valoarea constantei.
Această modificare nu elimină paşi, dar reduce dependenţa între faze succesive,
permiţând alte suprapuneri. Acum putem suprapune şi " actualizare EIP .. " cu calculul adresei
efective:
 preia octetul cu codul instrucţiunii (fetch opcod) din memorie;
 decodifică instrucţiunea şi actualizează EIP pentru a indica următorul octet;
 preia deplasamentul pentru a-l utiliza în calculul adresei efective;
 calculează adresa operandului destinaţie EBX +deplasament şi actualizează EIP pentru a
indica dincolo de valoarea deplasamentului;
 preia valoarea constantă din memorie şi o trimite la ALU;
 ia valoarea operandului destinaţie din memorie şi o trimite la ALU;
 comandă ALU pentru adunare;
 memorează rezultatul înapoi în memorie şi actualizează indicatorii de condiţie conform
rezultatului operaţiei de adunare şi actualizează EIP pentru a indica în memorie dincolo de
valoarea constantei.
Deşi ar părea posibilă preluarea constantei şi a operandului din memorie în acelaşi timp,
unitatea centrală (CPU) nu poate să o facă deoarece există doar o singură magistrală de date
utilizată pentru preluarea acestor valori din memorie. Vom vedea în subcapitolul următor că
există o soluţie şi pentru această situaţie.

De reţinut !
Modalitatea de a executa paşi ai unei instrucţiuni în paralel cu alţi
paşi constituie o tehnică esenţială de a îmbunătăţii performanţele unui
procesor fără a mări frecvenţa de ceas. Totuşi este evident că nu se
câştigă foarte mult, pentru că instrucţiunile ca atare sunt încă executate
secvenţial, o instrucţiune trebuind să se finalizeze pentru ca să înceapă
următoarea.

135
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

8.2. Coada pentru preluare anticipată ("prefetch queue").


Un factor cheie pentru mărirea vitezei unui procesor este deci executarea operaţiilor în
paralel. Dacă putem să executăm două operaţii în fiecare ciclu de ceas, unitatea centrală
(CPU) va executa instrucţiunile de două ori mai rapid la aceiaşi frecvenţă de ceas. Mulţi paşi
din execuţia unei instrucţiuni folosesc resurse comune, cum ar fi unităţile funcţionale ale
procesorului (ALU şi CU). O unitate funcţională este capabilă doar de o singură operaţie la un
moment dat. Două operaţii nu pot folosi aceiaşi unitate funcţională simultan (de exemplu să
incrementeze EIP şi să adune două valori în acelaşi timp).
Altă dificultate în execuţia simultană a operaţiilor este că o operaţie poate depinde de
rezultatul celei anterioare. Un exemplu în acest sens sunt cei doi paşi ai instrucţiunii ADD în
care se adună două valori şi apoi se memorează suma. Suma nu poate fi memorată până când
nu este calculată. Mai sunt şi alte resurse care nu pot fi partajate de paşii unei instrucţiuni.
Existând o singură magistrală de date, nu se poate prelua opcodul unei instrucţiuni în
acelaşi timp cu memorarea unei valori în memorie.
Ideea care stă la baza proiectării unei unităţi centrale care să execute mai mulţi paşi în
paralel este de a aranja paşii pentru a reduce conflictele care apar în utilizarea unor resurse
comune sau de a adăuga resurse care să permită ca două, sau mai multe, operaţii să poată fi
executate simultan în unităţi funcţionale diferite.
Pe perioadele de timp cât magistrala de date este neutilizată de instrucţiunea curentă o
putem folosi pentru preluarea anticipată a opcodurilor şi operanzilor şi să salvăm aceste valori
pentru execuţia instrucţiunii următoare. Resursa hardware pentru această operaţie este coada
de preluare anticipată - coada de prefetch ("prefetch queue").
Se prezintă organizarea unei unităţi centrale (CPU) cu coadă pentru preluare anticipată
(Fig. 8.1).
BIU (Bus Interface Unit) - unitatea de interfaţă cu magistralele este responsabilă cu
controlul accesului la magistralele de date şi adrese. Atunci când o componentă a CPU
doreşte să acceseze memoria trimite o cerere de acces la BIU care este responsabilă cu
"dirijarea" traficului şi gestionează cererile, care pot fi eventual simultane, de acces la
magistrale provenind de la diferitele subcomponente ale CPU (de exemplu EU- Execution
Unit - unitatea de execuţie sau coada de preluare anticipată). Atunci când unitatea de execuţie
(EU) nu foloseşte BIU, aceasta poate prelua octeţi suplimentari din fluxul de instrucţiuni. De
fiecare dată când unitatea centrală are nevoie de o instrucţiune sau operand ea preia următorul
octet disponibil din coada de preluare anticipată. Deoarece BIU poate prelua din memorie
136
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
până la 4 octeţi simultan şi "consumă" mai puţin de 4 octeţi per ciclu de ceas, orice octet pe
care unitatea centrală l-ar prelua din fluxul de instrucţiuni se va afla deja în coada de
prefetch.

CPU

EU

R
e Magistrală de date
g
i
s ALU BIU
t
Magistrală de adrese
r
e

Unitate de Coadă pentru


control preluare

Fig 8.1. Organizare CPU cu coadă pentru preluare anticipată

Din cele prezentate mai sus rezultă că prezenţa unei cozi de prefetch îmbunătăţeşte
performanţele unităţii centrale. Acesta este motivul pentru care ea există la toate procesoarele
familiei 80x86, chiar şi la 8088. La toate aceste procesoare există un BIU care preia continuu
date pentru coada de prefetch atunci când nu se citeşte sau scrie informaţie din/în memorie,
deci când există cicluri de magistrală nefolosite.
Coada de prefetch este mai eficientă pentru o dimensiune mai mare a magistralei de
date. Un 8086 este mai rapid decât un 8088 şi pentru că poate să umple coada de prefetch cu
mai puţine cicluri de magistrală. Unitatea centrală are nevoie de magistrala de date şi pentru
alte scopuri decât preluare opcoduri, deplasamente sau constante imediate. Instrucţiunile care
accesează memoria concurează cu coada de prefetch pentru accesul la magistrală şi au
prioritate. Dacă avem o secvenţă de instrucţiuni care toate accesează memoria, coada se poate
goli, existând prea puţine cicluri de magistrală disponibile pe durata execuţiei acestor
instrucţiuni. Odată ce coada este goală, unitatea centrală trebuie să aştepte ca BIU să preia noi
opcoduri din memorie, încetinind execuţia programului.

137
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

De reţinut !
Procesoarele Intel începând cu generaţia Pentium păstrează
compatibiltatea cu microprocesoarele precedente şi prezintă posibiltatea
de a executa două instrucţiuni simultan, datorită tehnologiei superioare,
comună microprocesoarelor RlSC, fiind prevăzute cu Buffer de
decodificare anticipată a instrucţiunilor.
Codul din memoria cache este testat pentru a sesiza din timp eventualele
instrucţiuni de salt anterior încărcării acestora în pipeline; decodificarea
instrucţiunilor se realizează deci anticipat şi ulterior sunt transmise
unităţilor de execuţie. Transmiterea se realizează pe o magistrală de 256
de biţi, dimensiunea mare a acesteia permiţând aducerea secvenţelor de
instrucţiuni cu o viteză mai mare decât a capacitaţii de procesare.

8.3. Pipeline - suprapunerea execuţiei mai multor instrucţiuni


Execuţia instrucţiunilor în paralel folosind BIU şi EU este un caz special de pipeline.
Familia 80x86 începând de la 80486 incorporează un pipeline de instrucţiuni pentru
îmbunătăţirea performanţelor unităţii centrale; cu puţine excepţii, acesta permite executarea
unei instrucţiuni per ciclu de ceas.
Avantajul cozii de prefetch (coada pentru preluare anticipată) era că: permite suprapunerea
preluării opcodului şi decodificării lui, cu execuţia instrucţiunii precedente.
Dacă este posibil şi putem să mai adăugăm resurse hardware similare, vom putea,
probabil, să executăm aproape toate operaţiile în paralel, aceasta fiind şi ideea de pipeline.
Un pipeline tipic: considerăm următorii paşi necesari pentru realizarea unei operaţii
generice:
 fetch opcod din memorie;
 decodifică instrucţiunea şi prefetch operand;
 calculează un mod de adresare complex [EBX + deplasament], dacă e cazul;
 preia valoarea sursă din memorie şi registrul de destinaţie ;
 calculează rezultatul;
 memorează rezultatul în registrul destinaţie.

138
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
Să presupunem că se poate construi o unitate centrală care s-ar compune dintr-un set de
mici unităţi centrale, etaje, fiecare din ele specializată pe prelucrările corespunzătoare paşilor
de mai sus, obţinându-se astfel un pipeline cu 6 etaje (Fig. 8.2).

Pipeline

Etaj 1 2 3 4 5 6

Decodifică Fetch
Fetch Calculează
opcod & valoare sursă Calculează Memorează
(preia)
prefetch adresă
& rezultat rezultat
opcod
operand efectivă
destinaţie

Fig 8.2. Organizarea unităţii centrale utilizând tehnica pipeline

Această structură se poate obţine prin realizarea de căi de date multiple în interiorul
unităţii centrale şi asigurându-ne că niciodată doi operanzi nu vor concura pentru utilizarea
magistralei de date, fiind excluse operaţiile de tip ... memorie, memorie).
Dacă vom avea un hardware dedicat pentru fiecare din etaje, practic aproape toţi aceşti
paşi pot avea loc în paralel. Bineînţeles, nu putem prelua şi decodifica opcodul pentru mai
mult de o instrucţiune odată, dar vom putea prelua opcodul în timp ce decodificăm
instrucţiunea anterioară. Pentru un pipeline cu n - etaje vom putea executa simultan n
instrucţiuni (Fig. 8.3).

T1 T2 T3 T4 T5 T6 T7 T8 T9
Opcod Decodif. Adresă Valori Calcul Mem. Instrucţiune 1
Opcod Decodif. Adresă Valori Calcul Mem. Instrucţiune 2
Opcod Decodif. Adresă Valori Calcul Mem. Instr. 3
Opcod Decodif. Adresă Valori Calcul Mem.

Fig 8.3. Funcţionarea unui pipeline

T1,T2,T3 ... reprezintă perioade consecutive ale ceasului sistem.


1. la momentul T = T1, CPU preia opcodul pentru prima instrucţiune;
2. la momentul T = T2, CPU începe decodificarea opcodului pentru prima
instrucţiune şi în paralel, preia (fetch) un bloc de octeţi din coada de prefetch, pentru
eventualitatea că instrucţiunea are operanzi.
139
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
Deoarece prima instrucţiune nu mai are nevoie de circuitul utilizat pentru preluarea
opcodului, el va fi utilizat de CPU pentru a prelua opcodul celei de a doua instrucţiuni, în
paralel cu decodificarea primei instrucţiuni. De menţionat că aici apare un prim conflict: CPU
încearcă să preia următorul octet din coada de prefetch pentru a-l folosi ca operand şi în
acelaşi timp, preia octetul operandului, tot din coada de prefetch, pentru a-l folosi ca opcod.
3. la momentul T = T3, CPU calculează adresa operandului pentru prima instrucţiune, dacă
există. CPU nu va face nimic legat de prima instrucţiune dacă ea nu foloseşte un mod de
adresare care să necesite un astfel de calcul. Tot pe durata lui T3, CPU decodifică
opcodul pentru a doua instrucţiune şi preia eventualul operand. Nu în ultimul rând, se
preia opcodul pentru a treia instrucţiune.
Cu fiecare nou ciclu (perioadă) de ceas, în pipeline se finalizează alt pas în execuţia
instrucţiuni şi CPU va prelua încă o nouă instrucţiune din memorie.
4. la momentul T = T6, se finalizează execuţia primei instrucţiuni, se calculează rezultatul
pentru a doua, ...., se preia opcodul pentru a şasea instrucţiune.
Odată ce pipeline-ul este plin unitatea centrală va finaliza o instrucţiune la fiecare ciclu
de ceas. Aceasta este adevărat chiar dacă există moduri complexe de adresare care trebuie
calculate, operanzi care trebuie preluaţi din memorie sau alte operaţii care folosesc nu
folosesc pipeline-ul.
Legat de conflictul menţionat anterior, la momentul T = T2 CPU încearcă să preia un
bloc de octeţi pentru un operand în acelaşi timp încercând să preia următorul opcod. Până
când CPU nu decodifică prima instrucţiune nu ştie câţi operanzi are această instrucţiune şi
nici lungimea lor. Totuşi CPU are nevoie de această informaţie pentru a determina lungimea
efectivă a instrucţiunii şi a ştii ce octet să preia ca opcod al instrucţiunii următoare.
Apare deci întrebarea: cum ar putea pipeline-ul să preia un opcod în paralel cu
preluarea unui operand cu semnificaţia de adresă ?

Prima soluţie ar fi să nu permitem să se întâmple aceasta. Dacă o instrucţiune are drept


operand o adresă sau constantă vom întârzia începutul următoarei instrucţiuni. Din păcate
multe instrucţiuni au aceşti operanzi adiţionali astfel că această abordare va avea un impact
negativ asupra vitezei de prelucrare a unităţii centrale.

A doua soluţie presupune existenţa unui hardware suplimentar şi mai complicat.


Dimensiunea operandului şi constantei este de 1,2 sau 4 octeţi. De aceea, dacă vom prelua 3
octeţi din memorie, cu un offset (decalaj ) de 1, 3 şi 5 dincolo de opcodul curent decodificat,
vom şti că, probabil, unul din aceşti octeţi va conţine opcodul pentru instrucţiunea următoare.
140
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
Odată ce decodifică instrucţiunea curentă vom şti şi ce dimensiune are şi vom ştii şi offsetul
pentru următorul opcod. Se poate utiliza un circuit simplu de selecţie (multiplexor) pentru a
alege unul din cei trei octeţi drept opcod.
Din păcate pentru un procesor 80x86 vom avea de selectat următorul opcod din mai mult de
trei octeţi deoarece instrucţiunile 80x86 au o gamă de lungimi mai mare. De exemplu, o
instrucţiune care mută (MOV) o constantă de 32 de biţi într-o locaţie de memorie poate avea
10 sau mai mulţi octeţi. Mai mult, anumite opcoduri 80x86 au mai mult de 1 octet, astfel că
unitatea centrală va trebui să preia mai mulţi octeţi pentru a decodifica instrucţiunea curentă.
În concluzie, cu resurse hardware corespunzătoare, putem decodifica opcodul curent în
acelaşi timp în care-l preluăm pe următorul.
Scenariul prezentat este, puţin prea simplificat. Există două situaţii dezavantajoase
pentru structura simplă de pipeline prezentată: accesul concurent al instrucţiunilor la
magistrala de date şi execuţia nesecvenţială a programului. Ambele situaţii fac să crească
timpul mediu de execuţie al instrucţiunilor în pipeline.
Accesul concurent poate apărea, de exemplu, atunci când se execută concurent o
instrucţiune "MOV mem,reg " care are nevoie să memoreze date în memorie, împreună cu o
instrucţiune "MOV reg, mem" care are nevoie să citească date din memorie. Concurenţa se
manifestă prin încercarea de a folosi (cvasi)simultan magistralele de adrese şi date.
O modalitate simplă de a rezolva această problemă este blocarea pipeline-ului
(pipeline stall). Unitatea centrală va da prioritate instrucţiunii celei mai avansate ca execuţie
în pipeline. Ea va suspenda preluarea de opcoduri până când instrucţiunea curentă îşi preia
operandul. Aceasta va face ca următoarea instrucţiune din pipeline să aibă nevoie de două
cicluri de ceas şi nu de unul pentru executarea ei.

De reţinut !
Pentru a depăşi viteza limitată de transmisie şi propagare a informaţiei se
impune utilizarea tehnicilor de prelucrare paralelă a informaţiei. În acest
caz trebuie să se utilizeze tehnici noi de programare care să se adapteze
arhitecturii paralele. În decursul anilor s-a dovedit că trecerea de la
programarea secvenţială la programarea paralelă este dificilă, probabil
datorita modului de gândire secvenţial al creierului uman. În cazul
procesoarelor Intel soluţia abordată a fost de a ascunde paralelismul prin
utilizarea unei arhitecturi de prelucrare de tip pipeline ce constă în
existenţa mai multor unităţi de procesare specializate, care prelucrează în
paralel mai multe instrucţiuni aflate în diferite faze de execuţie.

141
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

8.4. Memoria cache - căi multiple de acces la memorie

Proiectanţii de arhitecturi de calcul pot rezolva multe din problemele accesului simultan
prin utilizarea inteligentă a cozii de prefetch împreună cu un subsistem de memorie cache.
Coada de prefetch poate acţiona ca un tampon pentru date în fluxul de instrucţiuni, iar
memoria cache poate fi proiectată cu zone separate pentru date şi instrucţiuni. Ambele tehnici
pot îmbunătăţi performanţele sistemului prin eliminarea unor conflicte de magistrală.
Coada de prefetch va acţiona doar ca un buffer între fluxul de instrucţiuni şi circuitul de
preluare a opcodului instrucţiunii. Coada de prefetch este eficentă atunci când unitatea
centrală nu accesează în mod regulat memoria, atunci BIU putând să preia opcoduri
suplimentare pentru ea. Memoria cache creşte numai viteza, nu şi capacitatea sistemului de
memorare al calculatorului. Octeţii destinaţi memoriei cache nu sunt incluşi la calcularea
memoriei totale a unui calculator.
Un procesor 80x86 care utilizează un pipeline va accesa în mod constant memoria
deoarece preia un opcod la fiecare ciclu de ceas. Coada de prefetch nu poate beneficia de
ciclurile de magistrală "neutilizate" pentru a prelua opcoduri adiţionale, pentru că aceste
cicluri nu există. Ea este totuşi eficientă pentru că BIU preia octeţi multipli la fiecare acces şi
majoritatea instrucţiunilor sunt scurte. Fără coadă de prefetch sistemul va trebui să preia
explicit fiecare opcod, chiar dacă BIU, în mod "accidental", a preluat opcodul împreună cu
instrucţiunea precedentă. Când coada există nu va mai fi nevoie să preia încă odată explicit
opcodul în cauză, EU putându-l să-l folosească.
În realitate există destul de puţine procesoare care au o arhitectură Harvard adevărată.
Motivul principal este costul ridicat presupus de numărul mare de conexiuni externe şi alte
complicaţii de natură tehnologică care ar rezulta din implementarea separată a celor două
magistrale. Proiectanţii de arhitecturi de calcul au descoperit totuşi că se pot obţine avantaje
importante de la arhitectura Harvard realizând şi un compromis cu creşterea complexităţii
tehnologice, prin utilizarea unor memorii cache separate pentru instrucţiuni şi date. Astfel
există multe procesoare, printre ele fiind şi cele cu IA 32, care folosesc intern o arhitectură
Harvard şi extern o arhitectură Von Neumann, (Fig. 8.4).
Fiecare unitate de execuţie poate avea propriul pipeline. Dacă ea întâlneşte două sau
mai multe instrucţiuni în fluxul program, instrucţiuni care se pot executa independent, le va
executa ca atare, în paralel.

142
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

CPU

Mem.
cache BIU Magistrale
date adrese şi date
i t ţ i

EU
Mem. cache
instrucţiuni

Coadă pentru
preluare

Fig. 8.4. Microprocesor cu arhitectură Harvard intern şi arhitectură Von Neumann extern

De reţinut !
Memoria Cache este utilizată pentru depozitarea informaţiilor în timpul
transportului dinspre şi spre microprocesor. Memoria Cache contribuie la
creşterea performanţelor, pentru că microprocesorul are acces la aceste
informaţii mai rapid decât la cele din memoria RAM. Dacă informaţiile
încă există în Cache, sistemul nu trebuie să le ia din RAM. La
microprocesoarele 486, Pentium, PentiumPro memoria Cache se mai
numeste şi cache intern, este construită în microprocesor. Alte sisteme
conţin un cache extern, construit ca un cip de memorie aflat pe placa de
bază.

8.5. Arhitectura VLIW


8.5.1. Prezentare generală

Operarea superscalară încearcă să programeze, prin resurse hardware, execuţia


simultană a mai multor instrucţiuni. O altă tehnică utilizată de Intel în arhitectura sa de 64 de
biţi este utilizarea unor cuvinte instrucţiune foarte lungi sau VLIW (Very Long Instruction
Word).
O unitate centrală VLIW va prelua (fetch) un bloc mare de octeţi (41 în cazul

143
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
procesorului IA-64 Itanium) pe care îl va decodifica şi executa într-un singur pas. Acest bloc
conţine de fapt două sau mai multe instrucţiuni. Operarea VLIW cere ca programatorul sau
compilatorul să programeze corect secvenţa instrucţiunilor din fiecare bloc astfel ca să nu
apară hazarduri sau conflicte, dar odată această cerinţă îndeplinită, se pot executa trei sau mai
multe instrucţiuni per ciclu de ceas.
IA-64 nu este singurul procesor care utilizează arhitectura VLIW un alt exemplu fiind
procesorul Crusoe al firmei Transmeta. Crusoe este diferit de IA-64 şi prin aceea că nu
suportă execuţia nativă a instrucţiunilor IA-32. Crusoe va translata instrucţiunile 80x86 (şi
IA-32) în instrucţiuni proprii VLIW, tehnică numită "code morphing". Codul rezultat este cu
50% mai lent decât codul nativ IA-32, dar Crusoe mai are şi alte avantaje care compensează
această scădere a performanţelor. Trebuie menţionat că IA-32 nu foloseşte VLIW dar acest
concept arhitectural prezintă importanţă dacă vom dori să utilizăm noile procesoare Itanium
sau Crusoe.

8.5.2. Prezentare funcţională


Arhitectura VLIW reprezintă una dintre cele mai eficiente soluţii în proiectarea
microprocesoarelor. Pentru ca un procesor să lucreze mai repede există două posibilităţi:
 creşterea frecvenţei ceasului;
 execuţia mai multor operaţii pe fiecare ciclu de ceas.
Creşterea frecvenţei ceasului necesită inventarea unor procese de fabricare şi adoptarea
unor arhitecturi (cum sunt benzile de asamblare mai lungi), care să menţină circuitul cât mai
ocupat cu execuţia “task”-urilor.
Execuţia mai multor operaţii pe un ciclu de ceas necesită integrarea de unităţi
funcţionale multiple pe acelaşi “chip”, care să permită execuţia în paralel a „task”-urilor.
Problema planificării “task”-urilor este astfel crucială în proiectarea procesoarelor moderne.
Procesoarele superscalare actuale realizează acest lucru prin “hardware” pentru rezolvarea
dependenţelor de instrucţiuni. “Hardware”-ul de planificare creşte însă geometric cu numărul
de unităţi funcţionale şi conduce la limitări de implementare.
Alternativa este de a lăsa “software”-ul să facă planificarea “task”-urilor, ceea ce chiar
realizează arhitectura VLIW.
Se prezintă o arhitectura generală VLIW (Fig. 8.5) care constă într-o colecţie de unităţi
funcţionale (sumatoare, multiplicatoare, anticipare ramificaţii etc), conectate printr-o
magistrală, plus registre şi memorii intermediare.

144
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

Fig. 8.5. Arhitectura generală VLIW

O funcţie importantă a procesoarelor VLIW este aceea că pot implementa vechile seturi
de instrucţiuni CISC pentru că programarea procesorului VLIW este foarte asemănătoare cu
scrierea de microcod, putându-se astfel conserva programul.
Datorită lungimii foarte mari a cuvîntului de instrucţiune şi pentru a elimina creşterea
complexităţii “hardware”-ului, procesoarele VLIW utilizează un compilator complex care
preia instrucţiunile şi le pune într-o secvenţă de cod liniară, astfel încât ele să formeze un
cuvânt de instrucţiune foarte lung, din care instrucţiunile pot fi executate în paralel, evitându-
se conflictele de date.
Compilatorul utilizat de procesoarele VLIW trebuie să cunoască microarhitectura
procesorului VLIW pentru care compilează codul program, deoarece orice cod maşină pe care
îl produce rulează bine numai pe procesorul respective. Orice rulare pe o nouă generaţie de
procesor VLIW presupune o recompilare a codului.
Compatibilitatea cu noile generaţii poate fi totuşi păstrată prin folosirea unor tehnici
“hardware” sau “software” adecvate.
Datorită facilităţilor prezentate mai sus performanţa procesoarelor VLIW este de 10
până la 30 de ori mai bună decât un procesor convenţional.

145
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
Un exemplu de utilizare pentru arhitectura VLIW îl reprezintă Procesorul Intel Itanium
IA-64
Acest procesor este prima implementare pe 64 biţi pentru a procesa instrucţiuni de tip
VLIW, dezvoltat împreună de firmele Intel şi Hewlett Packard (HP).
Procesorul conţine
 4 unităţi de prelucrare întregi;
 4 unităţi multimedia;
 2 unităţi de încărcare/memorare;
 2 unităţi de prelucrare în virgulă mobilă cu dublă precizie;
 2 unităţi de prelucrare în virgulă mobilă cu precizie simplă.
Acesta lucrează la o frecvenţă de 800 de MHz, este realizat într-o tehnologie de 0,18
microni şi are banda de asamblare cu 10 etaje.
Arhitectura IA-64 utilizează un format fix de instrucţiuni împachetate pe 128 biţi.
Fiecare instrucţiune VLIW, numită multioperaţie, constă într-unul sau mai multe pachete de
128 biţi, fiecare pachet având 3 operaţii şi un câmp de control.
IA-64 utilizează un tampon de decuplare şi suport speculativ pentru a creşte viteza de
execuţie.
Itanium posedă un set de 128 de registre generale şi un alt set de 128 de registre în
virgulă mobilă pe 82 biţi.
Arhitectura IA-64 implementează suport pentru algoritmul de planificare pe bucle
(“software pipelining”), dezvoltat de Bob Rau de la HP în cadrul unui proiect anterior (Cydra-
5); pentru aceasta s-a implementat posibilitatea de rotaţie a registrelor astfel încât nu mai este
necesară desfacerea buclei şi redenumirea registrelor utilizate în iteraţii succesive.
IA-64 suportă execuţie şi control speculativ utilizând un mecanism ”software/hardware”
propriu.
IA-64 suportă de asemenea planificarea statică şi dinamică a ramificaţiilor.
Setul de instrucţiuni conţine şi instrucţiuni SIMD potrivite pentru procesare multimedia.
Procesorul Itanium este probabil cea mai complexă arhitecturå VLIW implementată
comercial, ceea ce justifică preocupările multor alte firme de a include în proiectele lor
modelul arhitectural VLIW.

146
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

De reţinut !
Procesoarele VLIW au mai multe caracteristici:
În primul rând, ele au unităţi funcţionale independente multiple şi, de
aceea, pot executa simultan multe operaţii pe aceste unităţi. Operaţiile
sunt împachetate într-o instrucţiune foarte lungă. O astfel de instrucţiune
poate include operaţii aritmetice (cum ar fi operaţii cu întregi şi în
virgulă mobilă), referiri la memorie, operaţii de control, deplasări de date
şi ramificaţii. O instrucţiune foarte lungă trebuie să posede un set de
câmpuri pentru fiecare unitate funcţională; aceasta poate avea între 256
şi 1024 biţi sau chiar mai mult. Aceste procesoare posedă numai o
unitate de control, ce generează un cuvânt de comandă lung, care
controlează explicit unităţile funcţionale prin câmpuri independente.
Astfel, ele pot executa numai un singur flux de cod, deoarece controlorul
global selectează pentru execuţie o singură instrucţiune foarte lungă, pe
fiecare perioadă de ceas. În plus, fiecare operaţie poate fi executată în
bandă de asamblare şi solicită pentru execuţie un număr mic de perioade
de ceas. Procesoare utilizează, pentru execuţia în paralel a operaţiilor, un
“hardware” simplu şi fără interblocare. Dependenţele de date şi resurse
sunt rezolvate înainte de execuţie şi controlate explicit de către
instrucţiuni. De asemenea, procesoarele utilizează căi paralele de date
pentru unităţile funcţionale independente multiple şi un volum mic de
logică de control şi sincronizare.

8.6. Multiprocesarea
8.6.1.Prezentare generală

Pipeline-ul, operarea superscalară, reordonarea dinamică şi VLIW sunt tehnici pe care


proiectantul de unităţi centrale le utilizează pentru a obţine execuţia mai multor instrucţiuni în
paralel. Aceste tehnici sunt cunoscute ca implementând un paralelism de granularitate fină
(fine-grained parallelism) şi sunt utile pentru accelerarea execuţiei instrucţiunilor ca atare.
Aşa cum am văzut, adăugarea de unităţi funcţionale creşte paralelismul, crescând astfel şi
viteza de execuţie, problema care se pune este ce efect are adăugarea a două sau mai multe

147
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
procesoare într-un sistem? Această tehnică cunoscută ca multiprocesare poate îmbunătăţi
performanţele sistemului, deşi nu la fel de uniform ca cele menţionate. Un sistem
multiprocesor foloseşte modelul MIMD. Acesta utilizează instrucţiuni multiple care operează
asupra unor obiecte de tip date multiple.
Sistemele multiprocesor sunt utile în cazul în care se execută mai multe programe
simultan, numite sisteme multitask. Pentru a face o diferenţiere de genul de paralelism
presupus de pipeline şi operarea superscalară, acest gen de paralelism va fi numit paralelism
cu granularitate mare (coarse-grained parallelism).
Adăugarea de procesoare multiple într-un sistem nu însemnă doar conectarea lor. Una
din marile probleme care apare în contextul arhitecturiilor evoluate 80x86 este ceea ce se
numeşte coerenţa memoriei cache.
Pentium III şi IV suportă actualizarea memoriei cache între două procesoare din
sistem. Mult mai costisitorul Xeon suportă mai mult de două procesoare. Unul din domeniile
în care procesoarele RISC au un mare avantaj asupra arhitecturi-lor Intel este suportul pentru
multiprocesare. În timp ce limita atinsă de Intel este de 16 procesoare (Xeon), sisteme ca Sun
SPARC şi altele utilizează până la 64 de procesoare, cu perspective de creştere.

8.6.2.Arhitecturi de sisteme multiprocesor


Există în principiu două categorii de sisteme multiprocesor:
 arhitectură centralizată
 arhitectură distribuită
Soluţia centralizată este utilizată pentru sisteme complexe. Este necesar un mecanism
de intercomunicare între procesoare (realizat software sau hardware) care limitează
performanţele sistemului.
Pentru soluţia distribuită deciziile se iau local de către procesoarele periferice.
Mecanismul de intercomunicare (uzual realizat software) este mai simplu. Este necesară
divizarea funcţiilor sistemului în subfuncţii bine determinate care sunt atribuite procesoarelor
locale.
În practică se utilizează şi soluţii mixte , cu un procesor central şi mai multe procesoare
locale.
Principalele moduri de conectare între două procesoare sunt :
 cu memorie comună;
 cu împărţirea magistralelor.

148
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
Memoria comună este un circuit mai complex ce include memoria propriu-zisă şi un
controler care arbitrează conflictele de acces ce pot apare dacă cele două procesoare cer
accesul "simultan" la memoria comună.
În cazul conectării prin aceleaşi magistrale comunicarea între procesoare se realizează
tot printr-o memorie comună iar cele două procesoare utilizează aceleaşi magistrale pentru
accesul la memoria comună. Unul dintre procesoare va fi master până când primeşte o cerere
de magistrală. Acestă cerere va fi generată atunci cînd procesorul slave doreşte să acceseze
memoria comună. Ciclul de magistrală al procesorului slave este întîrziat (prin trecerea
acestui procesor în starea WAIT ) pînă la activarea semnalului ce semnifică acceptarea cererii
de magistrală.

Lucrare de laborator
Lucrarea aferentă acestei unităţi de învăţare se intitulează
„PROGRAMAREA ÎN LIMBAJ DE ASAMBLARE FOLOSIND
SIMULATORUL SMS32: Programarea unor sisteme reale simulate”.
Obiectivele laboratorului sunt:
 Prezentarea sistemelor reale simulate incluse în simulatorul SMS32;
 Studiul lucrului cu porturi;
 Crearea unor programe care controlează sistemele simulate.

Test de autoevaluare
1. În ce constă paralelismul în execuţia instrucţiunilor?
2. În ce constă coada de preluare anticipată ("prefetch queue")?
3. În ce constă un pipeline tipic?
4. În ce constă arhitectura VLIW?
5. Precizaţi un exemplu de microprocesor din familia Intel care
utilizeaează arhitectura VLIW.
6. În ce constă multiprocesarea?
7. Precizaţi arhitecturi de sisteme multiprocesor.

149
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor

Lucrare de verificare la Unitatea de învăţare 8


Această unitate de învăţare se va regăsi în lista de subiecte pentru
examen prin următoarele subiecte:
1. Paralelismul - tehnica unei prelucrări mai rapide;
2. Pipeline - suprapunerea execuţiei mai multor instrucţiuni;
3. Memoria cache - căi multiple de acces la memorie.
4. Multiprocesarea

Răspunsuri şi comentarii la întrebările din testul de


autoevaluare
Răspunsurile la întrebările din testul de evaluare se găsesc în textul
unităţii de învăţare.

Concluzii
Performanţele microprocesoarelor se află pe o curbă exponenţială de la
crearea lor şi până în present. Miniaturizarea şi tehnicile de design
contribuie în mod egal la aceste spectaculoase creşteri. Această unitate
a încercat să prezinte unele din tehnologiile care fac parte şi care vor
face parte din generaţiile următoare de procesoare.

Bibliografie
1. Dobriceanu Mircea; Sisteme cu microprocesoare; Notiţe de curs,
Tipografia Universităţii din Craiova, 2012 şi format electronic
postat pe http://www.em.ucv.ro
2. Dobriceanu Mircea; Sisteme de achiziţie şi microprocesoare,
Editura Universitaria Craiova, 2003, p.304, ISBN 973-8043-289-8

150
SISTEME CU MICROPROCESOARE

S-ar putea să vă placă și