Documente Academic
Documente Profesional
Documente Cultură
SISTEME CU
MICROPROCESOARE
MANUAL
SISTEME CU MICROPROCESOARE
MANUAL
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
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).
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.
9
SISTEME CU MICROPROCESOARE
Introducere
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ă
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.
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
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
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).
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
Logica de
Unitate
control
control
Memorie Unitatea aritmetică
Program şi logică (ALU)
şi Date
Unitate intrare/ieşire
(I/O)
Logica de
Unitate
control
control
Memorie Unitate intrare/ieşire Memorie
Program (I/O) Date
Unitatea aritmetică
şi logică (ALU)
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ă.
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)
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
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
23
SISTEME CU MICROPROCESOARE
1. Concepte generale privind microprocesoarele
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
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.
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
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
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
32
SISTEME CU MICROPROCESOARE
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
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.
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).
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.
Dispozitive
I/O
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.
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.
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.
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.
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?
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
46
SISTEME CU MICROPROCESOARE
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
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
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
Fiecare dintre registre pot fi folosite pentru orice operaţie posibilă, dar sunt folosite de
către programatori în următoarele scopuri:
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.
53
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
Segmentul de stivă
Baza stivei
(valoarea iniţială SP sau
ESP)
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
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.
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).
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)
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ă.
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.
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ă.
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
Spaţiu de
Offset adrese
Adresă logică liniar
Selector segment
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
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ă
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?
63
SISTEME CU MICROPROCESOARE
3. Microprocesoarele INTEL 80x86: registrele şi organizarea memoriei
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
64
SISTEME CU MICROPROCESOARE
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
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.
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”.
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
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:
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
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:
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
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
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
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.
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).
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.
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
77
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
78
SISTEME CU MICROPROCESOARE
4. Microprocesoarele INTEL 80x86: setul de instrucţiuni
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)
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.
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)
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
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
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]
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
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
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
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.
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
DS
ofset
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
DS
ofset
[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]
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ă.
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
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).
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
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ă.
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
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
104
SISTEME CU MICROPROCESOARE
6. Microprocesorul 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
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).
Stiva creşte
Sensul crescător al
adreselor
SP – Vârful curent al stivei
Memorie RAM
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 C000h
BFFFh BFFFh
BFFEh SP=BFFEh BFFEh
BFFDh BFFDh
BFFCh BFFCh SP=BFFCh
BFFBh Extragere din stivă BFFBh
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
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).
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.
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.
113
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
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
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?
Concluzii
117
SISTEME CU MICROPROCESOARE
6. Microprocesorul INTEL 80x86: lucrul cu stive şi subrutine
Bibliografie
118
SISTEME CU MICROPROCESOARE
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
Nedezactivabile
Externe
Dezactivabile
Hardware
Interne
Întreruperi
Utilizator
Software
BIOS
Sistem
DOS
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
121
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul 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
123
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi
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.
125
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi
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
127
SISTEME CU MICROPROCESOARE
7. Microprocesoarele INTEL 80x86: sistemul de întreruperi
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
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
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
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
CPU
EU
R
e Magistrală de date
g
i
s ALU BIU
t
Magistrală de adrese
r
e
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.
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
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.
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
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ă.
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.
144
SISTEME CU MICROPROCESOARE
8. Tehnici pentru îmbunătăţirea performanţelor microprocesoarelor
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ă
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.
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
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