0% au considerat acest document util (0 voturi)
16 vizualizări130 pagini

AC01 Ro

Documentul descrie arhitectura calculatoarelor la diferite niveluri, de la nivelul logicii digitale până la limbajele de programare de nivel înalt. Sunt prezentate concepte precum registrele microprocesoarelor, limbajele de asamblare și de nivel înalt.

Încărcat de

Jubea Mihail
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
16 vizualizări130 pagini

AC01 Ro

Documentul descrie arhitectura calculatoarelor la diferite niveluri, de la nivelul logicii digitale până la limbajele de programare de nivel înalt. Sunt prezentate concepte precum registrele microprocesoarelor, limbajele de asamblare și de nivel înalt.

Încărcat de

Jubea Mihail
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd

Arhitectura Calculatoarelor 1

Arhitectura Calculatoarelor

Introducere
Un calculator numeric este constituit dintr-un ansamblu de resurse fizice (hardware) şi de programe
de sistem (software de sistem) care asigură prelucrarea automată a informaţiilor, în conformitate cu
algoritmii specificaţi de utilizator prin programele de aplicaţii (software utilizator).
Arhitectura calculatorului cuprinde două componente principale:
a) arhitectura setului de instrucţiuni (ASI);
b) implementarea maşinii, cu cele două sub - componente:
 organizare;
 hardware.
Arhitectura setului de instrucţiuni este ceea ce trebuie să ştie un programator pentru a scrie programe în
limbaj de asamblare, respectiv pentru a concepe şi construi un program de tip compilator, sau rutine
destinate sistemului de operare.
Termenul organizare include aspectele de nivel înalt ale unui proiect de calculator, ca de exemplu
structura internă a UCP (unitatea centrală de procesare, microprocesor), structura şi organizarea
magistralelor, organizarea sistemului de memorie. Noţiunea de hardware (resurse fizice) e utilizată pentru
a ne referi la aspectele specifice ale implementării calculatorului. Acestea includ proiectul logic de detaliu
şi tehnologia de realizare a maşinii de calcul.

1. Reprezentarea funcțională a unui calculator


Un calculator poate fi descris atât sub aspect funcţional cât şi structural. Circuitele electronice ale unui
calculator recunosc şi execută doar un set limitat de instrucţiuni elementare, codificate în formă binară.
Aceste instrucţiuni sunt doar succesiuni de biţi (1 şi 0) pe care procesorul le înţelege - decodifică şi le
execută. Indiferent de tipul de maşină, instrucţiunile recunoscute sunt rareori mai complicate decât
[Tanenbaum]:
 adună două numere;
 verifică dacă un număr este egal cu zero;
 copiază date dintr-o zonă a memoriei calculatorului în altă zonă.

De exemplu, la procesoarele Intel din seria 80x86 codul binar al instrucţiunii următoare:
0000 0100 0000 0110
comandă adunarea conţinutului unui registru intern de 8 biţi (numit registrul al) cu valoarea imediată 6.
Adesea, când utilizatorul este obligat să lucreze cu valori numerice binare, se foloseşte reprezentarea în
hexazecimal, care este mai compactă şi mai uşor de citit. Codul, în hexazecimal, al instrucţiunii
corespunzătoare succesiunii binare de mai sus este 04 06 hex. Şi acest mod de scriere a instrucţiunilor
este însă complicat pentru programator. În assembler acestă instrucţiune se descrie mov al,6.
Scrierea instrucţiunilor se poate realiza, la început, în limbaj natural, transpunându-se apoi într-
un limbaj artificial, numit limbaj de programare.
Limbajul de programare reprezintă un set de instrucţiuni, împreună cu regulile de organizare ale
acestora într-un program. Totalitatea regulilor de scriere ale instrucţiunilor reprezintă sintaxa limbajului,
iar totalitatea regulilor prin care se asociază o semnificaţie instrucţiunilor reprezintă semantica limbajului.
Calculatorul poate executa numai instrucţiuni exprimate intern sub forma unor şiruri de cifre
binare. Programele în care instrucţiunile sunt scrise sub această formă se numesc programe în limbaj
maşină. Limbajul maşină este caracteristic fiecărui tip de calculator. Scrierea şi introducerea programelor
sub această formă este dificilă. Pentru simplificarea scrierii programelor, au fost create limbaje în care
fiecărui cod de instrucţiune i s-a ataşat un nume mnemonic. Acest mod de reprezentare a instrucţiunilor
maşină se numeşte limbaj simbolic sau limbaj de asamblare. Acest limbaj permite utilizatorului să
realizeze codificări simbolice ale instrucţiunilor şi ale adreselor de memorie.
Pentru a se executa un program în limbaj de asamblare, acesta trebuie translatat în prealabil în
limbaj maşină, printr-un proces numit asamblare. Programul care se translatează se numeşte program
Arhitectura Calculatoarelor 2
sursă, iar cel rezultat în urma translatării se numeşte program obiect. Operaţia de translatare a
programului sursă în program obiect este executată de un program special numit asamblor.
O instrucţiune în limbaj de asamblare corespunde unei instrucţiuni în limbaj maşină, deosebirea dintre ele
constând numai în modul de reprezentare. Deci, fiecare instrucţiune în limbaj de asamblare este
translatată într-o singură instrucţiune în limbaj maşină.
Un limbaj de asamblare este specific unui calculator, astfel încât trebuie să se cunoască
instrucţiunile şi organizarea internă a acelui calculator. Din acest motiv, s-au elaborat limbaje pentru
programe care se pot executa pe orice calculator. Acestea sunt limbaje orientate pe probleme sau limbaje
de nivel înalt, spre deosebire de limbajele de asamblare, care sunt limbaje orientate pe calculator sau
limbaje de nivel scăzut. Asemenea limbaje de nivel înalt sunt Pascal, C, LISP, PROLOG etc.
Unei instrucţiuni într-un limbaj de nivel înalt îi corespunde o succesiune de instrucţiuni în limbaj
maşină. Translatarea în limbajul maşină se poate realiza cu ajutorul unui compilator, care generează din
programul sursă un program executabil, acesta fiind executat după ce întregul program a fost compilat.
O altă posibilitate este utilizarea unui interpretor, care translatează fiecare instrucţiune în limbajul
de nivel înalt într-o succesiune de instrucţiuni maşină, acestea fiind executate imediat. În acest caz nu se
generează un program executabil. Viteza de execuţie este însă redusă, deoarece fiecare instrucţiune
trebuie interpretată chiar dacă ea este executată în mod repetat.
Uneori este mai convenabil să se considere că există un calculator ipotetic sau o maşină virtuală, a
cărui limbaj maşină este un anumit limbaj de nivel înalt. Un asemenea calculator ar executa direct
instrucţiunile limbajului de nivel înalt, fără a fi necesară utilizarea unui translator (compilator) sau
interpretor. Chiar dacă implementarea unei maşini virtuale care să lucreze direct cu un limbaj de nivel
înalt ar fi prea costisitoare, se pot scrie programe pentru această maşină, deoarece aceste programe pot fi
translatate sau interpretate cu un program care poate fi executat direct de calculatorul existent.

Modelul unui calculator numeric


Un model posibil al unui calculator numeric modern reprezintă o ierarhie de maşini virtuale pe
mai multe nivele (Figura 1.1).

Figura 1.1 - Ierarhia de nivele a unui calculator modern

Nivelul 1, numit nivelul logicii digitale, este reprezentat de componentele hardware ale calculatorului
(maşina fizică). Circuitele acestui nivel execută instrucţiunile maşină ale nivelului 2. Elementele de bază
ale acestor circuite sunt porţile logice, fiecare poartă fiind formată la rândul ei dintr-un număr de
tranzistoare. O poartă logică are una sau mai multe intrări digitale (semnale reprezentând 0 logic sau 1
logic), şi are ca ieşire o funcţie simplă a acestor intrări, de exemplu ŞI logic, SAU logic.
Nivelul 2 reprezintă setul de instrucţiuni ale unei arhitecturii concrete de microprocesor.
Producătorii de microprocesoare proiectează microprocesoarele sale ca să recunoască un anumit set de
instrucțiuni pentru a efectua operațiuni de bază, cum ar fi copierea, adunarea, sau multiplicarea. Acest set
de instrucțiuni este menționat ca limbaj mașină. Fiecare instrucțiune din limbajul mașină este executat fie
direct prin hardware-ul calculatorului sau de un microprogram încorporat în cipul microprocesorului.
De menţionat că la anumite calculatoare nivelul de microprogram lipseşte. La aceste calculatoare,
Arhitectura Calculatoarelor 3
instrucţiunile maşinii convenţionale sunt executate direct de circuitele electronice ale nivelului 1.
Nivelul 3 este nivelul limbajului de asamblare. Limbaj de asamblare, care apare la nivelul 3,
folosește mnemonice scurte, cum ar fi ADD, SUB, și MOV, care sunt ușor de compilate (asamblate) la
nivelul ISA.
Nivelul 4 constă din limbajele destinate programatorilor de aplicaţie, fiind numit nivelul
limbajelor de nivel înalt. Programele scrise în aceste limbaje sunt translatate în o mulţime de instrucţiuni
a limbajului nivelului 3 cu ajutorul compilatoarelor sau interpretoarelor.
Fiecare nivel reprezintă o abstractizare distinctă, cu diferite obiecte şi operaţii. Setul tipurilor de
date, a operaţiilor şi facilităţilor fiecărui nivel reprezintă arhitectura nivelului respectiv. Arhitectura
tratează acele aspecte care sunt vizibile utilizatorului nivelului respectiv, ca de exemplu dimensiunea
memoriei disponibile. Aspectele de implementare, ca de exemplu tehnologia utilizată pentru
implementarea memoriei, nu fac parte din arhitectură. Arhitectura calculatorului reprezintă studiul
proiectării acelor părţi ale unui sistem de calcul care sunt vizibile pentru programatori.
Arhitectura Calculatoarelor 4

2 Registrele microprocesoarelor
2.1 Noțiuni generale
În Assembler, calculatorul este văzut la nivelul hardware: adrese fizice de memorie, registre,
întreruperi etc. Sunt necesare unele noţiuni pregătitoare.
Unitatea de bază a informaţiei memorate în calculator este bitul. Un bit reprezintă o cifră binară (de aici
şi numele, care e o prescurtare de la binary digit), deci poate avea valorile 0 sau 1. Modelul hardware
corespunzător este acela de bistabil. Un bistabil este deci un circuit electronic cu două stări stabile,
codificate 0 şi 1, capabil să memoreze un bit de informaţie.
Un grup de bistabili formează un registru. De exemplu, 8 bistabili formează un registru de 8 biţi.
Informaţia care se poate memora într-un asemenea registru poate fi codificată în binar, de la valoarea
00000000 (toţi biţii egali cu 0), până la valoarea 11111111 (toţi biţii egali cu 1). Este uşor de văzut că
numărul combinaţiilor care pot fi memorate este 256 (2 la puterea a 8-a). În general, un registru de n biţi
va putea memora 2n combinaţii distincte. Aceste combinaţii se numesc octeţi sau bytes (dacă n = 8),
respectiv cuvinte (dacă n = 16, 32 etc).

2.2 Registrele microprocesoarelor х86-64

Fiecare program la execuţie obţine anumite resurse ale microprocesorului. Aceste resurse (registre)
sunt necesare pentru executarea şi păstrarea în memorie a instrucţiunilor şi datelor programului, a
informaţiei despre starea curentă a programului şi a microprocesorului.
Microprocesoarele pe 32 biţi funcţionează în diferite moduri, ce determină mecanismele de protecţie
şi de adresare a memoriei: modul real 8086 (pe 16 biţi), modul virtual 8086 (V8086), modul protejat pe
32 biţi (inclusiv protejat pe 16 biţi). Modul de funcţionare a microprocesorului este impus de sistemul de
operare (SO) în conformitate cu modul definit de aplicaţii (task-uri).
În microprocesoarele pe 64 biţi au fost introduse noi moduri de funcţionare:
 Modul pe 64 biţi (64-bit mode) – acest mod susţine adresarea virtuală pe 64 biţi şi extensiile
registrelor pe 64 biţi. În acest mod este folosit numai modelul plat de memorie (un segment
comun pentru cod, date şi stivă).
 Modul de compatibilitate (compatibility mode) permite SO să execute aplicaţii pe 32 şi 16
biţi. Pentru aplicaţii microprocesorul reprezintă un microprocesor pe 32 biţi cu toate atributele
modului protejat, cu mecanismele de segmentare şi paginare.
Microprocesoarele pe 64 biţi reprezintă seturi de registre disponibile programatorilor (figura 2.1).

Figura 2.1 Registrele microprocesoarelor х86-64


Arhitectura Calculatoarelor 5

Structura şi destinaţia regiştrilor setului FPU/MMX, XMM, de sistem vor fi prezentate în capitolul
„Modelul program ale microprocesoarelor”.

2.2.1 Regiştrii de uz general

În figura 2.2 sunt prezentaţi regiştrii de uz general pe 64 biţi.

Figura 2.2 - Regiştrii de uz general pe 64 biţi

Regiştrii pe 64 biţi sunt indicați cu prefixul (REX). Adresarea la fiecare din 16 registre se petrece ca
la un registru pe 64-, 32-, 16- sau 8 biţi (se folosesc numai biţii inferiori). Structura şi destinaţia
registrelor va fi detaliată în subcapitolele următoare, în descrierea modurilor de compatibilitate.

2.3 Modul de compatibilitate pe 16 biţi

Pentru modul de compatibilitate pe 16 biţi (modul 8086), sunt utilizați numai părţile inferioare pe 16
biţi (figura 2.3) ai registrelor microprocesoarelor pe 64 (32) biţi, setul de registre este următorul:

Figura 2.3

Toate registrele sunt de 16 biţi. O serie de registre (AX, BX, CX, DX) sunt disponibile şi la nivel de
octet, părţile mai semnificative fiind AH, BH, CH şi DH, iar cele mai puţin semnificative, AL, BL, CL şi
DL. Denumirile registrelor sunt:
 AX - registru acumulator
 BX - registru de bază general
 CX - registru contor
Arhitectura Calculatoarelor 6
 DX - registru de date
 BP - registru de bază pentru stivă (base pointer)
 SP - registru indicator de stivă (stack pointer)
 SI - registru index sursă
 DI - registru index destinaţie
Registrul notat FLAGS cuprinde flagurile (biţi indicatori) procesorului, sau bistabililor de condiţie, iar
registrul IP (instruction pointer) este registrul de instrucțiuni.
Registrele de date (AX, BX, CX, DX) pot fi folosite pentru memorarea datelor, însă unele din acestea
sunt folosite special pentru alte scopuri. De exemplu registrul CX este folosit ca contor în instrucțiunea
LOOP de ciclare, care îl modifică implicit şi-i testează valoarea, registrul DX este folosit în instrucțiunile
de împărțire si înmulțire, iar registrul BX este folosit pentru adresarea datelor (operanzilor).
În modul 8086 unui program scris în limbaj de asamblare se alocă patru zone de lucru în memorie: o
zonă pentru date, o zonă pentru instrucțiuni, o zonă specială pentru stivă şi o zonă suplimentară pentru date.
Fiecare din aceste zone pot avea până la 64K octeți şi poartă denumirea de segment. Astfel există segmentul
de date (Data Segment), segmentul de instrucțiuni, cod (Code Segment), segmentul de stivă (Stack Segment)
si segmentul suplimentar de date (Extra Segment).
Este posibil ca cele 4 segmente sa fie suprapuse total sau parțial. Adresele de început ale acestor
segmente se află în 4 registre segment.
Denumirile registrelor de segment sunt:
 CS - registru de segment de cod (code segment);
 DS - registru de segment de date (data segment);
 SS - registru de segment de stivă (stack segment);
 ES - registru de segment de date suplimentar (extra segment).
Se observă că denumirile registrelor de segment corespund zonelor principale ale unui program
executabil. Astfel, perechea de registre (CS:IP) va indica totdeauna adresa următoarei instrucţiuni care se
va executa, iar perechea (SS:SP) indică totdeauna adresa vârfului stivei. Registrele DS şi ES conţin
adresele segmentelor de date şi sunt folosite pentru a accesa date.
Dacă segmentul de date începe de la locația de memorie 1234h atunci DS va conține valoarea 1234h. Există
instrucțiuni pentru încărcarea adreselor de memorie în registrele segment.
Registrele pointer (SP si BP) se folosesc pentru calculul offsetului (distanţei faţă de începutul unui
segment) din cadrul segmentului. Cele două registre pointer sunt: pointerul de stiva SP (Stack Pointer) si
pointerul de baza (Base Pointer). SP si BP sunt registre de 16 biti.
Registrul SP reţine adresa efectivă (offsetul) a vârfului stivei (figura 2.4). Adresa fizică a vârfului stivei
SS:SP este dată de perechea de registre SS si SP, registrul SS conține adresa de început al segmentului de
stiva iar SP conține offsetul din acest registru (adică distanţa in octeți de la începutul registrului de stiva):
stiva

SP Varful stivei

offset

SS
Baza stivei
Figura 2.4

Registrul BP este folosit la calculul offset-ului din interiorul unui segment. De exemplu poate fi
folosit ca pointer al unei stive proprii, dar nu a procesorului. Este folosit în principal pentru adresarea
bazată indexată a datelor.
Registrele de index, de 16 biti sunt: SI (Source Index) si DI (Destination Index). Registrele de
index sunt folosite pentru accesul la elementele unui tablou sau a unei tabele. Aceste registre sunt folosite
îndeosebi in prelucrarea șirurilor de caractere.
Arhitectura Calculatoarelor 7
Registrul de instrucțiuni (Instruction Pointer) conține offsetul curent în segmentul de cod. Adică
adresa efectivă a următoarei instrucțiuni de executat din segmentul de cod curent. După executarea
instrucțiunii curente, microprocesorul preia din IP adresa următoarei instrucțiuni de executat şi
incrementează corespunzător valoarea lui IP, cu numărul de octeți ai codului instrucțiunii ce va fi
executată. Uneori acest registru se numește numărător de program.
Registrul de flag-uri (fanioane) (bistabili de condiţie) al modului 8086 are configuraţia din figura
2.5. O serie de flag-uri sunt flag-uri de stare: acestea sunt poziţionate la 0 sau la 1 ca urmare a unor
operaţii aritmetice sau logice, conțin informații despre ultima instrucțiune executată. Celelalte flag-uri
controlează anumite operații ale procesorului.
Din cei 16 biți ai registrului sunt folosiți 9 biți: 0, 2, 4, 6 – 11.
Aproape toate instrucțiunile limbajului de asamblare afectează biții de stare.
Semnificația flag-urilor (biţilor) este următoarea:
 CF (Carry Flag, bistabil de transport) - semnifică un transport sau un împrumut din/în bitul cel mai
semnificativ al rezultatului, de exemplu la operaţii de adunare sau de scădere.

Figura 2.5 - Registrul de flag-uri al procesorului 8086

 PF (Parity Flag, flag de paritate) - este poziţionat în aşa fel încât numărul de biţi egali cu 1 din
octetul cel mai puţin semnificativ al rezultatului, împreună cu flag-ul PF, să fie impar; altfel formulat,
suma modulo 2 (XOR) a tuturor biţilor din octetul c.m.p.s. şi a lui PF să fie 1.
 AF (Auxiliarry Carry Flag, bistabil de transport auxiliar) - indică un transport sau un împrumut
din/în bitul 4 al rezultatului.
 ZF (Zero Flag, bistabil de zero) - este poziţionat la 1 dacă rezultatul operaţiei este 0.
 SF (Sign Flag, bistabil de semn) - este poziţionat la 1 dacă b.c.m.s. al rezultatului (bitul de semn)
este 1.
 OF (Overflow Flag, bistabil de depăşire) - este poziţionat la 1 dacă operaţia a condus la o depăşire
de domeniu a rezultatului (la operaţii cu sau fără semn).
 TF (Trap Flag, bistabil de urmărire) - dacă este poziţionat la 1, se forţează o întrerupere, pe un
nivel predefinit, la execuţia fiecărei instrucţiuni; acest fapt este util în programele de depanare, în care
este posibilă rularea pas cu pas a unui program.
 IF (Interrupt Flag, bistabil de întreruperi) - dacă este poziţionat la 1, procesorul ia în consideraţie
întreruperile hardware externe; altfel, acestea sunt ignorate.
 DF (Direction Flag, bistabil de direcţie) - precizează sensul (crescător sau descrescător) de variaţie
a adreselor la operaţiile cu şiruri de octeţi sau de cuvinte.
Flag-urile CF, PF, AF, ZF, SF şi OF sunt numite flag-uri de stare (aritmetice). Flag-urile TF, IF şi DF sunt
numite flag-uri de control.

2.3.1 Formarea adresei fizice

Procesorul 8086 dispune de adrese pe 20 de biţi, fiind capabil să adreseze 1 megaoctet de memorie
(220). Se pune problema cum se formează adresa fizică pe 20 de biţi (deci pe 5 cifre hexa), deoarece toate
registrele procesorului sunt de 16 biţi, putând codifica adrese în domeniul 0000...0FFFFH (pe 4 cifre
hexa), deci într-un spaţiu de maxim 64 KO.
Memoria unui sistem cu procesor 8086 este divizată în segmente. Un segment este o zonă
continuă de memorie, de lungime maximă de 64 KO, care începe la o adresă fizică multiplu de 4. Acest
fapt înseamnă că ultima cifră hexa a adresei de început a unui segment este totdeauna 0. Ca atare, această
cifră se poate omite şi adresa de segment se poate reprezenta tot pe 16 biţi. Adresele de început ale
segmentelor se vor găsi întotdeauna în unul din cele 4 registre de segment.
Adresarea în interiorul unui segment se realizează printr-un deplasament (offset) relativ la începutul
segmentului. Deoarece un segment nu poate depăşi 64 KO, deplasamentul se poate memora tot pe 16 biţi.
Deplasamentul poate fi o constantă sau conținutul unui registru care permite adresarea memoriei.
Arhitectura Calculatoarelor 8
În concluzie, pentru adresarea unui octet de memorie, se folosesc două entităţi pe 16 biţi: o adresă
de segment (conţinută obligatoriu într-un registru de segment) şi un deplasament. Deoarece ambele
entităţi sunt pe 16 biţi, se vorbeşte de adrese (sau pointeri) de 32 de biţi, deşi adresa fizică este doar pe 20
de biţi.
Formarea adresei fizice (pe 20 de biţi) este realizată automat (prin hardware) de către o
componentă a procesorului, conform Figurii 2.6.
Concret, adresa fizică se obţine prin deplasarea adresei de segment cu 4 biţi la stânga şi prin
adunarea deplasamentului. Pentru specificarea unei adrese complete (de 32 de biţi), se foloseşte notaţia
(segment:offset) sau (registru_segment:offset). De exemplu, putem specifica o adresă prin (18A3:5B27)
sau prin (DS:5B27).

Figura 2.6 - Formarea adresei fizice

Trebuie remarcat faptul că asocierea (segment:offset) - adresă fizică nu este biunivocă, deoarece la
o aceeaşi adresă fizică pot să corespundă mai multe perechi (segment:offset). De exemplu, perechile
(18A3:5B27) şi (18A2:5B37) reprezintă aceeaşi adresă fizică. În situaţia în care deplasamentul este redus
la minim, adică în domeniul 0...F, corespondenţa devine biunivocă.
O adresă completă de 32 de biţi este memorată cu offsetul la adrese mici şi cu adresa de segment
la adrese mari. Adresele complete se pot obţine cu directiva DD (Define Double-Word).

2.3.2 Definirea segmentelor. Structura programelor


Segmentele logice conțin cele trei componente ale unui program: cod, date si stivă.
Pentru a scrie un program ASM (în modul 8086), se folosesc directivele simplificate de definire a
segmentelor. Acestea sunt:
 .model small (precizează un model de memorie)
 .stack n (definire de segment de stivă)
 .data (definire de segment de date)
 .code (definire de segment de cod)
 end etichetă (sfârşit logic al programului)
În principiu, segmentul de cod va cuprinde programul executabil (instrucţiuni), iar segmentul de date
va cuprinde date definite de utilizator. Segmentul de stivă nu este folosit explicit. Comentariile se scriu
folosind simbolul ;. Ceea ce urmează după ; până la sfârșitul liniei curente, este considerat comentariu.
Structura programului este:
.MODEL small
.STACK 512
.DATA

definirea datelor
Arhitectura Calculatoarelor 9
.CODE

declarare si definire proceduri

start: mov ax,@data


mov ds,ax

program principal

end start

Directiva .stack alocă o zonă având lungimea n (.stack n) , zonă fiind definită ca stivă (ex: .stack
200h va aloca un segment de lungime 512 octeți). Directiva rezervă (nu şi inițializează) zona dedicată
stivei. Acțiunea de inițializare este opțională. Putem scrie si .stack 512.
Directiva .code precede segmentul de program. Încărcarea acestui segment este realizata automat de
câtre DOS. In schimb registrul ds va trebui încărcat de câtre programator.
Simbolul @data va primi adresa segmentului de date, abia după momentul editării legăturilor. Date
pot exista şi în cadrul segmentului de cod. Registrele de segment nu sunt niciodată încărcate cu valori
absolute. Se lasă în seama sistemului de operare sarcina amplasării în memorie a segmentelor. Ordinea
este asigurata tot de câtre componentele sistemului de operare.
Directiva .model defineşte modul de dispunere in memoria RAM a segmentelor care alcătuiesc un
program. Sistemul DOS admite 6 modele.
Cele mai des utilizate modele de memorie sunt tiny şi small (pot fi şi medium, large sau huge).
Semnificaţia acestor tipuri este:
 tiny - toate segmentele (date, cod, stivă) se pot genera într-un spaţiu de 64KO şi formează un singur
grup de segmente. Se foloseşte la programele de tip COM.
 small - datele şi stiva sunt grupate într-un singur segment iar codul în alt segment. Fiecare din acestea
nu depăşesc 64KO.

Etichetele sunt nume simbolice de adrese (offset) ce identifică instrucțiunile. Etichetele pot fi
referite în alte instrucțiuni pentru executarea salturilor în program. Dacă referirile la o etichetă sunt făcute
în cadrul segmentului în care ea este definită atunci se spune ca ea are atributul NEAR .
Pentru declararea etichetelor în segmentul de program se utilizează operatorul : (ex: START:)
Directiva END marchează sfârşitul logic al unui modul de program şi e obligatorie în toate
modulele. Tot ce se găseşte în fişierul sursă după această directivă este ignorat la asamblare. Forma
generală este:
END [punct_de_start]
în care punct_de_start este o etichetă sau un nume de procedură care marchează punctul în care se va da
controlul după încărcarea programului în memorie.

2.4 Modul de compatibilitate pe 32 biţi (microprocesor de 32 biţi)

Pentru modul de compatibilitate pe 32 biţi, sunt utilizate numai părţile inferioare pe 32 biţi ai
registrelor microprocesoarelor pe 64 de biţi şi setul de registre de uz general este prezentat în figura 2.7.
Microprocesoarele de 32 biți sunt compatibile ca arhitectură cu cele de 16 biți, prin aceea ca registrele de
16 biți se regăsesc ca subregistre ale registrelor de 32 de biți. Pentru accesarea registrelor de 32 biţi a fost
adăugat un set de instrucţiuni.
Registrele din figură, de exemplu al, ah, ax , indică registre pe 8 şi 16 biţi ale registrului extins
eax pe 32 biți (prefix „e” (Extended)).
Arhitectura Calculatoarelor 10

Figura 2.7 - Setul de registre de uz general

Registrele generale ax, bx, cx, dx, si, di, bp şi sp de 16 biți fac parte din registrele generale de 32 biți ai
microprocesoarelor de 32 biți extinse: eax, ebx, ecx, edx, esi, edi, ebp si esp. Primii 16 biți din aceste
registre sunt registre generali ai microprocesoarelor de 16 biti.
Analog registrele IP si FLAGS de 16 biți sunt extinse la 32 biți in cazul registrelor EIP şi ELAGS
de 32 biți. Registrul FLAGS se regăsește în primii 16 biți ai registrului EFLAGS.
Registrele segment au fost păstrate de 16 biți, dar s-au adăugat două noi registre FS şi GS.
Pe lângă aceste registre, microprocesoarele de 32 (64) de biți dispun de alte registre de control, de
gestionare a adresei, de depanare şi de test, care diferă de la un tip de procesor la altul fiind folosite în
principal de programele de sistem.
Semnificația registrelor segment în cazul microprocesoarelor de 32 biți a fost modificată, ele sunt
folosite ca selectoare de segment (detaliat în capitolul – memoria virtuală). În acest caz ele nu indică o
adresă de segment, ci un descriptor de segment care precizează adresa de bază a segmentului,
dimensiunea acestuia şi drepturile de acces asociate acestuia. Astfel adresa de bază poate fi specificată pe
32 biți iar dimensiunea unui segment să fie de până la 4 GB.

2.5 Tipuri de date

Tipurile de date sunt următoarele.


Bitul. Cel mai mic element de memorare a unei informații este bitul, în care se poate memora o
cifra binara, 0 sau 1.
De obicei informația de prelucrat se reprezintă pe segmente contigue de biți denumite tetrade,
octeți, cuvinte, dublu cuvinte, quadwords si tenbytes.

Tetrada. Tetrada este o secvență de 4 biți, numerotați 0,1,2,3 de la dreapta la stânga, bitul 0 fiind
cel mai puţin semnificativ, iar bitul 3 cel mai semnificativ:

1 0 1 1
3 2 1 0
Arhitectura Calculatoarelor 11
Octetul (Byte). Octetul sau byte este un element de memorare, ce cuprinde o secvenţa de 8 biţi.
Octetul este unul dintre cele mai importante elemente (celule ) de memorare adresabile. Cei 8 biţi ai unui
octet sunt numerotaţi cu 0,1,2,...7 de la dreapta la stânga:

0 1 1 0 0 0 0 1
7 6 5 4 3 2 1 0

Octetul este format din 2 tetrade, tetradă inferioara (din dreapta) conţine biţii 0, 1, 2, 3, iar cea
superioara (din stânga) conţine biţii 4, 5, 6, 7 ai octetului.

Cuvântul(Word). Cuvântul este o secvență de 2 octeţi, respectiv 16 biţi, numerotaţi de la dreapta


spre stânga, astfel 0, 1, 2 ......14, 15. Bitul cel mai semnificativ este bitul 15. Primul octet(inferior) din
cuvânt conţine biţii 0, 1, 2, 3, 4, 5, 6, 7, iar al doilea octet(superior), biţii 7, 8, 9, 10, 11, 12, 13, 14, 15.

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

Cuvântul poate fi reprezentat printr-un registru de 16 biţi sau în doi octeţi de memorie. In
memorie, octetul inferior (biţii 0-7) este memorat la adresa mai mică, iar octetul superior (biţii 8-15) la
adresa cea mai mare.
De exemplu cuvântul 4567h se reprezintă intr-un registru de 16 biţi sub forma 4567h, iar în
memorie la adresa 1000 sub forma 6745 (octetul 67 la adresa 1000, iar octetul 45 la adresa 1001).

Dublu cuvânt (Double Word). O succesiune de 2 cuvinte (4 octeţi, 32 biți), reprezintă un dublu
cuvânt. Cei 32 de biţi ai unui dublu cuvânt sunt numerotați de la dreapta la stânga prin 0, 1, 2, ......30, 31.
Bitul cel mai semnificativ este bitul 31, octetul cel mai puțin semnificativ conține biții 0-7, iar cel mai
semnificativ octet (octetul 4) conține biții 23-31.
Un dublu cuvânt poate fi reprezentat într-un registru de 32 biți sau pe 4 octeți consecutivi de
memorie. In memorie, octetul 1-cel mai puțin semnificativ este memorat la adresa cea mai mica, iar
octetul 4-cel mai semnificativ la adresa cea mai mare (în ordinea little-endian).
De exemplu dublul cuvânt 12 34 56 78h, aflat la offset-ul 0000, va fi memorat astfel 78 56 34 12,
cu octetul 78h la offset-ul 0000, iar octetul 12h la offset-ul 0003.

Quadword. Quadword (qword) este format din 2 dublu cuvinte (4 cuvinte, respectiv 8 octeţi
succesivi de memorie). Cei 64 biţi ai unui qword sunt numerotați de la dreapta la stânga astfel: 0, 1,
2, ......62, 63. Bitul cel mai semnificativ este bitul 63. In memorie octetul 1 se reprezintă la adresa cea mai
mica, iar octetul 8 la adresa cea mai mare.

Tenbyte (10 octeți)


O succesiune de 10 octeți formează un tenbyte (tb). Cei 80 de biți ai elementului sunt numerotați
de la dreapta la stânga cu 0, 1, 2,......78, 79. In memorie octetul cel mai puțin semnificativ (biții 0-7) se
reprezintă la adresa cea mai mica, iar octetul 10 ( biții 73-80) la adresa cea mai mare.
Arhitectura Calculatoarelor 12

2.6 Definirea datelor


În limbajele de asamblare 80x86 se poate opera cu anumite tipuri de date, recunoscute de
procesor, acesta dispunând de directive (pseudoinstructiuni) specifice pentru definirea lor.

a) Byte (octet).
Acest tip de date ocupa 8 biți, adică un octet (byte). Informaţia dintr-un octet poate fi: un întreg
fără semn cuprins intre 0 si 225, un întreg cu semn cuprins intre –128 si 127, sau un caracter ASCII.
Definirea datelor de tip byte se face cu ajutorul directivelor BYTE şi SBYTE:

value1 BYTE 'A' ; character ASCII


value2 BYTE 0 ; byte fără semn
value3 BYTE 255 ; byte fără semn
value4 SBYTE −128 ; byte cu semn
value5 SBYTE +127 ; byte cu semn
value6 BYTE ? ; byte nedefinit

Definirea datelor de tip byte se face şi cu ajutorul directivei DB (Define Byte):

Fie directivele:
alfa DB 65, 72h, 75o, 11011b, 11h+22h, 0ach
DB -65, 'a', 'abc'
În memorie începând de la adresa simbolica alfa (offset, etichetă de date), se va genera secvenţa
de octeți, reprezentata in hexazecimal :

41 72 3d 1b 33 ac bf 61 61 62 63
alfa +0 +1 +2 +3 +4 +10

Valoarea binara 11011b va fi generata la adresa alfa+3.

Definirea şirurilor de caractere:


salutare1 BYTE "Good afternoon",0
greeting2 BYTE 'Good night',0

Utilizarea operatorului DUP (duplicate):


BYTE 20 DUP(0) ; 20 bytes, toate încărcate cu zero
BYTE 20 DUP(?) ; 20 bytes, nedefiniţi
BYTE 4 DUP("STACK") ; 20 bytes: "STACKSTACKSTACKSTACK"

b) WORD (cuvânt).
Un cuvânt ocupa doi octeți (16 biți) si poate fi reprezentat intr-un registru de 16 biți sau in 2 octeți
consecutivi de memorie. Numerotarea biților in cadrul unui cuvânt se face de la 0 la 15 (bitul 15 e bitul
cel mai semnificativ al cuvântului, iar bitul 0 este bitul cel mai puțin semnificativ), numerotarea se face de
la dreapta la stânga:
Informaţia memorata intr-un cuvânt poate fi :
-un întreg pe 16 biți cu semn (bitul 15 este bitul de semn), cuprins intre -215 si 215 –1,
- un întreg pe 16 biți fără semn, cuprins intre 0 si 216
- o adresa de memorie de 16 biți.
Reprezentarea celor 2 octeți ai cuvântului in memorie se face astfel încât octetul cel mai puțin
semnificativ este memorat la adresa cea mai mica. De exemplu: daca valoarea 2345h este memorata la
adresa 2000h, atunci octetul 45h se va afla la adresa 2000h, iar octetul 23h la adresa 2001h.
Generarea datelor de tip cuvânt se poate face folosind directivele de tip WORD şi SWORD:

word1 WORD 65535 ; întreg pe 16 biți fără semn


word2 SWORD -32768 ; întreg pe 16 biți cu semn
word3 WORD ? ; neiniţializat
Arhitectura Calculatoarelor 13
Generarea datelor de tip cuvânt se poate face şi cu directiva de tip DW (Define Word):
Fie secvenţa de directive:

beta DW 4567h, 0bc4ah, 1110111011b, 2476o


DW -7683, 7683, 'ab'

In memorie de la adresa “beta” se vor genera octeții:

67 45 4a bc bb 03 3e 05 fd e1 03 e1 62 61
beta +2 +4 +6 +8 +12

Constanta octala 2476o este generată de la adresa beta +6.

c) Double WORD(dublu cuvânt)


Un dublu cuvânt ocupa 2 cuvinte sau 4 octeți ( 32 biți ) si poate fi reprezentat in memorie pe 4
octeți consecutivi, într-o pereche de registre de 16 biți sau într-un registru de 32 biți (la procesoarele de 32
biți).
Informația memorata într-un dublu cuvânt poate fi:
 un întreg pe 32 biți, cu sau fără semn;
 un număr real in simplă precizie;
 sau o adresă fizică de memorie de 32 biți.
Generarea datelor de tip dublu cuvânt se poate face folosind directivele DWORD şi SDWORD:

val1 DWORD 12345678h ; fără semn


val2 SDWORD −21474836 ; cu semn
val3 DWORD 20 DUP(?) ; fără semn

Generarea datelor de tip dublu cuvânt se face şi cu directiva DD (Define Double Word):

Reprezentarea celor doua cuvinte a unui dublu cuvânt de memorie se face astfel încât cuvântul cel
mai puțin semnificativ este memorat la adresa cea mai mica. De exemplu dublul cuvânt 12345678 h, aflat
la adresa 2000h se memorează astfel: cuvântul 5678h se memorează la adresa 2000h, iar cuvântul 1234h
la adresa 2002h.
Secvenţa de directive :

val1 DD 12345678h ; fără semn


val2 DD −21474836 ; cu semn

d) QUAD – WORD (8 octeți)


Tipul Quad – word (QWORD) ocupa 8 octeți și este reprezentat in memorie pe 64 biți sau într-o
pereche de registre de 32 biți (în cazul procesoarelor de 32 biți), sau într-un registru pe 64 biţi.
Informaţia stocata intr-un qword poate fi: un întreg cu sau fără semn pe 64 biți, sau un număr real
în dublă precizie.
Generarea unor date de tip qword se face cu ajutorul directivei QWORD:

quad1 QWORD 1234567812345678h

Generarea unor date de tip qword se face şi cu directiva DQ (Define Quad – word):

quad1 DQ 1234567812345678h

Reprezentarea in memorie a celor 8 octeți ai unui qword se face astfel încât octetul cel mai puțin
semnificativ este memorat la adresa cea mai mica.
Arhitectura Calculatoarelor 14

e) Ten Bytes
Valorile Ten – byte (tbyte) ocupă 10 octeți consecutivi de memorie, sau unul din registrele
coprocesorului matematic.
Informaţia stocata intr-un tbyte poate fi: un număr întreg reprezentat ca o secvenţa de cifre BCD
(format împachetat) cu sau fără semn, sau un număr real in precizie extinsa.
Generarea unor date de tip tbyte se face cu directiva TBYTE, de ex. valoarea zecimală -1234:

intVal TBYTE 80000000000000001234h

Generarea datelor de tip tbyte se face şi cu directiva DT ( Define Ten Bytes):

intVal DT 80000000000000001234h

În format BCD împachetat fiecare cifra zecimală se reprezintă pe o tetradă (4 biți), deci 2 cifre
BCD pe octet. Un întreg BCD se poate reprezenta cu maxim 19 cifre zecimale, care ocupă 76 biți. Ultima
tetradă aflată la adresa cea mai mare este destinată memorării semnului.

f) Definirea datelor în virgulă mobilă


Definirea datelor în virgulă mobilă se face cu directivele:
 REAL4 – defineşte variabile în virgulă mobilă, în simpla precizie pe 32 biţi;
 REAL8 – defineşte variabile în virgulă mobilă, în dubla precizie pe 64 biţi;
 REAL10 – defineşte variabile în virgulă mobilă, cu precizie extinsă pe 80 biţi.

rVal1 REAL4 -1.2


rVal2 REAL8 3.2E-260
rVal3 REAL10 4.6E+4096
ShortArray REAL4 20 DUP(0.0)

Definirea datelor în virgulă mobilă se face şi cu directivele:


rVal1 DD -1.2
rVal2 DQ 3.2E-260
rVal3 DT 4.6E+4096

Gama valorilor definite pot fi:

REAL4 - 1.18 x10-38 până 3.40 x1038


REAL8 - 2.23x10-308 până 1.79x10308
REAL10 - 3.37x10-4932 până 1.18x104932
2.7 Setul de instrucţiuni MASM

În cadrul acestui subcapitol, sunt prezentate în detaliu instrucţiunile de bază ale familiei de
microprocesoare Intel (x86). Acolo unde este cazul, se specifică tipurile interzise de adresare.
Setul de instrucţiuni este grupat în 6 clase:
 instrucţiuni de transfer, care deplasează date între memorie sau porturi de intrare/ieşire şi registrele
microprocesorului, fără a executa nici un fel de prelucrare a datelor;
 instrucţiuni aritmetice şi logice, care prelucrează date în format numeric;
 instrucţiuni pentru şiruri, specifice operaţiilor cu date alfanumerice;
 instrucţiuni pentru controlul programului, care în esenţă se reduc la salturi şl la apeluri de
proceduri;
 instrucţiuni specifice întreruperilor hard şi soft;
 instrucţiuni pentru controlul procesorului.
Această împărţire este realizată după criterii funcţionale. De exemplu, instrucţiunile PUSH şi POP
sunt considerate ca instrucţiuni de transfer, deşi, la prima vedere, ar putea fi considerate instrucţiuni
Arhitectura Calculatoarelor 15
specifice procedurilor. Acelaşi lucru despre instrucţiunile IN şi OUT, care interfaţează microprocesorul cu
lumea exterioară: ele sunt considerate instrucţiuni de transfer, deşi ar putea fi considerate instrucţiuni de
intrare/ieşire. Intrările şi ieşirile sunt însă cazuri particulare de transfer.
Fiecare categorie de instrucţiuni este însoțită de specificarea explicită a flag-urilor (indicatorilor de
condiţie) care sunt modificaţi în urma execuţiei.
Structura generală a instrucţiunilor x86 este următoarea:

[eticheta:] mnemonic [operanzi][ ; comentariu ]


Instrucţiunile pot conţine zero, unu, doi sau trei operanzi. Omitem câmpurile etichetă şi comentariu:

mnemonic
mnemonic [destinatie]
mnemonic [destinatie],[sursa]
mnemonic [destinatie],[ sursa-1],[ sursa-2]

Sunt trei tipuri de bază de operanzi:


 valoare imediată
 registru (valoare se află în registru al microprocesorului)
 referinţă la o locaţie de memorie.

2.7.1 Instrucţiuni pentru transferuri de date, instrucţiuni în aritmetica binara și în


aritmetica BCD. Noțiuni teoretice
Instrucţiunile de transfer permit copierea unui octet sau cuvânt de la sursa la destinaţie. Destinaţia
poate fi un registru, locaţie de memorie sau un port de ieşire, iar sursa poate fi un registru, o locaţie de
memorie, constante sau port de intrare. Ca regula generală destinaţia și sursa nu pot fi ambele locaţii de
memorie. În specificarea sursei și destinaţiei se vor folosi notaţiile:
 segment: offset pentru adrese fizice;
 [x] paranteze patrate pentru a desemna “conţinutul lui x”.

Instrucţiuni de transfer
a) Instrucţiunea MOV (Move Data).
Forma generală a instrucţiunii Mov este:
mov dest, sursa ; [dest]  [sursa]
realizează transferul informaţiei de la adresa efectiva data de sursa la dest.
Restricţii:
 Este necesar ca ambii operanzi să fie de aceiași mărime;
 Ambii operanzi nu pot fi locaţii de memorie (este necesară utilizarea unui registru);
 Registrele IP, EIP, sau RIP nu pot fi ca operanzi destinaţie.

Structura instrucţiunii MOV poate fi următoarea:

MOV reg,reg
MOV mem,reg
MOV reg,mem
MOV mem,imm
MOV reg,imm

Exemple:

.data
Arhitectura Calculatoarelor 16
var1 WORD ?
var2 WORD ?
.code
mov ax,var1
mov var2,ax

.data
oneByte BYTE 78h
oneWord WORD 1234h
oneDword DWORD 12345678h
.code
mov eax,0 ; EAX = 00000000h
mov al,oneByte ; EAX = 00000078h
mov ax,oneWord ; EAX = 00001234h
mov eax,oneDword ; EAX = 12345678h
mov ax,0 ; EAX = 12340000h

.data
alfa dw 1234h
beta db 56h
.code
mov ax, alfa; transfera conţinutul adresei alfa în ax
mov bx, offset beta; transfera adresa efectiva alfa în bx
mov al, 75h; transfera 75h în al
mov cx, [100]; transfera conţinutul adresei 100 în cx
mov [di], bx; transfera conţinutul lui bx la adresa conţinuta în di
mov byte ptr alfa , [bx]; pune conţinutul octetului de la adresa
;dată de bx la adresa alfa

Instrucţiunea MOVZX (move with zero-extend)


Copie conţinutul sursei în destinaţie cu extinderea valorii întroducând zerouri. Această instrucţiune este
utilizată numai petru valori fără semn. Sunt trei variante:

MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8

Exemple:
.data
byteVal BYTE 10001111b
.code
movzx ax,byteVal ; AX = 0000000010001111b

.data
Arhitectura Calculatoarelor 17
byte1 BYTE 9Bh
word1 WORD 0A69Bh
.code
movzx eax,word1 ; EAX = 0000A69Bh
movzx edx,byte1 ; EDX = 0000009Bh
movzx cx,byte1 ; CX = 009Bh

Instrucţiunea MOVSX (move with sign-extend)


Copie conţinutul sursei în destinaţie cu extinderea valorii întroducând unităţi. Această instrucţiune este
utilizată numai petru valori cu semn. Sunt trei variante:

MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8
Exemplu:

mov bx,0A69Bh
movsx eax,bx ; EAX = FFFFA69Bh
movsx edx,bl ; EDX = FFFFFF9Bh
movsx cx,bl ; CX = FF9Bh

Exemplu de program:
.data
val1 WORD 1000h
val2 WORD 2000h
arrayB BYTE 10h,20h,30h,40h,50h
arrayW WORD 100h,200h,300h
arrayD DWORD 10000h,20000h
.code
main PROC
; Demonstrating MOVZX instruction:
mov bx,0A69Bh
movzx eax,bx ; EAX = 0000A69Bh
movzx edx,bl ; EDX = 0000009Bh
movzx cx,bl ; CX = 009Bh
; Demonstrating MOVSX instruction:
mov bx,0A69Bh
movsx eax,bx ; EAX = FFFFA69Bh
movsx edx,bl ; EDX = FFFFFF9Bh
mov bl,7Bh
movsx cx,bl ; CX = 007Bh
; Memory-to-memory exchange:
mov ax,val1 ; AX = 1000h
xchg ax,val2 ; AX=2000h, val2=1000h
mov val1,ax ; val1 = 2000h
; Direct-Offset Addressing (byte array):
mov al,arrayB ; AL = 10h
mov al,[arrayB+1] ; AL = 20h
mov al,[arrayB+2] ; AL = 30h
; Direct-Offset Addressing (word array):
mov ax,arrayW ; AX = 100h
mov ax,[arrayW+2] ; AX = 200h
; Direct-Offset Addressing (doubleword array):
mov eax,arrayD ; EAX = 10000h
Arhitectura Calculatoarelor 18
mov eax,[arrayD+4] ; EAX = 20000h
mov eax,[arrayD+4] ; EAX = 20000h

b) Instrucţiunea XCHG ( Exchange Data )


Interschimbă sursa cu destinaţia. Forma generală:
XCHG dest, sursa
Restricţii:
 registrele de segment nu pot apărea ca operanzi;
 cel puţin un operand trebuie sa fie un registru general.

Sunt trei variante:


XCHG reg,reg
XCHG reg,mem
XCHG mem,reg

Exemple:
xchg al, ah
xchg alfa, ax
xchg sir [si], bx
xchg eax,ebx ; exchange 32-bit regs

Interschimbarea conţinutului a doi operanzi din memorie op1 și op2 se poate face prin secvenţa de
instrucţiuni:
mov reg, op1
xchg reg, op2
mov op2, reg

c) Instrucţiunea XLAT (Translate)


Forma generală:
XLAT
Instrucţiunea nu are operanzi, semnificaţia fiind:
[al] ds: [[bx]+[al]]
adică se transfera în al conţinutul octetului de la adresa efectiva : [bx]+[al].
Instrucţiunea se folosește la conversia unor tipuri de date, folosind tabele de conversie, adresa
acestor tabele se introduce în bx, iar în al se introduce poziţia elementului din tabel. De exemplu:
conversia unei valori numerice cuprinsă intre 0 și 15 în cifrele hexazecimale corespunzătoare, se poate
face prin:
tabel BYTE '0123456789abcdef''
..........
lea bx, tabel
mov al,11
xlat
În al se va depune cifra hexazecimala b.

c) Instrucţiunile IN (Input Data) şi OUT (Output Data)


Instrucţiunea IN execută o citire de 8, 16, 32 biţi de la portul de intrare. Şi invers, instrucţiunea
OUT execută o scriere de 8, 16, 32 biţi într-un port. Sintaxa este urmatoarea:
IN accumulator,port
OUT port,accumulator

Port poate fi o constantă cu plaja 0 - FFh, sau poate fi o valoare încărcată în registrul DX cu plaja
0 - FFFFh. Ca Accumulator va fi registrul AL pentru transferuri pe 8-biţi, AX pentru transferuri pe 16-
biţi şi EAX pentru transferuri pe 32-biţi.
Exemple:
Arhitectura Calculatoarelor 19
in al,3Ch ; input byte from port 3Ch
out 3Ch,al ; output byte to port 3Ch
mov dx, portNumber ; DX can contain a port number
in ax,dx ; input word from port named in DX
out dx,ax ; output word to the same port
in eax,dx ; input doubleword from port
out dx,eax ; output doubleword to same port

f) Instrucţiunea LEA (Load Effective Address)


Are ca efect încarcărea adresei efective (offsetul) intr-un registru general.
Forma generală:
LEA reg, sursa
unde:
 sursa - este un operand aflat în memorie, specificat printr-un mod de adresare ;
 reg - este un registru general.
Exemplu:
lea bx, alfa
lea si, alfa [bx][si]
Acelaşi efect se obţine folosind operandul OFFSET în Instrucţiunea MOV:
mov bx, offset alfa
mov si, offset alfa [bx][si]

g) Instrucţiunea LDS/ LES (Load Data Segment/ Load Extra Segment)


Forma generală:
LDS reg, sursa
unde:
 reg -este un registru general de 16 biti;
 sursa -este un operand de tip double – word aflat în memorie, care conţine o adresă completă de 32
biţi.
Are ca efect transferul unei adrese complete în perechea de registre ds și reg specificat în instrucţiune,
adică:
[reg]  [[sursa]]
[ds]  [[sursa] + 2]
Exemplu:
alfa byte 25
adr_alfa dword alfa
. . . . . . .. . .. . . .
lds si, adr_alfa ; în registru si se transferă offset-ul,
;iar în ds adresa de segment a celulei alfa
mov byte ptr [si], 75
. . . . .. . . .. . . . . . . .

i) Instrucţiunea LAHF (Load AH with FLAGS)


Instrucţiunea încarcă în registrul AH octetul dat de partea cea mai puţin semnificativa a registrului
FLAGS, ce conţine indicatorii. Instrucţiunea nu are operanzi.
AH  FLAGS 07
Ex.
.data
saveflags BYTE ?
.code
lahf ; load flags into AH
mov saveflags,ah ; save them in a variable

j) Instrucţiunea SAHF (Store AH into FLAGS)


Instrucţiunea încarcă în registrul FLAGS (EFLAGS or RFLAGS), în octetul cel mai puţin
semnificativ conţinutul registrului AH, adică:
Arhitectura Calculatoarelor 20
FLAGS  [AH] 07
Instrucţiunea nu are operanzi.

Ex.
mov ah,saveflags ; load saved flags into AH
sahf ; copy into Flags register

Instrucţiunea PUSH
Instrucţiunea PUSH decrementează registrul ESP şi copie operandul sursă în stivă. Un operand pe
16 biţi decrementează registrul ESP cu 2, iar un operand pe 32 biţi – cu 4. Sunt 3 formate ale instrucţiunii:

PUSH reg/mem16
PUSH reg/mem32
PUSH imm32

Instrucţiunea POP
Instrucţiunea PUSH copie conţinutul stivei în operandul sursă pe 16 sau 32 biţi şi incrementează
registrul ESP cu valorile 2 sau 4 respectiv. Sunt 2 formate ale instrucţiunii:

POP reg/mem16
POP reg/mem32

Instrucţiunile PUSHFD şi POPFD


Instrucţiunea PUSHFD copie conţinutul registrului EFLAGS pe 32 biţi în stivă, iar POPFD
extrage din stivă valoarea pe 32 biţi şi încarcă registrul de fanioane EFLAGS.
pushfd
popfd

Instrucţiunile PUSHAD, PUSHA, POPAD şi POPA


Instrucţiunea PUSHAD copie conţinutul registrelor de uz general în stivă în ordinea următoare:
EAX, ECX, EDX, EBX, ESP (valorile înaintea execuţiei PUSHAD), EBP, ESI şi EDI. Iar
inctrucţiunea POPAD extrage din stivă şi încarcă regiştrii de uz general în ordinea inversă.
Respectiv instrucţiunea PUSHA copie conţinutul registrelor de uz general pe 16 biţi în stivă în
ordinea următoare: AX, CX, DX, BX, SP, BP, SI, DI. Iar inctrucţiunea POPA extrage din stivă şi încarcă
regiştrii de uz general pe 16 biţi, în ordinea inversă.

2.7.2 Aritmetica binara


Aceste instrucțiuni modifica conţinutul registrului FLAGS.

a) Instrucţiunea ADD (Add)


Forma generală:
ADD dest, sursa ; [dest]  [dest] + [sursa]
unde:
 dest poate fi un registru general sau o locaţie de memorie;
 sursa poate fi un registru general, o locaţie de memorie sau o constantă.
Operanzii au aceeaşi structură ca la instrucţiunea MOV. Cei doi operanzi nu pot fi simultan locaţii de
memorie.
Operaţia se poate efectua pe 8,16, 32 sau pe 64 biţi. Cei doi operanzi trebuie sa aibă aceeaşi dimensiune
(acelaşi tip). În caz de ambiguitate se va folosi operatorul PTR.
Indicatorii afectaţi sunt: AF, CF, PF, SF, ZF și OF

Exemple:
add ax, 5
add bl, 5
add ax, bx
Arhitectura Calculatoarelor 21
add word ptr [bx], 75
add alfa, ax
add alfa, 5
add byte ptr [si], 75
add byte ptr alfa, 75

.data
var1 DWORD 10000h
var2 DWORD 20000h
.code
mov eax,var1 ; EAX = 10000h
add eax,var2 ; EAX = 30000h

.data
sum qword 0

.code
mov rax,5
add rax,6
mov sum,rax

b) Instrucţiunea ADC (Add with Carry)


Forma generală:
ADC dest, sursa ; [dest)  [dest] + [sursa] + [CF]
Unde dest și sursa au aceeasi semnificaţie ca la instrucţiunea ADD, iar CF este Carry Flag.
Instrucţiunea adună conţinutul dest cu conţinutul sursei și cu bitul de transport CF. Indicatorii afectaţi sunt
aceeaşi de la instrucţiunea ADD.
Operaţia ADC se folosește la adunări de operanzi pe mai multe cuvinte, operaţie în care poate
apărea transport de care trebuie să se țină seama.
Exemplu 1. Să se adune doua numere op1, op2 pe 2 cuvinte (dword).
op1 dword 12345678h
op2 dword 0abcdefgh
rez dword ?
...................................
mov ax, word ptr op1
add ax, word ptr op2
mov word ptr rez, ax
mov ax, word ptr op1+2
adc ax, word ptr op2+2; se considera eventualul transport
mov word ptr rez+2, ax

Exemplu 2. Adunăm 2 numere întregi pe 8 biţi (FFh + FFh), producănd un rezultat pe 16-biţi, suma va
fi in DL:AL, care este 01FEh:
mov dl,0
mov al,0FFh
add al,0FFh ; AL = FEh
adc dl,0 ; DL/AL = 01FEh

c) Instrucţiunea SUB (Substrat)


Forma generală:
SUB dest, sursa ; [dest]  [dest] – [sursa]
Arhitectura Calculatoarelor 22
unde dest și sursa au aceeaşi semnificaţie ca la instrucţiunea ADD. Indicatorii afectaţi sunt cei specificaţi
la ADD. Structura operanzilor ca la instrucţiunea MOV.
.data
var1 DWORD 30000h
var2 DWORD 10000h
.code
mov eax,var1 ; EAX = 30000h
sub eax,var2 ; EAX = 20000h

d) Instrucţiunea SBB (Substrat with Borrow)


Forma generală:
SBB dest, sursa ; [dest]  [dest] – [sursa] – [CF]
unde semnificația dest, sursa și CF sunt cele prezentate la ADC. Instrucţiunea SBB ia în considerare
eventualul împrumut. Exemplu:
Op1 dword 12345678h
Op2 dword 0abcdef78h
Rez dword ?
.............
mov ax, word ptr op1
sub ax, word ptr op2
mov word ptr rez, ax
mov ax, word ptr op1 + 2
sbb ax, word ptr op2 + 2 ; se considera eventualul împrumut
mov word ptr rez + 2, ax
Alt exemplu. Scăderea dintr-un întreg de 64 biţi un untreg de 32 biţi. Perechea de regiştri EDX:EAX se
încarcă cu valoarea 0000000700000001h şi scădem 2. La prima etapă se va scădea din partea inferioară
(EAX-00000001h), adică din 1 vom scădea 2, ce va duce la împrumut cu setarea indicatorului Carry.

mov edx,7 ; partea superioar?
mov eax,1 ; partea inderioar?
sub eax,2 ; sc?derea  2
sbb edx,0 ; sc?derea p?r?ii superioare

e) Instrucţiunea INC (Increment)


Forma generală:
INC dest ; [dest]  [dest] + 1
unde dest este un registru general, un operand din memorie. Semnificația fiind operandul dest este
incrementat cu unu. Indicatorii afectaţi sunt AF, PF, SF, ZF, OF.
Exemple:
inc alfa
inc bl
Arhitectura Calculatoarelor 23
inc eax
inc rbx
inc word ptr [bx] [si]

f) Instrucţiunea DEC (decrement)


Forma generală:
DEC dest ; [dest]  [dest] – 1
unde dest are aceeaşi semnificaţie ca dest de la Instrucţiunea INC. Aceeaşi indicatori ca la INC sunt
afectaţi.

g) Instrucţiunea NEG (Negate)


Forma generală:
NEG dest : [dest]  0 – [dest] schimbare de semn

unde dest este un operand pe 8, 16, 32 sau 64 biţi ce poate fi un registru general sau o locaţie de memorie.
Instrucţiunea afectează indicatorii AF, CF, PF, SF, OF și ZF.
Exemplu:
alfa byte 75
............
mov al, alfa
neg al
mov alfa, al ; la adresa alfa avem - 75
sau
neg alfa

h) Instrucţiunea CMP (Compare)


Forma generală:
CMP dest, sursa ; [dest] – [sursa]
Instrucţiunea realizează o operaţie de scădere intre cei doi operanzi, fără a modifica operandul
dest sau sursa cu poziţionarea indicatorilor de condiţie. Indicatorii afectaţi sunt: AF, CF, PF, SF, ZF și OF.
Aceasta instrucţiune se folosește împreuna cu instrucţiunea de salt condiţionat.
Când comparăm doi operanzi fără semn indicatoarele Zero şi Carry indică următoarea relaţie între
operanzi:

Exemple:
cmp ax, alfa[bx][si]
cmp [si], 0

i) Instrucţiunea CBW (Convert Byte to Word)


Are ca efect extinderea bitului de semn (AL7) din AL la întreg registru AH, adică:
daca bitul de semn AL7 = 0 atunci [ah]  00h
altfel [ah]  0ffh.
Arhitectura Calculatoarelor 24

Instrucţiunea nu are operanzi și nu afectează indicatorii de condiţie.


Exemplu. Se cere să se adune un număr întreg cu semn reprezentat pe octet cu un număr întreg cu semn
pe cuvânt.
a sbyte -75
b sword -188
c sword ?
.........
mov al, a
cbw ; converteşte octetul la cuvânt
add ax, b
mov c, ax
..........

j) Instrucţiunea CWD (Convert Word to Double Word)


Are ca efect extinderea bitului de semn din AX [AX15] la întreg registrul DX, obţinându-se astfel AX pe
32 de biţi, adică:
daca semnul [AX15] = 0 atunci [dx]  0000h,
altfel [dx]  0ffffh.

Instrucţiunea nu are operanzi și nu afectează indicatorii de condiţie.


Exemplu. Se cere diferenţa dintre un operand reprezentat pe 2 cuvinte (do) și unul reprezentat pe cuvânt
(so)
do dword 12345678h
so word 0abcdh
rez dword ?
................
mov ax, so
cwd ; operandul so reprezentat în DX : AX
mov bx, ax ; salvează ax în bx
mov ax, word ptr do
sub ax, bx
mov word ptr rez, ax
mov ax, word ptr do + 2
sbb ax, dx ; ia în considerare eventualul transport
mov word ptr rez + 2

Instrucţiunea CDQ (convert doubleword to quadword)


Are ca efect extinderea bitului de semn din EAX [EAX15] la întreg registrul EDX, obţinându-se astfel
EAX pe 64 de biţi, adică:
daca semnul [EAX15] = 0 atunci [EDX]  00000000h,
altfel [edx]  0ffffffffh.

Instrucţiunea nu are operanzi și nu afectează indicatorii de condiţie.

k) Instrucţiunea MUL (Multiply)


Forma generală:
MUL reg/mem8
MUL reg/mem16
Arhitectura Calculatoarelor 25
MUL reg/mem32
unde reg poate fi un registru sau o locaţie de memorie mem de 8, 16, 32 biţi. Rezultatul se obţine pe un
număr dublu de biţi (16, 32, 64). Operaţia realizată este produsul intre acumulator și sursa cu depunerea
rezultatului în acumulatorul extins. Cei doi operanzi se consideră numere fără semn.
Dacă sursa este pe octet avem:
[AX]  [AL] * [reg/mem8]

mov al,5h
mov bl,10h
mul bl ; AX = 0050h, CF = 0
Diagrama ilustrează interacţiunea dintre registre:

Dacă sursa este pe cuvânt avem:


[DX:AX]  [AX] * [reg/mem16]

.data
val1 WORD 2000h
val2 WORD 0100h
.code
mov ax,val1 ; AX = 2000h
mul val2 ; DX:AX = 00200000h, CF = 1

Diagrama ilustrează interacţiunea dintre registre:

Dacă sursa este pe 32 biţi avem:


[EDX:EAX]  [EAX] * [reg/mem32]

mov eax,12345h
mov ebx,1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF = 0

Diagrama ilustrează interacţiunea dintre registre:

iar dacă sursa este pe 64 biţi avem:


[RDX:RAX]  [RAX] * [reg/mem64]

mov rax,0FFFF0000FFFF0000h
mov rbx,2
mul rbx ; RDX:RAX = 0000000000000001FFFE0001FFFE0000

Afectează indicatorii CF și OF, ceilalţi sunt nedefiniţi.

l) Instrucţiunea IMUL (Integer Multiply)


Arhitectura Calculatoarelor 26
Instrucţiunea IMUL semnifică înmulţirea cu semn. Instrucţiunea poate avea 1, 2, sau 3operanzi. Afectează
indicatorii CF și OF, restul sunt nedefiniţi.
Structura cu un operand:

IMUL reg/mem8 ; AX = AL * reg/mem8
IMUL reg/mem16 ; DX:AX = AX * reg/mem16
IMUL reg/mem32 ; EDX:EAX = EAX * reg/mem32

Structura cu doi operanzi. Structura cu doi operanzi trunchiază produsul la lăţimea registrului de
destinație. Dacă cifrele semnificative sunt pierdute, se setează indicatorii CF și OF.

IMUL reg16,reg/mem16
IMUL reg16,imm8
IMUL reg16,imm16

IMUL reg32,reg/mem32
IMUL reg32,imm8
IMUL reg32,imm32

Structura cu 3 operanzi - op1=op2*op3 (trunchiază produsul):

IMUL reg16,reg/mem16,imm8
IMUL reg16,reg/mem16,imm16

IMUL reg32,reg/mem32,imm8
IMUL reg32,reg/mem32,imm32

Exemplu cu 2 operanzi:

.data
word1 SWORD 4
dword1 SDWORD 4
.code
mov ax,­16  ; AX = ­16
mov bx,2  ; BX = 2
imul bx,ax  ; BX = ­32
imul bx,2  ; BX = ­64
imul bx,word1 ; BX = ­256
mov eax,­16  ; EAX = ­16
mov ebx,2  ; EBX = 2
imul ebx,eax ; EBX = ­32
imul ebx,2  ; EBX = ­64
imul ebx,dword1 ; EBX = ­256

Exemplu cu 3 operanzi:
.data
word1 SWORD 4
dword1 SDWORD 4
.code
imul bx,word1,­16  ; BX = word1 * ­16
imul ebx,dword1,­16  ; EBX = dword1 * ­16
imul ebx,dword1,­2000000000 ; signed overflow!

m) Intructiunea DIV (Divide)


Arhitectura Calculatoarelor 27
Forma generală:
DIV sursa
unde sursa este un registru sau o locaţie de memorie, reprezentata pe octet, cuvânt, 32 biţi sau 64 biţi.
Instrucţiunea realizează împărțirea fără semn intre deîmpărţit și împărţitor. Daca împărţitorul (sursa) este
reprezentat pe octet atunci deîmpărţitul este AX și rezultatul este: câtul în al iar restul în ah, adică:

DIV sursa ; [al] [ax]/ [sursa]


; [ah] restul împărţirii [ax]/ [sursa]

mov ax,0083h  ; deîmp?r?itul
mov bl,2  ; împ?r?itorul
div bl  ; AL = 41h­catul, AH = 01h­restul

Daca împărţitorul (sursa) este reprezentat pe cuvânt atunci deîmpărţitul este considerat în DX și
AX, câtul se obţine în AX iar restul în DX, adică
DIV sursa ; [ax] câtul împărţirii [dx:ax]/[sursa]
; [dx] restul împărţirii [dx:ax]/[sursa]

mov dx,0 ; clear deîmpartitul, high
mov ax,8003h ; deîmpartitul, low
mov cx,100h ; împartitorul
div cx ; AX = 0080h­câtul, DX = 0003h­restul

Daca împărţitorul (sursa) este reprezentat pe 32 biţi atunci deîmpărţitul este considerat în EDX și EAX
(64 biţi), câtul se obţine în EAX iar restul în EDX

.data
dividend QWORD 0000000800300020h
divisor DWORD 00000100h
.code
mov edx,DWORD PTR dividend + 4 ; high doubleword
mov eax,DWORD PTR dividend ; low doubleword
div divisor ; EAX = 08003000h, EDX = 00000020h

Daca împărţitorul (sursa) este reprezentat pe 64 biţi atunci deîmpărţitul este considerat în RDX și RAX
(64 biţi), câtul se obţine în RAX iar restul în RDX
.data
dividend_hi QWORD 0000000000000108h
dividend_lo QWORD 0000000033300020h
divisor QWORD 0000000000010000h
.code
mov rdx,dividend_hi
mov rax,dividend_lo
div divisor  ; RAX = 0108000000003330
Arhitectura Calculatoarelor 28
; RDX = 0000000000000020

Toţi indicatorii nu sunt definiţi. Operaţia de împărţire poate conduce la depăşiri, dacă câtul depășește
valoarea maximă reprezentabilă pe 8, respectiv pe 16 biţi sau daca împărţitorul este 0.

n) Instrucţiunea IDIV (Integer Divide)


Forma generală:
IDIV sursa
Semnificația instrucțiunii și a operandului sursa este aceeasi ca la Instrucţiunea DIV, cu o singură
diferență importantă – deîmpărţitul cu semn trebuie să fie extins înainte ca împărţirea să fie executată.
Extinderea semnului se execută cu instrucţiunile CBW, CWD, CDQ.
Indicatorii sunt nedefiniţi. Operaţia poate conduce la depăsiri.
Ex. Împărţim -48 la +5
.data
byteVal SBYTE ­48 ; D0 hexadecimal
.code
mov al,byteVal ; partea inferioar? a deîmp?r?itului
cbw  ; extindem AL in AH
mov bl,+5  ; împ?r?itorul
idiv bl  ; AL = ­9 ­ câtul, AH = ­3 ­ restul

2.7.3 Aritmetica BCD

2.3.1 Instrucțiunea AAA (ASCII Adjust for Addition)


Instrucțiunea nu are operanzi și execută corecția acumulatorului AX, după operații de adunare cu numere
în format BCD despachetat. Semnificația este:
daca [AL0:3] > 9 sau [AF] = 1, atunci {
[AL]  [AL] + 6
[AH]  [AH]+1
[AF] 1
[CF] 1
[AL]  [AL] AND 0FH
}
Indicatorii afectați : AF, CF, restul nedefiniți.
Exemplu:
mov ax, 408h
mov dx, 209h
add ax, dx ; [ax]=0611h
AAA ; [ax]=0707h

2.3.2 Instrucțiunea AAS (ASCII Adjust for Subtraction)


Instrucțiunea nu are operanzi și execută corecția acumulatorului AX, după operații de scădere cu numere
in format BCD despachetat. Semnificația este:
daca [AL0:3] > 9 sau [AF] = 1, atunci {
[AL]  [AL] - 6
[AH]  [AH] - 1
[AF] 1
[CF] 1
[AL]  [AL] AND 0FH
}
Indicatorii afectați : AF, CF, restul nedefiniți.
Exemplu:
mov ax, 408h
mov dx, 209h
sub ax, dx ; [ax]=01ffh
AAS ; [ax]=0109h
Arhitectura Calculatoarelor 29

2.3.3 Instrucțiunea DAS (Decimal Adjust for Substraction)


Instrucțiunea nu are operanzi și execută corecția zecimala a acumulatorului AL, după operații de
scădere cu numere în format BCD împachetat. Semnificația este:
daca [AL0:3] > 9 sau [AF] = 1, atunci {
[AL]  [AL] - 6
[AF]  1
}
daca acum [AL4:7] > 9 sau CF = 1, atunci {
[AL]  [AL] - 60H
[CF]  1
}
Indicatorii afectați : AF, CF, PF, SF, ZF. Indicatorul OF este nedefinit.
De exemplu, în urma secvenței:
MOV AL, 52H
SUB AL, 24H ; AL = 2EH
DAS ; AL = 28H
se obține în AL rezultatul corect 28H.

2.3.5 Instrucțiunea AAM (ASCII Adjunct for Multiply)


Instrucțiunea nu are operanzi și efectuează o corecție a acumulatorului AX, după o înmulțire pe 8
biți cu operanzi în format BCD despachetat.
Semnificația este următoarea:
[AH]  [AL] / 10
[AL]  [AL] MOD 10

Indicatori afectați: PF, SF, ZF, restul nedefinite.


De exemplu
mov al, 7
mov bl, 9
mul bl ; 003Fh
AAM ; 0603h

2.3.6 Instrucțiunea AAD (ASCII Adjunct for Division)


Instrucțiunea nu are operanzi și efectuează o corecție a acumulatorului AX, înaintea unei împărțiri
a doi operanzi în format BCD despachetat.
Semnificația este următoarea:
[AL]  [AH] * 10 + [AL]
[AH]  0

Indicatori afectați: PF, SF, ZF, restul nedefinite.


De exemplu
mov ax, 305h
mov bl, 2
AAD ; [ax]=35h
div bl ; [al]=12h [ah]=1

2.7.4 Exemple programe

Exemplul 1. Acest exemplu prezintă câteva tehnici de adresare specifice procesoarelor din familia
x86:
INCLUDE [Link]
.data
Arhitectura Calculatoarelor 30
alfa WORD 3 DUP(?)
.code
main proc
mov ax,17 ; Adresare imediata a operandului
; sursa care este o constantă zecimala
mov ax,10101b ; Sursa este o constantă binara
mov ax,11b ;
mov ax,0bch ; Sursa este o constantă hexa
mov alfa,ax ; Adresare directa a operandului destinatie
mov cx,ax ; Interschimba registrele ax si bx
mov ax,bx ; Folosind registrul cx
mov ax,cx ;
xchg ax,bx ; Interschimba direct cele 2 registre.
mov si,2
mov alfa[si],ax ; Adresare relativa cu registrul
; și a operandului destinaţie
mov esi,2
mov ebx,offset alfa ; Adresare imediată a operandului
; sursă (adresa variabilei alfa)
; datorită operatorului OFFSET
lea ebx,alfa ; Acelasi efect
mov ecx,[ebx][esi] ; Adresare bazata indexata a sursei
mov cx,alfa[2] ; Acelasi efect.
mov cx,[alfa+2] ; Acelasi efect
mov di,4
mov byte ptr [ebx][edi],55h ; Se va folosi această
; variantă când se doreşte o
; adresare la nivel de octet
mov esi,2
mov ebx,3
mov alfa[ebx][esi],33h ; Adresare bazata indexata
; relativa a operandului destinaţie
mov alfa[ebx+esi],33h ; Notatii echivalente
mov [alfa+ebx+esi],33h
mov [ebx][esi]+alfa,33h

exit
main ENDP
END main

Pentru exemplificări s-a folosit Instrucţiunea mov în diferite variante de adresare: registru la registru,
din memorie în registru și din registru în memorie.

Exemplul 2. Să se calculeze expresia aritmetică: e=((a+b*c-d)/f+g*h)/i. Se consideră a, d, f –


cuvant, iar b, c, g, h, i –byte. Ca să putem executa împărţirea cu f convertim împărţitorul la dublucuvânt.
Ne vor interesa doar câturile împărţirilor, rezultatul va fi de tip octet.

INCLUDE [Link]
.data
a dw 5
b db 6
cd db 10
d dw 5
f dw 6
g db 10
h db 11
Arhitectura Calculatoarelor 31
i db 10
interm dw ?
rez db ?

.code
main proc
mov eax,0
mov al, b
imul cd ; in ax avem b*c
add ax, a ; ax=b*c+a
sub ax, d ; ax=b*c+a-d
cwd ; am convertit cuvantul din ax, in dublu cuvantul , retinut in dx:ax
idiv f ; obtinem câtul în ax si restul în dx ax=(a+b*c-d)/f
mov interm, ax ; interm=(a+b*c-d)/f
mov al, g
imul h ; ax=g*h
add ax, interm ; ax=(a+b*c-d)/f+g*h
idiv i ; se obtine catul în al si restul în ah
mov rez, al

exit
main ENDP
END main

Fişierul [Link] este o bibliotecă de proceduri ce apelează funcţii Win32 API, concepută
pentru a oferi o interfață simplă pentru intrări-ieșiri de date la consolă. (API - Application Programming
Interface, un set de funcţii oferite de sistemul de operare Windows pentru manipularea resurselor
calculatorului şi sunt implementate în următoarele trei biblioteci: [Link], [Link] şi [Link]).
Fereastra consolei (sau fereastra – linie de comandă, [Link]) este o fereastră textuală, creată de
MS-Windows, pentru afişarea liniei de comandă. Vom descrie unele funcţii utilizate pentru a introduce
date de la tastatură şi afişarea datelor de ieşire. Aceste proceduri se apelează cu instrucţiunea call, de
exemplu call Clrscr.
Procedurile apelate utilizează diferite echivalări.

2.7.5 Echivalări şi operatori

Echivalările reprezintă niște valori constante de tip constantă numerică sau şir de caractere atribuite
unor nume simbolice, simbolurile putând fi înlocuite în locul valorilor respective.
a) Echivalările numerice sunt folosite pentru a atribui o constanta numerica unui simbol. Acestea pot fi:
- redefinibile: valoarea unui simbol poate fi redefinită în orice moment în timpul asamblării;
Sintaxa unei echivalări numerice redefinite este:
nume = expresie
unde: - expresie poate fi un întreg, o expresie constantă, o constantă de tip şir de caractere sau două constante
sau o expresie evaluată la o adresă, nume este un nume de simbol unic sau un nume de simbol definit
anterior cu =.
- neredefinibile: valoarea simbolului nu poate fi redefinita în timpul asamblării.
Sintaxa unei echivalări numerice neredefinibile este:
nume EQU expresie
Parametrii având semnificațiile: nume este un nume de simbol unic.
Simbolurile definite prin echivalări numerice pot fi folosite în construcții ulterioare ca operanzi imediați.
Acestor simboluri nu li se alocă memorie.
Operatorii admiși in cazul folosiri expresiilor constante sunt operatori aritmetici: +, -, *, /(împărțire
întreagă) şi mod.
OFFSET. Operatorul OFFSET returnează distanța unei variabile în octeți, de la începutul
Arhitectura Calculatoarelor 32
segmentului. De exemplu variabila myByte în segmentul de date va arăta în felul următor:

PTR. Operatorul PTR este utilizat la accesarea unui operand, dimensiunea cărui este diferită de cea
necesară. Exemple de utilizare.
.data
myDouble DWORD 12345678h
.code
mov ax,WORD PTR myDouble ; 5678h
mov ax,WORD PTR [myDouble+2] ; 1234h
mov bl,BYTE PTR myDouble ; 78h

.data
wordList WORD 5678h,1234h
.code
mov eax,DWORD PTR wordList ; EAX = 12345678h

TYPE. Operatorul TYPE întoarce un număr ce reprezintă tipul unei expresii în octeţi.
LENGTHOF. Operatorul LENGTHOF întoarce numărul de elemente a unui şir, tablou de date.
SIZEOF. Operatorul SIZEOF întoarce numărul total de octeți alocați pentru un tablou sau variabilă
definita cu DUP.
Exemple.
.DATA
intgr = 14*3 ;=42
intgr = intgr/4 ;10
intgr = intgr mod 4 ;2
intgr = intgr+4 ;6
intgr = intgr-3 ;3
m1 EQU 5
m2 EQU -5
const EQU m1+m2 ;const=0
vect DW 60 DUP(?)
s_vect EQU SIZEOF vect ;60 * 2 = 120
l_vect EQU LENGTHOF vect ;60
t_vect EQU TYPE vect ;2
verif EQU t_vect*l_vect ;=2*60
mov ax, SIZEOF vect

În general echivalările sunt păstrate în fișiere separate de includere, fiind incluse într-un program prin
intermediul directivei INCLUDE.

2.7.6 Procedurile utilizate

Procedura Descrierea
Clrscr Șterge fereastra consolei și poziţionează cursorul în colțul stânga sus.
Crlf Sunt coduri ASCII ce indică sfârşitul liniei, din rând nou
Delay Întrerupe execuția programului pentru un interval specificat de milisecunde
DumpMem Procedura afişează un tablou de date (array) în hexazecimal
DumpRegs Afișează conţinutul regiştrilor EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP,
EFLAGS, și registrul EIP în hexazecimal
Gotoxy Plasează cursorul pe un rând și coloană în fereastra de consolă
Random32 Procedura generează și returnează un număr întreg aleator pe 32 de biți în
Arhitectura Calculatoarelor 33
EAX.
RandomRange Generează un întreg aleator într-un interval specificat.
ReadChar Așteaptă un singur caracter introdus de la tastatură și returnează caracterul în
AL
ReadDec Citește de la tastatură un întreg zecimal fără semn pe 32 de biți, finalizarea
introducerii - tasta Enter
ReadHex Citește de la tastatură un întreg hexazecimal pe 32 de biți, finalizarea
introducerii - tasta Enter
ReadInt Citește de la tastatură un întreg zecimal cu semn pe 32 de biți, finalizarea
introducerii - tasta Enter
ReadString Citește de la tastatură un şir de caractere, finalizarea introducerii - tasta Enter
SetTextColor Setează culorile textului și de fundal a consolei.
WaitMsg Afișează un mesaj și așteaptă un clic pe o tastă
WriteBin Afișează un întreg fără semn pe 32 de biți în format binar ASCII
WriteBinB Afișează un întreg în format binar pe un octet, cuvânt, sau 32 de biți
WriteChar Afișează un singur caracter
WriteDec Afișează un întreg fără semn pe 32 de biți în format zecimal
WriteHex Afișează un întreg pe 32 de biți în format hexazecimal
WriteHexB Afișează un întreg de un byte, word, sau doubleword în format hexazecimal
WriteInt Afișează un întreg cu semn pe 32 de biți în format zecimal
WriteString Afișează un şir, finalizat cu un octet nul
WriteWindowsMsg Afișează un șir care conține cele mai recente erori generate de MS-Windows

Descrierea detaliată
Delay. Înainte de a apela Delay, setați registrul EAX cu intervalul dorit în milisecunde. Exemplu:
mov eax,1000 ; 1 second
call Delay

DumpMem. Înainte de apelare, în ESI - încărcaţi deplasamentul tabloului, în ECX - numărul de


locaţii de memorie, iar în EBX – tipul locaţiei de memorie (1 = byte, 2 = word, 4 = doubleword). În
exemplul următor se afişează un tablou din 11 cuvinte duble (doubleword) în hexazecimal:
.data
array DWORD 1,2,3,4,5,6,7,8,9,0Ah,0Bh
.code
main PROC
mov esi,OFFSET array ; starting OFFSET
mov ecx,LENGTHOF array ; numărul de locaţii de memorie
mov ebx,TYPE array ; tipul locaţiei de memorie - doubleword 
call DumpMem
La ieşire se va afişa:
00000001 00000002 00000003 00000004 00000005 00000006
00000007 00000008 00000009 0000000A 0000000B

DumpRegs. Afișează conţinutul regiştrilor EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EFLAGS, și
registrul EIP în hexazecimal. Se afișează, de asemenea, valorile fanioanelor (indicatoarelor) Carry, Sign,
Zero, Overflow, Auxiliary Carry, şi Parity.
call DumpRegs
La ieşire se va afişa:

EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000
ESI=00000000 EDI=00000100 EBP=0000091E ESP=000000F6
EIP=00401026 EFL=00000286 CF=0 SF=1 ZF=0 OF=0 AF=0 PF=1
Arhitectura Calculatoarelor 34
Gotoxy. Plasează cursorul pe un rând și coloană în fereastra de consolă. În mod implicit, valorile
coordonatei X este de la 0-79 și Y- de la 0 la 24. Când apelaţi Gotoxy, încărcaţi coordonatele Y (rând) în
DH și coordonatele X (coloana) în DL. Exemplu:

mov dh,10 ; randul 10
mov dl,20 ; coloana 20
call Gotoxy ; pozitia cursorului

Random32. Procedura Random32 generează și returnează un întreg aleator pe 32 de biți în EAX. Când
Procedura este solicitată în mod repetat, Random32 generează o secvență aleatoare de valori.
.data
randVal DWORD ?
.code
call Random32
mov randVal,eax

RandomRange. Procedura RandomRange produce un număr întreg aleator în intervalul de la 0 la n-1,


unde n este un parametru de intrare încărcat în registrul EAX. Numărul generat aleator este întors în
EAX. Următorul exemplu generează un număr întreg aleator între 0 și 4999 și se salvează într-o variabilă
numită randVal.
.data
randVal DWORD ?
.code
mov eax,5000
call RandomRange
mov randVal,eax

ReadChar. Procedura ReadChar aşteaptă un singur caracter introdus de la tastatură şi îl încarcă în


registrul AL. Caracterul este introdus fără ecou (fără afişare).
.data
char BYTE ?
.code
call ReadChar
mov char,al
Dacă executaţi clic pe o tastă funcţională (F1 …), săgeată (← …), Ins, sau Del, procedura încarcă
registrul AL cu zero, și în AH se va introduce scan -codul tastei.

ReadDec. Procedura ReadDec citește un întreg zecimal de 32-biţi fără semn de la tastatură și încarcă
valoarea în EAX. Spatiile sunt ignorate. Se introduc numai valori zecimale. De exemplu, dacă utilizatorul
introduce 123ABC, valoarea returnată în EAX este 123.
.data
intVal DWORD ?
.code
call ReadDec
mov intVal,eax

ReadHex. Procedura ReadHex citește un întreg hexazecimal de 32 de biți de la tastatura si încarcă


valoarea binară corespunzătoare în EAX. Nu indică eroare la introducerea valorilor nevalide. Puteți utiliza
atât litere mari și mici pentru caracterele de la A la F. Un număr maxim de opt cifre pot fi introduse
(caracterele suplimentare sunt ignorate). Spaţiile sunt ignorate.
.data
hexVal DWORD ?
.code
call ReadHex
Arhitectura Calculatoarelor 35
mov hexVal,eax

ReadInt. Procedura ReadInt citește un întreg de 32-biţi, cu semn, de la tastatură și încarcă valoarea în
EAX. Utilizatorul poate introduce, opțional, semnul plus sau minus, și restul numărului poate consta doar
din cifre. ReadInt setează în „1” flag-ul Overflow și va afișa un mesaj de eroare în cazul în care valoarea
introdusă nu intră în plaja numerelor cu semn de 32-biţi (plaja: -2,147,483,648 +2,147,483,647 ).
Se introduc numai valori zecimale. De exemplu, în cazul în care utilizatorul introduce 123ABC, valoarea
introdusă va fi 123.
.data
intVal SDWORD ?
.code
call ReadInt
mov intVal,eax

ReadString. Procedura ReadString citește un șir de caractere de la tastatură, clic Enter – finalizarea
introducerii. Înainte de invocarea procedurii, este necesar să încarcăm EDX cu offset-ul buffer-ului unde
va fi stocat şirul și ECX cu numărul maxim de caractere care va fi introdus, plus 1 (pentru byte-ul nul de
finalizare). Procedura returnează numărul de caractere introduse de utilizator în EAX.
.data
buffer BYTE 21 DUP(0) ; input buffer
byteCount DWORD ? ; holds counter
.code
mov edx,OFFSET buffer ; point to the buffer
mov ecx,SIZEOF buffer ; specify max characters
call ReadString ; input the string
mov byteCount,eax ; number of characters
ReadString introduce automat byte-ul nul în memorie, la sfârșitul șirului. După ce utilizatorul a introdus
șirul "ABCDEFG" în variabila buffer va fi:

Conţinutul variabilei byteCount va fi egală cu 7.

SetTextColor. Procedura SetTextColor setează culorile textului și de fundal a consolei. La invocarea


procedurii culorile textului şi de fundal este necesar să fie încărcate în registrul EAX. Constantele
culorilor predefinite sunt următoarele:

Constantele sunt predefinite în [Link]. Următoarele constante indică culoarea galben a caracterului
pe fundal albastru:

yellow _ (blue * 16)

Următoarea secvenţă setează: caracter alb pe fundal albastru:

mov eax,white _ (blue * 16) ; white on blue
call SetTextColor

WaitMsg. Procedura WaitMsg afișează mesajul “Press any key to continue. . .” şi așteaptă ca utilizatorul
să execute clic pe o tastă. Procedura n-are parametri de intrare. Apelul este următorul:
Arhitectura Calculatoarelor 36
call WaitMsg

WriteBin. Procedura WriteBin afișează un întreg fără semn pe 32 de biți în format binar ASCII. Întregul
este necesar să fie încărcat în EAX. Biţii sunt afişaţi în grupe de câte 4 biţi.
mov eax,12346AF9h
call WriteBin
În urma invocării se va afişa:
0001 0010 0011 0100 0110 1010 1111 1001

WriteBinB. Procedura WriteBinB afișează un întreg în format binar pe un octet, cuvânt, sau 32 de biți.
Încărcaţi în EAX întregul şi în EBX indicaţi valoarea de afişat în octeţi (1, 2, sau 4). Biţii sunt afişaţi în
grupe de câte 4 biţi.

mov eax,00001234h
mov ebx,TYPE WORD ; 2 octeti inferiori
call WriteBinB ; displays 0001 0010 0011 0100

WriteChar. Procedura WriteChar afișează un singur caracter. Încărcaţi caracterul de afişat (sau codul
ASCII al caracterului) în registrul AL.

mov al,'A'
call WriteChar ; displays: "A"

WriteDec. Procedura WriteDec afișează un întreg fără semn pe 32 de biți în format zecimal. Încărcaţi
întregul în EAX.

mov eax,295
call WriteDec ; displays: "295"

WriteHex. Procedura WriteHex afișează un întreg pe 32 de biți în format hexazecimal. Introduceţi


zerouri, dacă este necesar. Încărcaţi întregul în EAX.
mov eax,7FFFh
call WriteHex ; displays: "00007FFF"

WriteHexB. Procedura WriteHexB afișează un întreg de un byte, word, sau doubleword în format
hexazecimal. Încărcaţi în EAX întregul şi în EBX indicaţi valoarea de afişat în octeţi (1, 2, sau 4).
mov eax,7FFFh
mov ebx,TYPE WORD ; 2 bytes
call WriteHexB ; displays: "7FFF"

WriteInt. Procedura WriteInt afișează un întreg cu semn pe 32 de biți în format zecimal. Este necesar să
introdiceţi semnul. Încărcaţi întregul în EAX.

mov eax,216543
call WriteInt ; displays: "+216543"
WriteString. Procedura WriteString afișează un şir, finalizat cu un octet nul. Încărcaţi offset-ul şirului în
registrul EDX.
.data
prompt BYTE "Enter your name: ",0
.code
mov edx,OFFSET prompt
call WriteString

WriteWindowsMsg. Procedura WriteWindowsMsg afișează un șir care conține cele mai recente erori
generate de MS-Windows, la invocarea funcţiilor de sistem.
call WriteWindowsMsg
Arhitectura Calculatoarelor 37

Un exemplu de mesaj:

Error 2: The system cannot find the file specified.

2.7.7 Instrucţiuni de salt și ciclare

a)Instrucţiunea de salt necondiţionat JMP


Forma generala :
JMP operand
unde, operand este adresa de salt necondiţionat. Există următoarele tipuri de instrucţiuni JMP:
 de tip SHORT - când operandul specifica o adresă în domeniul -128÷ +127 față de (IP) actualizat
 de tip NEAR - operandul specifică o adresă din acelaşi segment de cod;
 de tip FAR - operandul specifică o adresă din alt segment de cod.

b)Instrucţiuni de salt condiţionat


Aceste instrucţiuni implementează salturile condiţionate de indicatorii de condiţie.
Forma generala:
Jcond operand
unde:
- cond este condiţia de salt și este reprezentată de una sau două litere (vezi tabelul de mai jos);
- operand este un offset cuprins între -128 si 128.
Dacă condiţia este îndeplinită are loc saltul la adresa dată de operand, dacă nu - se continuă în
secvenţă.
Se observă că există 2 categorii de instrucţiuni pentru ‘mai mic’ si ‘mai mare’, cele care conţin
cuvintele ‘above’ sau ‘bellow’ şi cele care conţin cuvintele ‘less’ sau ‘greater’. Primele se folosesc în
situaţia comparării a două valori fără semn, iar ultimele în situaţia comparării a două valori cu semn.
Fie secvenţele de program:
mov ax,0FFFEh
mov bx, 2
cmp ax, bx
ja alfa

și
mov ax, 0FFFEh
mov bx, 2
cmp ax, bx
jg alfa
în care se compară pe cuvânt 0FFFEh şi 2.
Se observă că (AX) > (BX) dacă cele două valori se consideră reprezentate fără semn şi că (AX) < (BX)
dacă cele două valori se consideră cu semn. (-2 este mai mic decat 2). Ca atare în primul caz saltul la
eticheta alfa are loc, pe cand în cel de-al doilea caz nu are loc.
Fiecare mnemonică din tabel se referă la iniţialele cuvintelor următoare, ce indică condiţia în
limba engleză: Above (peste, mai mare), Below (sub, mai mic), Equal (egal), Not (nu), Greater (mai
mare), Less (mai mic), Carry (transport), Zero, Overflow (depăşire de capacitate), Parity (PEven - paritate
pară, POdd - paritate impară), Sign (semn).
Arhitectura Calculatoarelor 38
Instrucţiune Condiţie de salt Interpretare
(mnemonica)
JE, JZ ZF = 1 Zero, Equal
JL, JNGE SF  OF Less, Not Greater or Equal
JLE,JNG SF  OF sau ZF = 1 Less or Equal, Not Greater
JB, JNAE, JC CF = 1 Below, Not Above or Equal, Carry
JBE, JNA CF = 1 sau ZF = 1 Below or Equal, Not Above
JP, JPE PF = 1 Parity, Parity Even
JO OF = 1 Overflow
JS SF = 1 Sign
JNE, JNZ ZF = 0 Not Zero, Not Equal
JNL, JGE SF = OF Not Less, Greater or Equal
JNLE, JG SF = OF si ZF = 0 Not Less or Equal, Greater
JNB, JAE, JNC CF = 0 Not Below, Above or Equal, Not Carry
JNBE, JA CF = 0 si ZF = 0 Not Below or Equal, Above
JNP, JPO PF = 0 Not Parity, Parity Odd
JNO OF = 0 Not Overflow
JNS SF = 0 Not Sign
(Exemplu de citire: JNBE = jump if not below or equal, salt (J) dacă nu (N) e mai mic (B) sau egal (E)).

c) Instrucțiunea JCXZ (JUMP if CX is Zero)


Instrucțiunea realizează salt la eticheta specificată dacă conținutul registrului CX este zero. Forma
generala:
JCXZ eticheta
JECXZ eticheta
JRCXZ eticheta
unde eticheta este o eticheta aflata in domeniul -128 si 127 fata de (IP).
Exemple:
mov edx,0A523h
cmp edx,0A523h
jne L5 ; jump not taken
je L1 ; jump is taken

mov bx,1234h
sub bx,1234h
jne L5 ; jump not taken
je L1 ; jump is taken

mov cx,0FFFFh
inc cx
jcxz L2 ; jump is taken

xor ecx,ecx
jecxz L2 ; jump is taken

Exemple, comparări cu semn:


mov edx,­1
cmp edx,0
jnl L5 ; jump not taken (­1 >= 0 is false)
jnle L5 ; jump not taken (­1 > 0 is false)
jl L1 ; jump is taken (­1 < 0 is true)

mov bx,+32
cmp bx,­35
Arhitectura Calculatoarelor 39
jng L5 ; jump not taken (+32 <= ­35 is false)
jnge L5 ; jump not taken (+32 < ­35 is false)
jge L1 ; jump is taken (+32 >= ­35 is true)

mov ecx,0
cmp ecx,0
jg L5 ; jump not taken (0 > 0 is false)
jnl L1 ; jump is taken (0 >= 0 is true)

mov ecx,0
cmp ecx,0
jl L5 ; jump not taken (0 < 0 is false)
jng L1 ; jump is taken (0 <= 0 is true)

Exemplu, salt la etichetă dacă toţi biţii (2, 3 şi 7) sunt setaţi în 1:

mov al,status
and al,10001100b ; mask bits 2,3,7
cmp al,10001100b ; all bits set?
je ResetMachine ; yes: jump to label

d) Instrucțiunea LOOP
Forma generală:
LOOP eticheta
Are ca efect:
ecx  ecx -1
dacă ecx = 0 atunci
[IP]  [IP] + D8
adică se decrementează ECX (CX şi RCX în modurile pe16 şi 64 biţi respectiv) și dacă acesta este diferit
de zero se sare la eticheta specificată, în caz contrar se continuă cu instrucțiunea următoare. D8 este un
deplasament pe 8 biți şi reprezintă diferența între offset-ul instrucțiunii următoare instrucțiunii LOOP şi
offset-ul etichetei. Se utilizează şi notaţiile:
 instrucțiunea LOOPD utilizează registrul ECX ca registru contor;
 instrucțiunea LOOPW utilizează registrul CX ca registru contor.
Ex: Suma celor n octeți de la adresa sir.

.data
sir byte 7, 9, 15, 25, -18, 33, 11
n equ LENGTHOF sir
suma byte ?
.code

xor eax, eax


mov ecx, n
xor esi, esi
repeta:
add al, sir[esi]
inc esi
LOOP repeta
mov suma, al

e) Instrucțiunea LOOPZ/LOOPE (LOOP While Zero/Equal)


Arhitectura Calculatoarelor 40
Forma generala:
LOOPZ eticheta
sau
LOOPE eticheta
Semnificația:
cx  cx - 1
daca cx > 0 si ZF = 1 atunci
[IP]  [IP] + D8
Se decrementează cx (ECX, RCX) şi dacă acesta este diferit de zero şi indicatorul ZF este 1 (rezultatul
ultimei operații aritmetice a fost zero) se sare la eticheta specificată.

f) Instrucțiunea LOOPNZ/LOOPNE (Loop While Not Zero/Not Equal)


Forma generala:
LOOPNZ eticheta
sau
LOOPNE eticheta
Semnificația:
cx cx - 1
daca cx > 0 şi ZF = 0 atunci
[IP]  [IP] + D8
Efectul este că se ciclează cât timp rezultatul ultimei operații aritmetice este diferit de zero, dar nu de mai
multe ori cât este conținutul inițial a lui CX (ECX, RCX).

2.7.8 Instrucțiuni de deplasare (SHL, SAL, SHR, SAR) si de rotație (ROL, RCL, ROR, RCR).
Acest grup de instrucțiuni realizează operații de deplasare şi de rotație la nivel de bit.
Instrucțiunile au doi operanzi: primul este operandul propriu-zis, iar al doilea este numărul de biți cu care
se deplasează sau se rotește primul operand. Ambele operații se pot face la dreapta sau la stânga.
Deplasarea înseamnă transferul tuturor biților din operand la stânga/dreapta, cu completarea unei valori
fixe în dreapta/stânga şi cu pierderea biților din stânga/dreapta. Deplasarea cu un bit la stânga este
echivalenta cu înmulțirea operandului cu 2, iar deplasarea la dreapta, cu împărțirea operandului la 2.
Rotație înseamnă transferul tuturor biților din operand la stânga/dreapta, cu completarea în
dreapta/stânga cu biții care se pierd în partea opusă.
Ambele operații se fac cu modificarea bistabilului CF, care participă la operațiile de rotație.
Forma generala a instrucțiunilor este:
OPERATIE operand, contor
în care operand este un registru sau o locație de memorie de 8 sau 16 biți, iar contor (numărul de biți) este
fie o constantă , fie registrul CL, care conține numărul de biți cu care se deplasează/rotește operandul.
La operațiile de deplasare , se modifică toate flag-urile conform rezultatului, în afară de AF, care
este nedefinit. La operațiile de rotație, se modifică numai CF şi OF.
La instrucțiunile de deplasare, se consideră deplasări logice şi aritmetice, care se pot utiliza
după natura operanzilor.

a) Instrucțiunea SHL/SAL (Shift Logic/Arithmetic Left)


Are forma generală:
SHL/SAL operand, contor

Deși există două mnemonice (SHL şi SAL), în fapt este vorba de o unică instrucțiune. Bitul cel
mai semnificativ al operandului trece în CF, după care toți biții se deplasează la stânga cu o poziție.
Operația se repetă de atâtea ori de cât este valoarea lui contor (0-255 sau conținutul registrului CL).
Dacă deplasăm valoarea binară 11001111 în stănga cu un bit, după deplasare va deveni 10011110.
Arhitectura Calculatoarelor 41

Structura instrucţiunii (similar şi SHR, SAL, SAR, ROR, ROL, RCR, RCL) este următoarea:

SHL reg,imm8
SHL mem,imm8
SHL reg,CL
SHL mem,CL
Exemple:
mov bl,8Fh ; BL = 10001111b
shl bl,1 ; CF = 1, BL = 00011110b

mov al,10000000b
shl al,2 ; CF = 0, AL = 00000000b

mov dl,10 ; before: 00001010
shl dl,2 ; after: 00101000

b) Instrucțiunea SHR (Shift Logic Right)


Are forma generală:
SHR operand, contor

Bitul cel mai puțin semnificativ din operand trece in CF, după care se deplasează toți biții cu o
poziție la dreapta (împărțire la 2). Faptul că operația de împărțire se execută fără semn înseamnă că se
completează cu un bit 0 dinspre stânga. Operația se repetă de atâtea ori cât este valoarea lui contor (0-255
sau conținutul registrului CL).
Exemple:
mov al,0D0h ; AL = 11010000b
shr al,1 ; AL = 01101000b, CF = 0

mov al,00000010b
shr al,2 ; AL = 00000000b, CF = 1

c) Instrucțiunea SAR (Shift Arithmetic Right)


Are forma generală:
SAR operand, contor

Bitul de semn rămâne nemodificat. Bitul cel mai puțin semnificativ din operand trece in CF, după
care se deplasează toți biții cu o poziție la dreapta . Faptul că operația de deplasare se execută cu semn
înseamnă că se completează toți biții eliberați cu bitul de semn. Operația se repetă de atâtea ori cât este
valoarea lui contor (0-255 sau conținutul registrului CL).
Exemple:
mov al,0F0h ; AL = 11110000b (­16)
Arhitectura Calculatoarelor 42
sar al,1 ; AL = 11111000b (­8), CF = 0

mov dl,­128 ; DL = 10000000b
sar dl,3 ; DL = 11110000b

mov ax,­128 ; EAX = ????FF80h
shl eax,16 ; EAX = FF800000h
sar eax,16 ; EAX = FFFFFF80h

d) Instrucțiunea ROL (Rotate Left)


Are forma generală:
ROL operand, contor

Bitul cel mai semnificativ din operand trece atât in CF, cât şi în bitul cel mai puțin semnificativ
din operand, după ce toți biții acestuia s-au deplasat la stânga cu o poziție. Operația se repetă de atâtea ori
cât este valoarea lui contor (0-255 sau conținutul registrului CL).
mov al,40h ; AL = 01000000b
rol al,1 ; AL = 10000000b, CF = 0
rol al,1 ; AL = 00000001b, CF = 1
rol al,1 ; AL = 00000010b, CF = 0

e) Instrucțiunea ROR (Rotate Right)


Are forma generala:
ROR operand, contor

Bitul cel mai puțin semnificativ din operand trece atât în CF, cât şi în bitul cel mai semnificativ
din operand, după ce toți biții acestuia s-au deplasat la dreapta cu o poziție. Operația se repetă de atâtea
ori cât este valoarea lui contor (0-255 sau conținutul registrului CL).
mov al,01h ; AL = 00000001b
ror al,1 ; AL = 10000000b, CF = 1
ror al,1 ; AL = 01000000b, CF = 0

mov al,00000100b
ror al,3 ; AL = 10000000b, CF = 1

f) Instrucțiunea RCL (Rotate Left through Carry)


Are forma generală:
RCL operand, contor

Bitul cel mai semnificativ din operand trece în CF, se deplasează toți biții din operand cu o
poziție la stânga, iar CF inițial trece în bitul cel mai puțin semnificativ din operand. Operația se repetă de
atâtea ori cât este valoarea lui contor (0-255 sau conținutul registrului CL).
Arhitectura Calculatoarelor 43
clc ; CF = 0
mov bl,88h ; CF,BL = 0 10001000b
rcl bl,1 ; CF,BL = 1 00010000b
rcl bl,1 ; CF,BL = 0 00100001b

f) Instrucțiunea RCR (Rotate right through Carry)


Are forma generală:
RCR operand, contor

Bitul cel mai puțin semnificativ din operand trece în CF, se deplasează toți biții din operand cu o
poziție la dreapta, iar CF inițial trece în bitul cel mai semnificativ din operand. Operația se repetă de
atâtea ori cât este valoarea lui contor (0-255 sau conținutul registrului CL).
stc ; CF = 1
mov ah,10h ; AH, CF = 00010000 1
rcr ah,1 ; AH, CF = 10001000 0

Instrucțiunile SHLD/SHRD (shift left double, shift right double)


Forma generală:
SHLD dest, sursa, contor
SHRD dest, sursa, contor

Structura instrucţiunii:
SHLD reg16,reg16,CL/imm8
SHLD mem16,reg16,CL/imm8
SHLD reg32,reg32,CL/imm8
SHLD mem32,reg32,CL/imm8

Deplasarea stânga se petrece dupâ următoarea schemă:

Iar deplasarea dreapta după următoarea schemă:


Arhitectura Calculatoarelor 44

Exemple:
.data
wval WORD 9BA6h
.code
mov ax,0AC36h
shld wval,ax,4 ; wval = BA6Ah

mov ax,234Bh
mov dx,7654h
shrd ax,dx,4

2.7.9 Instrucțiuni logice


Instrucțiunile logice realizează funcțiile logice de bază, pe 8, 16, 32 sau 64 biţi. Operațiile se fac la
nivel de bit.

a) Instrucțiunea NOT (Not)


Forma generala :
NOT dest
în care dest poate fi un registru sau o locație de memorie. Instrucțiunea provoacă negarea tuturor biților
operandului, adică se face complementul faţă de unu.
mov al,11110000b
not al ; AL = 00001111b

b) Instrucțiunea AND (And)


Forma generala :
AND dest, sursa
în care dest poate fi un registru sau o locație de memorie, iar sursa un registru, o locație de memorie sau
o constantă. Instrucțiunea depune în dest şi-logic la nivel de bit între dest şi sursa.
Indicatori afectați: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Structura instrucţiunii:
AND reg,reg
AND reg,mem
AND reg,imm
AND mem,reg
AND mem,imm
Valoarea imediată imm nu poate depăşi mărimea de 32 biţi.
mov al,10101110b
and al,11110110b ; result in AL = 10100110
Arhitectura Calculatoarelor 45
c) Instrucțiunea OR (Or)
Forma generala :
OR dest, sursa
în care dest poate fi un registru sau o locație de memorie, iar sursa un registru, o locație de memorie sau
o constanta. Instrucțiunea depune în dest sau-logic la nivel de bit între dest şi sursa.
Indicatori afectați: SF, ZF, PF, CF=0, OF=0, AF nedefinit.
mov al,11100011b
or al,00000100b ; result in AL = 11100111

d) Instrucțiunea XOR (Exclusive Or)


Forma generala :
XOR dest,sursa
în care dest poate fi un registru sau o locație de memorie, iar sursa un registru, o locație de memorie sau
o constantă. Instrucțiunea depune în dest xor-logic la nivel de bit între dest şi sursa.
Indicatori afectați: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Tabelul de adevăr este următorul:

e) Instrucțiunea TEST (Test)


Forma generala :
TEST dest,sursa
în care dest poate fi un registru sau o locație de memorie, iar sursa un registru, o locație de memorie sau
o constanta. Instrucțiunea realizează and-logic la nivel de bit între dest şi sursa şi nu modifică destinaţia,
cu poziționarea indicatorilor.
Indicatori afectați: SF, ZF, PF, CF=0, OF=0, AF nedefinit.
Această instrucţiune este deseori utilizată pentru a testa starea unui bit (biţi).
Exemplu. Fie este necesar să testăm starea bitului 5:

test al,00100000b; test bit 5 
Dacă ZF=0, atunci bitul 5 este egal cu 1, iar dacă ZF=1, bitul 5 egal cu 0.

f)Instrucțiunile BSF, BSR (Bit scan forward, reverse)


Forma generala :
BSF dest,sursa
BSF reg16,r/m16
BSF reg32,r/m32

 Instrucţiunea scanează biţii operandului sursă, începând cu bitul 0 (BSR-15/31) până la bitul 15/31
(BSR-0), pentru a găsi primul bit de 1.
 Dacă se întâlneşte bitul de 1, flag-ul ZF este setat în 0, iar în operandul destinație este încărcat
indexul (poziţia) primului bit de 1.
 În cazul în care nici un bit de 1 nu este găsit, flag-ul ZF este setat în 1.
Exemplu:
mov bx,0002h ;bx=0000 0010b
...
bsf cx,bx ;cx=0001h
jz null
...
null:

Instrucțiunile BT, BTC, BTR, BTS (Bit tests)


Arhitectura Calculatoarelor 46
Forma generala :
BT dest,sursa
BT r/m16,imm8
BT r/m16,r16
BT r/m32,imm8
BT r/m32,r32

Instrucţiunea BT copie bitul n, specificat în sursă, în flag-ul Carry. Operandul destinaţie conţine
valoarea cu bitul căutat, iar operandul sursă conţine poziţia bitului căutat.
Instrucţiunea BTC copie bitul n, în flag-ul Carry şi compementează bitul n în operandul
destinaţie.
Instrucţiunea BTR copie bitul n, în flag-ul Carry şi setează bitul n în 0 în operandul destinaţie.
Instrucţiunea BTS copie bitul n, în flag-ul Carry şi setează bitul n în 1 în operandul destinaţie.

mov ebx,01001100h
bt ebx,8 ;testarea bitului 8 şi setarea cf în 1
jc m1 ;salt la m1, dacă valoarea bitului este 1

Exemple programe
{Căutare secvențiala} Să se scrie un program pentru căutarea primului blanc din șirul începând de la
adresa sir. La ieșirea din program eax va conține valoarea 0 daca șirul nu conține blancuri, altfel va conține
valoarea poziției din sir a primului blanc găsit. Se presupune că șirul sir are l caractere.
.data
sir DB 'Acesta este un sir!'
l EQU sizeof sir

.code

mov ecx,l
mov esi,-1
mov al,' '
urm: inc esi
cmp al,sir[esi]
loopne urm
jne nu_gasit
mov eax,l
sub eax,ecx
jmp iesire
nu_gasit: mov eax,0
iesire: nop

2.8 Instrucțiuni pentru controlul procesorului


Sunt instrucțiuni care controlează anumite funcții ale procesorului, ce acționează fie prin
intermediul unor indicatori de control (sau registre de control), fie prin introducerea unor stări sau
semnale necesare pentru sincronizarea cu evenimentele externe.
Exemple:
CMC ;complementarea valorii indicatorului CF
CLC ;poziționarea pe 0 a indicatorului CF
STC ;poziționarea pe 1 a indicatorului CF
NOP ;Nici o operație, dar consumă 3 perioade de ceas.
CLD ;poziționarea pe 0 a indicatorului DF
STD ;poziționarea pe 1 a indicatorului DF
CLI ;poziționarea pe 0 a indicatorului IF, dezactivare întreruperi mascabile
STI ;poziționarea pe 1 a indicatorului IF
Arhitectura Calculatoarelor 47
HLT ;Oprire microprocesor până la RESET, NMI, sau INT (dacă sunt activate)
WAIT ;așteptare până când vine semnalul exterior test=0
ESC ;operație destinată coprocesorului
LOCK ;prefix care activează semnalul extern /lock, astfel că microprocesorul anunţă
;că nu va răspunde la o cerere de cedare a controlului magistralelor.

2.9 Instrucțiuni pentru lucrul cu șiruri


În afară de tipurile de bază amintite mai sus, există și posibilitatea efectuării unor operații de
transfer, sau operații aritmetice și logice cu șiruri de date (cu informații aflate în zone continue de
memorie). Operațiile pe șiruri pot fi efectuate individual, pentru fiecare cuvânt din șir, sau automat - cu
repetare, numărul de repetări al instrucțiunii fiind dictat de conținutul unui registru contor.
Operațiile tipic efectuate sunt:
 transferul unui șir din zonă sursa în zonă destinaţie
 comparare între două şiruri
 căutarea unei valori într-un şir
 încărcarea acumulatorului cu elementele unui şir.
 citirea unui şir de la un port de intrare
 scrierea unui şir la un port de ieşire
Exemple :

Instrucţiunile MOVSB (Move (copy) bytes)


MOVSW (Move (copy) words)
MOVSD (Move (copy) doublewords)

Transfer pe 8 (16,32) biţi, din zona de memorie indicată de ESI, în zona de memorie indicată de
registrul EDI. După transferul primului byte (word, doubleword), dacă flag-ul DF=0, se petrece
autoincrementarea ESI←ESI+1; EDI←EDI+1 (decrementare pentru DF=1).

În operaţii cu şiruri sunt utilizate prefixe de repetare:

REP Repetare până ecx>0


REPZ, REPE Repetare până ZF=1 şi ecx>0
REPNZ, REPNE Repetare până ZF=0 şi ecx>0

Exemplu. Fie dat să copiem 20 de cuvinte duble din şirul sursă source în şirul destinaţie target:
.data
source DWORD 20 DUP(0FFFFFFFFh)
target DWORD 20 DUP(?)
.code
cld  ; direction = forward
mov ecx,LENGTHOF source ; setam contorul  REP 
mov esi,OFFSET source ; incarcam ESI cu adresa  soursei
mov edi,OFFSET target ; incarcam EDI cu adresa destina?iei
rep movsd  ;copiem cuvinte duble

Instrucţiunile CMPSB (Compare bytes)


CMPSW (Compare words)
CMPSD (Compare doublewords)

Comparare pe 8 (16,32) biţi, din zona de memorie indicată de ESI, cu zona de memorie indicată
de registrul EDI. După compararea primului byte (word, doubleword), dacă flag-ul DF=0, se petrece
autoincrementarea ESI←ESI+1; EDI←EDI+1 (decrementare pentru DF=1).
Exemple:
.data
Arhitectura Calculatoarelor 48
source DWORD 1234h
target DWORD 5678h
.code
mov esi,OFFSET source
mov edi,OFFSET target
cmpsd  ; compare doublewords
ja L1  ; jump if source > target
Dacă comparăm cuvinte multiple:
mov esi,OFFSET source
mov edi,OFFSET target
cld ; direction = forward
mov ecx,LENGTHOF source ; repetition counter
repe cmpsd ; repeat while equal

Prefixul REPE repetă compararea, incrementând ESI şi EDI în mod automat, până când ECX =0
sau o pereche de cuvinte duble nu va fi egală.

Instrucţiunile SCASB (SCAS- Scans a string)


SCASW
SCASD

Instrucţiunile compară valoarea din AL/AX/EAX cu byte, word sau doubleword din zona de memorie
indicată de EDI. Instrucţiunile sunt utile la căutarea unui singur element într-un şir.
Exemple:
.data
alpha BYTE "ABCDEFGH",0
.code
mov edi,OFFSET alpha ; incarcam EDI cu adresa
;sirului de scanat
mov al,'F'  ; cautam litera F
mov ecx,LENGTHOF alpha ; setam registrul contor
cld  ; direction = forward
repne scasb ; repetam pana nu este egal
jnz quit ; iesire daca litera nu a fost gasita

Instrucţiunile STOSB (STOS- Store string data)


STOSW
STOSD

Instrucţiunile încarcă valoarea din AL/AX/EAX , în memorie cu offset-ul indicat de EDI. Incrementarea
se petrece conform flag-ului DF (DF=0- incrementarea, DF=1- decrementarea).
Exemplu. Şirul string1 este completat cu valoarea 0FFh.
.data
Count = 100
string1 BYTE Count DUP(?)
.code
mov al,0FFh ; valoarea de de incarcat
mov edi,OFFSET string1 ; EDI cu adresa sirului
mov ecx,Count ; numarul de elemente ale sirului
cld ; direction = forward
rep stosb ; copierea AL in string1

Instrucţiunile LODSB (LODS- Load Accumulator from String)


LODSW
Arhitectura Calculatoarelor 49
LODSD

Instrucţiunile încarcă valoarea din byte, word sau doubleword din memorie idicat de ESI, în
AL/AX/EAX respectiv. Instrucţiunile sunt utile la căutarea unui singur element într-un şir.
Exemplu: Multiplicarea fiecărui element a unui şir cu o constantă.

INCLUDE [Link]
.data
array DWORD 1,2,3,4,5,6,7,8,9,10 ; test data
multiplier DWORD 10 
.code
main PROC
cld  ; direction = forward
mov esi,OFFSET array ; sirul sursa
mov edi,esi  ; sirul destinatie
mov ecx,LENGTHOF array ; setarea contorului
L1: lodsd  ; incarcarea [ESI] in EAX
mul multiplier ; multiplicarea cu constanta
stosd ; copie din EAX in [EDI]
loop L1
exit
main ENDP
END main

2.10 Subprograme și macroinstruțiuni

În general definirea unui subprogram se face cu directiva PROC în maniera următoare:


nume PROC {NEAR | FAR}
corp
RET {constanta}
nume ENDP
Dacă atributul NEAR şi FAR lipsesc, în cazul utilizării definiţiilor complete se consideră implicit
NEAR.
Tehnicile de transfer a parametrilor combină diversele modalităţi de alegere a tipurilor de locaţii
fizice pentru păstrarea parametrilor transmişi: registre, locaţii de memorie fixate, codul apelant, stiva
procesorului, tehnica blocurilor (tabelelor) de parametri, cu ceea ce se transmite efectiv referitor la un anumit
parametru: adresa sau valoarea acestuia.

Instructiunea CALL (apel de procedura)


Poate apărea sub una din formele:
CALL nume_proc
CALL NEAR PTR nume_proc
CALL FAR PTR nume_proc
Tipul apelului poate fi dedus din tipul procedurii (primul caz) sau specificat explicit prin NEAR şi
FAR. Tipul apelului trebuie să coincidă cu tipul procedurii şi cu tipul instructiunii RETURN din
interiorul procedurii.

Instructiunea RET (RETURN)


Forma generală:
RET [n]
unde n este o constantă întreagă opțională.
Dacă instrucțiunea RET este de tip NEAR semnificația sa este:
[IP]  SS: [[SP] + 1: [SP]]
[SP]  [SP] + 2
Arhitectura Calculatoarelor 50
[[SP]  [SP] + n]
adică se reface (IP) prin copierea conținutului vârfului stivei şi incrementarea cu 2 a lui (SP). Dacă în
instrucțiunea RET apare şi constanta n atunci această constantă se adună la (SP), adică se descarcă stiva.
Exemplu:
.data
a DWORD 55555h
b DWORD 77777h
s DWORD ?
.code
...
; încarcă primul numar in DX:AX
mov ax,WORD PTR a
mov dx,WORD PTR [a+2]
; incarca al doilea number in DI:SI
mov si,WORD PTR b
mov di,WORD PTR [b+2]
; incarca adresa rezultatului in BX
mov bx,OFFSET s
; apeleaza procedura
call pro_ad
...
; codul procedurii
pro_ad PROC NEAR
add ax,si
adc dx,di
mov [bx],ax
mov [bx+2],dx
ret
pro_ad ENDP
...

O macroinstrucțiune reprezintă o secvență de cod sursă căreia i se atribuie un nume simbolic, conținutul
acestei secvențe putând fi repetat ori de câte ori în cadrul unui program prin simpla referire la numele
simbolic respectiv. Utilizarea unei macroinstrucțiuni necesită parcurgerea a doi pași:
[Link] macroinstrucțiunii, care se marchează printr-o macro definiție. Aceasta cuprinde o secvența de
cod, între directivele MACRO si ENDM. Sintaxa este:

nume MACRO {parametrii}


cod
ENDM

unde:
 nume reprezintă numele simbolic dat macroinstrucțiunii ;
 parametrii reprezintă parametrii formali opționali ai macroinstrucțiunii, separați prin virgulă,
blancuri sau TAB-uri. La apelul macroinstrucțiunii, acești parametri formali sunt înlocuiți textual cu
parametrii actuali.

[Link] macroinstrucțiunii, care se realizează printr-un macroapel, cu sintaxa:


nume {argumente}
unde:
 nume reprezintă numele simbolic al macroinstrucțiunii apelate;
 argumente reprezintă lista parametrilor actuali, separați prin virgulă, blancuri sau TAB-uri.
Apelul macroinstrucțiunii are ca efect includerea textuală a codului din definiția macroinstrucțiunii în
corpul programului.

Exemplu : Adunarea a 3 cuvinte cu depunerea rezultatului în ax.


Arhitectura Calculatoarelor 51
addup MACRO ad1,ad2,ad3
mov ax,ad1
add ax,ad2
add ax,ad3
ENDM
………
a WORD 1
b WORD 2
cd WORD 3
d WORD ?
………..
addup a,b,cd
mov dx,ax
addup dx,dx,dx
mov d,ax
addup d,dx,cd

Pentru definirea unor simboluri în cadrul unei macroinstructiuni, care la fiecare apel al macroinstructiunii
respective vor fi înlocuite cu nume unice de simboluri, gestionate de asamblor, se utilizează directiva
LOCAL cu sintaxa:
LOCAL nume {,nume} ...

Directiva LOCAL, dacă este prezentă într-o macrodefinitie, trebuie să urmeze imediat directivei
MACRO.
Exemplu: Ridicarea unui numar la o putere.

power MACRO factor,exponent


LOCAL again, gotzero
xor dx,dx
mov ax,factor
mov cx,exponent
again: jcxz gotzero
mul bx
loop again
gotzero:
ENDM
Arhitectura Calculatoarelor 52

3 Structura calculatoarelor

3.1 Componentele funcţionale și clasificarea


Noţiunea de la care pornim este aceea de calculator; acesta este un sistem programabil de prelucrare
a informaţiei care are două componente esenţiale, inseparabile şi definitorii: hardware şi software.
A. Din punct de vedere hardware, calculatorul are trei componente funcţionale legate într-un mod
specific (Figura 3.1).
Blocurile funcţionale sunt:
1. Unitatea centrală de prelucrare (UCP) are două funcţii esenţiale:
 prelucrarea datelor;
 controlul activităţii întregului calculator.
O unitate centrală de prelucrarea informaţiei, având funcţiile enunţate mai sus, care coordonează
un sistem structurat funcţional ca în Figura 3.1 şi care, fizic, se prezintă sub forma unui singur cip (circuit
integrat) se numeşte microprocesor. Această accepţiune standard a noţiunii va fi folosită în continuare
pentru detalierea conceptelor care stau la baza funcţionării întregului calculator.
2. MEMORIA este, din punctul de vedere al sistemului pe care îl definim, o secvenţă de locaţii pentru
stocarea informaţiei.
Fiecare locaţie este definită prin două entităţi informaţionale:
 Conţinutul, reprezentat de o înşiruie de cifre binare 0 sau 1 ("biţi"); se va observa că nu am
folosit noţiunea de "număr binar", pentru că informaţia stocată într-o locaţie de memorie poate
avea diverse semnificaţii. Numărul de cifre binare conţinute într-o locaţie depinde de modul în
care microprocesorul organizează informaţia în memorie; mărimea unei locaţii va fi denumită
formatul memoriei, exprimat în număr de biţi (8 biţi). Formatul memoriei nu are nici-o legătură
cu organizarea fizica a cipurilor de memorie.

MEMORY

Magistrala date

Magistrala adrese
CPU

Mgistrala control

I/O
Arhitectura Calculatoarelor 53

Figura 3.1

 Adresă, reprezentând numărul de ordine al locaţiei, care permite identificarea sa în cadrul


secvenţei de locaţii (există o corespondenţă biunivocă între fiecare locaţie de memorie şi adresa
sa).
 În privinţa memoriei unui calculator vom folosi câteva noţiuni:
 "Harta memoriei", definită ca fiind totalitatea locaţiilor de memorie pe care le poate adresa un
microprocesor.
 "Pagini" şi/sau "segmente" sunt subdiviziuni logice ale hărţii memoriei, ale căror dimensiuni,
fixe sau dinamice, sunt specifice modului în care un microprocesor anume organizează
memoria. Subliniem din nou că aceste moduri de organizare nu au nici-o legătură cu structura
fizică a memoriei unui calculator.
3. Dispozitivele de intrare/ ieșire (I/O) sunt constituite din circuitele prin care se realizează legătura
între calculator şi lumea exterioară. O unitate elementară de conversaţie cu exteriorul poartă numele de
"port de intrare/ieşire". Între porturi şi locaţiile din memorie există nişte similitudini:
 Porturile sunt în esenţă tot locaţii de memorare a informaţiei, adresabile; desigur, informaţia care
se foloseşte uzual aici este alcătuită din operanzi/rezultate (date).
 Există o "hartă a porturilor" care, aşa cum vom arăta în capitolele următoare, poate sau nu să facă
parte din harta memoriei.
Singura deosebire esenţială faţă de locaţiile de memorie este legătura fizică pe care porturile o asigură
cu exteriorul; pentru microprocesor, de multe ori, această legătură fizică este transparentă şi
nesemnificativă.
În sfârşit, componenţa hardware a calculatorului comportă un set de legături specifice; acestea se
realizează printr-o aşa numită "magistrală": un set de conexiuni fizice între blocuri prin care informaţia
care circulă are o semnificaţie prestabilită. Sistemele la care ne referim au o magistrală unică, ce le
caracterizează; din punct de vedere funcţional, există trei componente ale acestei magistrale,
individualizate şi în Figura 3.1:
1. Magistrala de date, bidirecţională, permite circulaţia datelor (operanzi/rezultate), a instrucţiunilor şi
chiar a adreselor.
2. Magistrala de adrese, unidirecţională, permite microprocesorului să localizeze informaţia în
Memorie sau în Dispozitivele de intrare/ieşire; deci pe această magistrală circulă numai adrese.
3. Magistrala de control permite circulaţia, bidirecţională, a semnalelor de comandă şi control de la/la
microprocesor, în calitatea sa de Unitate centrală.
B. Din punct de vedere software, a doua componentă definitorie a calculatorului, definirea rezultă
practic din considerentele anterioare: o serie de programe organizate în moduri specifice.
Prezentarea acestor noţiuni şi definirea lor ne permit câteva concluzii care să facă o primă delimitare
asupra conceptului de microprocesor aşa cum este el înţeles în volumul de faţă:
 Microprocesorul constituie Unitatea centrală de prelucrare a unui sistem având schema
bloc funcţională din Figura 3.1. Important este că el concentrează şi funcţia de prelucrare şi pe
cea de comandă.
 Toate celelalte componente ale sistemului nu au putere de decizie. Memoria, de pildă, nu
controlează şi nici nu e necesar să controleze semnificaţia informaţiei pe care o deţine şi modul în
care este organizată logic.
 Legătura dintre blocuri este asigurată de o magistrală unică cu trei componente
funcţionale; pe magistrala de date circulă toate tipurile de informaţii.
 Funcţionarea sistemului se face pe baza unor programe alcătuite din secvenţe de
instrucţiuni. Acestea sunt citite din memorie de către microprocesor, recunoscute şi apoi
executate.

Calculatoarele deseori se caracterizează prin :


a) Viteza de calcul - este o evaluare, determinată analitic sau experimental, a volumului de
Arhitectura Calculatoarelor 54
instrucțiuni (comenzi) executate de calculator într-o unitate de timp. Viteza de calcul se măsoară
în milioane de instrucțiuni executate pe secundă (milion instruction per second, MIPS), milioane
de instrucțiuni în virgulă mobilă ( megaflops, MFLOPS ).
a) Lăţimea magistralei de date – lăţimea (mărimea ) maximală a codului informatic care poate fi
prelucrat, păstrat şi transferat în calculator, ca o unitate întreagă.
b) Capacitatea de stocare a memoratoarelor – cantitatea informaţiei codate, concomitent păstrată în
memoratoarele calculatorului. Pentru măsurarea capacităţii de stocare se folosesc următoarele
prefixe:
 1KiloByte = 210Byte ≈ 103 Byte
 1MegaByte = 220 Byte ≈ 106 Byte
 1GigaByte = 230 Byte ≈ 109 Byte
 1TerraByte = 240 Byte ≈ 1012Byte
 1PetaByte = 250 Byte ≈ 1015Byte

Clasificarea calculatoarelor conform caracteristicilor menționate este neactuală.


Prezentăm câteva clasificări moderne.

Industria modernă produce o mare varietate de calculatoare. Din această varietate, vom clasifica
orientativ calculatoarele ( E. Tanenbaum "Organizarea structurată a calculatoarelor"):
 circuitul integrat, sau calculatoare "one-off", domeniul de utilizare – de ex. felicitările (cărți poștale);
 calculatoare integrate (microcontrolere) - ceasuri, maşini, diferite dispozitive;
 console de jocuri – jocuri la domiciliu;
 calculatoare personale PC – variantele desktop și laptop-uri;
 servere - servere de rețea;
 grupe (clastere) de staţii de lucru (COW- Cluster Of Workstations) - multicalculatoare conectate în
rețele;
 Mainframe - prelucrarea a bazelor de date într-o bancă.

Circuite integrate
Ele mai sunt numite calculatoare "one-off". Aceste circuite pot fi lipite pe cărți poștale și interpretează
melodii cu tematica specifică anumitor sărbători / aniversari, de tipul «Happy Birthday». Probabil, cea
mai semnificativă realizare în acest domeniu a fost apariția circuitelor RFID (Radio Frequency
Identification — Tehnologia identificării prin radiofrecvenţă). Această tehnologie presupune stocarea
informaţiilor nu prin codurile de bare, ci prin intermediul unor cipuri electronice integrate, de ex. în
etichete, ecusoane, ambalaje de marfă, corpurile animalelor etc. Aceste informaţii, ce reprezintă un cod
unic din 128 biți, pot fi citite (de la câţiva centimetri până la sute de metri) prin unde radio. Dimensiunea
acestor circuite este mai mică de 0,5mm (figura 3.2), costul fiind de câțiva cenți. Circuitele nu utilizează
surse de alimentare și pot stoca informația mult timp.

a) b)
Figura 3.2 - Circuitul RFID -a, b – fără antenă
Arhitectura Calculatoarelor 55
Informații detaliate le puteți găsi pe site-ul [Link].

Microcontrolere
La modul general un microcontroler este, actualmente, o structură electronică destinată controlului
(destul de evident!) unui proces sau, mai general, unei interacțiuni caracteristice cu mediul exterior, fără
să fie necesară intervenția operatorului uman. El reprezintă un microcircuit care incorporează o unitate
centrală (CPU) și o memorie împreună cu resurse care-i permit interacțiunea cu mediul exterior. Toate
aplicațiile în care se utilizează microcontrolere fac parte din categoria așa ziselor sisteme încapsulate-
integrate (“embedded systems”), la care existența unui sistem de calcul incorporat este (aproape)
transparentă pentru utilizator.

Printre multele domenii, unde utilizarea lor este practic un standard industrial, se pot menționa:
în industria de automobile (controlul aprinderii/motorului, climatizare, diagnoză, sisteme de alarmă,
etc.), în așa zisa electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane,
telefonie mobilă, GPS-uri, etc.), în aparatura electrocasnică (mașini de spălat, frigidere, cuptoare cu
microunde, aspiratoare), în controlul mediului și climatizare (sere, locuințe, hale industriale), în industria
aerospațială, în mijloacele moderne de măsurare (aparate de măsurare, senzori și traductoare inteligente),
la realizarea de periferice pentru calculatoare, în medicină, ş.a.
Ca un exemplu din industria de automobile, unde numai la nivelul anului 1999, un BMW seria 7
utiliza 65 de microcontrolere, iar un Mercedes din clasa S utiliza 63 de microcontrolere; iar un avion
peste 200. Practic, este foarte greu de găsit un domeniu de aplicații, în care să nu se utilizeze
microcontrolerele.

Console de jocuri. O consolă de jocuri este un sistem dedicat jocurilor video, ce reprezintă de fapt un
calculator interactiv pentru distracții. Deseori constă din 2 unități: un controller - cu ajutorul căruia,
utilizatorul poate introduce date sau interacționa cu obiectele de pe ecran și un bloc ce conține un
procesor, RAM, și un coprocesor pentru audio-video, incorporate intr-o carcasă la care se conectează
televizorul și controlerul. Prezentăm caracteristicile principale ale Sony PlayStation4. Noua consolă are
un procesor AMD Jaguar cu 8 nuclee și un GPU AMD Radeon, cu o viteză de calcul de 1,84 teraflopi,
alături de memorie RAM GDDR5 de 8GB și spatiu de stocare HDD până 640 GB. Specificațiile PS4
includ și Blu-ray drives cu un volum de 250 GB, alături de conectivitate USB 3.0, Bluetooth 4.0, HDMI,
Wi-Fi și Ethernet.
Calculatoare personale
Calculatoare personale (PC) se divizează în 2 grupe: variantele desktop și portabile (laptop, notebook,
palmtop (PDA). În structura lor, de regulă, intră: microprocesoare, module de memorie de gigabytes, hard
discuri de terabytes, CD-ROM/DVD drives, modemuri, plăci video, audio, de rețea, monitoare ș.a.,
sisteme de operare complexe instalate.

Servere
Un server este o un calculator, care operează continuu în rețeaua sa și așteaptă solicitări din partea
altor calculatoare din rețea, pentru a asigura accesul la toată paleta de forme de conectare și servicii.
Multe componente de hardware sunt identice cu cele ce le găsim într-un calculator personal. Totuși
serverele rulează sisteme de operare și programe specializate care sunt diferite față de cele folosite pe
calculatoare personale.
Serverele deservesc resurse hardware care sunt partajate și pot uneori fi comandate de către
calculatoarele-client, cum ar fi imprimante (atunci serverul se numește print server) sau sisteme de fișiere
(atunci el se numește file server). Această partajare permite un acces și o securitate mai bune. Cu toate că
serverele pot fi construite, din comoditate, din componente obișnuite de calculatoare, este necesar ca,
Arhitectura Calculatoarelor 56
pentru operații rapide și de mare amploare, serverele să folosească configurații hardware optimizate
pentru aceste cerințe, Intel produce microprocesoare specializate pentru servere și stații de lucru - Intel
Xeon. Cu toate că serverele oferă mult spațiu pe disc, pentru mărirea siguranței în funcționare sunt
folosite hard-discuri de capacitate redusă, numeroase, interconectate în mod special.
Folosirea mai multor microprocesoare duce la o mai mare fiabilitate în comparație cu un singur
microprocesor. De asemenea se folosesc Uninterruptible Power Supplies (UPS-uri) pentru a fi siguri de
continuitatea de alimentare cu energie electrică, astfel ca penele din rețeaua publică de curent să nu
provoace stricăciuni ireparabile. Diferența majoră între computerele personale și servere nu este partea
hardware ci partea de software. Pe servere rulează sisteme de operare care sunt special proiectate pentru
acestea. De asemenea ele rulează aplicații special proiectate pentru procesele dorite. În lumea serverelor
cele mai populare sistem de operare sunt FreeBSD, Sun Solaris și GNU/Linux – care derivă și sunt
asemănătoare cu sistemul de operare UNIX. UNIX a fost o alegere logică și eficientă ca sistem de operare
pentru servere.

Grupe (clastere) de staţii de lucru (COW- Cluster Of Workstations)


Clasterele constau din zeci, sute, mii de PC-uri sau statii de lucru conectate in retea prin placi de retea de larg
consum. Sistemele COW sunt gestionate de soft specializat, ce permite să direcționeze resursele lor pentru a
rezolva diferite probleme inginerești și științifice. Dacă frecvența accesărilor la paginile web-site-ului se
estimează la mii, zeci de mii pe secundă, este convenabil ca serverele să fie organizate în clastere de stații de
lucru.

Calculatoarele Mainframe
Calculatoarele mainframe sunt calculatoare ce pot exploata volume imense de date şi pot suporta
lucrul a mii de utilizatori simultan. Un calculator mainframe se distinge mai ales prin capacitatea de
stocare şi memoria internă. El poate rula ani întregi fără întrerupere, Unele calculatoare pot rula mai
multe sisteme de operare simultan, operând astfel ca o mulţime de “maşini virtuale”. Preţul unui astfel de
calculator este de ordinul sutelor de mii de dolari. Este solicitat de companiile care vehiculează şi
prelucrează un volum foarte mare de informaţie. Principala diferenţă între supercalculatoare şi mainframe
este că primele se folosesc pentru operaţii ce necesită calcule intense, în timp ce mainframe efectuează
operaţii de complexitate redusă asupra unor volume mari de date.
Supercalculatorul posedă resurse hardware şi software deosebite. Se utilizează în industria de
apărare, în cercetarea ştiinţifică, în câteva universităţi, în industria aeronautică şi spaţială. Departamentul
Energiei SUA deţine un supercomputer din lume The Roadrunner. Acesta are o putere de calcul de 1
petaflop (1015 operaţii pe secundă, în virgulă mobilă). Ocupă o suprafaţă de 1100 m2 şi a fost construit din
700 de procesoare AMD Opteron.
În anul 2013 compania Cray a realizat pentru Departamentul Energiei al SUA un supercomputer
cu o putere de calcul de 20 peta operaţii de secundă (20 petaflops) numit Titan. Astfel, în scurt timp (anul
2025), se va realiza un supercomputer cu o putere de calcul de 10 exaflops (10 19 flops), care va fi capabil
să simuleze activitatea creierului uman.

În studiul arhitecturilor de calcul este foarte utilă existenţa unei metode de comparare a diferitelor
arhitecturi, fără a fi necesară compararea specificaţiilor detaliate ale fiecărei arhitecturi. Astfel că
arhitecturile de calcul sunt clasificate pe baza unui set mai restrâns de caracteristici.
Clasificarea lui Flynn
Cea mai cunoscută clasificare a arhitecturilor de calcul este cea propusă de Flynn (profesor la
Stanford University) în 1966. Această clasificare nu examinează structura explicită a sistemelor ci
urmăreşte fluxul de date şi de instrucţiuni prin acestea. Prin flux de instrucţiuni se înţelege secvenţa de
instrucţiuni executată de o maşină sau unitate de execuţie; iar prin flux de date se înţelege secvenţa de
date apelate de fluxul de instrucţiuni.
După Flynn arhitecturile de calcul se împart în următoarele patru categorii:
 cu un flux de instrucţiuni şi un flux de date (SISD);
 cu un flux de instrucţiuni şi mai multe fluxuri de date (SIMD);
 cu mai multe fluxuri de instrucţiuni şi un flux de date (MISD);
 cu mai multe fluxuri de instrucţiuni şi mai multe fluxuri de date (MIMD).

SISD (Single Instruction Single Data):


Arhitectura Calculatoarelor 57
Din această categorie fac parte calculatoarele convenţionale care execută un singur flux de instrucţiuni
asupra unui singur flux de date. Aceste siteme de calcul se mai numesc şi calculatoare von Neumann.

Figura 3.2 Arhitectura von Neumann


Instrucţiunile sunt executate secvenţial, însă pot exista suprapuneri între acestea dacă este
implementat conceptul de bandă de asamblare (pipeline) – majoritatea sistemelor SISD actuale utilizează
conceptul de bandă de asamblare. Calculatoarele SISD pot avea mai multe unităţi funcţionale (ex:
coprocesor matematic, procesor grafic, procesor de intrare/ieşire, etc.), însă acestea sunt văzute ca o
singură unitate de execuţie.

Figura 3.3 Arhitectura SISD


UC – unitate de comandă;
UE – unitate de execuţie, element de procesare, procesor;
MM – modul de memorie;
SI – flux (şir) de instrucţiuni;
SD – flux (şir) de date.
Exemple de calculatoare SISD: CDC 6600, CDC 7600, Amdhal 470/6, Cray-1.

SIMD (Single Instruction Multiple Data)


Această categorie de arhitecturi cuprinde sistemele de calcul compuse din mai multe unităţi de
execuţie identice aflate sub comanda unei singure unităţi de control. Unitatea de control transmite acelaşi
flux de instrucţiuni, simultan, tuturor unităţilor de execuţie. Toate unităţile de execuţie execută simultan
aceeaşi instrucţiune asupra datelor din memoria proprie (există sisteme ce au şi o memorie partajată
pentru comunicaţii). Unitatea de control trebuie să permită tuturor elementelor de procesare să-şi termine
instrucţiunea curentă înainte de iniţierea unei noi instrucţiuni, astfel că execuţia instrucţiunilor trebuie
sincronizată între toate unităţile de execuţie. Ca şi ordin de mărime numărul procesoarelor implicate într-o
structură SIMD este de câteva mii.
Aplicabilitate: calculatoarele SIMD sunt folosite în cazul aplicaţiilor paralele ce necesită un control fin
asupra datelor. Exemplu: reţele neuronale.
Exemple de implementări SIMD: ILLIAC-IV, PEPE, BSP, STARAN, MPP, DAP, Connection Machine
CM-1, CM-2 (de la Thinking Machines Corporation), MassPar MP-1, MP-2.
Arhitectura Calculatoarelor 58
Figura 3.4 Arhitectura SIMD
Topologia reţelei de interconectare nu apare în clasificarea lui Flynn.
MISD (Multiple Instruction Single Data)
Arhitecturile MISD au mai multe elemente de procesare, fiecare executând un set diferit de instrucţiuni
asupra unui singur flux de date. Acest lucru este realizabil în două moduri:
 acelaşi element din fluxul de date este prelucrat de toate procesoarele, fiecare executând propriile
operaţii asupra respectivei date;
 un element din fluxul de date este prelucrat de primul procesor, rezultatul obţinut este pasat mai
departe celui de-al doilea procesor ş.a.m.d., formându-se astfel o macro-bandă de asamblare.
Singurul exemplu de implementare pentru acest tip de arhitecturi este [Link] (calculator
multimicroprocesor) construit la Carnegie-Mellon University. Acest calculator este reconfigurabil şi poate
opera în modurile SIMD, MISD şi MIMD.

Figura 3.5 Arhitectura MISD

MIMD (Multiple Instruction Multiple Data)


Majoritatea sistemelor multiprocesor se pot încadra în această categorie. Un sistem de calcul MIMD
are mai multe elemente de procesare interconectate, fiecare având propria unitate de control. Procesoarele
lucrează fiecare asupra propriilor date executând asupra lor propriile instrucţiuni. Sistemele MIMD pot
avea şi memorie partajată. Operaţiile executate de fiecare procesor sunt independente intre ele, deci
modul lor de operare este asincron.
Acest tip de arhitecturi sunt aplicabile în cazul aplicaţiilor paralele (calcul paralel).
Exemple de implementare: [Link], Burroughs D825, Cray-2, S1, Cray X-MP, SGI/Cray Power
Challenge Array, SGI/Cray Origin-2000, HP/Convex SPP-2000, Pluribus, IBM 370/168 MP, Univac
1100/80, Tandem/16, IBM 3081/3084, BBN Butterfly, Meiko Computing Surface (CS-1), FPS T/40000,
iPSC.
Arhitectura Calculatoarelor 59

Figura 3.6 Arhitectura MIMD

O variantă între SIMD şi MIMD sunt arhitecturile SPMD (Single Program Multiple Data), în care
unităţile de procesare execută acelaşi segment de cod asupra unor date diferite, independent unul de
celălalt (în mod asincron).
SIMD < SPMD < MIMD

Prezentare generală a microprocesoarelor Intel


Primele microprocesoare sunt produse la firma Intel în 1971: ele se "numeau" 4004 şi 8008, pe
patru şi respectiv 8 biţi. Primul microprocesor considerat "standard", care impune chiar o definire a
termenului şi a unor concepte legate de această modalitate de prelucrare a informaţiei este însă 8080
produs tot de firma Intel. Tot firma Intel este cea care lansează primul microprocesor care lucrează pe 16
biţi - Intel 8086 (1978). În 1979, Intel face, aparent, un pas înapoi: lansează 8088 care este identic în
interior cu 8086 dar în exterior lucrează pe 8 biţi. Strategia firmei este limpede: mulţi fabricanţi nu sunt
pregătiţi să schimbe toate celelalte componente ale sistemelor de prelucrare pe 16biţi, aşa că vor prefera
încă microprocesoarele compatibile cu magistrala de 8 biţi.
În tabelul de mai jos sunt prezentate generaţiile şi carateristicile de bază ale microprocesoarelor Intel.
Tabelul 1 - Generaţiile şi carateristicile de bază ale microprocesoarelor Intel
Frecvenţa
Lăţimea Cache Frecvenţa
de tact a
magistralei Interior de tact
Tip/generaţie Anul magistralei
Date/Adrese, (L1), (interioară,)
de memorie,
Biţi kB (Mhz)
(Mhz)
8088/First 1979 8/20 None 4.77-8 4.77-8
8086/First 1978 16/20 None 4.77-8 4.77-8
80286/Second 1982 16/24 None 6-20 6-20
80386DX/Third 1985 32/32 None 16-33 16-33
80386SX/Third 1988 16/32 None 16-33 16-33
80486DX/Fourth 1989 32/32 8 25-50 25-50
80486SX/Fourth 1989 32/32 8 25-50 25-50
80486DX2/Fourth 1992 32/32 8 25-40 50-80
80486DX4/Fourth 1994 32/32 8+8 25-40 75-120
Pentium/Fifth
1993 64/32 8+8 60-66 60-200
Pentium
1997 64/32 16+16 66 166-233
MMX/Fifth
Pentium Pro/Sixth 1995 64/36 8+8 66 150-200
Pentium II/Sixth 1997 64/36 16+16 66 233-300
Pentium 1999 64/36 32K+32K 100 650-1400
III/Sixth
Pentium4/ 2000 64/36 64K+64K 100 1300-3800
Seventh
Arhitectura Calculatoarelor 60
Consacrarea definitivă a produselor Intel o face firma IBM care, în 1981, anunţă primele
calculatoare personale, IBM PC-XT, care folosesc 8088/8086. Aceste procesoare au introdus conceptul de
segmentare a memoriei: memoria este împărţită în zone numite segmente de maxim 64 KB, iar cele patru
registre de segment pot păstra adresele de bază ale segmentelor active. Aceste procesoare pot funcţiona
numai în modul real, care este un mod uniproces, în care se execută un singur proces (program sau task)
la un moment dat.
În 1982 Intel lansează microprocesorul 80286 (ignorăm că, între timp, multe firme ca National,
Fairchild, RCA, Signetics etc. produc componente similare); acesta, deşi tot pe 16 biţi, introduce o serie
de noi concepte fundamentale care tind să schimbe chiar noţiunea de microprocesor. Procesorul 80286
poate funcţiona în modul real al procesoarelor precedente, dar dispune şi de un mod de adresare virtual
sau mod protejat. Acest mod utilizează conţinutul registrelor de segment ca selectori sau pointeri în tabele
ale descriptorilor de segment. Procesorul dispune de o unitate de gestiune a memoriei virtuale. În modul
protejat, procesorul poate funcţiona în regim multi-proces (multitasking), în care pot fi executate mai
multe procese în mod concurent. În acest mod se realizează o comutare prin hardware între procesele care
se execută concurent. Firma IBM lansează şi ea o nouă generaţie de calculatoare personale: PC-AT
("Advanced Technology") care foloseşte Intel 80286.
Procesorul 80386 a introdus în cadrul arhitecturii Intel registre de 32 de biţi, utilizate atât pentru
păstrarea datelor, cât şi pentru adresare. Pentru compatibilitate cu procesoarele anterioare, aceste registre
s-au obţinut prin extinderea registrelor de 16 biţi, fiind posibilă utilizarea în continuare a vechilor registre,
acestea constituind jumătatea de ordin inferior a registrelor de 32 de biţi. A fost introdus un nou mod de
funcţionare, numit mod virtual 8086. Instrucţiunile originale au fost extinse cu noi forme care utilizează
operanzi şi adrese de 32 de biţi, şi au fost introduse instrucţiuni complet noi, ca de exemplu instrucţiuni
pentru operaţii la nivel de bit.
Procesorul 80386 a introdus de asemenea mecanismul de paginare ca metodă de gestiune a
memoriei virtuale. El a fost primul din cadrul familiei 80x86 care a utilizat o formă de prelucrare paralelă
şi o memorie încorporată cache cu informaţii despre până la 32 de pagini cel mai recent accesate.
Procesorul 80486 a fost primul din familia 80x86 la care unitatea de calcul în virgulăl mobilă a
fost integrată în acelaşi circuit cu unitatea centrală. Procesorului i s-a adăugat o memorie cache de nivel 1
(L1 – Level 1) de 8 KB. Au fost adăugaţi de asemenea noi pini şi noi instrucţiuni care permit realizarea
unor sisteme mai complexe: sisteme multiprocesor şi sisteme care conţin o memorie cache de nivel 2 (L2
– Level 2).
Au fost dezvoltate versiuni ale procesorului 80486 în care au fost incluse facilităţi pentru reducerea
consumului de putere, ca şi alte facilităţi de gestiune a sistemului. Una din aceste facilităţi este noul mod
de gestiune a sistemului (System Management Mode – SMM), pentru care s-a prevăzut un pin dedicat de
întrerupere. Acest mod permite operaţii complexe de gestiune a sistemului (ca de exemplu gestiunea
puterii consumate de diferitele subsisteme ale calculatorului), într-un mod transparent pentru sistemul de
operare şi pentru programele de aplicaţii. Facilităţile numite “Stop Clock” şi “Auto Halt Power down”
permit funcţionarea unităţii centrale la o frecvenţă redusă a tactului pentru reducerea puterii consumate,
sau chiar oprirea funcţionării (cu memorarea stării).
În 1993, se lansează primul microprocesor al generaţiei a cincea, numit din acest motiv Pentium.
Procesorul Pentium a adăugat o nouă linie de execuţie de tip pipeline a instrucţiunilor, pentru a se obţine
performanţe superscalare. Cele două linii de execuţie a instrucţiunilor, numite U şi V, permit execuţia a
două instrucţiuni pe durata unei perioade de tact. Capacitatea memoriei cache L1 a fost de asemenea
dublat , fiind alocaţi 8 KB pentru instrucţiuni şi 8 KB pentru date. Memoria cache pentru date utilizează
protocolul MESI, care permite gestiunea memoriei cache atât prin metoda mai eficientă “write-back”, cât
şi prin metoda “write-through” utilizată de procesorul 80486. Procesorul Pentium utilizează predicţia
salturilor pentru a creşte performanţele construcţiilor care utilizează bucle de program. Registrele
generale sunt tot de 32 de biţi, dar s-au adăugat magistrale interne de date de 128 şi 256 de biţi pentru a
creşte viteza transferurilor interne, iar magistrala externă de date a fost extinsă la 64 de biţi. Procesorului i
s-a adăugat un controler avansat de întreruperi (Advanced Programmable Interrupt Controller – APIC)
pentru a permite realizarea sistemelor cu mai multe procesoare Pentium, fiind adăugate de asemenea noi
pini şi un mod special de procesare dual pentru sistemele cu două procesoare.
Procesorul Pentium Pro este primul din cadrul familiei de procesoare P6. Acest procesor are o
arhitectură superscalară îmbunătăţită, care permite execuţia a trei instrucţiuni într-o stare (perioadă de
tact, ceas). Procesorul Pentium Pro, ca şi următoarele procesoare din familia P6, se caracterizează prin
execuţia dinamică a instrucţiunilor, care constă din analiza fluxului de date, execuţia instrucţiunilor într-o
Arhitectura Calculatoarelor 61
altă ordine decât cea secvenţială, o predicţie îmbunătăţită a salturilor şi execuţia speculativă. Pe lângă cele
două memorii cache L1 de câte 8 KB, prezente şi la procesorul Pentium, procesorul Pentium Pro dispune
şi de o memorie cache L2 de 256 KB, aflat în acelaşi circuit cu unitatea centrală , conectat cu aceasta
printr-o magistrală dedicată de 64 de biţi. Procesorul Pentium Pro are o magistrală de adrese extinsă la 36
de biţi, astfel încât spaţiul adreselor fizice este de până la 64 GB.
Procesorul Pentium II se bazează pe arhitectura Pentium Pro, la care s-au adăugat extensiile MMX
(Multimedia Extensions). Memoria cache L2 a fost mutată în afara capsulei procesorului. Atât memoria
cache L1 pentru date, cât şi memoria cache L1 pentru instrucţiuni au fost extinse la 16 KB fiecare.
Dimensiunea memoriei cache L2 poate fi de 256 KB, 512 KB, 1 MB sau 2 MB. Procesorul Pentium II
utilizează diferite stări cu consum redus de putere, ca de exemplu “AutoHALT”, “Sleep” şi “Deep Sleep”,
pentru reducerea puterii consumate în perioadele de inactivitate.
Pentium III este ultimul din cadrul familiei P6, şi se bazează pe arhitecturile procesoarelor Pentium Pro şi
Pentium II. Au fost adăugate 70 de noi instrucţiuni de tip SSE (Streaming SIMD Extensions) la setul de
instrucţiuni existent. Acestea sunt destinate atât unităţilor funcţionale existente la procesoarele precedente,
cât şi noii unităţi de calcul în virgulă mobilă de tip SIMD (Single Instruction, Multiple Data).
Primul din familia P7, numit Pentium 4, a primit şi o nouă arhitectură cu o viteză de procesare mai
performantă. În versiunea microprocesorului cu frecvenţa de tact de 3,06 Ghz a fost realizată o nouă
tehnologie – hyperthreading. Această tehnologie permite ca procesele (programele) să fie divizate în două
fluxuri de program pentru a fi procesate în paralel de microprocesor, ce măreşte viteza de procesare.
Pentru creşterea vitezei de prelucrare a datelor audio şi video a fost introdus un set suplimentar din SSE
instrucţiuni.
În noembrie 2004 firma Intel a renunţat la producerea în serie a microprocesorului Pentium 4 cu
frecvenţa de 4 Ghz din cauza dificultăţilor apărute la răcirea lui.
Actualmente, firma Intel, încapsulează două şi mai multe nuclee de microprocesor cu frecvenţe reduse
în circuitul unui microprocesor, ce exclud dificultăţile cu răcirea lor.
Evoluţia dispozitivelor pe care am descris-o până în acest moment se referă exclusiv la
microprocesoarele ale căror caracteristici esenţiale şi arii de aplicaţii posibile s-au dezvoltat de la tipurile
de bază lansate în anii 70. Noi vom denumi aceste dispozitive " microprocesoare" şi le vom defini în acest
capitol; vom detalia, în evoluţia lor, conceptele esenţiale care stau la baza funcţionării lor în capitole
următoare.
Există însă şi alte direcţii de dezvoltare a dispozitivelor de prelucrare a informaţiei; un exemplu sunt
aşa numitele "procesoare cu set redus de instrucţiuni" (RISC) avînd ca reprezentanţi procesoarele SPARC
(produse de diferite firme), i860 (Intel), M88000 (Motorola) etc. De asemenea există procesoare
specializate pentru anumite tipuri de prelucrări specifice cum sunt procesoarele digitale de semnal (DSP)
şi altele.

3.2 Microprocesoarele CISC/RISC


Multe microprocesoare au seturi de instrucţiuni ce includ mai mult de 100 – 200 instrucțiuni. Ele
folosesc o varietate de tipuri de date și un mare număr de moduri de adresare. Tendința aceasta de a mări
numărul de instrucțiuni a fost influențată de mai mulți factori, dintre care amintim:
 perfecționarea unor modele de procesoare existente anterior, pentru a pune la dispoziția
utilizatorilor (programelor utilizator) cât mai multe funcții;
 adăugarea de instrucțiuni care să faciliteze translatarea din limbajele de nivel înalt în programe
cod executabil (limbaj mașină);
Așa arhitecturi de microprocesoare au fost numite arhitecturi CISC - Complex Instruction Set
Computer - calculator cu set complex de instrucțiuni. Câteva din caracteristici sunt:
 Multe instrucțiuni care prelucrează operanzi din memorie;
 Format de lungime variabilă pentru instrucțiuni;
 Unitate de control microprogramată (micro-codată), avantajoasa din punctul de vedere al
flexibilității implementării, dar lentă;
 Set complex (extins) de instrucțiuni și o mare varietate de moduri de adresare;
 Un număr relativ mic de registre în interiorul UCP.
 Utilizarea compilatoarelor optimizatoare - pentru a optimiza performanțele codului obiect;
Ideea simplificării setului de instrucțiuni, în scopul măririi performanțelor procesorului, provine din
proiectele realizate la universităţile americane din Berkeley (RISC I, RISC II şi SOAR) şi Stanford
Arhitectura Calculatoarelor 62
(proiectul MIPS). Proiectele RISC (Reduced Instruction Set Computer - Calculator cu set redus de
instrucţiuni) au urmărit ca instrucţiunile procesorului să fie de aceeaşi lungime, instrucţiunile să se
execute într-o singură perioadă de ceas (cu ajutorul tehnicii de tip pipeline). La RISC se urmăreşte de
asemenea ca accesările la memorie (consumatoare de timp) să se efectueze doar pentru operaţiile de
încărcare şi stocare (arhitectura fiind numită în consecinţă: "load/store"), iar celelalte operaţii să se
efectueze cu operanzi stocaţi în registrele interne ale UCP. Unele din proiectele de arhitecturi RISC
folosesc un set mare de ferestre de registre pentru a accelera operaţiile de apel al subrutinelor.
Rezumând, putem enumera câteva din elementele caracteristice pentru maşinile RISC:
 Acces la memorie limitat, doar prin instrucţiuni de încărcare (load) şi stocare (store);
 Format de lungime fixă pentru instrucţiuni, deci uşor de decodificat; caracteristică care contribuie
la simplificarea structurii unităţii de control;
 structură simplă a unităţii de control, deci cu viteză mare de funcţionare;
 Relativ puţine tipuri de instrucţiuni (tipic sub 100 de instrucţiuni) şi puţine moduri de adresare
(din nou această caracteristică contribuie şi la simplificarea structurii unităţii de control);
 Tehnica de tip pipeline este utilizată şi la arhitecturile CISC, dar la RISC tehnica este mai eficientă
şi mai uşor de implementat, datorită lungimii constante a instrucţiunilor;
 Un număr relativ mare de registre în interiorul UCP;
Așa cum s-a arătat mai sus, arhitecturile RISC restricționează numărul de instrucțiuni care accesează
direct memoria principală. Cele mai multe instrucțiuni ale RISC presupun doar operații între registrele
interne UCP. Pentru că instrucțiunile complexe nu există în setul de instrucțiuni, dacă este nevoie de ele,
acestea se implementează prin rutine cu ajutorul instrucțiunilor existente. În final, într-un program
executabil vor fi mai multe instrucțiuni decât la CISC, dar execuția pe ansamblu va fi mai rapidă. Formal,
toate microprocesoarele x86 erau microprocesoare de tip CISC, dar microprocesoarele noi, începând de la
Intel 486DX sunt microprocesoare CISC cu un nucleu RISC. Instrucțiunile microprocesoarelor x86 de tip
CISC, înainte de executarea lor, sunt transformate într-un set simplu de instrucțiuni interne de tip RISC.
Multe microprocesoare moderne încorporează arhitecturi RISC, ca de exemplu ARM, DEC Alpha,
SPARC, AVR, MIPS, POWER, PowerPC.

3.3 Banda de asamblare (pipeline)


Introducem noțiunea de arhitectura suprascalară. Pentru a explica această noțiune, urmărim utilizarea
microinstrucțiunilor executate în paralel (tehnica "pipeline") folosite de microprocesoarele moderne.
Începând cu microprocesorul i486 (fig. 3.7 ), Intel a introdus o bandă de asamblare, numită tehnica
”pipeline”, care constă din 5 segmente:

Unitate de Unitate pentru Unitate pentru


execuţie în segmentare paginare
virgulă mobilă
Unitate de
interfaţă cu
magistrala

Memoria
cache
Unitate de
execuţie
Unitate pentru Unitate
decodificare pentru
instrucţiuni “prefetch”

Figura 3.7
 Ciclul maşină „fetch”(Citirea instrucţiunii din cache sau din memoria internă);
 Decodificarea instrucţiunii – decodifică în microinstrucțiuni;
 Generarea adresei pentru localizarea operanzilor în memorie;
Arhitectura Calculatoarelor 63
 Prelucrarea instrucţiunii în UAL;
 Înscrierea rezultatului ( unde va fi înscris rezultatul depinde de formatul instucţiunii).
Toate aceste segmente sunt executate în paralel. Din unitatea „prefetch” instrucţiunea se transferă în
unitatea pentru decodificarea instrucţiuni, şi unitatea „prefetch” este liberă şi poate citi următoarea
instrucţiune. Deci, în interiorul microprocesorului se află 5 instrucţiuni în diferite segmente de execuţie.
Aceste segmente formează o Bandă de asamblare (pipeline).
Figura 3.8 ilustrează o bandă de asamblare cu 5 unități numite și stages (segmente, etape). Segmentul 1
extrage instrucțiunea din memorie și o plasează într-un registru tampon. Segmentul 2 o decodifică,
determinându-i tipul și operanzii. Segmentul 3 localizează și extrage operanzii, fie din regiştri, fie din
memorie. Segmentul 4 execută instrucțiunea, de obicei rulând operanzii prin calea de date, iar segmentul
5 scrie rezultatul în regiştri.

Figura 3.8 - O banda de asamblare de 5 segmente (a)


Starea fiecărui segment în funcție de timp (b).

În figura 3.8 –b vedem cum operează o bandă de asamblare în funcție de timp. În ciclul 1, segmentul
S1 lucrează asupra instrucțiunii 1 (o extragere din memorie). În ciclul 2, S2 decodifică instrucțiunea 1.
Tot în ciclul 2, S1 extrage instrucțiunea 2. În ciclul 3, S3 extrage operanzii pentru instrucțiunea 1, S2
decodifica instrucțiunea 2 și S1 extrage instrucțiunea 3.
Microprocesoarele ce includ o Bandă de asamblare se numesc microprocesoare cu arhitectura scalară,
cele ce includ două și mai multe - microprocesoare cu arhitectura suprascalară. Microprocesorul
Pentium include două Benzi de asamblare şi poate executa 2 instrucţiuni pe durata unei perioade de ceas
(clock, stare).
Date fiind avantajele benzii de asamblare, ar fi de dorit mai multe din acestea. În figura 3.9 este
prezentată o posibilă proiectare a unui UCP în bandă de asamblare duală. Pentru a putea lucra în paralel,
cele 2 instrucțiuni nu trebuie să-și dispute resursele (de exemplu registrele) și nici una nu trebuie să
depindă de rezultatul celeilalte. Fie compilatorul trebuie să garanteze că ipoteza anterioara e respectată,
fie conflictele sunt detectate și eliminate pe parcursul execuției, cu ajutorul unui hardware suplimentar.

Figura 3.9 Banda de asamblare duală cu 5 segmente

Pentium are două benzi de asamblare asemănătoare cu cele din fig. 3.9, deși împărțirea între
segmentele 2 si 3 (numite decode-1 si decode-2) este puțin diferită față de cea din exemplul nostru. Banda
de asamblare principală, numita ”u” pipeline, poate executa orice instrucțiune Pentium, în timp ce a doua
Arhitectura Calculatoarelor 64
bandă, numită ”v” pipeline, poate executa doar instrucțiuni pentru întregi și o instrucțiune simplă în
virgulă mobilă – FXCH. Reguli destul de complexe determină dacă instrucțiunile sunt compatibile, astfel
încât să poată fi executate în paralel.
Alte UCP utilizează abordări cu totul diferite. Idea de bază este de a avea o singură bandă de
asamblare, dar cu mai multe unități funcționale, așa cum se observă în figura 3.10.

Figura 3.10 - Un procesor superscalar cu 5 unități funcționale

Procesorul Pentium II are o structură asemănătoare (sunt și diferențe) cu cea din fig. 3.10. Unitățile
funcționale UAL din segmentul S4 pot executa instrucțiuni timp de un ciclu de ceas, iar cele care
accesează memoria sau care lucrează în virgulă mobilă (mai lente), au nevoie de mai mult timp decât un
ciclu de ceas pentru a-și executa funcția. După cum se poate observa, pot exista mai multe unități
funcționale în segmentul S4.
Arhitectura Calculatoarelor 65
4 Microarhitectura procesoarelor

Arhitectura de bază a microprocesorului Pentium (fig. 4.1) include


următoarele structuri componente:
a) Două unități de execuție pentru operații cu numere întregi (U si V)
asimilate unor benzi de asamblare.
Pentru cele două unități de execuție se decodifică simultan două instrucțiuni,
iar execuția lor se realizează tot simultan (cu condiția că rezultatul celei de-a doua
instrucțiuni să nu depindă de rezultatul primei instrucțiuni). Aceasta conduce la o
creştere a performantei cu circa 30%, Intel numind-o tehnologie superscalara, baza
noii microarhitecturi (microarhitectură este metoda de realizare a arhitecturii setului
de instrucțiuni (ASI) prin hard-ul microprocesorului).
Pentium foloseşte două memorii cache (de câte 8 kB), pentru coduri şi date,
care sunt folosite pentru a stoca cele mai frecvent folosite coduri şi date. În acest
fel se elimină, de câte ori este posibil, accesul la memoria microcalculatorului, acces
care necesită un timp mai mare.
b) 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 din memoria cache se realizează pe o magistrala de 256 de
biți, dimensiunea mare a acesteia permițând aducerea secvențelor de instruțtiuni cu
o viteză mai mare chiar decât a capacității de procesare.
Memoria
cache 8k
Instrucțiuni Unitate de
Buffer de predicție a
decodificare salturilor
anticipată BTB
Prefetch
buffer
Unitate de
Unitate de UAL UAL virgulă
interfaţă cu U V mobilă
magistrala
FPU

Registre

Memoria cache
8k
date
Figura 4.1

c) Procesorul Pentium utilizează predicția salturilor pentru a creşte


performanțele construcțiilor care utilizează bucle de program. Procesorul Pentium
foloseşte mecanismul predicţiei adreselor salturilor (BTB-Branch Target Buffer).
Conform statisticii, un program tipic la fiecare 6-8 instrucțiuni conține o instrucțiune
de salt. Deci, la fiecare 6-8 instrucțiuni va fi necesară reactualizarea benzii de
asamblare (BA) conform adresei de salt, şi avantajele folosirii BA se pierd. Pentium
Arhitectura Calculatoarelor 66
foloseşte o memorie BTB în care se stochează informația ultimelor 256 de salturi.
Majoritatea programelor conțin bucle de program, în decursul cărora se decide,
ieşirea din buclă sau salt la începutul ei. În acest caz se memorează instrucțiunea
ce controlează ramificarea, adresa saltului şi presupunerea ce subprogram va fi
executat. Unitatea BTB presupune, că ramificarea va fi repetată şi furnizează
instrucțiunea de salt benzii de asamblare. Statistica predicțiilor corecte este de 80%
(conform Intel).
Registrele generale sunt tot de 32 de biți, dar s-au adăugat căi interne de
date de 128 şi 256 de biți pentru a creşte viteza transferurilor interne, iar
magistrala externă de date a fost extinsă la 64 de biți.
TLB (Translation Lookaside Buffer) translatează adresa liniara în adresa fizica.
Procesorului i s-a adăugat un controler avansat de întreruperi (Advanced
Programmable Interrupt Controller – APIC) pentru a permite realizarea sistemelor
cu mai multe procesoare.
Următoarea generație de procesoare este Intel P6. Microarhitectura
procesoarelor din familia P6 este una superscalară cu trei benzi de asamblare.
Aceasta înseamnă că, prin utilizarea tehnicilor de prelucrare paralelă, procesorul
poate decodifica şi executa în medie trei instrucţiuni în fiecare ciclu de ceas. Pentru
a
obține această rată de execuție a instrucțiunilor, procesoarele din familia P6
utilizează o cale de date de tip pipeline cu 12 segmente, care permite execuția
instrucțiunilor într-o ordine diferită de cea specificată în program.
Figura 4.2 prezintă structura acestei căi de date, care este împărțită în patru
unități de prelucrare:

 unitatea de extragere şi decodificare,


 unitatea de expediere şi execuție,
 unitatea de retragere şi rezervorul de instrucțiuni.
Instrucțiunile şi datele sunt transmise acestor unități prin unitatea de interfață cu
magistrala.

Figura 4.2 Unitățile de prelucrare din microarhitectura procesoarelor din familia P6


şi
interfața acestora cu subsistemul de memorie
Arhitectura Calculatoarelor 67
Pentru a asigura furnizarea constantă a instrucțiunilor şi datelor la unitățile de
execuție din calea de date, microarhitectura utilizează două nivele de memorie
cache.
Memoria cache L1 este împărțită într-o memorie cache de 8 KB pentru
instrucțiuni şi o memorie cache de 8 KB pentru date, ambele integrate în calea de
date. Memoria cache L2 este o memorie RAM statică de 256 KB, 512 KB sau 1 MB,
care este conectată la calea de date printr-o magistrală de 64 de biți, funcționând la
frecvența de ceas a procesorului.
Microarhitectura procesoarelor din familia P6 utilizează execuţia dinamică a
instrucțiunilor. Mecanismul de execuție dinamică cuprinde trei concepte:
 Predicția salturilor;
 Analiza dinamică a fluxului de date;
 Execuția speculativă.
Predicţia salturilor este un concept întâlnit la majoritatea arhitecturilor
performante de calculatoare şi a microprocesoarelor de viteză ridicată. Acest
concept permite procesorului decodificarea instrucțiunilor de după cele de salt
pentru a nu goli calea de date pipeline la execuția instrucțiunilor de salt. Unitatea
de extragere şi decodificare a instrucțiunilor utilizează un algoritm de predicție
optimizat pentru anticiparea
direcției fluxului de instrucțiuni prin nivele multiple de salturi, apeluri de proceduri
şi reveniri din proceduri.
Analiza dinamică a fluxului de date implică analiza în timp real a fluxului
datelor prin procesor pentru a determina dependența datelor şi a registrelor, şi
pentru a detecta posibilitatea execuției instrucțiunilor într-o ordine diferită de cea
specificată în program. Unitatea de expediere şi execuție a instrucțiunilor poate
monitoriza simultan mai multe instrucțiuni şi poate executa aceste instrucțiuni într-
o ordine în care se optimizează utilizarea unităților multiple de execuție ale
microarhitecturii, menținând în acelaşi timp integritatea datelor asupra cărora se
operează. Această ordine de execuție asigură ocuparea unităților de execuție chiar
şi atunci când apar dependențe între datele instrucțiunilor.
Execuţia speculativă se referă la posibilitatea procesorului de a executa
instrucțiuni aflate înaintea instrucțiunii adresate de contorul de program, şi de a
furniza rezultatele în ordinea şirului inițial de instrucțiuni. Pentru ca execuția
speculativă să fie posibilă, microarhitectura familiei P6 separă expedierea şi
execuția instrucțiunilor de producerea rezultatelor. Unitatea de expediere şi
execuție a instrucțiunilor utilizează analiza fluxului de date pentru a executa toate
instrucțiunile din rezervorul de instrucțiuni şi a memora rezultatele în registre
temporare. Unitatea de retragere a instrucțiunilor caută apoi instrucțiunile care au
fost executate şi pentru care nu mai există dependențe de date cu alte instrucțiuni
sau predicții nerezolvate ale salturilor. Atunci când se găsesc instrucțiuni care au
fost executate, unitatea de retragere a instrucțiunilor depune rezultatele acestor
instrucțiuni în memorie sau în registrele microarhitecturii (cele opt registre ale
procesorului şi opt registre ale unității de calcul în virgulă mobilă), în ordinea
specificată în program, şi retrage aceste instrucțiuni din rezervorul de instrucțiuni.
Aceste 3 concepte şi sunt diferențele față de structura benzii de asamblare
(fig.3.10), menționate anterior.
Schemele structurale ale microprocesoarelor, din următoarele generații, la
nivel de microarhitectură devin tot mai complexe. Ne vom limita la descrierea noilor
tehnologii implementate în microprocesoare.
Arhitectura Calculatoarelor 68
Arhitectura Calculatoarelor 69
Următorul reprezentant al microprocesoarelor, din generația Intel, este
Pentium 4 cu microarhitectura NetBurst.

În microprocesor a fost implementată tehnologia


Hyper-threading, ce permite execuția a două fluxuri de
instrucțiuni de un singur nucleu fizic. Sistemul de operare,
ce susține tehnologia Hyper-threading, determină
existența a două procesoare logice (Logical procesor).
Fizic, fiecărui procesor logic îi sunt alocate setul său de
registre şi un controler de întreruperi (APIC), iar restul
componentelor ale procesorului sunt utilizate în comun.
Potrivit Intel, utilizarea acestei tehnologii, majorează
viteza de execuție cu 15-30%.
Următoarele elemente structurale implementate:
 adoptarea unei arhitecturi Hyper Pipeline cu 20 de segmente de procesare a
instrucțiunilor (dublu față de varianta P6), fapt ce a majorat frecvența
procesorului – de la 1,4 Ghz (3,2 Ghz în Pentium 4 Extreme Edition);
 a fost extinsă memoria cache L2 - 512 KB şi L3 – pînă la 2МB (Pentium 4
Extreme Edition), iar transferurile între memoriile cache au ajuns la o rată
de transfer de 48 GB/s;
 a fost introdusă o memorie cache pentru microinstrucțiuni, volum 12000
microinstrucțiuni;
 setul de instrucțiuni SSE2 a fost extins prin adăugarea a 144 instrucțiuni
SIMD noi şi extinderea lățimii datelor prelucrate la 128 biți (16 octeți
prelucrați în paralel);
 a fost majorată rata de transfer între microprocesor şi controlerul memoriei la
3,2 GB/s (La P6 – maximum 1,06 GB/s).
 proces tehnologic utilizat de 130 nm.

Pe următoarele figuri sunt prezentate nucleele procesorului Pentium 4.


Arhitectura Calculatoarelor 70

Dificultăți. Funcționarea procesorului la frecvențe înalte este asociată cu


temperaturi ridicate ale nucleului său. Microprocesoarele Pentium 4 (nucleul Cedar
Mill) au fost capabile să funcționeze la frecvențe mai mari de 7 GHz folosind răcire
extremă (utilizând azot lichid). Din cauza dificultăților apărute la răcirea
procesoarelor, frecvența maximă la Pentium 4, produs în serie, a fost limitată la
3800 MHz. Intel a fost nevoit să treacă de la o structură de mononucleu (single-
core) la multinuclee (multi-core).
Compania Intel, în 2006, a prezentat noua microarhitectura Intel Core, care este
o arhitectură multi-core. Ea încorporează mai multe nuclee, suportă tehnologia de
virtualizare (Intel VT) şi modul Intel 64 (64-bit mode), un set suplimentar de
instrucțiuni SSE3.
Procesoarele pentru servere şi stații de lucru au fost fabricate sub numele de
brand Xeon, iar pentru utilizatorii de calculatoare variantele desktop şi mobile -
Core 2.
Microarhitectura Intel Core incorporează o bandă de asamblare cu
14 segmente (Pentuim 4 "Prescott" - 31 segmente). Fiecare nucleu
poate procesa, executa simultan până la patru instrucțiuni
( microarhitectura NetBurst doar trei instrucțiuni).

În microarhitectura Intel Core a fost introdus un set de tehnologii care au primit


numele Intel Wide Dynamic Execution. Cele mai importante sunt:
Arhitectura Calculatoarelor 71
 Advanced Smart Cache – noua arhitectură este optimizată pentru procesoare
cu 2 nuclee (dual-core). Memoria cache de nivelul L2 este partajată de
ambele nuclee. Datele din memoria cache de nivelul L1 obligatoriu se află şi
în memoria cache de nivelul L2. Memoria cache de nivelul L2 este dinamic
alocată ambelor nuclee pentru performanță maximă. Rata maximală de
transfer între memorii - 96 GB/s (cu frecvența nucleului de 3 GHz).
 Tehnologia Macro Fusion constă în fuziunea dintre două instrucțiuni x86 (şi
câteva microinstrucțiuni - micro-ops Fusion), într-o una singură instrucțiune
(macroinstrucțiune). Unele perechi de instrucțiuni (de exemplu, instrucțiunea
de comparare şi de salt condiționat) la decodificare pot fi fuzionate şi
utilizate ulterior ca o singură microinstrucțiune. Ignorând tehnologia Macro
Fusion procesorul (cu 4 unități de execuție) poate decodifica doar patru
instrucțiuni. Utilizând tehnologia MacroFusion, procesorul poate decodifica
cinci instrucțiuni (prin fuziunea a două din ele).

În luna iunie 2009 compania a anunțat că schimbă varietate de nume de brand,


cum ar fi Core, Core 2 Duo, Core 2 Quad, Core 2 Extreme, în favoarea a trei nume:
Core i3, Core i5 si Core i7. Dezvoltarea acestor microprocesoare, bazate pe
microarhitecturi noi, a dus la divizarea lor pe generații:
 Prima generație – microprocesoarele Core i3, Core i5 şi Core i7 bazate pe
microarhitectura Nehalem;
 A doua generație – microprocesoarele Core i3, Core i5 şi Core i7 bazate pe
microarhitectura Sandy Bridge;
 A treia generație – microprocesoarele Core i3, Core i5 şi Core i7 bazate pe
microarhitectura Ivy Bridge.
Prezentăm succint inovațiile microarhitecturii Nehalem:
 2, 4 sau 8 nuclee;
 Tehnologia SMT (Simultaneous Multi-Threading), permite execuția simultană
a două fluxuri de instrucțiuni de un singur nucleu (2 nuclee logice din unul
fizic);
 Memoria cache pe 3 nivele: cache L1 volum de 64 KB pe nucleu, Cache L2
volum de 256 KB pe nucleu, memoria Cache L3 partajată de toate nuclee,
volum până la 24 MB;
 Controlerul de memorie încorporat, ce suportă câteva canale de memorie
DDR3 SDRAM;
 Proces tehnologic de 45nm;
 Posibilitatea de încorporare în microprocesor a nucleului grafic;
 Magistrală de mare viteză QPI (Quick Path Interconnect) (înlocuind FSB) cu
topologia punct-la-punct, destinată interconectării procesorului cu chipset-ul
şi a procesoarelor în sistem multiprocesor;
 Tehnologia Turbo Boost - permite automat, ca nucleele procesorului să
poată funcționa cu o frecventă mai mare decât frecventa de bază (nominală),
doar dacă procesorul funcționează în cadrul limitelor de putere, curent si
temperatură, conform TDP (TDP - thermal design power).
 Structura pe module;
 Set suplimentar de instrucțiuni SSE4.2.

Următoarea microarhitectură Sandy Bridge.


Principalele îmbunătățiri.
Circuitul microprocesorului Sandy Bridge
încorporează principalele componente:
 Nucleele microprocesorului;
 Nucleul grafic (HD Graphics 3000, cu 12
Arhitectura Calculatoarelor 72
unități de execuție);
 Memoria cache L3;
 „Puntea de nord” (System Agent).
Toate aceste componente sunt interconectate prin intermediul noii versiuni a
tehnologiei QPI, o magistrală inelară pe 256-biți. Proces tehnologic de 32nm.
Următoarea microarhitectură Ivy Bridge. Ivy Bridge — este o versiune a
microarhitecturii Sandy Bridge cu proces tehnologic de 22nm. În aprilie 2012 au
fost prezentate procesoarele cu microarhitectura menționată.

Ivy Bridge include următoarele îmbunătățiri față de platforma precedentă (Sandy


Bridge):
 Tehnologia « Tri-gate transistor » (“3D” sau pe 3 căi) care la acelaşi nivel
de performanță ca tranzistorii 2-D au un consum de energie mai redus cu
până la 50%;
 Suport PCI Express 3.0;
 Intel HD Graphics 2500/4000 cu suport a 3 monitoare independente;
 GPU (procesorul grafic integrat) are 16 unități de execuție (EUs) în
comparație cu Sandy Bridge -12;
 DDR3L (“L” desemnează low-voltage = tensiune scăzută) şi TDP
configurabil pentru procesoarele mobile.

Este sugestivă următoarea comparație de performanță cu generația Sandy


Bridge:

 5% până la 15% creştere în performanța generală a procesorului,


 20% până la 50% creştere în performanța procesorului grafic integrat (GPU).
Arhitectura Calculatoarelor 73

Pe următoarea figură sunt prezentate unele tehnologii susținute de


microarhitectura Broadwell. Proces tehnologic de 14 nm.

Pe următoarea figură sunt prezentate dimensiunile comparative ale


microprocesoarelor Broadwell şi Haswell.
Arhitectura Calculatoarelor 74
Arhitectura Calculatoarelor 75
5 Modelul program ale microprocesoarelor de ultima generație x86
Fiecare program la execuție obține anumite resurse ale microprocesorului. Aceste
resurse sunt necesare pentru executarea şi păstrarea în memorie a instrucțiunilor şi
datelor programului, a informației despre starea curentă a programului şi a
microprocesorului. Totalitatea acestor resurse reprezintă modelul program al
microprocesorului. La început vom prezenta modelul program al microprocesoarelor
Intel pe 32 biți, apoi microprocesoarele cu extensii pe 64 biți (AMDx86-64 şi Intel
EM64T). Arhitectura IA-64 (procesoarele Itanium) nu este folosită în calculatoarele
personale şi nu se studiază în cazul dat.
Schema, prezentată în figura 5.1, reprezintă modelul program al
microprocesoarelor Intel pe 32 biți (Intel Architecture (IA)-32).
Pentru fiecare grup de registre, în paranteze, se indică începând de la care
model a apărut grupul dat de registre în modelul program al microprocesoarelor
Intel. Dacă nu este indicat, grupul dat de registre a fost prezent în
microprocesoarele i386 şi i486.
În modelul program al microprocesorului Intel intră:
 Harta memoriei fizice (Pentium IV – 236 – 1 B);
 Setul de registre generali;
 Setul de registre de segment;
 Setul de registre de stare şi control;
 Setul de registre ai unității de calcul în virgulă mobilă (coprocesorului);
 Setul de registre destinate extensiilor MMX, reflectați pe registrii coprocesorului
(Pentium MMX);
 Setul de registre destinate extensiilor MMX în virgulă mobilă (Pentium III);
 Stiva. Structură de memorie, accesul la care se petrece cu instrucțiuni
speciale (PUSH, POP).

Setul de registre
Modelul program include câteva grupe de registre folosite de programe:
 Registre generali eax/ax/ah/al, ebx/bx/bh/bl, edx/dx/dh/dl, еcх/cx/ch/cl,
ebp/bp, esi/si, edi/di, esp/sp. Aceste registre conțin, de regulă, operanzi şi/sau
rezultate aferente instrucțiunilor de transfer şi prelucrare a datelor;
 Registre segment cs, ds, ss, es, fs, gs. Aceste registre sunt folosite pentru
crearea diviziunilor logice în memorie numite segmente;
 Registre coprocesorului st(0), st(l), st(2), st(3), st(4), st(5), st(6), st(7). Sunt
folosiți în calcule în virgulă mobilă;
 Registre extensiilor MMX (date împachetate, întregi) mmx0, mmx1, mmx2,
mmxЗ, mmx4, mmx5, mmx6, mmx7;
 Registre extensiilor XMM (date împachetate, în virgulă mobilă) хmm0, хmm1,
хmm2, хmmЗ, хmm4, хmm5, хmm6, хmm7;
 Registre de stare şi control – conțin informația despre starea
microprocesorului, programului în execuție;
 Registrul de fanioane eflags/flags;
 Registrul indicator de instrucțiuni;
 Registre de sistem – dedicate controlului modurilor de funcționare
microprocesorului.
Conponența setului registrelor de sistem diferă la diferite microprocesoare şi din
această cauză nu sunt concretizați în figura 5.1.
Registrii notați în figură, de exemplu al, ah, ax , indică registre pe 8 şi 16 biți ale
registrului extins eax pe 32 biți (prefix „e” (Extended)).
Grupele de registre de uz general, segment, registrul indicator de instrucțiuni,
Arhitectura Calculatoarelor 76
registrul de fanioane ale Pentium IV au destinații identice cu registrele respective
ale i8086, diferând numai prin lungimea lor.
Grupul de registre segment a fost extins cu două registre de date „gs” şi „fs”.
În registrul de fanioane au fost introduşi indicatori noi (tabelul 5.1).

Figura 5.1 Modelul program IA-32

Tabelul 5.1
RF Fanionul 16 Se foloseşte la prelucrarea întreruperilor
reluare provenite de la registrul de reglare
(Resume
VM Fanionul 17 Indicatorul funcționării microprocesorului
modului în mod virtual 8086:
virtual 8086 1 —microprocesorul funcționează în modul
AC (Virtual
Fanionul 18 virtual 8086
Destinat controlului alinierii la adresarea
alinierii memoriei
(Alignment
VIF Fanionul 19 În modul virtual este analogic fanionului
Întreruperii if. Fanionul vif se foloseşte împreună cu
Virtuale fanionul vip. A fost introdus în Pentium.

(Virtual
Interrupt
Arhitectura Calculatoarelor 77
VIP Fanionul 20 Se setează în 1 pentru indicarea
Întreruperii întreruperii amânate. Se foloseşte în
Virtuale modul V împreună cu fanionul vif.
amânate Introdus la Pentium.
(Virtual
ID Fanionul 21 Indică susținerea instrucțiunii cpuid.
identificării
(IDentificati
on flag)

Modelul program ale microprocesoarelor х86-64


Extensiile х86-64 şi ЕМ64Т sunt destinate pentru majorarea spațiului de
memorie adresabilă: registrele pe 64 biți permit adresarea până la 2 64=18,4 x 1018
Byte. Acest spațiu este limita de adresare a microprocesoarelor pe 64 biți, dar
practic sunt folosiți numai 48 de biți, cei mai puțin semnificativi.
Microprocesoarele oferă un sistem de privilegii pe 4 nivele destinat protecției
memoriei, spațiului de intrare/ieşire şi întreruperilor, şi un mecanism destinat
comutării sarcinilor pentru sistemele de operare multitask. Setul de instrucţiuni
conţine toate instrucţiunile microprocesoarelor precedente x86 şi este extins
cu noi instrucţiuni. Cu extensia setului de instrucţiuni se extinde şi setul de
registre arhitecturali (MMX, XMM, noi registre de uz general pe 64 biţi).
Microprocesoarele funcționează în diferite moduri, ce determină mecanismele
de protecție şi de adresare a memoriei: modul real 8086 (pe 16 biți), modul virtual
8086 (V8086), modul protejat pe 32 biți (inclusiv protejat pe 16 biți). Modul de
funcționare a microprocesorului este impus de sistemul de operare în conformitate
cu modul definit de aplicații (task-uri). În microprocesoarele pe 64 biți au fost
introduse noi moduri de funcționare, între care sunt moduri de compatibilitate cu
sistemele operaționale şi aplicații pe 32 biți. Modurile noi introduse sunt folosite
numai de sistemele de operare pe 64 biți.

Modurile de funcţionare a microprocesoarelor


Microprocesoarele pe 32 biți pot funcționa în unul din următoarele moduri:
 Modul de adresare reală (real address mode), sau modul real (real mode),
compatibil cu modul 8086. În acest mod este posibilă adresarea până la 1
MByte de memorie fizică.
 Modul virtual protejat de adresare (protected virtual address mode), sau modul
protejat (protected mode). În acest mod microprocesorul conectează
mecanismele de segmentare şi paginare. Mecanismul segmentării permite
accesarea la un spațiu de memorie virtuală până la 64 TByte. Practic este
folosit numai mecanismul paginării care asigură accesul fiecărei sarcini (task)
la 4 GByte memorie virtuală. Implicit, adresele şi operanzii sunt pe 32 biți. În
modul protejat microprocesorul poate executa instrucțiuni, inaccesibile în
modul real, un şir de instrucțiuni de transfer a controlului, prelucrare a
întreruperilor sunt executate în mod diferit de modul real.
 Modul virtual 8086 (Virtual 8086 Mode, V86) este un mod deosebit al modului
protejat, în care microprocesorul funcționează ca 8086 (adresele şi datele pe
16 biți). Pe un microprocesor, în acest mod, pot fi executate în paralel câteva
sarcini cu resurse izolate. Totodată adresarea spațiului fizic de memorie este
gestionat de mecanismele de segmentare şi paginare. Încercările de a executa
instrucțiuni nepermise, ieşirea după limitele spațiului de memorie şi a spațiului
de intrare/ieşire permis sunt controlate de sistemul de protecție. Mai efectiv
este modul virtual extins 8086 (Enhanced Virtual 8086 Mode, EV86) în care
Arhitectura Calculatoarelor 78
virtualizarea întreruperilor este optimizată.
 În modul de gestiune a sistemului (System Management Mode, SMM)
microprocesorul accesează un spațiu de memorie izolat de alte moduri. Acest
mod este folosit în scopuri de control şi reglare. De exemplu, invizibil sunt
executate funcțiile de control asupra alimentării, se emulează adresările la
dispozitive inexistente (emularea tastaturii şi mouse-lui PS/2 pentru USB).
Pentru microprocesoarele х86-64 modurile enunțate sunt grupate şi grupa are
denumire legacy mode, dar a mai fost introdus un nou mod long mode cu două
submoduri:
 Modul pe 64 biți (64-bit mode) – acest mod susține adresarea virtuală pe 64
biți şi extensiile registrelor pe 64 biți. În acest mod este folosit numai modelul
plat de memorie (un segment comun pentru cod, date şi stivă). Implicit adresa
este pe 64 biți, a operanzilor – 32 biți, dar cu prefixul (REX) pot fi definiți
operanzi pe 64 biți. A fost introdus un nou mod de adresare – relativ la
indicatorul de instrucțiuni. Acest mod este folosit de sistemele de operare (SO)
pe 64 biți la lansarea aplicațiilor pe 64 biți – este setat de SO pentru segmentul
de cod a unei sarcini;
 Modul de compatibilitate (compatibility mode) permite SO să execute aplicații
pe 32 şi 16 biți. Pentru aplicații microprocesorul reprezintă un microprocesor
pe 32 biți cu toate atributele modului protejat, cu mecanismele de segmentare
şi paginare. Proprietățile pe 64 biți sunt folosite numai de SO ce se reflectează
în procedurile de translatare a adreselor, de prelucrare a excepțiilor şi
întreruperilor. Modul este setat de SO pentru segmentul de cod ale unei sarcini
concrete.
SO pe 32 biți folosesc microprocesoarele х86-64 numai în modul legacy mode
(ca un microprocesor IA-32).
Registre de arhitectură şi tipuri de date
Operanzii folosiți de microprocesoare operează cu date de diferite tipuri:
 Numere întregi (cu sau fără semn) mărime de Byte, cuvânt (16 biți), cuvânt
dublu (DWord, 32 biți), cuvânt din 4 Byte (QWord, 64 biți), cuvânt din10 Byte
(TB, 80 biți) şi cuvânt din 16 Byte (DQWord, 128 biți);
 Biți, câmpuri de biți, şiruri de biți;
 Numere în virgulă mobilă (FP) mărime 32, 64, 80 biți.
Posibilitatea de a folosi operanzi lungi (64 şi 128 biți) a apărut în
microprocesoarele cu extensiile MMX şi XMM. Maximal de rapid microprocesorul
procesează datele ce se află în registrele sale interne. Componența registrelor la
care au acces aplicațiile este prezentată în figura 5.2.
Notațiile registrelor pe 64 biți încep cu litera R.
Microprocesoarele includ un set de registre de sistem ce nu sunt folosite de
aplicații (în figură nu sunt prezentați). La ei se referă registrele de adrese de
sistem, registrele de control, registrele pentru reglări şi testări. Un şir din aceste
registre sunt specifice (Model-Specific Registers, MSR), ce sunt destinate
controlului reglărilor, monitorizării productivității, controlului efectuat de
microprocesor, gestionarea memoriei cache ş.a. Componența lor diferă la diferite
microprocesoare, accesul este privilegiat.
Arhitectura Calculatoarelor 79

Figura 5.2 Registrele microprocesoarelor х86-64

Registrele de uz general
Structura şi destinația registrelor pe 32 biți este analogică IA-32. Au fost
adăugate 8 registre de uz general (R8...R15), adresarea a fost unificată: adresarea
la fiecare din 16 registre se petrece ca la un registru pe 64-, 32-, 16- sau 8 biți (se
folosesc numai biții inferiori).
RIP, în varianta pe 64 biți, poate fi utilizat la adresarea relativă a datelor.

Registre FPU
Registrele blocului FPU sunt destinați executării operațiilor aritmetice, calcului
principalelor funcții matematice (trigonometrice, exponente, logaritmi) ş.a. În
diferite generații de microprocesoare acest bloc era numit FPU (Floating Point Unit-
unitatea de prelucrare în virgulă mobilă) , NPX (Numeric Processor extension –
extensie numerică a procesorului) sau coprocesor. Coprocesorul prelucrează 7 tipuri
de date: numere întregi pe 16, 32, 64 biți; numere în virgulă mobilă pe 32, 64, 80
biți (format FP) şi 18 numere în cod binar-zecimal (BCD). Aplicarea coprocesorului
accelerează considerabil viteza de calcul.

Blocul MMX şi extensiile 3DNow!


Tehnologia MMX este orientată aplicațiilor multimedia, grafica 2D/3D şi
comunicațiilor. Avantajul principal al MMX constă în prelucrarea concomitentă a
unui şir de date cu o instrucțiune – conform tehnologiei SIMD (Single Instruction —
Multiple Data). Tehnologia MMX prelucrează noi tipuri de date împachetate în
registre pe 64 biți: 8 Byte, 4 cuvinte, 2 cuvinte duble, cuvânt pe 64 biți. Aceste
date sunt prelucrate în registrele MMX0-MMX7, care reprezintă 64 biți inferiori ai
registrelor FPU pe 80 biți.

Tehnologia 3DNow!
Tehnologia 3DNow! (21 instrucțiuni) a fost implementată de firma AMD în
microprocesoarele sale K6-2, pentru extinderea capacităților blocului MMX. Această
tehnologie prelucrează date în format FP – 2 cuvinte pe 32 biți cu o precizie unitară
şi date împachetate (8 Byte, 4 cuvinte, 2 cuvinte duble, cuvânt pe 64 biți). În
microprocesoarele Athlon setul de instrucțiuni a fost extins cu 24 instrucțiuni. Setul
extins este notat - 3DNow!E. Noile instrucțiuni sunt destinate procesoarelor DSP
(12 instrucțiuni), ce prelucrează date în format FP, sa extins setul de instrucțiuni
MMX (12 instrucțiuni numere întregi), extinsă gestiunea memoriei cache (7
instrucțiuni destinate accelerării transferului de date). Unele instrucțiuni coincid cu
Arhitectura Calculatoarelor 80
instrucțiunile din setul SSE. Setul 3DNow! Professional (72 instrucțiuni), introdus în
microprocesoarele Sempron, este compatibil cu setul SSE şi este notat 3DNow!P.
În microprocesoarele Intel extensiile 3DNow! nu sunt utilizate.

Blocul XMM şi extensiile SSE


Extensiile SSE (Streaming SIMD Extensions) sunt destinate accelerării prelucrării
fluxurilor mari de date în virgulă mobilă (FP) şi numere întregi. Extensiile fluxurilor
de date sunt realizate pe baza registrelor blocului XMM (8 registre pe 128 biți la
microprocesoarele pe 32 biți, 16 - la microprocesoarele x86-64).
Registrele XMM prelucrează următoarele tipuri de date:
 4 numere în virgulă mobilă cu precizie unitară (32 biți);
 2 numere în virgulă mobilă cu precizie dublă (64 biți);
 Numere întregi: 16 Byte, 8 cuvinte, 4 cuvinte duble sau 2 cuvinte pe 64biți
(numai în SSE2)
În procesoarele Pentium III este aplicat setul SSE, în Pentium 4 – SSE2 destinat
pentru prelucrarea datelor în grafica 3D, codificarea/decodificarea video, cifrarea
datelor. Apoi a fost aplicată şi extensia SSE3, iar în procesaorele moderne şi
SSE4.2. Blocul XMM şi seturile SSE1, SSE2, SSE3 sunt aplicate şi în
microprocesoarele AMD.

Setul de instrucţiuni
Setul de instrucțiuni ale microprocesoarelor x86 moderne, conține toate
instrucțiunile ale microprocesoarelor din generațiile precedente. Instrucțiunile pot fi
divizate în instrucțiuni de uz general, ce sunt folosite de diferite aplicații şi de
sistem, ce sunt folosite de sistemul operațional pentru crearea mediului de
funcționare a aplicațiilor. În figura 5.3 sunt prezentate grupele de instrucțiuni ale
microprocesoarelor x86 în ordinea apariției lor în microprocesoarele din diferite
generații şi modele.
Instrucţiunile de uz general - instrucțiuni x86 pentru prelucrarea numerelor
întregi şi sunt aplicate practic de toate programele. Instrucţiunile modurilor pe 64
biţi (long mode instructions) au apărut în microprocesoarele pe 64 biți şi sunt
accesibile numai în modurile respective.
Instrucţiunile în virgulă mobilă x86 funcționează cu blocul FPU şi prelucrează date în
virgulă mobilă: 80 biți – precizie extinsă, 64 – precizie dublă, 32 – precizie unitară.
Suplimentar susțin formatul BCD.
Media instrucţiuni pe 64 biţi prelucrează datele ce se află în registrele MMX pe
64 biți. Ele operează cu date întregi şi în virgulă mobilă, sunt destinate media
aplicațiilor ce prelucrează blocuri de date. Au apărut cu implementarea registrelor
MMX, setul a fost extins cu instrucțiuni AMD Extension toMMX
Arhitectura Calculatoarelor 81

Figura 5.3 Setul de instrucțiuni ale microprocesoarelor x86

şi parțial cu instrucțiuni SSE, introduse de Intel. Instrucțiuni în virgulă mobilă au


apărut în 3DNow!, setul a fost extins cu instrucțiuni AMD Extensions to 3DNow!
Instructions.
Media instrucţiuni pe 128 biţi prelucrează datele ce se află în registrele XMM pe
128 biți. Aceste instrucțiuni operează cu date întregi şi în virgulă mobilă, sunt
destinate media aplicațiilor ce prelucrează mari blocuri de date. În setul SSE sunt
definite instrucțiuni în virgulă mobilă cu precizie unitară (32 biți), în SSE2 au fost
introduse instrucțiuni în virgulă mobilă cu precizie dublă (64 biți), în SSE3 introduse
13 instrucțiuni (la setul din 144 instrucțiuni din SSE şi SSE2). Un şir de instrucțiuni
reprezintă punți între grupele de instrucțiuni susnumite. Ele asigură transferuri de
date între blocurile MMX, XMM şi registre de uz general. Un şir de instrucțiuni pot fi
executate şi în blocul MMX (şi FPU) şi în blocul XMM.
Arhitectura Calculatoarelor 82

6 Gestionarea memoriei
6.1 Memoria virtuală
Vom trece pe scurt în revistă câteva dintre principiile mai importante care
caracterizează evoluția microprocesoarelor.
Un prim principiu porneşte de la segmentarea memoriei microcalculatorului în
subdiviziuni logice, aşa cum procedează Intel 8086.
Există deci două modalități principial diferite de a trata memoria:
- Adresarea liniară, care presupune accesul în memorie în mod continuu de la
adresa 0 la adresa 2n-1, unde "n" este numărul de biți ai unei adrese (sau, fizic,
numărul de linii ai magistralei de adrese).
- Adresarea segmentată, în care memoria este divizată logic în porțiuni numite
segmente, în interiorul cărora adresarea este liniară. Orice localizare în memorie se
face relativ la baza segmentului iar fixarea fizică a bazei unui segment este
transparentă utilizatorului. Am prezentat deja, pentru 8086, mecanismul
segmentelor de dimesiune fixă, noțiunea de adresă logică precum şi translatarea ei
în adresă fizică.
O generalizare interesantă este aceea de a forma segmente de dimensiuni
variabile. Aceasta permite o mai bună adaptare a subdiviziunilor logice ale
memoriei la dimensiunile programelor sau ale structurilor de date.
Un alt concept este acela al formării unei memorii virtuale.
Conceptul de memorie virtuală se bazează pe ideea separării memoriei logice a
utilizatorului de cea fizică şi extinderea memoriei logice prin stocare imaginii sale
pe hard disc (fişierul [Link]). Fiecare program la execuție, nu este obligatoriu
să fie stocat întreg în memoria RAM, ci doar o secvență de cod şi date, executate
la un moment dat. Apare, în mod firesc, ideea de a extinde spațiul de memorie
logică, care poate fi realizat cu mult mai mare decât memoria fizică. Acesta este
principiul de bază al organizării memoriei virtuale.
Legat de conceptul memoriei virtuale apare mecanismul de gestionare a
memoriei. El constă în translatarea adreselor virtuale (folosite de programator) în
adrese fizice identificabile în structura fizică, concretă, a microcalculatorului.
Un alt concept este acela de multiprocesare (concurență, multiprogramare,
"multitasking") care se referă la capacitatea calculatorului de a executa mai multe
procese ("task-uri") simultan aceasta se realizează prin comutarea, secvențială, de
la o secvență de instrucțiuni a unui proces (task) la altă secvență aparținând altui
proces şi aşa mai departe, apoi se comută din nou la prima secvență etc. Tot acest
mecanism este transparent utilizatorului care are impresia desfaşurării simultane a
mai multor procese (aceasta poate însemna, eventual, mai mulți utilizatori, sau un
singur utilizator care are nevoie de mai multe procese simultan). Ideea nu trebuie
să surprindă: este firesc ca într-un sistem cu o memorie virtuală de mari dimensiuni
(la Pentium ajunge la 64TB), organizată logic într-o multitudine de segmente, să fie
loc pentru mai multe procese.
Precizăm că noțiunea de proces (task) folosită aici se referă la o secvență de
acțiuni coerente (eventual organizate ca programe de sine stătătoare) care duc la
îndeplinirea unui scop, folosind resursele calculatorului: memorie, timp de procesor,
memorie externă etc.
O consecință importantă a gestionării memoriei este mecanismul protecției.
Legătura este atât de firească încât modul de lucru "virtual" al microprocesoarelor
Intel se mai numeşte şi "protejat" (subliniem că, din motive de compatibilitate, toți
membrii familiei Intel au şi un mod "real" de funcționare similar cu funcționarea lui
Arhitectura Calculatoarelor 83
8086). Protecția are, pentru toate microprocesoarele evoluate, trei aspecte de
bază:
 Controlul informației (coduri sau diverse tipuri de date);
 Izolarea utilizatorilor unul față de altul (protecția "inter-task");
 Izolarea software-ului de sistem de cel de aplicații (protecția "intra-task").
Se impun aici câteva observații strict necesare:
- Componentele esențiale ale mecanismului gestionării memoriei şi implicit ale
protecției sunt cele de segment şi proces (task), în accepțiunile definițiilor date
anterior. De altfel din punctul de vedere al mecanismului protecției, segmentul se
redefineşte ca fiind cea mai mică regiune (logică) de memorie cu atribute de
protecție precizate.
- Cele trei aspecte de bază ale protecției nu pot fi asigurate satisfacător numai
prin mecanismul gestionării memoriei. De aceea multe familii de microprocesoare
evoluate adaugă un mecanism suplimentar: privilegiile multi-nivel. Acesta asigură
izolarea software-ului de sistem de cel de aplicații prin ierarhizarea pe mai multe
nivele de privilegii (patru pentru familia Intel) a programelor (coduri şi date) şi a
proceselor.
Segmentarea memoriei şi multiprocesarea încurajează un procedeu de a rula
procese ce au nevoie de resurse importante de memorie, în memorii fizice cu mult
mai reduse. Acest deziderat se realizează prin procedeul denumit interschimbarea
locului proceselor ("swapping tasks"), care constă în trimiterea provizorie în
memorie a proceselor (sau a unor părți componente dintr-un proces) din memoria
internă în cea externă, dacă acel proces (sau acea parte din el) nu este în execuție
la un moment dat. Schimbarea locului între memoria internă şi cea externă se
poate face de câte ori este necesar pentru a menține continuu în memoria internă
doar strictul necesar bunei desfaşurări a unei acțiuni.
Un mecanism folosit practic de toate calculatoarele actuale este paginarea, ceea
ce semnifică implementarea memoriei virtuale bazată pe blocuri de mărime fixă
numite pagini. Multiprocesarea precum şi procedeul de interschimbarea locului
proceselor se poate realiza cu pagini în loc de segmente. Familia Intel combină
segmentarea memoriei cu paginarea.
Localizarea unei informații în memorie devine un mecanism complicat: între
adresa virtuală şi adresa fizică se interpune un nou tip de adrese: adrese liniare;
acestea, la rândul lor, sunt translatate prin mecanismul paginării în adrese fizice.
Microprocesoarele evoluate care folosesc mecanisme complicate de localizare a
informației în memorie (ca în cazul descris anterior: adresă virtuală→adresă
liniară→adresă fizică) au nevoie şi de procedee prin care să minimizeze timpul
necesar unei referiri în memorie. De regulă, metoda folosită este aceea a
elementelor de structură ascunse ("cache"). Astfel Intel foloseşte registre cache
care prelungesc, transparent pentru utilizator, informația din registrele segment,
astfel încât să aibă disponibile iriformațiile necesare formării segmentelor în
memorie şi atributele lor de protecție.
Microprocesorul PentiumIV foloseşte în plus o memorie asociativă cache TLB
("translation lookaside buffer") care conține adresele celor mai folosite pagini şi
diminuează considerabil timpul afectat mecanismului paginării.

Modul protejat Protected Mode, mai precis Protected Virtual Address Mode
(modul protejat de adresare a memoriei virtuale), este modul de funcționare de
bază a microprocesoarelor pe 32 biți. În acest mod microprocesoarele pot adresa
până la 64 Tbyte memorie virtuală, care cu ajutorul mecanismului paginării poate fi
translatată în 64 GByte (Pentium IV) memorie fizică. Cu apariția
microprocesoarelor pe 64 biți volumul memoriei virtuale a fost extins până la 2 64
Byte. Practic în primele microprocesoare pe 64 biți lungimea adresei virtuale a fost
Arhitectura Calculatoarelor 84
limitată până la 48 biți, iar adresa fizică – 52biți.
Modul virtual 8086 — Virtual 8086 Mode sau V86 — este o stare a modului
protejat, în care microprocesorul funcționează ca 8086 având posibilitatea de a
folosi adrese şi operanzi pe 32 biți.
Modul protejat este destinat să asigure executarea a mai multe procese
(sarcini) simultan, ce presupune protecția resurselor unei sarcini de la acțiunea
alteia (ca procese presupunem aplicațiile, sarcinile sistemului operațional).
Principala resursă protejată este memoria, în care se păstrează codurile,
datele şi diferite tabeluri de sistem (de exemplu, tabelul întreruperilor), accesul la
care se petrece printr-o varietate de moduri de adresare (24 moduri). E necesar de
protejat şi dispozitivele utilizate în comun, accesarea la care se petrece cu ajutorul
instrucțiunilor de intrare/ieşire şi întreruperi.
Memoria logic poate fi tratată ca un segment sau o mulțime de segmente de
dimensiuni variabile (în mod real - dimensiuni fixe). Exceptând segmentarea, în
modul protejat este posibilă (folosind mecanismul paginării) divizarea logică a
memoriei pe pagini de dimensiuni fixe de 4Kbyte (2MB, 4MB), fiind posibilă
poziționarea lor în orice zonă a memoriei fizice.
Referitor la memorie deosebim 3 spații de adresare: logic, linear şi fizic.
Combinând segmentare şi paginarea deosebim două modele de memorie:
 În modelul segmentat al memoriei, aplicația foloseşte câteva segmente de
memorie (cod, date, stivă). În acest model aplicația operează cu adrese logice.
 În modelul plat al memoriei, aplicației i se atribuie un singur segment. În acest
model aplicația operează cu adrese lineare. Modelul plat de memorie este mai
simplu şi mai practic în utilizare şi este folosit de sistemele de operare
moderne.
Segmentarea este un mod logic de organizare a memoriei la nivel practic.
Paginarea este folosită la nivel de sistem pentru gestionarea memoriei fizice.
Segmentele şi paginile pot fi îndepărtate din memoria operativă (RAM) în memoria
externă (hard disk), şi la necesitate, să fie încărcate din nou în memoria operativă.
În aşa mod se realizează memoria virtuală.

6.2 Memoria virtuală pentru microprocesoarele pe 32 biți


Vom detalia aici principiul gestionării memoriei, folosind pentru exemplificare
componenta familiei Intel - microprocesorul PentiumIV, ce combină segmentarea
memoriei cu paginarea.
Adresa virtuală, ca şi adresa logică, are pentru utilizator două părți componente:
 adresa efectivă (sau offsetul ădresei virtuale);
 selectorul, care înlocuieşte adresa segment.
Adresa efectivă este adresa în interiorul segmentului şi utilizatorul trebuie să o
conceapă ca fiind relativă la baza unui segment predefinit. Adresa efectivă este
precizată de modul de adresare aferent instrucțiunii care o utilizează.
Selectorul se află, ca şi în cazul adreselor logice, tot într-un registru segment.
Noutatea constă în faptul că definirea segmentului asociat unui selector nu se mai
face direct (ca în cazul microprocesorului Intel 8086) ci prin mecanismul adresării
indirecte.
Microprocesorul are următoarele particularități:
- Adresa virtuală este o adresă pe 48 de biți:
AV ≡ adr48
- Adresa efectivă este o adresă pe 32 biți:
AE ≡ adr32
Aceasta impune dimensiunea maximă a unui segment la 2 32 B = 4 GB.
Se foloseşte un concept nou: cuanta de informație într-un segment poate fi
octetul (ca la predecesorii familiei) sau "pagina" definită ca fiind o subdiviziune
Arhitectura Calculatoarelor 85
logică de dimensiuni fixe (4kB) a memoriei virtuale. Mecanismul paginării va fi
detaliat într-un subcapitol ulterior.
Selectorul are 16 biți şi este compus din trei entități informaționale:
 un câmp numit INDEX pe 13 biți;
 un "indicator de tabelă" (TI) care ocupă 1 bit;
 un câmp de 2 biți denumit "nivelul de privilegiu cerut" (RPL). Deci:
SELECTOR = INDEX TI RPL
Figura 6.1 prezintă: a) configurația adresei virtuale şi b) configurația selectorului
pentru microprocesorul Intel PentiumIV.

47 31
0
SELECTOR AE
(offset)

15
3 2 1 0
INDEX
TI RPL
Figura 6.1

Dintre cele trei câmpuri enumerate mai sus, numai primele două folosesc pentru
definirea unui segment în memorie (RPL este utilizat de mecanismul privilegiilor
multi-nivel şi nu va fi explicat în acest capitol). Cei 14 biți pe care îi ocupă INDEX şi
TI conduc la posibilitatea de a forma în memorie un maximum de 214 segmente =
16k segmente.
Rezultă o primă concluzie importantă: dimensiunea memoriei virtuale pe care o
poate adresa Intel PentiumIV este dată de numărul maxim de segmente, fiecare
presupus la dimensiunea maximă:
214 segmente * 232 B/segment =246 B= 64 TB
Subliniem că pentru Intel PentiumIV o adresă fizică are 36 biți:
AF=adr36,
ceea ce înseamna că harta memoriei fizice are 2 36 B = 64 GB. Afirmația făcută
anterior cu privire la faptul că memoria virtuală întrece cu mult memoria fizică
(internă) îşi găseşte, deci, o primă justificare.
Memoria virtuală este divizată logic în două jumătăți:
 Pentru TI = 0 se defineşte "spațiul adreselor globale" folosit de întregul sistem
şi "împârțit" de toate procesele pentru a nu fi nevoie să se multiplice
procedurile generale pentru fiecare proces în parte. Aici se află sistemul de
operare, librăriile de proceduri, suportul pentru compilatoare etc.
 Pentru TI = 1 se defineşte "spațiul adreselor locale" care cuprinde segmentele
de program şi de date pentru fiecare proces în parte.
În fiecare dintre cele două zone adresabile de către un utilizator se pot forma 213
segmente = 8k segmente.
Câmpul INDEX foloseşte pentru identificarea propriu-zisă a unui segment. El
acționează ca un deplasament într-o tabelă localizată în memorie numită tabelă de
descriptori. Fiecare descriptor conține, între altele, adresa fîzică a bazei unui
segment precum şi dimensiunea sa. Se observă deci că se utilizează adresarea
indirectă cu memoria pentru identificarea unui segfment.

6.3 Generarea adresei fizice


Arhitectura Calculatoarelor 86
Translatarea adresei logice în fizică pentru procesoarele pe 32 biți este
ilustrată în figura 6.2. Blocul segmentării translatează spațiul logic de adresare în
spațiu linear de adrese pe 32 biți. Adresa lineară se formează prin adunarea adresei
de bază a segmentului şi adresei efective. Adresa de bază a segmentului în mod
real se obține prin deplasarea la stângă cu patru poziții binare a valorii din registrul
de segment (ca în 8086). În mod protejat adresa de bază se încarcă din descriptor,
ce se află într-un tabel de descriptori, selectat de selectorul ce se află în registrul de
segment utilizat.

Figura 6.2 Generarea adresei fizice în microprocesoarele pe 32 biți: а — în mod


protejat,
b — în mod V86, c — în mod real

Adresa fizică este formată după translatarea adresei lineare cu ajutorul unității
de paginare. Adresa se plasează pe magistrala externă a procesorului. Când
unitatea de paginare este deconectată adresa fizică coincide cu cea lineară.
Unitatea de paginare activată translatează adresa lineară în cea fizică ce localizează
pagini de 4 KByte (2 sau 4 MB). Unitate de paginare poate fi activată numai în
modul protejat.
În modul pe 64 biți segmentarea nu se foloseşte (figura 6.3, a): aplicațiile
operează cu adrese virtuale lineare. În microprocesoare cu extensii pe 64 biți
mecanismul segmentării este utilizat numai în modul de compatibilitate (figura 6.3,
b). Părțile superioare ale acestor adrese trebuie să fie egale cu zero, în caz contrar
mecanismul protecției va fixa excepție. Din registrele de segment procesorul
utilizează numai registrele CS, FS şi GS. În descriptorul indicat de CS sunt utilizate
numai atributele: indicatorul modului pe 64 biți, implicit mărimea operandului şi
nivelul de privilegii.
Registrele FS şi GS sunt utilizați în noul mod de adresare: adresa de bază din
descriptorul de segment poate fi utilizat ca deplasament la calculul adresei
(efective, virtuale şi lineare – acum noțiuni identice). Unitatea de paginare permite
utilizarea adresei fizice cu o lungime diferită de lungimea adresei lineare.
Arhitectura Calculatoarelor 87

Figura 6.3 Generarea adresei fizice în microprocesoarele cu extensii pe 64 biți:


а — în mod pe 64 biți, b— în mod de compatibilitate

În microprocesoarele cu extensii pe 64 biți, adresa lineară este limitată la 48


biți, iar adresa fizică până la 52 biți.

6.4 Descriptori şi tabele de descriptori


Descriptorul constituie elementul de bază în definirea infomiațiilor legate de
segmentarea şi gestionarea memoriei virtuale precum şi de mecanismul protecțiilor
proceselor. Descriptorii sunt folosiți pentru o coerență maximă în descrierea celor
mai diferite entități informaționale. Astfel, există următoarcle tipuri de descriptori:
a) Descriptorii segmentelor care permit identificarea segmentelor uzuale de
lucru (de programe şi/sau de date).
b) Descriptorii speciali de control care sunt, la rândul lor, de mai multe feluri:
1) Descriptorii segmentelor de sistem, segmente care sunt folosite de
microprocesor în mecanismul gestionării memoriei.
2) Descriptorii "segmentelor de stare a proceselor" prin care se poate
implementa mecanismul multiprocesării.
3) Descriptorii "porţilor" (Gate) folosiți în mai multe tipuri de acțiuni:
protecția multi-nivel, multiprocesarea, răspunsul la cererile de întreruperi.
Pentru familia de microprocesoare Intel, forma generală a unui descriptor
este reprezintată în Figura 6.4 Indiferent de tip, un descriptor are 8B (numerotați în
figură de la 0 la 7), fiecare octet având semnificații precizate.
Cei 8B ai descriptorului au următoarele semnificații:
7
0

7
6
ATRIBUTE
5 PS DPL E C RA
4
3
2
1
0
Arhitectura Calculatoarelor 88

Figura 6.4

 Octeții 0, 1 şi nibble-ul inferior ai octetului 6, conțin 20 biți din LIMITA


segmentului selectat.
 Octeții 2, 3, 4 şi 7 conțin 32 biți din BAZA (adresa fizică a bazei) segmentului
selectat.
 Octetul 5 şi nibble-ul superior ai octetului 6, este câmpul ATRIBUTE, cu diverse
informații despre segment pe care le vom detalia în continuare.
În ceea ce priveşte câmpul ATRIBUTE, notăm următoarele semnificații (începând cu
octetul 5);
 Bitul 7, notat cu P, are rolul de a indica dacă segmentul este "prezent" în
memoria fizică (P = 1) sau nu (P = 0).
 Biții 6 şi 5 formează "Nivelul de privilegiu al descriptorului" (DPL) şi este folosit
în mecanismul protecției multi-nivel.
 Bitul 4, notat cu S, este folosit, aşa cum arătam deja, pentru a distinge între
segmentele normale de lucru (S=1) sau segmentele speciale de sistem (S=0).
În acest ultim caz, configurația nibble-ului inferior este 0010 (informație prezentată
succint cu codificarea tip = 2) care indică faptul că descriptorul defineşte în spațiul
adreselor globale o LDT.
Pentru segmentele obişnuite, semnificația biților inferiori este:
 Bitul 3, notat cu E, indică un segment executabil (E=1), adică un segment de
program, sau un segment pentru date (E = 0).
În funcție de această ultimă clasificare, următorii trei biți au semnificații diferite:
a) Pentru segmentele de program:
 Bitul 2, notat cu C, este folosit de mecanismul protecției multi-nivel pentru a
introduce o excepție în modul de acces al acestui tip de segment.
 Bitul 1, notat cu R, indică, pentru R = 1 că segmentul poate fi şi citit nu numai
executat.
 Bitul 0, notat cu A, semnifică "accesat". Ne vom opri puțin mai în detaliu
asupra acestui bit, deoarece microprocesoarele Intel îl folosesc în cadrul unui
procedeu cu o aplicabilitate mult mai generală.
Procedeul poartă numele de Strategia "LRU- Least Recently Used” " ("cel mai
puțin utilizat") şi ajută sistemul de operare să decidă ce segment este mai puțin
utilizat pentru a fi trimis în memoria externă a calculatorului, în aşteptare. Astfel A
este setat ori de câte ori se face referire la descriptorul care îl conține; periodic A
este resetat de sistemul de operare, orice resetare efectivă incrementând un
contor. Segmentul al cărui contor asociat este minim va fi ales ca "victimă" pentru
a aştepta în memoria externă.
b) Pentru segmentele de date:
 Bitul 2, notat acum cu ED (prescurtarea de la "expanded down"), indică dacă
segmentul de date este folosit ca stivă.
- pentru ED= 0 - segment de date;
- pentru ED=1 - stivă.
 Bitul 1, notat acum cu W, indică, pentru W = 1, dacă segmentul de date poate
fi şi "înscris" nu numai citit.
 Bitul 0, notat cu A, are aceeaşi semnificație ca şi pentru segmentele de
program, fiind folosit în cadrul "Strategiei LRU".
Se impun câteva observații:
 Dimensiunea adresei fizice a bazei segmentului indică o locație în harta
memoriei fizice de 4 GB.
Arhitectura Calculatoarelor 89
 Câmpul LIMITA indică o dimensiune maximă de 220 = l M cuante de informație.
Numai că această cuantă poate fi octetul sau pagina (în dimensiune fixă de 4
kB).
Acest tip de organizare a memoriei este indicat de bitul 7 al octetului 6, bit notat cu
G ("granularitate"). Pentru G = 1, Pentium foloseşte mecanismul paginării. Se
observă că în cazul granularității pe octet segmentele au maximum 1 MB, iar în
cazul granularității pe pagină, segmentele ating dimensiunea maximă de 4 GB.
Ceilalți trei biți din octetul 6 au următoarele semnificații:
 Bitul 6, notat cu D/B (D pentru date şi B pentru coduri), indică pentru D/B = 1
că se lucrează cu operanzi pe 32 de biți, cu toate modurile de adresare care îi
sunt caracteristice. Pentru D/B = 0, se lucrează cu operanzi pe 16 biți şi cu
segmente de maximum 64 kB.
 Bitul 5 este 0 pentru compatibilitate cu descendenții familiei Intel.
 Bitul 4, notat cu AVL este la dispoziția utilizatorului ("disponibil").
Se degajă câteva concluzii generale despre descriptorii de segment, indiferent de
tipul microprocesorului:
 Segmentele de sistem de tip LDT nu pot fi în mod explicit nici citite, nici
înscrise, nici executate. Ele sunt utilizate numai în mecanismul translatării în
spațiul adreselor locale. Pentru a crea o LDT, sistemul de operare creează în
GDT un descriptor pentru un segment de date, înscrie informațiile în segmentul
definit cu acest descriptor, apoi schimbă tipul descriptorului prin modificarea
biților corespunzători din ATRIBUTE.
 Informația conținută în descriptor este deosebit de bogată. Astfel:
1. Se precizează adresa fizică a bazei segmentului precum şi dimensiunea sa.
Bitul ED ajută la interpretarea acestei dimensiuni.
2. Biții P şi A ajută sistemul de operare să decidă care segmente vor fi
menținute în memoria internă.
3. Se pot distinge segmentele de program, de date şi speciale.
4. Biții R şi W definesc accesul în segmente, asigurând o primă protecție.
5. Câmpul DPL şi bitul C asigură privilegii suplimentare.
 Orice încălcare a unui tip de protecție este semnalată prin verificare
"hardware" cu o cerere de întrerupere dedicată.
Tabelele de descriptori guvernează interpretarea adreselor virtuale. Orice
translatare a adreselor virtuale în adrese fizice face apel implicit la aceste tabele.
Există trei categorii de tabele de descriptori:
1. "Tabela descriptorilor globali" (GDT) destinată să conțină informațiile pentru
o descriere completă a spațiului adreselor globale. Să reținem că există o singură
tabelă de acest fel.
2. "Tabelele de descriptori locali" (LDT) conțin informațiile din spațiul adreselor
locale folosite de unul sau mai multe procese.
3. „Tabela de descriptori de întrerupere” (IDT), folosită în modul protejat, poate
conține până la 256 întreruperi.
În mod normal, fiecare proces trebuie să aibă acces la trei tabele de descriptori
care să-i definească spațiul adreselor virtuale ce îi este destinat. În acest fel se
asigură toate protecțiile necesare pentru a nu depăşi acest spațiu dar nici pentru a
nu fi afectat de alte procese. Cele trei tabele sunt: Tabela descriptorilor globali
(folosită de toate procesele), o Tabelă de descriptori locali particulară (privată sau
"împărțită" cu un grup de procese înrudite) şi tabela de descriptori de întreruperi
(accesarea întreruperilor cu instrucțiuni INT, întreruperi Hard, excepții ale
microprocesorului).
Pentru sistemele cele mai simple, în care protecția proceselor nu este necesară,
poate fi definit doar spațiul adreselor globale şi deci GDT este suficientă.
O tabelă poate avea 8k descriptori necesari pentru a defini un maximum de 8k
Arhitectura Calculatoarelor 90
segmente potențiale. O tabelă poate avea un număr predefinit de descriptori chiar
dacă la un moment dat nu sunt definite tot atâtea segmente. Acest lucru este
asigurat prin rezervarea spațiului din tabelă unor "descriptori nuli": descriptori
pentru care câmpul atribute este 0H, ceea ce semnifică faptul că aceşti descriptori
nu identifică nici-un segment în memoria virtuală.
Fiecărui tabel îi corespunde un registru al procesorului (GDTR, LDTR şi IDTR).
Instrucțiunile ce încarcă registrele LGDT, LLDT şi LIDT sunt privilegiate (nivelul 0).

Sistemul de privilegii
Sistemul de privilegii pe 4 nivele este destinat gestionării instrucțiunilor
privilegiate şi accesului la descriptori. Nivelele sunt numerotate 0-3, nivelul zero
corespunde accesului nelimitat şi este destinat nucleului sistemului operațional
(SO). Nivelul 3, acces minimal şi practic este destinat aplicațiilor. Serviciile oferite
proceselor, sarcinilor (tasks) pot avea diferite niveluri de protecție. Transferul
controlului între sarcini este gestionat de porți (Gate), ce controlează regulile de
utilizare a nivelelor de privilegii. Utilizând porțile, sarcinile pot primi acces la
serviciile segmentelor din diferite nivele.
Nivelele de privilegii sunt destinate descriptorilor, selectorilor şi sarcinilor. În
registrul de fanioane sunt indicatori de privilegii de intrare/ieşire, cu ajutorul cărora
este asigurat controlul accesului la instrucțiunile de intrare/ieşire şi controlul
fanionului de întreruperi.
Descriptorii şi privilegiile sunt baza sistemului de protecție: descriptorii
determină structura elementelor de program, iar privilegiile determină posibilitatea
de accesare la descriptori şi executarea instrucțiunilor privilegiate. Orice violare a
protecției provoacă apariția excepțiilor speciale care sunt prelucrate de nucleul SO.

Figura 6.5 Nivelele de privilegii

Mecanismul memoriei virtuale permite fiecărei sarcini utilizarea spațiului logic de


adresare cu dimensiunea până la 64 TByte (16 K segmente de 4 GByte). Prezența
fiecărui segment în memoria operativă, la un moment dat, este indicat de un bit în
descriptorul segmentului. Segmentul neutilizat poate fi descărcat din memoria
operativă în cea externă (de exemplu, harddisk), fapt ce este notificat în descriptor.
Spațiul eliberat poate fi utilizat pentru restabilirea componentelor altui segment
(procesul swapping) şi în descriptor se notifică prezența în memorie. Când un
Arhitectura Calculatoarelor 91
proces adresează segmentul ce nu este prezent în memorie, procesorul formează
excepție respectivă şi segmentul (pagina) se încarcă în memoria operativă.

6.5 Translatarea adresei virtuale


Mecanismul de translatare porneşte de la cele două entități informaționale din
adresa virtuală (selector şi adresa efectivă):
 Selectorul furnizează, la rândul său, următoarele informații:
1) Prin intermediul lui TI se identifică tipul de tabelă.
2) Câmpul INDEX este multiplicat cu 8 (un descriptor are 8B) şi se obține poziția
relativă față de baza tabelei, identificându-se astfel un descriptor din tabelă.
Din descriptor se extrage:
a) Adresa fizică a bazei segmentului ("BAZA") pe 4 octeți.
b) Dimensiunea segmentului vizat ("LIMITA") pe 20 de biți.
 Adresa efectivă se adună la BAZA obținută indirect cu ajutorul selectorului (aşa
cum arătam mai sus) obținându-se astfel adresa fizică (AF) a informației din
segmentul vizat. Concomitent se verifică dacă dimensiunea prestabilită a
segmentului nu este depăşită:
AE  LIMITA
Mecanismul translatării adresei virtuale (TI=1) este dat în Figura 6.6.
Stabilirea bazei tabelei de descriptori depinde de tipul de tabelă: în spațiul
adreselor globale sau locale.
În spațiul adreselor globale, GDT are o modalitate mai simplă de definire: fiind
unică, baza şi lungimea sa sunt stocate într-un registru intern al microprocesorului:
"Registrul tabelei de descriptori globali" (GDTR). Accesul la acest registru este
15
asigurat de instrucțiuni privilegiate,
31 astfel
0 încât un utilizator obişnuit să nu poată
avea acces la redefinirea
0
SELECTORacestei tabele
AE (reamintim că GDT este folosită de toate
procesele, inclusiv de sistemul de operare).

7 0
INDEX
TI=0

7 Tabela 0 Segme
AF nt
descripto
ri
+ LIMITA
select
at
Descript
or
de BAZA
segment

+
Baza tabelei de
descriptori

31 0 31
BAZA_GDT 0
LIMITA_GDT
: GDTR
Arhitectura Calculatoarelor 92

Figura 6.6

Putem nota următoarele observații:


– Orice LDT este privită ca un segment, dar nu unul obişnuit, ci un segment de
sistem. Fiecare astfel de segment trebuie să se afle în spațiul adreselor
globale, deci descriptorii pentru LDT-uri se vor afla în GDT.
– GDT nu are nevoie de un descriptor special adresa fizică a bazei sale precum
şi dimensiunea sa sunt stocate într-un registru dedicat.

6.6 Registre "cache"


Examinând modul de translatare a adreselor virtuale se poate observa că
referințele în memorie, mai ales în spațiul adreselor locale, implică multe operații şi
necesită un timp lung.
Microprocesorul PentiumIV aplică în acest caz o metodă de a minimiza timpul
de acces în memorie.
Presupunând că referințele în memorie se fac mai des decât schimbarea
informației din registrele segment şi decât schimbarea procesului activ (deci
schimbarea selectorului din LDTR) s-a recurs la folosirea unor registre ascunse
("cache").
Figura 6.7 prezintă registrele cache ale microprocesorului.
Se observă că registrele segmentelor, precum şi LDTR au "o prelungire" invizibilă
utilizatorului. Aici se află toate informațiile necesare din descriptorul asociat
selectorului din registrul respectiv.
Ori cate ori este încărcat un registru segment "vizibil" cu un selector, se încarcă şi
cei octeți utili
din descriptorul asociat în registru cache respectiv. Aici se află adresa fizică a bazei
segmentului vizat, dimensiunea sa precum şi drepturile de acces. Deci toate
informațiile necesare unei referințe în memorie sunt stocate în aceste registre care
reprezintă o "memorie" pe cip, foarte rapid adresabilă. Adresa fizică se calculează
direct prin suma dintre baza segmentului, aflată în registrul cache, şi adresa
efectivă din adresa virtuală specificată conform modului de adresare. Concomitent
se pot face toate verificările necesare (dacă informația este în interiorul dimensiunii
Arhitectura Calculatoarelor 93
predefinite a segmentului, dacă segmentul e prezent, ce tip de segment este vizat
etc).

SELECTOR Registre
cache
CS 15 0
SS

DS

ES

FS

GS

ATRIBUTE BAZA [Link]


LIMITA
LDTR

ATRIBUTE BAZA LDTR


LIMITA LDTR
Figura 6.7

Registrele segment pot încărca un selector de 16 biți. Partea invizibilă cuprinde


32 de biți pentru adresa bazei segmentului selectat, 32 de biți pentru
dimensionarea segmentului (din care se folosesc numai 20 de biți) şi un câmp
pentru diversele atribute ale segmentului (prezent, nivelul de privilegiu, accesat,
granularitate etc).
Din motive uşor de înțeles, GDTR nu are porțiune ascunsă. El este în întregime
vizibil şi încârcarea sa se face tot cu o instrucțiune privilegiată: LGDT
Pentru LDTR situația este puțin diferită. Aici partea "invizibilă" conține numai adresa
bazei şi dimensiunea tabelei de descriptori locali care este vizată în memorie. În
partea sa "vizibilă" există un selector care are obligatoriu TI = 0. Încărcarea acestui
registru se face cu o instrucțiune privilegiată: LLDT.
Mai subliniem că nu am considerat decât registrele care iau parte la mecanismul
gestionării memoriei, deşi principiul registrelor cache are o aplicabilitate mai largă.

6.7 Paginarea
Paginarea este procedeul de realizare în memorie a unor blocuri fixe numite
pagini, care pot fi utilizate în mecanismul interschimbării proceselor (transferul
blocurilor între memoria internă şi cea externă).
Tehnica paginării este larg folosită şi este aplicată de unitatea de gestionare a
memoriei (Memory Management Unit, MMU). Paginarea utilizează directorul şi
tabele de descriptori a paginilor – structuri de date în memoria fizică (operativă).
Unitatea MMU divizează adresa lineară în pagini virtuale de o mărime fixă (4KB,
4MB, 2MB). Pe pagini similare este divizat şi spațiul adreselor fizice.
Avantajele paginării pot fi rezumate astfel:
 Un obiect în memorie nu trebuie să fie continuu: pagina poate constitui o nouă
"cuantă" de informație.
 Mecanismul paginării şi, implicit, întreaga tehnică de a schimba continuu
blocuri fixe de informații întră memoria internă şi cea externă nu sunt vizibile
utilizatorului.
Paginarea introduce şi o nouă noțiune legată de adrese: adresa liniară. Acest tip
de adresă rezultă în urma translatării adresei virtuale şi urmează, la rândul ei, să fie
Arhitectura Calculatoarelor 94
translatată în adresă fizică.
Notăm următoarele observații preliminare:
 mecanismul paginării se aplică numai în funcție de bitul de granularitate (G)
din descriptorii de segmente.
 adresa virtuală, alcătuită din selector şi adresa efectivă, este translatată în
adresa liniară şi apoi în cea fizică. Ca şi adresa fizică, adresa liniară (AL) este
de 32 de biți.
 Dimensiunea maximă a unui segment în memoria virtuală se obține numai
pentru G = 1, în acest caz un segment poate avea:
220 pagini * 212 B/pagină = 232 B = 4 GB.

Mecanismul paginării (pagini pe 4K) are următoarele elemente esențiale:


 Se utilizează două nivele de adresare indirectă cu memoria, astfel încât, până
să se ajungă la pagina propriu-zisă, se face o referință într-un "director" din
care se selectează o "tabelă a paginilor".
 Toate obiectele din memorie implicate (directorul şi tabelele) sunt tratate la
rândul lor ca nişte pagini speciale; deci au toate mărimea fixă de 4 kB. Se
păstrează astfel principiul coerenţei informaţiei în memorie (ca şi în cazul
segmentelor).
 Atât directorul cât şi tabelele de pagini au structură uniformă fiind formate din
1 k "elemente" de câte 4 octeți. Senmificația informației din aceste elemente
va fi detaliată în cadrul acestui subcapitol. Ne limităm să menționăm acum că
aici se găseşte adresa bazei tabelei şi respectiv a paginii selectate.
 Orice adresă a bazei unei tabele sau a unei pagini este dată pe 20 de biți,
aceştia constituind partea mai semnificativă a adresei fizice vizate. Toate
blocurile în memorie sunt "aliniate" din 4 kB în 4 kB, deci, automat cei mai
puțin semnificativi 12 biți ai adreselor fizice ale bazelor sunt 0.
 Adresa fizică a bazei directorului se află într-unul din registrele de control ale
microprocesorului CR3 (Page Directory Physical Base Address) (desigur şi aici
cei mai puțin semnificativi 12 biți ai adresei sunt 0).
Mai menționăm că registrul de control CR2 este şi el utilizat în paginare, dar
pentru verificarea corectitudinii procedeului; el conține adresa liniară la care se
detectează ultima eroare în mecanismul paginării (Page Fault Linear Address). Se
generează un cod de eroare care se încarcă în stiva aferentă procesului activ.
Figura 6.8 prezintă modul în care se produce paginarea prin cele două nivele de
adresare indirecta cu memoria.
Arhitectura Calculatoarelor 95

Figura 6.8

Adresa liniară cuprinde trei entități informaționale:


AL=Directory Table Offset
În care:
a) Director (Directory) este un câmp de 10 biți. Aceştia, concatenați cu 00,
formează adresa relativă la bază a elementului vizat din director. Concatenarea
cu 00 este normală pentru că un element are 4 B, deci informația este "aliniată"
din 4B în 4B.
b) Tabela (Table) este un câmp de 10 biți. Tot prin concatenare cu 00 formează
adresa relativă la bază a elementului selectat dintr-o tabelă a paginilor.
c) Offset este un câmp de 12 biți care localizează informația în pagina selectată.
Evident şi această adresă este relativă la adresa fizică a bazei paginii.

Directorul (4KB) conține 1024 elemente pe 32 biți - PDE (Page Directory Entry)
(figura 6.9,a). Tabela de pagini conţine tot 1024 elemente pe 32 biţi - РТЕ (Page
Table Entry) (figura 6.9, b) şi aceste elemente conţin adresa fizică de bază (Page
Frame Address) şi atributele paginilor.

Figura 6.9 Structura elementelor paginării pe 32 biți: a – elementul din director


(PDE),
Arhitectura Calculatoarelor 96
b – elementul tabelei de pagini (PTE)

Detalierea câmpurilor (figura 6.9) dintr-un element (fie din director, fie dintr-o
tabelă a paginilor) este următoarea, începând cu cei mai semnificativi biți:
a) Biții 12 31 constituie cei mai semnificativi 20 de biți ai adresei fizice a bazei
unei tabele a paginilor şi respectiv a unei pagini propriu-zise.
b) Biții 911 sunt rezervați sistemului de operare. Se pot utiliza, de pildă, în
"strategia LRU (Least Recently Used)” pentru a determina timpul cât o pagină
rămâne "activă" în memona internă.
c) Biții 7 şi 8 sunt rezervați pentru compatibilitate cu descendenții familiei Intel.
în cazul de față ei sunt obligatoriu 0.
d) Bitul 6 notat cu D ("dirty") indică, numai în cazul tabelelor paginilor, pentru D
= 1, dacă a avut loc o scriere în pagina selectată. Acest bit nu este definit
pentru elementele din director.
e) Bitul 5 notat cu A ("accesat") indică, pentru A = 1, un acces de orice fel
(scriere/citire) în pagină.
f) Biții 3 şi 4 sunt folosiți numai de Intel 486 în adresarea memoriei cache de pe
cip (PCD -"page cache disable" şi PWT - "page write through").
g) Biții 1 şi 2 sunt utilizați în mecanismul protecției paginilor (R/W, U/S-
User/Supervisor).
h)Bitul 0 notat cu P ("prezent") indică:
1) Pentru P = 1 - pagina este prezentă în memoria internă, deci elementul
poate fi folosit pentru translatarea adresei liniare în adresă fizică.
2) Pentru P = 0 - pagina este în memoria externă; în acest caz tot restul
informației din element este irelevant.
Mecanismul paginării permite şi alte două observații interesante, care reflectă
aplicarea unor principii mai generale:
a) Structura cu două nivele de adresare indirectă cu memoria pare greoaie şi
consumă mult timp. Ea este însă absolut necesară. Într-adevăr, să ne imaginăm
un singur nivel de adresare indirectă. în acest caz, în memoria fizică încap 1M
pagini, de câte 4 kB. Tabela de adresare ar trebui să conțină 1M elemente de
câte 4 B = 4 MB. Structura coerentă cu director şi tabele ale paginilor de câte 4
kB fiecare (exact ca şi paginile propriu-zise) rezolvă elegant această problemă.
Arhitectura Calculatoarelor 97

Figura 6.10

b) Problema timpului necesar pentru accesul într-o pagină din memorie se


rezolvă folosind principiul general al memoriei asociative cache. Pentru a elimina
stările suplimentare impuse de mecanismul paginării, unitatea care se ocupă de
aceasta conține o astfel de memorie, adresabilă prin conținut, denumită TLB
("translation lookaside buffer"). Principiul este prezentat în figura 6.10.
Memoria conține cele mai frecvent utilizate 32 de elemente din director şi tabelele
paginilor. De câte ori este necesar accesul într-o pagină, se verifică întâi TLB. Dacă
aici se găseşte elementul vizat (ceea ce se numeşte "cache hit"), translatarea se
face citind adresa corespunzătoare din TLB, fără timpii adiționali de calcul şi căutare
în tabele succesive. Reactualizarea TLB se face ori de câte ori nu se gaseşte
elementul cerut ("cache miss"). Evident TLB este complet reînnoit când CR3 este
încărcat cu o nouă adresă de bază a directotiilui. Intel ne asigură că în 98% dintre
referințele în memorie, mecanismul de translatare este înlocuit cu simpla citire a
adresei din TLB.
Arhitectura Calculatoarelor 98
Arhitectura Calculatoarelor 99
7 Plăcile de sistem. Magistrale şi interfețe
7.1 Structura plăcii de bază

Una din cele mai importante componente a unui sistem de calcul este placa
principală numită si placa de bază sau placa de sistem.
Placa de sistem (engleză: mainboard, motherboard) este o componentă
hardware, de obicei complexă, pe care sunt montate toate celelalte componente
hardware ale unui PC. Cu evaluarea calculatoarelor se extindeau funcțiile şi se
modifica structura legăturilor pe placa de bază. Au fost incorporate circuite
specializate ce asigurau conectarea diferitelor componente hardware pe placa de
bază cu microprocesorul şi memoria. Acest grup de circuite integrate, sau cipuri, a
primit denumirea de chipset. Chipset-ul constă din 2 (1) circuite, fiecare cu
destinație specială, notate - puntea de nord (North bridge) şi puntea de sud (South
bridge). Chipset-ul conține diferite controllere ce interconectează componentele de
pe placa de sistem. Pe placa de bază modernă Intel QM77, puntea de nord este
incorporată în circuitul microprocesorului.
Prezentăm câteva structuri ale plăcilor de bază.

Arhitectură bazată pe magistrale şi punți


Ca exemplu de sistem cu arhitectură bazată pe magistrale şi punți poate fi privit
chipset-ul AMD-760 (figura 7.1)

Figura 7.1 Placa de sistem bazată pe chipset-ul AMD-760

Chipset-ul AMD-760 constă din următoarele componente:


 AMD-762 – controllerul de sistem (North bridge)
 AMD-766 – controllerul magistralelor periferice (South bridge)
Controllerul de sistem AMD-762 asigură funcția de legătură (conectare) între
magistralele microprocesoarelor (magistrale de sistem), magistrala AGP,
subsistemul de memorie DDR şi magistrala PCI.
Principalele componente ce încorporează şi proprietăți ce asigură controllerul:
Arhitectura Calculatoarelor
100
a) 2 magistrale de sistem (conectarea cu microprocesoare) structurate „point-to-
point” cu viteza de transfer de 266 MHz, funcționarea monoprocesor sau
multiprocesarea simetrică a 2 microprocesoare;
b) controllerul memoriei ce asigură conectarea a 4 slot-uri de tip DIMM, cu plăci
de memorie de tip PC2100 DDR (Double Data Rate), cu volum de până la 4GB;
c) interfața AGP-4x (suportă modurile 1x şi 2x);
d) funcționarea interfeței magistralei PCI în mod dual:
1)frecvența 33 MHz, lățimea magistralei pe 32 sau 64 biți (suportă până la 7
dispozitive);
2)frecvența 66 MHz, lățimea magistralei pe 32 sau 64 biți (suportă până la 2
dispozitive).
Controllerul magistralelor periferice AMD-766 integrează subsistemul I/O ce
permite comunicarea cu dispozitivele periferice. Controllerul include:
 interfața magistralei PCI pe 33 MHz/32 biți;
 interfața magistralei LPC (Low Pin Count);
 interfaţa GPIO/Flash: lăţimea magistralei pe 8 biţi, comunicarea cu memoria
Flash BIOS şi dispozitivele generale (ex. butoane şi întrerupătoare (switch) )
(GPIO – General Purpose I/O Devices);
 controllerul a 2 magistrale EIDE, modurile UDMA 33/66/100;
 controllerul magistralei USB (include host hub cu 4 porturi);
 controllerul de întreruperi şi alte componente.

Arhitectura bazată pe hub-uri


Viteza de transfer a magistralei PCI a devenit insuficientă odată cu introducerea modurilor rapide
de transfer a datelor UltraDMA (ATA/66, ATA/100 şi ATА/133) între controlerul IDE şi memoria de
sistem. În plus, au apărut interfeţe cu viteze înalte de transfer de date Gigabit Ethernet, FireWire
(100/200/400/800 Мb/s) şi USB 2.0 (480 Мb/s). Ca rezultat, au fost implementate
arhitecturi bazate pe hub-uri. În acest context, hub-uri sunt microcircuite
specializate, destinate asigurării transferului de date între interfeţele sale externe.
Aceste interfeţe sunt interfeţele ce asigură conectarea microprocesoarelor,
modulelor de memorie, magistralelor de extensie şi interfeţele perifericelor (ATA,
SATA, USB, FireWire, Ethernet). Practic, chipset-ul este implementat din două hub-uri
(North şi South) interconectate printr-un canal (magistrală) cu viteza înaltă de
transfer de date. North hub execută aceleaşi funcţii ca şi North bridge din
arhitectura bazată pe magistrale şi punţi: interconectează magistralele
microprocesorului, memoriei şi AGP. În partea de „sud” al acestui hub nu se
utilizează magistrala PCI ci o interfaţa și magistrala DMI (Direct Media Interface) de
mare viteză de transfer ce intreconectează ambele hub-uri (North şi South) (figura
7.2). În figura 7.2 este prezentat chipset-ul Intel 915 GM.
North hub, notat GMCH (Graphics Memory Controller Hub) determină principalele
caracteristici ale plăcii de sistem:
- modelul microprocesorului, frecvența magistralei de sistem (FSB).
- Tipurile de memorie şi frecvența magistralei de memorie (pe plăcile de sistem
cu microprocesoare cu controller al memoriei încorporat, caracteristicile
memoriei (tip, numărul de canale, frecvența) sunt determinate de
microprocesor).
- Volumul maximal de memorie.
- Unul sau două canale de memorie.
- PCI Express x16 pentru conectarea cartelei grafice.
- 2 porturi SDVO (Serial Digital Video Out), LVDS Interface, CRT, TV-Out –
conexiuni pentru dispozitive seriale şi digitale externe cu diferite standarde
DVI, LVDS, HDMI, TV-out, etc.
South hub (ICH6 - Intel I/O Controller Hub) conectează magistralele:
Arhitectura Calculatoarelor
101
- ATA (1 magistrală).
- SATA (2 porturi).
- USB 2.0 (8 porturi)
- 4 porturi PCI-E x1.
- Interfața AC-link (Audio kodek).
- Magistrala PCI.
- Magistrala LPC (memoria CMOS, flash BIOS, mouse, tastatura).
În South hub este încorporat timer-ul (8254), controllerul de întreruperi (APIC),
controllerul DMA.
Principiul de funcționare a controllerului DMA este prezentat în figura 7.3.

Figura 7.2 Chipset - ul Intel 915 GM

Controllerul DMA (DMA-direct memory access, acces direct la memorie) este un


dispozitiv ce asigură accesul direct la RAM a perifericelor, neutilizând registrii interni
ai microprocesorului.
Cererea de acces este formulată pe un terminal specializat denumit, de regulă,
"BUSRQ" (cerere de magistrală). Are prioritatea maximă şi răspunsul aşteaptă doar
terminarea ciclului maşină curent.
Arhitectura Calculatoarelor
102
Microprocesorul "îngheață" întreaga activitate internă; magistralele sale trec în
"impedanță înaltă" iar controlul transferului de informație este preluat de
controllerul DMA. Acesta facilitează transferul informației direct între memorie şi
echipamente periferice (Figura 7.3).
Controllerul de DMA poate fi extern sau intern unui microprocesor standard. El
adresează blocuri de date în memorie (succesiv, între limite prestabilite) şi
comandă transferul la sau de la un periferic prestabilit.

Figura 7.3
Activitatea de DMA este luată drept etalon pentru viteza maximă de circulație a
datelor pe magistrala unui calculator (microprocesorul nu participă şi deci adresarea
memoriei şi perifericelor nu este afectată de timpul de calcul al adresei fizice).

Arhitectura HyperTransport
Tehnologia (arhitectura) HyperTransport (HT) a fost proiectată ca alternativă arhitecturii bazate pe
magistrale şi punţi. Tehnologia a fost elaborată de firmele AMD, Apple Computers, Broadcom, Cisco
Systems, NVIDIA, PMC-Sierra, SGI, SiPackets, Sun Microsystems, Transmeta.
Principala inovaţie – înlocuirea conectării prin intermediul magistralelor a dispozitivelor periferice prin
conectarea punct-la-punct (point-to-point) ce presupune transferuri de date concomitent în ambele
direcţii între 2 noduri (similară cu topologia PCI-e, detaliată ulterior). Prin această tehnologie se
majorează considerabil viteza de transfer a datelor. Schema structurală a arhitecturii HT este prezentată în
figura 7.4. Puntea de bază (host bridge) asigură legătura cu nucleul sistemului – microprocesorul şi
memoria. Controllerele perifericelor, ce necesită rate înalte de transfer de date sunt realizate în formă de
tuneluri HT (HT Tunnel). Structura conectării controllerului grafic AGP şi a magistralei PCI-X la
magistrala HT, organizate ca tunel, este prezentată în figura 7.5, 7.6.
Caracteristicile principale ale tunelului sunt:
 Interfaţa HyperTransport pe 16 biţi (Side A) oferă o rată maximală de transfer (lăţime de bandă) –
până la 6,4 GB/s;
 Interfaţa HyperTransport pe 8 biţi (Side B) oferă o rată maximală de transfer – până la 1,6 GB/s.
În arhitectură este prevăzută şi conectarea prin punte cu magistrala PCI.
Arhitectura HT asigură toate tipurile de tranzacţii a microprocesorului şi dispozitivelor PCI, PCI-X şi
AGP. Tranzacţiile se efectuează în formă de pachete de diferite tipuri. Iniţiatorul transferului transmite
pachetul-cerere şi datele necesare tranzacţiei scriere, dispozitivul ţintă trimite pachetul-confirmare şi date
pentru tranzacţii de citire.
Semnalizarea întreruperilor în HT este realizată tot pe pachete: dispozitivul trimite mesajul –
execută tranzacţia scriere pe adresa indicată la configurare. Rutina de tratare a întreruperilor trimite
mesajul de finalizare – întrerupere prelucrată (End Of Interrupt, EOI), executând o scriere pe
altă adresă aferentă dispozitivului dat.
Arhitectura Calculatoarelor
103

Figura 7.4 Arhitectura HyperTransport

Figura 7.5 Structura conectării controllerului grafic AGP


la magistrala Hyper Transport

Figura 7.6 Conectarea Magistralei PCI-X la magistrala HT

Arhitectura HT se bazează pe transferuri bidirecţionale (pe linii diferite) a pachetelor


de date între 2 dispozitive. Dispozitivul HT poate fi ca iniţiator sau/şi ca ţinta
tranzacţiilor. Sunt diferite tipuri de dispozitive HT din punct de vedere topologic:
- Tunel (Tunnel) – dispozitiv cu 2 interfeţe HT; ele pot forma un lanţ (daisy chain),
organizând o magistrală logică. Lanţul de dispozitive se conectează la host
Arhitectura Calculatoarelor
104
(microprocesorul cu Host bridge), ce asigură configurarea tuturor dispozitivelor şi
gestionează funcţionarea HT.
- Punte (Bridge) – dispozitiv ce conectează o magistrală logică primară cu una sau
câteva magistrale logice secundare (lanţuri). Puntea conţine un set de registre,
informaţia din care permite gestionarea tranzacţiilor între aceste magistrale.
- Comutator (Switch) – dispozitiv cu câteva interfeţe HT (analogic magistralei PCI
cu câteva punţi) conectate la o magistrală internă.
- „Terminus”, sau cavernă (Cave) – dispozitiv cu o interfaţă HT.
Principala variantă topologică – lanţ din dispozitive-tuneluri conectat la Host Bridge. Interfaţa HT
constă din 2 componente independente: emiţător şi receptor. La configurare fiecărui dispozitiv i se
atribuie un spaţiu de adresare propriu. Pachetele se livrează în următorul mod: pachetul trimis de un
dispozitiv iniţiator din lanţ este primit, decodificat şi retransmis de Host Bridge dispozitivului ţintă din
lanţ, iar dacă se cere acces direct la memoria RAM, Host Bridge formează legătura cu controllerul
memoriei.
Din figura 7.5 se observă că magistrala HT (Hyper Transport Link, Side A) constă din 2
submagistrale: o magistrală pe 16 biţi – direcţia transferurilor spre Host şi o magistrală similară destinată
transferurilor de date de la Host. Un bit al magistralei reprezintă o pereche de fire diferenţiale (16 biţi-32
fire) cu impedanţa de 100 Ω, semnale LVDS (Low Voltage Differential Signal) – nivel 1,2 V.
Frecvenţa 200, 300, 400, 500, 600, 800, 1000 MHz.
În microprocesoarele AMD pe 64 biţi, ce folosesc arhitectura HT, Host Bridge
este incorporat în microprocesor. Ca rezultat microprocesorul posedă 2 interfeţe:
interfaţa memoriei şi HT în calitate de magistrală de sistem. În chipset-urile VIA, SiS
la interfaţa HT este conectat numai North Hub, ce conectează numai interfaţa
grafică – AGP sau PCI-E. South Hub se conectează la North Hub utilizând o interfaţă
proprie.
În următoarele capitole vom detalia principalele componente de pe placa de
bază.

7.2 Magistrale
Detaliem noțiunea de magistrală menționată în capitolul 3 (figura 7.7).

Figura 7.7 Magistralele PC

Magistrala este destinată schimbului de informaţie între 2 sau mai multe dispozitive. Magistrala
conţine componente (conectori , sloturi) la care se conectează diferite dispozitive. În arhutectectura
magistralei intră un controller ce gestionează transferurile de informaţie pe magistrală.
Sunt 2 tipuri de magistrale: paralele şi seriale.
Magistrala paralelă conține un set de linii permițând transferul simultan al unui
cuvânt (cuvânt pe 8, 16, 32, 64,128, 256, 512 biți) de informație. Pe magistrala
serială informația se transmite succesiv (un cuvânt este transmis bit cu bit, pe
aceeaşi linie).
Arhitectura Calculatoarelor
105
Magistrala paralelă poate fi subdivizată in trei categorii, după tipul informației
transferate: magistrale de adrese, de date, şi de control.

Destinaţia liniilor magistralei paralele


Magistrala asigură conectarea paralelă a dispozitivelor periferice şi asigură
transferurile de informație între ele.
Arhitectura magistralei include următoarele componente:
- Linii pentru transferuri de date (magistrala de date);
- Linii pentru adresarea datelor (magistrala de adrese);
- Linii pentru controlul datelor (magistrala de control);
- Controllerul magistralei.
Controllerul magistralei efectuează controlul procesului de schimb de date, de
semnale de control şi reprezintă un microcircuit sau se integrează în circuitele
chipset-ului.
Magistrala de date
Magistrala de date este destinata atât transferului unidirecţional de instrucțiuni
de la memorie (citire a programului), cat si celui bidirecţional, de date intre
memorie, unitatea centrala si /sau interfețele de intrari/iesiri (informația parcurge
magistrala in ambele sensuri, sau de la procesor la una dintre unitățile externe
acestei unități, sau de la una dintre aceste unități spre procesor). Direcția
transferului de informație este supervizata de către secțiunea de CONTROL a
microprocesorului, prin generarea de semnale specifice (citire sau scriere).
Lungimea cuvântului microprocesorului determina numărul de linii de conexiune din
magistrala de date (8, 16, 32, etc.).
Magistrala de adrese
Magistrala de adrese este o magistrală unidirecțională. Ea vehiculează codul
binar reprezentând locația (adresa) datei ce se va utiliza în cadrul operației ce se
execută.
Adresabilitatea unui microprocesor este dată de numărul de biți ai magistralei
de adrese. Un număr uzual de 65536 (64 KB) celule de memorie vor necesita 16
linii de adresă pe această magistrală. (2 16=65536). În general, se vor putea adresa
2N celule de memorie prin intermediul a N linii de adresă.

Magistrala de control
Această magistrală furnizează informații suplimentare necesare pentru indicarea
operației ce se efectuează. Numărul de semnale de pe această magistrală depinde
de numărul de semnale de control necesare pentru microprocesorul utilizat. Tipice
sunt semnalul de ceas al sistemului (care asigura funcționarea secvențială cu o
periodicitate fixă a întregului sistem microprocesor), semnalele de citire/scriere în
memorie, citire/scriere pentru intrare/iesire din sistem etc.
Corelate cu magistrala de adrese, semnalele de pe magistrala de control permit
selecția unica 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 executa.

Principalele caracteristici ale magistralei:


 Lățimea magistralei – numărul de linii folosite pentru transferuri de informații
(dacă nu menționăm lățimea componentei concrete (date, adrese, control), se
presupune lățimea magistralei de date). Poate fi pe 8, 16, 32, 64, 128, 256,
512 biți.
Arhitectura Calculatoarelor
106
 Viteza (rata) de transfer a informației, se determină ca produsul dintre
frecvența magistralei şi lățimea ei: ex. lățimea magistralei PCI 32 biți şi
frecvența 33 MHz
(32 biți x 33MHz) : 8 = (1056 Mb/s) : 8 = 132 MB/s

Interfaţa
Conform concepției clasice un calculator este format dintr-o unitate centrală
de prelucrare, memorie si dispozitive de intrare/iesire. Dispozitivele de
intrare/iesire, numite şi echipamente periferice au în general o structură proprie
independentă de structura calculatorului la care se conectează (ex.: imprimanta,
plotter, display, mouse, etc.). Cuplarea acestor echipamente la un sistem de calcul
presupune adaptarea semnalelor specifice fiecărui echipament periferic la semnalele
de pe magistrală si reglarea fluxului de date de intrare/iesire între calculator si
periferic şi aceste funcții sunt efectuate de interfețe.

7.3 Magistrale de sistem


Magistrala de sistem este destinată schimbului de informație între CPU şi alte
componente ale PC. Dintre ele fac parte magistralele GTL+(AGTL+), EV6.
Magistrala de sistem GTL+(AGTL+) este magistrala de interacțiune între CPU şi
Chipset, a fost elaborată de Intel pentru microprocesoarele Pentium III (Pentium
IV). Lățimea magistralei – 64 biți, frecvența (ceas, FSB) – 100, 133 (200, 266)
MHz, viteza de transfer – 800 MB/s, 1,06 GB/s (3,2 , 4,2 GB/s).
Magistrala EV6 a fost elaborată de firma Digital Equipment pentru CPU Alpha
21264. Ea este folosită de firma AMD pentru sisteme cu microprocesoare K-7.
Diferă de alte magistrale prin: validarea informației se petrece pe ambele fronturi
ale semnalului de frecvență, specificarea magistralei permite majorarea frecvenței
până la 377 MHz.

7.4 Magistrala PCI


7.4.1 Magistrala paralelă PCI
PCI (Peripheral Component Interconnect) local bus – magistrala de conectare
a componentelor periferice. Această magistrală de extensie a fost destinată
procesoarelor Pentium şi prima versiune a apărut în anul 1992. În specificarea PCI
versiunea 2.0 (1993) a fost introdusă specificarea conectorilor şi cartelelor de
extensie. În versiunea 2.1 (1995) a fost introdusă frecvența maximă a ceasului de
66 MHz. Descrierea dată se bazează pe textul standardului „PCI Local Bus
Spesification. Revision 2.2” de la 18.12. 1998, publicată de organizația PCI SIG
(Special Interest Grup).
Magistrala este sincronă – validarea semnalelor se petrece pe frontul pozitiv a
semnalului CLK. Frecvența nominală de sincronizare – 33 MHz. Specificarea 2.1,
permite mărirea frecvenței până la 66 MHz prin acordul tuturor dispozitivelor
conectate la magistrală. La o frecvență de 33 MHz, se poate obține o rată de
transfer de 132 MB/s în cazul implementării pe 32 de biți, sau 264 MB/s pentru 64
de biți. Cu o frecvență a ceasului de 66 MHz, se pot obține rate de transfer de 264
MB/s, respectiv 528 MB/s.
Configurarea
Dispozitivul PCI poate fi multifuncțional, adică constă din mai multe funcții.
Fiecărei funcții se atribuie un spațiu de configurare de 256 bytes (Standardul PCI
determină pentru fiecare slot spațiu de configurare de pînă la 256 registre (pe 8
bits), ce nu se referă la spațiul de memorie şi nici la spațiul de intrare/ieşire).
Accesul la acestea registre se petrece în faze speciale ale magistralei Configuration
Read şi Configuration Write. Numărul funcției (function number), în tranzacțiile de
Arhitectura Calculatoarelor
107
configurare este transmis pe liniile AD[10:8] (liniile AD[0:7] adresează registrii din
interiorul dispozitivului PCI). Deci dispozitivul poate încorpora pînă la 8 funcții. La
configurare se adresează funcția cu numărul “0”.
La o magistrală PCI pot fi conectate cîteva dispozitive fiecare cu numărul său
(device number). În sistemă pot fi cîteva magistrale PCI, fiecare cu numărul său (PCI
bus number). Magistralele se numerotează consecutiv.
Protocolul magistralei PCI
La fiecare transfer participă două dispozitive: inițiatorul şi ținta. Inițiatorul, sau
dispozitivul master, este cel care inițiază un transfer. Ţinta, sau dispozitivul slave,
este adresat de inițiator în scopul executării transferului. Dispozitivele inițiator şi
țintă sunt numite agenţi PCI.
Transferuri în mod exploziv
Un asemenea transfer constă dintr-o singură fază de adrese urmat de mai
multe faze de date. Arbitrajul de magistrală trebuie executat o singură dată . În
timpul fazei de adrese se transmite adresa de început şi tipul tranzacției care
urmează . Dispozitivul țintă memorează adresa de început într-un contor de adrese,
şi va incrementa adresa în fiecare fază de date.
În cazul magistralei PCI, cele mai multe transferuri se execută în mod
exploziv, cele mai multe dispozitive fiind proiectate astfel încât să permită
asemenea transferuri. Dacă un dispozitiv țintă poate efectua numai tranzacții
singulare, la încercarea dispozitivului master de a executa o tranzacție în mod
exploziv, ținta termină tranzacția după prima fază de date. Astfel dispozitivul
master va fi obligat să solicite din nou magistrala printr-un proces de arbitraj. În
acest mod performanțele vor fi mai reduse, dar tranzacțiile singulare se pot utiliza
pentru dispozitivele care nu necesită rate ridicate de transfer.
Presupunând că nici inițiatorul şi nici dispozitivul țintă nu inserează stări de
aşteptare, poate fi transferat câte un cuvânt la fiecare front crescător al semnalului
de ceas.
Tranzacții
Faza de adrese
Toate tranzacțiile pe magistrala PCI constau dintr-o fază de adrese urmată de una
sau mai multe faze de date. Excepția o reprezintă tranzacțiile în care se utilizează
adresarea pe 64 de biți, unde adresa este furnizată în două faze de adrese. O fază
de adrese are durata unei perioade de ceas. În această fază, inițiatorul identifică
dispozitivul țintă şi tipul tranzacției. Ţinta este identificat prin transmiterea unei
adrese de start pe magistrala de adrese/date în cadrul domeniului de adrese
asignat dispozitivului.
Tipul tranzacției este identificat prin depunerea tipului comenzii pe liniile C/BE.
Inițiatorul activează semnalul FRAME pentru a indica prezența unei adrese de start
şi tip de tranzacție valide. Deoarece adresa de start este prezentă numai pe durata
unei perioade de ceas, fiecare dispozitiv țintă trebuie să memoreze adresa pentru a
putea fi decodificat ulterior.
Atunci când un dispozitiv țintă determină faptul că este adresat, trebuie să
activeze semnalul DEVSEL, pentru a revendica tranzacția. Dacă acest semnal nu va
fi activat într-un timp predeterminat, inițiatorul va abandona tranzacția. După
terminarea fazei de adrese, magistrala de adrese/date este utilizată pentru
transferul datelor în cadrul unei sau mai multor faze de date.
Faza de date
Pe durata fazei sau fazelor de date are loc transferul datelor între inițiator şi țintă .
Atât inițiatorul cât şi ținta trebuie să indice faptul că sunt pregătite pentru
terminarea unei faze de date prin activarea semnalelor IRDY, respectiv TRDY . În
cazul în care nu sunt activate ambele semnale la începutul unei perioade de ceas,
Arhitectura Calculatoarelor
108
se va insera o stare de aşteptare cu durata unei perioade.
Terminarea tranzacţiei
Inițiatorul identifică durata totală a unui transfer cu ajutorul semnalului FRAME.
Acest semnal este activat la începutul fazei de adrese şi rămâne activat până când
inițiatorul este pregătit pentru a termina faza finală de date (activează IRDY ).
Executarea ultimei faze de date este indicată de inițiator prin dezactivarea
semnalului FRAME şi activarea semnalului IRDY . După terminarea ultimului
transfer, inițiatorul readuce magistrala în starea inactivă prin dezactivarea
semnalului IRDY .
Arbitrajul de magistrală are loc în timp ce un dispozitiv master utilizează
magistrala. Dacă arbitrul de magistrală a acordat în prealabil magistrala unui alt
dispozitiv master, acest dispozitiv poate detecta starea inactivă a magistralei prin
faptul că semnalele FRAME şi IRDY sunt ambele dezactivate.
Se descriu în continuare principalele semnale.
 AD[31:0] (Address/Data) - Reprezintă magistrala multiplexată de adrese şi de
date. În timpul fazei de adrese, pe această magistrală se transmite adresa de
start a tranzacției. În timpul fazei de date, pe liniile AD[31:0] se transmit date
provenite de la inițiator (la o scriere) sau de la ținta adresat (la o citire).
 C / BE [3:0] (Command or Byte Enable) - În timpul fazei de adrese aceste
linii definesc o comandă pe care inițiatorul o utilizează pentru a indica tipul
tranzacției necesare. Dintre comenzile posibile se amintesc citirea din
memorie, scrierea în memorie, citirea de la un dispozitiv de I/E, scrierea la un
dispozitiv de I/E, achitarea unei întreruperi etc. În timpul fazei de date aceste
linii sunt utilizate de inițiator pentru a indica octeții care trebuie transferați din
cadrul cuvântului dublu adresat şi grupele de linii ale magistralei AD care
trebuie utilizate pentru transferul datelor.
 FRAME (Cycle Frame) - Este activat de inițiator şi indică începutul şi durata
unei tranzacții pe magistrală . O tranzacție poate consta din una sau mai
multe transferuri de date între inițiatorul curent şi ținta adresată. Semnalul
FRAME este dezactivat atunci când inițiatorul este pregătit să încheie faza
finală de date.
 TRDY (Target Ready) - Este activat de dispozitivul țintă adresat atunci când
acest dispozitiv este pregătit pentru un transfer de date (poate executa faza
curentă de date). Faza de date este terminat atunci când ținta activează TRDY
şi inițiatorul activează IRDY la frontul crescător al semnalului de ceas. În
timpul unei operații de citire, semnalul TRDY activat indică faptul că ținta a
depus date valide pe magistrala de date. În timpul unei operații de scriere,
semnalul TRDY activat indică faptul că ținta este pregătit să accepte datele de
la inițiator. Sunt inserate stări de aşteptare în faza curentă de date până când
ambele semnale TRDY şi IRDY sunt activate.
 IRDY (Initiator Ready) - Este activat de inițiatorul tranzacției şi semnalează
momentul în care inițiatorul este pregătit pentru un transfer de date. În timpul
unei operații de scriere, semnalul IRDY activat indică faptul că inițiatorul a
depus date valide pe magistrala de date. În timpul unei operații de citire,
semnalul IRDY activat indică faptul că inițiatorul este pregătit să accepte
datele de la ținta adresată.
 REQ (Request) - Este activat de inițiator pentru a indica o cerere de
magistrală. Această linie este conectată la arbitrul de magistrală. Metoda de
arbitrare a magistralei nu este descris în specificațiile PCI; se pot implementa
diferite metode. Este specificat doar faptul că arbitrul de magistrală trebuie să
utilizeze un algoritm prin care să se evite blocajele; fiecărui dispozitiv master
potențial trebuie să i se permită accesul la magistrală.
Arhitectura Calculatoarelor
109
 GNT (Grant) - Este activat de arbitrul de magistrală pentru a indica acordarea
magistralei pentru inițiator. Atunci când detectează acest semnal, inițiatorul
trebuie să aştepte terminarea tranzacției în curs de către inițiatorul curent.
 CLK (Clock) - Reprezintă semnalul de ceas utilizat pentru sincronizarea tuturor
tranzacțiilor, inclusiv a arbitrajului de magistrală. Toți parametrii de
sincronizare ai magistralei sunt specificați relativ la frontul crescător al
semnalului de ceas. Frecvența semnalului de ceas se poate modifica în orice
moment, cu condiția să nu existe cereri de magistrală şi semnalul LOCK să nu
fie activ. De asemenea, ceasul poate fi oprit în starea low (pentru reducerea
puterii consumate).
 DEVSEL (Device Select) - Este activat de dispozitivul țintă nimai când acesta
şi-a decodificat adresa. Dacă un dispozitiv master a inițiat un transfer şi nu
detectează semnalul DEVSEL activ în cursul a şase perioade de ceas, va
presupune că ținta nu poate răspunde sau că adresa respectiv nu este
utilizată. Va rezulta un abandon din partea dispozitivului master.
Exemplu de tranzacţie
Figura 7.8 prezintă un transfer de date reprezentativ de la un dispozitiv slave la
un dispozitiv master, de exemplu o operație de citire de la un dispozitiv de I/E.
Tranzacția începe în momentul în care inițiatorul activează semnalul REQ
(Request) - pentru a indica o cerere de magistrală, ce este conectat la arbitrul de
magistrală. Arbitrul de magistrală pentru a indica acordarea magistralei pentru
inițiator, activează semnalul GNT (Grant), iar inițiatorul trebuie să aştepte
terminarea tranzacției în curs de către inițiatorul curent şi să activeze semnalul
FRAME în ciclul de ceas 1.

Figura 7.8 - Tranzacție de citire pe magistrala PCI

Ciclul de ceas 1. Activarea semnalului FRAME indică începutul unei tranzacții pe


magistrală. Inițiatorul plasează o adresă pe liniile AD şi un cuvânt de comandă
pe liniile C/BE (IO READ în acest exemplu). Dispozitivul țintă activează DEVSEL
- ”0”, pentru a indica faptul că a decodificat cu succes adresa şi este ținta
tranzacției curente. Nici un transfer de date nu poate avea loc până în
momentul în care semnalul DEVSEL nu este activ.
Ciclul de ceas 2. Pentru evitarea conflictelor în momentul în care inițiatorul nu
mai are controlul asupra liniilor AD şi acest control este preluat de dispozitivul
țintă, faza de adrese este urmat de un ciclu inactiv (TRDY – ”1”). Condiția
tranzacției- liniile IRDY şi TRDY setate ”0”.
Arhitectura Calculatoarelor
110
Ciclul de ceas 3. Liniile IRDY şi TRDY setate ”0” – se transmite cuvântul de date
1.
Ciclul de ceas 4. Dispozitivul țintă inserează o stare de aşteptare (de ex.
dispozitivul este mai lent). Cele dou dispozitive controlează rata de transfer real
prin liniile IRDY şi TRDY, care permit inserarea unui număr oarecare de stări de
aşteptare după fiecare ciclu de transfer de date.
Ciclul de ceas 5. Dispozitivul țintă activează TRDY şi se transmite cuvântul de
date 2.
Ciclul de ceas 6. Dispozitivul inițiator inserează o stare de aşteptare. Transferul
de date se întrerupe, transferul cuvântului 3 de date este amânat până în ciclul
7.
Ciclul de ceas 7. Dispozitivul inițiator activează IRDY şi se transmite cuvântul
de date 3. Inițiatorul dezactivează semnalul FRAME pentru a indica faptul că
următorul ciclu va fi final.
Ciclul de ceas 8. Toate liniile sunt dezactivate, ce marchează sfârşitul tranzacției
pe magistrală.

O tranzacție de scriere (în care inițiatorul este sursa datelor) este similar cu cea din
Figura 7.3. În acest caz ciclul inactiv după faza de adrese nu este necesar, deoarece
inițiatorul menține în continuare controlul asupra liniilor AD pe durata tranzacției.

7.4.2 Magistrala serială PCI Express


PCI Express este o magistrală serială ale cărei specificații inițiale au fost
preluate de organizația PCI-SIG de la grupul de lucru Arapahoe (Arapahoe Working
Group), care a elaborat specificațiile preliminare ale interfeței 3GIO (Third
Generation I/O). Versiunea 1.0 a acestor specificații a fost terminată în aprilie
2002, după care specificațiile au fost transferate la organizația PCI-SIG, interfața
3GIO fiind redenumită PCI Express. Acest nume a fost ales pentru a sublinia
compatibilitatea software a noii magistrale cu magistrala PCI convențională.
Specificațiile 3GIO au fost revăzute de membrii PCI-SIG, fiind aprobate şi publicate
în luna iulie 2002 ca PCI Express versiunea 1.0. Scopul magistralei PCI Express este
de a pune la dispoziție o interconexiune serială scalabilă, având costuri reduse şi
utilitate generală, care să unifice mai multe soluții de interconectare din cadrul unei
platforme.
Topologia unui sistem bazat pe magistrala PCI Express conține un comutator
şi mai multe conexiuni punct la punct cu dispozitivele de I/E. În Figura 7.9 se
prezintă topologiile conexiunilor magistralelor PCI şi PCI Express. Dispozitivele de
I/E conectate la magistrala PCI împart lățimea de bandă (fig. 7.9 (a)). Iar la PCI
Express (fig. 7.9 (b)) conexiunile multiple punct la punct introduc un nou element,
comutatorul, în cadrul topologiei sistemului de I/E. Comutatorul înlocuieşte
magistrala partajată pentru conectarea dispozitivelor de I/E şi permite comunicația
directă dintre două dispozitive de I/E.
Arhitectura Calculatoarelor
111
a) b)
Figura 7.9 - Topologiile PCI şi PCI Express

Nivelul fizic are la bază o legătură punct la punct formată din două canale de
comunicație simplex, unul pentru transmisie şi unul pentru recepție. Legătura fizică
de bază (Figura 7.10) utilizează 4 conexiuni între două dispozitive, semnalele
transmise fiind diferențiale şi având tensiuni reduse (LVDS - Low Voltage
Differential Signaling).
Nivelul legăturii de date adaugă numere de secvență şi coduri CRC acestor
pachete pentru a asigura un transfer fiabil. Semnalul de ceas este codificat
împreună cu datele pentru a obține rate de transfer ridicate.

Figura 7.10 – Structura legăturii puct la punct


Rata de transfer inițială este de 2,5 Gbiți/s pentru fiecare direcție, fiind de aşteptat
ca aceasta să crească ulterior până la 16 Gbiți/s pe direcție.

Rata de transfer a unei legături poate fi mărită liniar prin adăugarea a noi canale.
Numărul de canale poate fi de 1, 2, 4, 8, 12, 16 sau 32. Viitoarele îmbunătățiri
pentru creşterea frecvenței de funcționare, modificarea tehnicii de codificare sau
schimbarea mediului fizic vor afecta numai nivelul fizic.

La transferuri pe mai multe canale se foloseşte principiul partajării datelor pe canale


(data stripping) (Figura 7.11) ce constă în transferul următorului byte pe
următorul canal.
Arhitectura Calculatoarelor
112

Figura 7.11 - Data stripping

La transferuri pe magistrala PCI Express se foloseşte algoritmul de codificare


8b/10b – fiecare byte de informație este transmis ca 8 biți + 2 biți de control = 10
biți.

Protocolul PCI Express


Formatul unui cadru este prezentat în figura Figura 7.12. El constă din:
1byte - Start-of-Frame, al 2 byte- Numărul pachetului, 16-20 bytes – identificatorul
pachetului, de la 0-4096 bytes - Data field, 0 - 4-bytes cîmpul ECRC(End-to-end
Cyclic Redundancy Check), 4- bytes LCRC(Local Cyclic Redundancy Check), 1- byte
End-of Frame.

Figura 7.12 - Formatul unui cadru

Urmând acest format, pentru a transfera 4096 bytes, cadrul este format din
4124 bytes.
Nivelul legăturii de date are ca rol principal asigurarea transmiterii fiabile a
pachetelor. Acest pachet creat de nivelul tranzacțiilor. Un protocol special asigură
ca un pachet să fie transmis numai atunci când este disponibil un buffer pentru
recepția acestui pachet la destinație. Aceasta elimină retransmisia pachetelor
datorită resurselor limitate. Un pachet va fi retransmis automat de nivelul legăturii
de date atunci când a apărut o eroare la transmisia acestuia.
Nivelul tranzacțiilor primeşte cereri de citire şi scriere de la nivelul software şi
creează pachetele care vor fi transmise de nivelul legăturii de date. Toate cererile
de transfer sunt implementate ca tranzacții divizate, unele pachete de cerere
necesitând un pachet de răspuns. Nivelul tranzacțiilor recepționează de asemenea
pachetele de răspuns de la nivelul legăturii de date. Fiecare pachet are un
identificator unic. Formatul pachetelor permite adresarea memoriei pe 32 de biți
sau pe 64 de biți.
Arhitectura Calculatoarelor
113
7.5 Magistrala ATA
7.5.1 Magistrala paralelă ATA (IDE)
Versiunea inițială (ATA-1) a standardului ATA (PATA) a fost aprobată oficial de
institutul ANSI în anul 1994, deşi prima versiune de lucru a acestui standard a fost
publicată în anul 1989.
Ultima versiune a standardului ATA/ATAPI 7 defineşte următoarele
caracteristici ale interfeței ATA:
 Conectori cu 40 sau 44 de pini;
 Un canal ATA, care poate fi partajat de două unități de discuri, configurate ca
o unitate master şi o unitate slave;
 Utilizarea tehnologiei S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting
Technology) pentru predicția degradării performanței unităților de discuri;
 Creşterea integrității datelor prin utilizarea unui cod ciclic redundant CRC;
 Definirea unui cablu opțional cu 80 de fire (dintre care 40 de fire sunt de
masă), care permite creşterea imunității la zgomote;
 Utilizarea cablului cu 80 de fire este obligatorie pentru funcționarea în
modurile UDMA/66, UDMA/100, UDMA/133.
Tehnologia S.M.A.R.T., dezvoltată inițial de firma IBM, permite sistemului de
operare să monitorizeze parametrii de funcționare ai unei unități de discuri în scopul
detectării unor degradări ale performanței acesteia. Această degradare se poate
accentua în mod progresiv, conducând în final la o defectare a unității şi la
pierderea datelor înregistrate. Prin utilizarea acestei tehnologii este posibilă
predicția defectării unității şi salvarea din timp a datelor. Tehnologia S.M.A.R.T. nu
permite însă predicția defectării subite a unei unități de discuri.
Observaţie
Rata maximă de transfer a interfeței ATA nu reprezintă principala limitare a
vitezei la transferul cu o unitate de discuri. Cel mai important factor este rata
susținută cu care unitatea poate transfera datele de pe suport la placa logică a
unității, prin intermediul ansamblului capetelor de citire. Chiar şi la unitățile de
discuri performante, această rată poate fi de sub 80 MB/s. Astfel, principalul criteriu
la alegerea unei unități de discuri trebuie să fie rata de transfer susținută de pe
suport şi nu rata de transfer maximă a interfeței.
Interfaţa electrică
Standardul ATA prevede opțiunea de funcționare a sistemului cu două unități
conectate în lanț. Prima unitate (unitatea 0) este numită master, iar unitatea a
doua (unitatea 1) este numită slave. O unitate poate fi desemnată fie ca master, fie
ca slave, prin aşezarea unui jumper sau comutarea unui microîntrerupător.
Cablul utilizat (Figura 7.13) pentru conectarea unităților IDE este un cablu cu
40 de fire, prevăzut cu trei conectori.

Figura 7.13 - Cablul cu conectori ATA

De obicei, cablul pleacă de la conectorul IDE către o unitate, şi apoi în continuare


spre a doua unitate (dispunere în lanț). La unul din capete cablul este legat fie la
conectorul pentru interfața IDE de pe placa de bază, fie la o placă adaptoare pentru
Arhitectura Calculatoarelor
114
interfața IDE, care este amplasată într-unul din conectorii plăcii de bază.
7.5.2 Tehnologia Serial ATA
În tehnologia serial ATA (SATA) pentru transferuri de date se folosesc două
fire prin care se transmit semnale diferențiale cu o amplitudă de 250 mV, rezultând
o imunitate crescută la zgomote.
Magistrala constă din 7 fire (figura 7.14), dintre care 4 sunt informaționale şi
3 pentru conectare la masă (Ground). O pereche de fire se foloseşte pentru
transferuri, iar alta pentru recepția datelor. Informația se codifică după metoda NRZ
(Non Return to Zero).

Figura 7.14 - Structura magistralei SATA

Figura 7.15 - Cablul SATA

Lungimea cablului poate fi de 1 m (figura 7.15). La SATA pot fi conectate nu numai


dispozitive de memorare interne dar şi dispozitive externe blocului de sistem.
Viteza de transfer este de 150 MB/s. Viteza declarată este de 1.5 Gb/s, dar
folosirea metodei de codificare 8b/10b, a micşorat viteza de transfer la 1.2Gb/s.
Dezvoltarea standardului prevede 3 generații SATA (tabelul 7.3). În SATA II rata
maximă de transfer este de 3 Gb/s, iar în SATA III - până la 6Gb/s.

7.6 Magistrala SCSI


7.6.1 Magistrala paralelă SCSI
Interfața SCSI (Small Computer System Interface) provine din interfața SASI
(Shugart Associates System Interface). SCSI nu este o interfață de disc, deci un
anumit tip de controller, ci o interfață la nivelul sistemelor, formată dintr-o
magistrală care acceptă mai multe echipamente. Unul din aceste echipamente,
adaptorul cu sistemul gazdă, funcționează ca o punte între magistrala SCSI şi
magistrala sistemului. Magistrala SCSI nu comunică direct cu echipamentele
Arhitectura Calculatoarelor
115
periferice, cum sunt unitățile de discuri, ci cu controllerul care este inclus în aceste
unități.
O singură magistrală SCSI poate accepta până la 8 sau 16 unităţi fizice,
numite unităţi SCSI, dintre care una este adaptorul SCSI. Unitățile fizice pot fi
unități de discuri fixe, unități de bandă, unități CD-ROM, scanere, imprimante.
Majoritatea sistemelor pot accepta până la patru adaptoare SCSI la sistemul gazdă,
fiecare din acestea permițând cuplarea a până la şapte echipamente periferice,
conectate în lanț.
SCSI este o interfață destinată în special stațiilor de lucru şi serverelor cu
performanțe ridicate. La prima versiune a interfeței SCSI, frecvența de ceas a
magistralei era de 5 MHz, iar rata maximă de transfer era de 5 MB/s. La versiunile
actuale ale acestei interfețe, frecvența de ceas a magistralei este de 80 MHz sau
160 MHz, iar ratele maxime de transfer sunt de 320 MB/s, respectiv 640 MB/s.
Pe lângă aceste versiuni paralele ale interfeței SCSI, a fost elaborată şi o
versiune serială a interfeței. Această interfață SCSI serială, numită Serial Attached
SCSI, a înlocuit treptat interfața SCSI paralelă. Atât tehnologia SCSI paralelă, cât şi
cea serială, sunt promovate de organizația SCSI Trade Association
([Link]).

7.6.2 Interfaţa Serial Attached SCSI (SAS)


Serial Attached SCSI (SAS) reprezintă versiunea serială a interfeței SCSI.
Aceasta utilizează un protocol serial punct la punct şi setul standard de comenzi
SCSI. Interfața serială SAS oferă compatibilitate cu unitățile de discuri SATA de
generația a doua, care se pot conecta la plăci de bază SAS. Totuşi, unitățile de
discuri SAS nu se pot conecta la plăci de bază SATA.

Conectarea a 4 SATA la adaptorul SAS

Standardele SAS au fost elaborate de comitetul tehnic T10 al INCITS


(International Committee for Information Technology Standards). Prima versiune a
standardului interfeței SAS a fost publicată în anul 2003, iar o versiune
îmbunătățită (SAS-1.1) a fost publicată în anul 2005. Ambele versiuni specifică a
interfață serială cu o viteză maximă de 3 Gbiți/s. Standardul SAS-2, care a fost
publicat de comitetul INCITS în anul 2009, defineşte generația a doua a interfeței
SAS. Această versiune a standardului introduce o legătură serială cu o viteză
maximă de 6 Gbiți/s, un nivel fizic care este compatibil cu interfața SATA, şi
protocoale pentru transferul comenzilor SCSI la echipamentele SAS şi a comenzilor
ATA la echipamentele SATA. Versiunea SAS-2.1 a standardului, care a fost aprobată
în anul 2010, defineşte un număr de îmbunătățiri ale standardului SAS-2, printre
care conectori suplimentari şi facilități de gestiune a energiei consumate. Versiunea
SAS-3 a standardului, a fost aprobată în anul 2013, defineşțe generația a treia a
interfeței SAS, cu o viteză maximă de 12 Gbiți/s.
Interfața SAS este o arhitectură punct la punct, cu fiecare echipament
conectat direct la un port SCSI în loc de a fi conectat la o magistrală partajată.
Arhitectura Calculatoarelor
116

Protocolul SAS specifică o comunicație duplex între controlerul SAS şi o


unitate de discuri. Astfel, operațiile de citire şi scriere pot fi executate în acelaşi
timp, ceea ce creşte performanța. Comparativ, unitățile SATA utilizează o
comunicație semiduplex, astfel încât datele sunt transmise la unitate pentru scriere,
datele care trebuie citite de la unitate trebuie să aştepte terminarea comunicației
precedente.
Se pot conecta un număr mare de unități de discuri SAS sau SATA la un port
al unui controler SAS prin utilizarea unor expandoare SAS. Un expandor permite ca
un singur inițiator să comunice cu un număr de echipamente destinație SAS/SATA.
Un expandor SAS este similar cu un comutator dintr-o rețea, care permite
conectarea mai multor sisteme utilizând un singur port al comutatorului. Costul
unui sistem care conține un expandor este mult mai redus comparativ cu costul
unui sistem care conține un controler SAS cu un număr mare de porturi sau mai
multe controlere cu un număr mai mic de porturi. Prin utilizarea expandoarelor,
sunt posibile până la 65,535 legături fizice (dispozitive).
Interfața SAS utilizează semnale diferențiale, codificarea 8b/10b a datelor şi
cifrarea datelor pentru reducerea interferențelor electromagnetice. Se pot combina
până la patru porturi cu aceeaşi adresă într-un port de lățime mai mare, care
permite transferuri de date cu până la 24 Gbiți/s.
Unitățile de discuri SAS sunt cu port dual, ceea ce înseamnă că acestea se pot
conecta direct şi pot fi controlate de două controlere SAS în acelaşi timp. Această
posibilitate permite construirea unui sistem redundant. Atunci când unul din
controlerele SAS se defectează, celălalt va fi totuşi în măsură să acceseze unitățile
de discuri SAS şi datele memorate pe aceste unități.
Principalele deosebiri dintre interfețele SAS şi SATA sunt următoarele:
 Unitățile de discuri SATA sunt identificate prin numărul portului conectat la
adaptorul calculatorului gazdă, în timp ce echipamentele SAS sunt identificate
prin adresa lor SAS sau World Wide Name. World Wide Name (WWN) este un
identificator de 64 biți care reprezintă adresa SAS şi identifică în mod unic
echipamentul în domeniul SAS. Din cei 64 de biți, 24 biți reprezintă identificatorul
firmei producătoare şi 40 de biți reprezintă identificatorul specific al producătorului.

 Spre deosebire de protocolul SATA, protocolul SAS permite existența mai


multor inițiatori într-un domeniu SAS.
 Interfața SATA permite conectarea numai a unităților de discuri magnetice şi a
unităților optice. Interfața SAS permite conectarea şi a altor tipuri de
echipamente, cum sunt scannere şi imprimante. Totuşi, aceste echipamente
au, de obicei, alte interfețe decât SAS, cum sunt USB, IEEE 1394 sau
Ethernet.
 Interfața SAS utilizează nivele mai ridicate de tensiune (0,8-1,6 V) decât
interfața SATA (0,4-0,6V).
 Din cauza tensiunilor mai ridicate ale semnalelor, la interfața SAS se pot utiliza
cabluri mai lungi (până la 8 m), comparativ cu interfața SATA, la care
lungimea maximă a cablului poate fi de 1 m.
Unitățile de discuri SAS au performanțe superioare comparativ cu unitățile de
Arhitectura Calculatoarelor
117
discuri SATA. Viteza de rotație a unităților SAS este cuprinsă între 10.000 şi 15.000
rotații pe minut (RPM), în timp ce viteza de rotație a unităților SATA este cuprinsă
între 5.400 şi 7.200 RPM. Viteza de rotație mai ridicată reduce timpul de acces.
Comunicația duplex permisă de unitățile SAS contribuie de asemenea la
performanța superioară a acestor unități comparativ cu unitățile SATA. Unitățile
SAS sunt cu port dual, iar aceasta le permite să comunice cu două adaptoare ale
calculatorului gazdă sau controlere simultan, ceea ce îmbunătățeşte disponibilitatea
datelor. De asemenea, unitățile SAS sunt mai fiabile decât unitățile SATA şi sunt
proiectate pentru o utilizare mult mai intensă. Pe de altă parte, unitățile SATA sunt
mult mai puțin costisitoare decât unitățile SAS. Un alt avantaj al unităților SATA
este că acestea au, de obicei, capacitatea semnificativ mai ridicată decât cea a
unităților SAS.

7.7 Magistrala USB


Unul din scopurile elaborării magistralei USB (Universal Serial Bus sau Magistrala
Serială Universală) a fost simplificarea interconexiunilor dintre calculator şi periferice,
prin reducerea numărului de cabluri care se conectează la calculator şi utilizarea
aceluiaşi tip de conector pentru diferite categorii de periferice. Într-un sistem
conținând o magistrală USB, diferitele periferice se pot conecta în serie sau într-o
topologie sub formă de stea pe mai multe nivele, un singur periferic fiind conectat la
un port USB al calculatorului gazdă. Un alt aspect care s-a avut în vedere la
elaborarea magistralei USB a fost asigurarea unei rate de transfer mai ridicate decât
ratele de transfer permise de porturile seriale şi paralele. De asemenea, s-a urmărit
ca perifericele să poată fi adăugate în mod simplu la calculator, fără deschiderea
carcasei acestuia, fără oprirea tensiunii de alimentare şi fără reîncărcarea sistemului
de operare.
Specificarea USB 1.0 publicată în ianuarie 1996 determină două viteze de transfer:
FS (Full Speed) - 12 Mb/s şi LS (Low Speed) – 1.5 Mb/s. In anul 2000 a apărut o
noua specificație pentru USB, versiunea USB 2.0, care a introdus viteza HS (High
Speed) - 480 Mbps. Aceasta creştere a vitezei de transfer a făcut posibilă acceptarea
magistralei USB ca interfață pentru writer-e CD/DVD, scanere, camere foto digitale,
echipament video, etc. In anul 2008 Intel anunță specificația USB 3.0, care a
introdus viteza SS (Super Speed) – 4.8 Gbps.
Într-un sistem pot fi prezente şi funcționa concomitent dispozitive cu toate trei viteze
enunțate mai sus. Magistrala permite conectarea a maxim 127 de dispozitive, la o
distanță maximă – 25m (Folosind hub-uri intermediari). Cablul de comunicație constă
din 4 fire: două sunt de date si două pentru alimentare (5V si 0V). Pentru a facilita
interconectarea intre echipamente, se folosesc conectori standard Master si Slave.
Lungimea cablului este de maxim 5m. Acesta are la un capăt conectori de tip A,
pentru conectarea la calculator (master) si la celălalt - conectori de tip B, Petru
conectare la periferic (slave).

Structura USB
USB asigură schimbul de date între host-calculatorul şi diferite echipamente periferice.
Distribuirea vitezei de transfer a magistralei între echipamentele periferice sunt
planificate de HOST şi se realizează de el cu ajutorul indicatoarelor (token). Magistrala
permite conectarea, configurarea, folosirea şi deconectarea dispozitivelor în timpul
lucrului hostului. Mai jos se aduc variantele de traducere a termenilor din specificațiile
«Universal Serial Bus Specification. Revision 1.0, January 15, 1996», publicate de
Compaq, DEC, IBM, Intel, Microsoft, NEC şi Northern Telecom. Mai multe detalii şi
informații puteți găsi pe adresa: [Link]
Arhitectura Calculatoarelor
118
Ca dispozitive (Device) USB pot fi hub-uri (distribuitoare), funcții sau dispozitive ce
îmbină şi hub-uri şi funcții (compound device, figura 7.17). Hub-urile asigură puncte
de conectare suplimentare a dispozitivelor la magistrală. Funcțiile USB sunt nişte
sisteme, de exemplu mouse ce susține USB. Dispozitive care combină câteva funcții,
(compound device, figura mai jos) de exemplu, keyboard cu trackball încorporat.
Elementele principale ale unui sistem care utilizează magistrala USB sunt
dispozitivele USB, cablurile USB şi programele de sistem. Dispozitivele de pe
magistrala USB sunt conectate fizic la calculatorul gazdă utilizând o topologie sub
formă de stea , după cum se ilustrează în Figura 7.17.

Figura 7.17 – Topologia fizică

În specificațiile versiunea 1.0 a standardului USB magistrala USB este menționată ca


host-centrică: Ca Master (dispozitivul ce controlează transferurile pe magistrală) pe
magistrala USB întotdeauna este host-calculatorul (cu USB controller incorporat), iar
toate dispozitivele periferice conectate la host sunt dispozitive conduse sau Slave.
Structura magistralei USB pe mai multe nivele se ilustrează în Figura 7.18.

Figura 7.18 – Topologia magistralei pe nivele


Arhitectura Calculatoarelor
119
Centrul magistralei USB este însăşi host-controlerul, care este conectat cu hub
de rădăcină (root hub), de regula, prin unul din două porturi ale sale.
Un hub (distribuitor) reprezintă o clasă specială de dispozitiv USB, care asigură
puncte de conectare suplimentare pentru alte dispozitive USB. Aceste puncte de
conectare se numesc porturi. Calculatorul gazdă conține un hub rădăcină, prin
care asigură unul sau mai multe puncte de conectare. În plus, acest hub conține
controlerul magistralei USB. Fiecare magistrală USB are un singur controler de
magistrală (figura 7.19).

Figura 7.19 – Hub USB tipic

Figura 7.19 prezintă un hub USB tipic. Unul din porturile hub (Upstream port)
permite conectarea la calculatorul gazdă sau la un hub de pe nivelul superior al
topologiei. Fiecare din celelalte şapte porturi (Downstream ports) permit conectarea
la un hub sau la o funcție de pe nivelul inferior. Hub-urile pot fi conectate în
cascadă până la cinci nivele. Hub-ul recunoaşte conectarea dinamică a unui periferic
şi asigură o putere de cel puțin 0,5 W pentru fiecare periferic în timpul inițializării.
Sub controlul programului de sistem, hub-ul poate asigura o putere suplimentară
pentru funcționarea perifericelor, până la 2,5 W (un curent de 0,5 A). Unele
periferice, cum este tastatura, mouse-ul sau creionul optic, pot fi alimentate numai
cu tensiunea furnizată de cablul magistralei, în timp ce altele pot avea o sursă
proprie de alimentare.
Un hub constă din două părți: un controler şi un repetor. Controlerul conține
registre de interfață pentru comunicația cu calculatorul gazdă. Comenzile de stare
şi de control permit calculatorului gazdă configurarea hub-ului, monitorizarea şi
controlul porturilor sale. Repetorul este un comutator controlat prin protocol între
portul de nivel superior şi porturile de nivel inferior. De asemenea, repetorul
monitorizează semnalele de pe porturi şi gestionează tranzacțiile care îi sunt
adresate. Toate celelalte tranzacții sunt repetate la dispozitivele ataşate. Fiecare
port de nivel inferior poate fi validat individual şi poate fi conectat la dispozitive cu
viteză ridicată sau cu viteză redusă. Porturile cu viteză redusă sunt izolate de
semnalele cu viteză ridicată.

O funcţie este un dispozitiv USB care poate transmite şi/sau recepționa date
sau informații de control pe magistrală. Acest dispozitiv trebuie să răspundă la
cererile de tranzacție transmise de calculatorul gazdă. O funcție este implementată
în mod obişnuit ca un periferic separat conectat printr-un cablu la un port al unui
hub. Un singur dispozitiv fizic poate conține însă funcții multiple. De exemplu, o
tastatură şi un trackball pot fi combinate într-un singur dispozitiv fizic. În cadrul
unui asemenea dispozitiv compus, funcțiile individuale sunt ataşate la un hub, iar
acest hub intern este conectat la magistrala USB.
Fiecare funcție conține informații de configurație care descriu posibilitățile sale
şi resursele necesare. Aceste informații sunt transmise calculatorului gazdă ca
răspuns la o tranzacție de control. Înaintea utilizării unei funcții, aceasta trebuie
Arhitectura Calculatoarelor
120
configurată de calculatorul gazdă. Această configurare presupune alocarea unei
lățimi de bandă în cadrul magistralei USB şi selectarea opțiunilor specifice de
configurație.
Specificațiile magistralei USB 2.0 (numită şi Hi-Speed USB) descriu o
magistrală cu performanțe îmbunătățite. Conectoarele şi cablurile conforme cu
specificațiile USB 1.1 permit obținerea ratelor de transfer mai ridicate ale
magistralei USB 2.0 fără nici o modificare. Rata de transfer maximă care se poate
obține este de 480 Mbiți/s. Perifericele USB 2.0 cu viteze de transfer superioare
sunt conectate la un distribuitor USB 2.0. Un distribuitor USB 2.0 acceptă tranzacții
de viteză ridicată şi furnizează datele cu ratele corespunzătoare perifericelor USB
2.0 şi perifericelor USB 1.1. Vitezele de transfer ridicate sunt negociate cu fiecare
periferic, iar dacă un periferic nu permite o viteză ridicată, legătura cu acest
periferic va funcționa la viteza mai redusă de 12 Mbiți/s sau 1,5 Mbiți/s. Aceasta
implică o complexitate mai ridicată a hub-lor şi necesitatea memorării temporare a
datelor recepționate. Un hub USB 2.0 va avea porturi de ieşire pentru transferuri cu
viteză ridicată şi porturi de ieşire pentru transferuri cu viteză redusă.
Controlerele magistralei USB, aflate pe placa de bază a calculatorului gazdă,
au propriile specificații. În cazul versiunii 1.1 a magistralei USB, existau două
specificații pentru aceste controlere.
Prima dintre ele, Universal Host Controller Interface (UHCI), a fost elaborată de
firma Intel şi permitea simplificarea circuitelor, partea mai complexă fiind cea de
software. A doua specificație, Open Host Controller Interface (OHCI), a fost
elaborată de firmele Compaq, Microsoft şi National Semiconductor, această
specificație permițând simplificarea programelor, partea mai complexă fiind cea de
hardware. Odată cu introducerea versiunii 2.0 a magistralei USB, a fost necesară
elaborarea unei noi specificații pentru controlerele de magistrală. Această
specificație, numită Enhanced Host Controller Interface (EHCI), a fost elaborată de
mai multe firme, printre care Intel, Compaq, NEC, Microsoft şi Lucent Technologies.
Există specificații separate pentru diferite categorii (clase) de periferice USB.
O clasă USB reprezintă un grup de periferice sau interfețe cu atribute sau servicii
similare. De exemplu, două periferice sau interfețe sunt plasate în aceeaşi clasă
dacă utilizează şiruri de date cu acelaşi format pentru comunicația cu calculatorul
gazdă. Dintre clasele de periferice USB se amintesc următoarele: memorii de masă,
monitoare, dispozitive de interacțiune cu utilizatorul (HID – Human Interface
Device), imprimante, dispozitive audio, dispozitive de comunicație (modemuri,
telefoane analogice şi digitale, adaptoare de rețea), dispozitive de captare a
imaginilor fixe (camere digitale).

Sistema USB pe trei nivele


Sistema USB se divizează pe trei nivele cu anumite reguli de interacțiune.
Dispozitivul USB conține interfața (USB Bus Interface), componentele logice (USB
Logical Device) şi funcția (function). Hostul tot este divizat în trei părți - interfața (USB
Host Controller), de sistem (USB System) şi soft-ul dispozitivului (Client SW). Fiecare
parte are o destinație predefinită, interacțiunile logice şi reale între nivele sunt
prezentate în fig 7.21.
Arhitectura Calculatoarelor
121

Figura 7.21 - Interacțiunea componentelor USB

În structura prezentată intră următoarele componente:


 Dispozitivul fizic USB- dispozitivul de pe magistrală, ce execută funcțiile, necesare
utilizatorului.
 Client SW - soft, ce asigură conectarea şi funcționarea a unui dispozitiv periferic
concret, se execută in host-calculator.
 USB system SW- softul sistemului USB.
 USB Host Controler – soft şi hard ce asigură conectarea dispozitivelor USB la Host.

Interfața fizică
La interfața USB se utilizează patru tipuri de conectori: două tipuri de fişe,
amplasate la capetele unui cablu USB, şi două tipuri de mufe, amplasate în cadrul
unui hub sau periferic.
Fişele şi mufele pot fi de tip A sau de tip B.

a) b)
c)

Figura 7.22 - Conector USB: a - tipul «А»(hub), b - tipul «В»(periferic), C - marcare convenţională

Hub-rile (de exemplu, cele din calculator) conțin o mufă rectangulară cu patru pini
de tip A. Perifericele se conectează la o asemenea mufă dintr-un hub utilizând o fişă
rectangulară de tip A (Figura 7.22). Toate cablurile care sunt ataşate permanent la
Arhitectura Calculatoarelor
122
periferice conțin o fişă de tip A. De obicei, perifericele se conectează însă printr-un
cablu detaşabil. Aceste periferice conțin o mufă pătrată de tip B, iar cablul care
conectează aceste periferice la un hub conține o fişă de tip B la capătul care se
conectează la periferic şi o fişă de tip A la capătul care se conectează la hub. În
acest fel, nu este posibilă conectarea incorectă a cablului. Specificațiile USB 2.0 au
fost modificate ulterior publicării acestora pentru a include o fişă şi o mufă de tip B
de dimensiuni mai reduse. Aceşti conectori, numiți mini-B, conțin cinci contacte şi
se utilizează pentru echipamentele mobile de dimensiuni reduse, cum sunt
telefoanele mobile. Echipamentele respective conțin o mufă de tip mini-B, iar
cablurile utilizate pentru conectarea acestor echipamente la un calculator PC conțin
o fişă de tip mini-B la un capăt şi o fişă de tip A la celălalt capăt. Figura 7.23
ilustrează o fişă de tip mini-B alăturată cu o fişă de tip A.

Figura 7.23 - Fişă USB de tip mini-B alăturată cu o fişă de tip A

Specificațiile USB “On-The-Go” (OTG), care au fost elaborate ca o extensie a


specificațiilor USB 2.0 pentru conectarea directă a unor echipamente mobile, fără
utilizarea unui calculator PC, conțin descrierea unor fişe mini-A, mufe mini-A şi
mufe mini-AB. Utilizarea acestor conectori este necesară deoarece la conectarea
directă a unor echipamente mobile unul din echipamente va avea rolul unui
calculator gazdă. Specificațiile USB OTG descriu şi diferite tipuri de cabluri care
utilizează conectori de dimensiuni reduse sau o combinație între un conector de
dimensiuni reduse şi unul de dimensiuni normale.
Pentru transferul semnalelor şi a tensiunii de alimentare pe magistrala USB,
se utilizează un cablu cu patru fire, ilustrat în Figura 7.30. Semnalele diferențiale de
date se transmit pe liniile D+ şi D–, formate din două fire torsadate (răsucite).
Semnalul de ceas este transmis codificat împreună cu datele. Codificarea utilizată
este numită NRZI (Non Return to Zero Invert). În cazul acestei metode (fig.7.29),

Figura 7.29 - Codificarea prin metoda NRZI

biții de 1 şi 0 sunt reprezentați prin tensiuni opuse şi alternante înalte şi joase, fără
a exista revenirea la tensiunea de referință (zero) între biții codificați. Sunt inserați
biți suplimentari pentru a asigura tranziții suficiente ale semnalelor transmise, în
Arhitectura Calculatoarelor
123
scopul asigurării sincronizării. Fiecare pachet de date este precedat de un câmp de
sincronizare pentru a permite receptorilor sincronizarea ceasurilor de recepție.

Figura 7.30 - Cablul USB

Cablul USB transmite şi tensiunea de alimentare pentru periferice pe liniile


VBUS şi GND. Tensiunea pe linia VBUS este de +5 V la sursă. Pentru a asigura
nivele de tensiune garantate la intrarea perifericelor şi o impedanță de terminare
corespunzătoare, se utilizează terminatori la fiecare capăt al cablului.
Pentru identificarea simplă a firelor din cablurile USB, standardul specifică
utilizarea culorilor
din Tabelul 7.5 pentru aceste fire. Acest tabel indică şi asignarea pinilor conectorilor
la semnalele magistralei USB.
Observație
• Nu este posibilă interconectarea a două calculatoare printr-un cablu USB obişnuit.
Chiar dacă s-ar utiliza un cablu cu doi conectori de tip A, prin interconectarea a
două calculatoare ar exista două controlere USB într-un sistem, ceea ce nu este
permis. Există însă cabluri speciale care conțin o punte USB sub forma unui circuit
integrat, prin intermediul căruia este posibilă comunicația între cele două
calculatoare gazdă.
Tabelul 7.5 - Asignarea pinilor conectorilor la semnalele magistralei USB şi
culorile firelor cablurilor.

La planificarea conectării trebuie de luat în considerație necesitățile de


alimentare a dispozitivelor. Dispozitivele ce se alimentează de la magistrală de
obicei se conectează la hub-uri, care sunt alimentate de la rețeaua electrică. La hub-
uri care se alimenteză de la magistrală, se conectează doar dispozitive care necesită
puțin curent – de exemplu tastatura USB, mouse-ul USB etc.

Modelul de transfer a datelor


Fiecare dispozitiv USB conține un set de puncte finale (Endpoint), cu care host-
controlerul realizează schimb de informație. Endpoint se caracterizează cu următorii
parametri:
 frecvența de acces la magistrală;
 lățimea de bandă a canalului;
 numărul Endpoint
 cerințe la prelucrarea erorilor
 mărimea maximală a pachetelor transferate
Arhitectura Calculatoarelor
124
 tipul transferului
 direcția transferului (pentru transferul izocronic)
Fiecare dispozitiv conține un Endpoint cu numărul 0, folosit pentru inițializare şi
control. Acest Endpoint este întotdeauna configurat la conectarea dispozitivului la
magistrală.
Dispozitivele – funcții mai conțin un set de Endpoint, ce realizează schimburi de
date utile. Dispozitivele lente LS pot conține până la două Endpoint, iar dispozitivele
FS până la 16 Endpoint de intrare şi 16 Endpoint de ieşire (restricție de protocol).
Endpoint nu pot fi folosite până ce nu au fost configurate (până la instalarea unui
canal coordonat).
Canal (Pipe) la USB se numeşte modelul de transfer a datelor între host-controler
şi Endpoint al dispozitivului. EL este un canal logic şi uneori intregul canal logic e
numit punct final (Figura 7.31). Există două tipuri de canale: fluxuri (Stream ) şi
mesaje (Message).

Figura 7.31

Prin canalul de tip flux sunt transmise date intr-o direcție. Un Endpoint poate fi
folosit pentru două canale de tip flux — pentru intrare sau ieşire. Canalul de tip flux
poate realiza următoarele tipuri de transferuri: continuu(date voluminoase), izocron şi
de întreruperi. Transferul se petrece prin metoda primul intrat – primul ieşit (FIFO).
Canalul de tip mesaje susține tipul de transfer de control. Formatul mesajelor este
determinat de specificarea USB. Hostul transmite cererea către Endpoint, după care
urmează pachetul cu mesaje, după care urmează pachetul cu informație despre
starea Endpoint. Următorul mesaj nu poate fi transmis până precedentul nu este
prelucrat. Schimbul cu mesaje în ambele direcții se efectuează cu unul şi acelaşi
Endpoint.
Canalele se organizează la configurarea dispozitivului USB. Pentru fiecare dispozitiv
conectat există un canal pentru mesaje de tip control (Control Pipe Off), prin care se
transmite informația despre configurare, stare şi control.

Tipurile de transfer de date


Arhitectura USB permite patru tipuri de transferuri de date: de control, de
întrerupere, de date voluminoase şi izocrone.
Transferurile de control se utilizează de driverele calculatorului gazdă pentru
configurarea dispozitivelor care sunt ataşate la sistem. Alte drivere pot utiliza
transferuri de control în moduri specifice implementării.
Transferurile de întrerupere se utilizează pentru date cu volum redus. Transferul
acestor date poate fi solicitat de un dispozitiv în orice moment, iar rata de transfer
pe magistrala USB nu poate fi mai redusă decât cea specificată de dispozitiv. Datele
pentru care se utilizează transferurile de întrerupere constau din notificarea unor
Arhitectura Calculatoarelor
125
evenimente, din caractere sau coordonate care sunt organizate pe unul sau mai
mulți octeți. Un exemplu îl reprezintă coordonatele de la un dispozitiv indicator (Ex.
mouse). Datele interactive pot avea anumite limite ale timpului de răspuns care
trebuie asigurate de magistrala USB.
Transferurile de date voluminoase (“bulk”) se utilizează cu periferice cum sunt
memorii de masă, imprimante sau scanere. Aceste date sunt secvențiale.
Fiabilitatea transferurilor este asigurată la nivel hardware prin utilizarea unui cod
detector de erori şi reluarea unui transfer cu erori de un număr de ori. Rata de
transfer în cazul acestor transferuri poate varia în funcție de alte activități de pe
magistrală.
Transferurile izocrone (isos – egal, chronos – timp) se utilizează pentru datele
care trebuie furnizate cu o anumită rată de transfer constantă şi a căror
sincronizare trebuie garantată. Izocron are semnificația “cu durată egală” sau “care
apare la intervale regulate”. Datele izocrone sunt generate în timp real şi trebuie
furnizate cu rata cu care sunt recepționate pentru a păstra sincronizarea lor. Pe
lângă rata de transfer impusă, pentru datele izocrone trebuie respectată şi
întârzierea maximă cu care acestea sunt furnizate. Furnizarea la timp a datelor
izocrone este asigurată cu prețul unor pierderi potențiale în şirul de date. Cu alte
cuvinte, erorile de transmisie nu sunt corectate prin mecanisme hardware, de
exemplu, prin retransmiterea lor. În concluzie, transferurile izocrone se
caracterizează prin furnizarea la timp a datelor şi prin lipsa retransmiterii lor în
cazul unor erori, deoarece datele întârziate nu mai sunt utile. Spre deosebire de
transferurile izocrone, transferurile asincrone se caracterizează prin faptul că
fiabilitatea transmiterii datelor este mai importantă decât asigurarea sincronizării.
Pentru aceasta se utilizează retransmiterea datelor în cazul unor erori, chiar dacă
apar întârzieri din această cauză.
Un exemplu tipic de date izocrone este reprezentat de imaginile video. Dacă rata
de transfer a acestor şiruri de date nu este respectată, va avea loc pierderea unor
date datorită depăşirii capacității bufferelor. Chiar dacă datele sunt furnizate de
magistrala USB cu rata adecvată, întârzierile introduse de programe pot afecta
negativ aplicațiile care utilizează aceste date, cum sunt cele pentru videoconferințe.
Şirurilor de date izocrone li se alocă o porțiune dedicată a lățimii de bandă a
magistralei USB. De asemenea, această magistrală este proiectată pentru o
întârziere minimă a transferurilor de date izocrone.
Protocolul
Similar cu alte interfețe mai recente, interfața USB utilizează un protocol
bazat pe pachete. Toate transferurile sunt inițiate de controlerul USB al
calculatorului gazdă. Tranzacțiile de pe magistrală implică transmisia a patru tipuri
de pachete:
• Pachet antet (simbol – “token”);
• Pachet de date;
• Pachet de confirmare (“handshake”);
• Pachet special.
Fiecare tranzacție, constă din 3 pachete şi începe în momentul în care controlerul
USB transmite, pe baza unei planificări, un pachet antet (Token) care descrie tipul
tranzacției, direcția acesteia, adresa dispozitivului USB şi numărul punctului
terminal. Sursa tranzacției transmite apoi un pachet de date (Data) conținând
datele care trebuie transferate, sau poate indica faptul că nu are date de transmis
prin faptul că pachetul de date nu conține informații utile. Destinația răspunde, în
general, cu un pachet de confirmare (Handshake) indicând dacă transferul s-a
efectuat cu succes sau dacă punctul terminal nu este disponibil. Succesiunea
pachetelor în tranzacții este prezentată în fig. 7.32
Arhitectura Calculatoarelor
126

Figura 7.32 - Succesiunea pachetelor

Formatul pachetelor USB


Toate pachetele încep cu un câmp de sincronizare (SYNC), care este utilizat de
circuitele receptorului pentru sincronizarea cu ceasul transmițătorului. Câmpul de
sincronizare conține un număr de şase tranziții succesive de la valoarea 1 la
valoarea 0 sau invers, urmate de un marcaj de doi biți care indică sfârşitul câmpului
de sincronizare.
Câmpul de identificare al pachetului (PID) urmează imediat după câmpul de
sincronizare. Câmpul PID conține patru biți care indică tipul pachetului şi patru biți de
control care confirmă acuratețea biților care conțin tipul pachetului. Biții de control
conțin complementul față de 1 al biților care reprezintă tipul pachetului.
Tabelul 7.6 indică diferitele tipuri de pachete, codificarea şi descrierea
acestora. Pentru simplitate, pachetele speciale nu sunt detaliate.
Câmpul de adresă (ADDR) specifică adresa funcției USB care este sursa sau
destinația unui pachet de date. Acest câmp are o lungime de 7 biți, permițând
specificarea a până la 128 de adrese. Fiecare adresă defineşte o singură funcție.
Adresa 0 este rezervată ca adresă implicită şi nu poate fi asignată în mod explicit
unei funcții. La pornirea şi resetarea unei funcții, adresa acesteia va avea valoarea
implicită 0. Calculatorul trebuie să seteze adresa funcției în timpul procesului de
enumerare.

Tabelul 7.6 - Codificarea şi descrierea diferitelor tipuri de pachete USB


Arhitectura Calculatoarelor
127

Transferuri pe magistrala USB


Fiecare transfer pe magistrală este inițiat de Host controler. Controlerul
formează cadre în care sunt plasate transferurile către fiecare dispozitiv conectat la
magistrala USB. Pentru sincronizarea întregului sistem USB, calculatorul gazdă
transmite câte un pachet SOF (Start-of-Frame) la fiecare interval de timp
corespunzător începutului unui cadru sau micro-cadru. Un cadru reprezintă un
interval de timp de 1 ms ± 0,0005 ms şi este definit pentru magistrala USB cu
viteza normală (12 Mbiți/s). Un micro-cadru reprezintă un interval de timp de 125
μs ± 0,0625 μs şi este definit pentru magistrala USB cu viteza ridicată (480
Mbiți/s). Un pachet SOF constă dintr-un câmp de sincronizare, un câmp PID şi un
câmp de 11 biți reprezentând numărul cadrului, după cum se ilustrează . După
pachetul SOF urmează transferul către primul dispozitiv conectat la magistrala
USB(pachetele IN/OUT, DATA, HANDSHAKE, ca pe fig. 7.33), apoi se petrece
schimbul de date cu dispozitivul doi(pachetele IN/OUT, DATA, HANDSHAKE), până
nu este apelat ultimul dispozitiv conectat la magistrală. Dispozitivele lente pot fi
apelate şi peste câteva cadre. În următorul cadru interogarea dispozitivelor se
repetă.
În cazul magistralei USB cu viteza ridicată, numărul cadrului va fi acelaşi pentru
opt pachete SOF consecutive, pe durata unei perioade de 1 ms. Succesiunea
cadrelor este ilustrată în figura 3.14.

Figura 7.33 - Succesiunea de cadre USB

Toate funcțiile şi hub USB recepționează pachetele SOF. Recepția acestor pachete
nu va determina generarea unui pachet de confirmare din partea receptorului.
Arhitectura Calculatoarelor
128

Detalierea pachetelor USB


În continuare se prezintă formatul pachetelor de antet, SOF, de date şi de confirmare.
Pachete de antet
Aceste pachete sunt transmise doar de calculatorul gazdă. Structura unui pachet de antet
este
următor:

Câmpul de identificare al pachetului, PID, poate specifica un pachet de antet cu subtipul IN, OUT sau
SETUP. Pachetele cu subtipul IN sau OUT informează dispozitivul USB asupra direcției transferului
care urmează: intrare (citire de către calculatorul gazdă), respectiv ieşire (scriere de către
calculatorul gazdă). Un pachet cu subtipul SETUP se utilizează la începutul transferurilor de control.
În cazul pachetelor cu subtipul OUT sau SETUP, câmpurile ADDR şi ENDP identifică în mod unic
punctul terminal care va recepționa următorul pachet de date. În cazul unui pachet cu subtipul IN,
câmpurile ADDR şi ENDP identifică punctul terminal care va transmite un pachet de date. Câmpul
CRC5 conține codul CRC pentru câmpurile ADDR şi ENDP.
Pachet SOF
Un pachet SOF constă dintr-un câmp de sincronizare, un câmp PID şi un câmp de 11 biți
reprezentând numărul cadrului, după cum se ilustrează . După pachetul SOF urmează transferul
către primul dispozitiv conectat la magistrala USB(pachetele IN/OUT, DATA, HANDSHAKE), apoi se
petrece schimbul de date cu dispozitivul doi(pachetele IN/OUT, DATA, HANDSHAKE), până nu este
apelat ultimul dispozitiv conectat la magistrală.

Pachete de date
Informațiile propriu-zise sunt transmise pe magistrala USB în pachetele de date. Un pachet
de date constă din câmpul de sincronizare SYNC, un câmp de identificare al pachetului PID, un câmp
de date, un câmp CRC de 16 biți şi câmpul de sfârşit al pachetului EOP. Codul CRC se calculează
numai pentru câmpul de date. Datele sunt transmise într-un număr întreg de octeți. Pentru
dispozitivele cu viteză redusă, lungimea maximă a câmpului de date este de 8 octeți. Pentru
dispozitivele cu viteză normală (12 Mbiți/s) şi viteză ridicată (480 Mbiți/s), lungimea maximă este de
1024 octeți.

Pachete de confirmare
Pachetele de confirmare constau doar din câmpul de sincronizare SYNC, un câmp de
identificare al pachetului PID şi câmpul de sfârşit al pachetului EOP. Aceste pachete se utilizează
pentru a raporta starea unei tranzacții de date prin subtipul returnat în câmpul PID. Subtipul unui
pachet de confirmare poate fi ACK (Acknowledge), NAK (Negative Acknowledge), STALL (Stall) sau
NYET (No Response Yet). Aceste subtipuri sunt descrise în Tabelul 3.2.

Principalele câmpuri ale pachetelor USB sunt descrise în continuare.


Câmpul de sincronizare
Toate pachetele încep cu un câmp de sincronizare (SYNC), care este utilizat de circuitele
receptorului pentru sincronizarea cu ceasul transmițătorului. Câmpul de sincronizare conține un
Arhitectura Calculatoarelor
129
număr de şase tranziții succesive de la valoarea 1 la valoarea 0 sau invers, urmate de un marcaj de
doi biți care indică sfârşitul câmpului de sincronizare.
Câmpul de identificare al pachetului
Câmpul de identificare al pachetului (PID) urmează imediat după câmpul de sincronizare.
Câmpul PID conține patru biți care indică tipul pachetului şi patru biți de control care confirmă
acuratețea biților care conțin tipul pachetului. Biții de control conțin complementul față de 1 al biților
care reprezintă tipul pachetului. Formatul câmpului PID este ilustrat în continuare, unde nPIDi
reprezintă complementul față de 1 al bitului PIDi.

Calculatorul gazdă şi toate funcțiile USB decodifică complet toți biții câmpului PID. Dacă un
câmp PID este recepționat cu valori incorecte ale biților de control sau cu valori nedefinite ale tipului
pachetului, se presupune că a fost recepționat eronat şi restul pachetului este ignorat de receptor.
Câmpul de adresă
Câmpul de adresă (ADDR) specifică adresa funcției USB care este sursa sau destinația unui
pachet de date. Acest câmp are o lungime de 7 biți, permițând specificarea a până la 128 de adrese.
Fiecare adresă defineşte o singură funcție. Adresa 0 este rezervată ca adresă implicită şi nu poate fi
asignată în mod explicit unei funcții. La pornirea şi resetarea unei funcții, adresa acesteia va avea
valoarea implicită 0. Calculatorul trebuie să seteze adresa funcției în timpul procesului de
enumerare.
Câmpul punctului terminal
Câmpul punctului terminal (ENDP) permite o adresare mai flexibilă a funcțiilor cu mai multe
puncte terminale. Acest câmp are o lungime de 4 biți, ceea ce permite adresarea a până la 16
puncte terminale. Dispozitivele cu viteză redusă pot avea însă doar două puncte terminale
suplimentare pe lângă punctul terminal cu numărul 0.
Câmpul de date
Câmpul de date poate conține între zero şi 1024 de octeți, în funcție de tipul transferului. Biții
de date din cadrul fiecărui octet sunt transmişi pe magistrală începând cu bitul cel mai puțin
semnificativ.
Câmpurile de control ciclic redundant
Aceste câmpuri conțin codurile de control ciclic redundant (CRC) utilizate pentru verificarea
integrității diferitelor câmpuri din pachetele de antet şi de date. Câmpul PID nu este inclus în calculul
codului CRC. Codurile CRC pentru pachetele de antet şi de date asigură detectarea tuturor erorilor
de un bit şi de doi biți. În cazul în care codul CRC calculat la recepție diferă de codul transmis într-un
câmp CRC, receptorul va ignora câmpurile protejate şi, în majoritatea cazurilor, întregul pachet.
Standardul USB specifică polinoamele generatoare utilizate pentru calculul codurilor CRC. Pentru
pachetele de antet se utilizează un câmp CRC de 5 biți (CRC5), iar pentru pachetele de date se
utilizează un câmp CRC de 16 biți (CRC16).
Câmpul de sfârşit al pachetului
Acest câmp (EOP) indică sfârşitul unui pachet prin valoarea 0 pe durata corespunzătoare a
doi biți, urmată de valoarea 1 pe durata corespunzătoare unui bit.
Standardul USB 3.0 este compatibil cu USB 2.0. Performanțele:
 Viteza maximă de transfer pe USB 3.0 este de 4.8 Gbps (interfața USB 2.0
Hi-Speed: 480 Mbps);
 Transferul informațiilor se face pe canale separate de comunicare (transfer
bidirecțional – o pereche de canale LVDS) – astfel este posibilă citirea şi
scrierea simultană a datelor pe dispozitivele selectate; USB 2.0 suportă doar
trafic unidirecțional.
 curentul maximal furnizat - 900 mA, față de cei 500 mA oferiți de USB 2.0.
În figura 7.34 este prezentat conectorul USB3.0
Arhitectura Calculatoarelor
130

Figura 7.34

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