Sunteți pe pagina 1din 117

Arhitectura Calculatoarelor 1

Arhitectura Calculatoarelor
Suport de curs
(limba română)
Arhitectura Calculatoarelor 2

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
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.
Arhitectura Calculatoarelor 3
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,
instrucţiunile maşinii convenţionale sunt executate direct de circuitele electronice ale nivelului 1.
Arhitectura Calculatoarelor 4
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 decompilate (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 5
2 Regiştrii microprocesoarelor
2.1 Noțiuni generale
În Assembler, calculatorul este văzut la nivelul hardware: adrese fizice de memorie, regiştri,
î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 Regiştrii microprocesoarelor х86-64

Fiecare program la execuţie obţine anumite resurse ale microprocesorului. Aceste resurse (regiştri)
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
regiştrilor 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 regiştri disponibile programatorilor (figura 2.1).

Figura 2.1 Regiştrii microprocesoarelor х86-64


Arhitectura Calculatoarelor 6
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 regiştri se petrece ca la
un registru pe 64-, 32-, 16- sau 8 biţi (se folosesc numai biţii inferiori). Structura şi destinaţia regiştrilor
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 regiştrilor microprocesoarelor pe 64 (32) biţi, setul de regiştri este următorul:

Figura 2.3

Toţi regiştrii sunt de 16 biţi. O serie de regiştri (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 regiştrilor sunt:
 AX - registru acumulator
 BX - registru de bază general
 CX - registru contor
 DX - registru de date
Arhitectura Calculatoarelor 7
 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.
Regiştrii 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 regiştri segment.
Denumirile regiştrilor 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 regiştrilor de segment corespund zonelor principale ale unui program
executabil. Astfel, perechea de regiştri (CS:IP) va indica totdeauna adresa următoarei instrucţiuni care se
va executa, iar perechea (SS:SP) indică totdeauna adresa vârfului stivei. Regiştrii 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 regiştrii segment.
Regiştrii pointer (SP si BP) se folosesc pentru calculul offsetului (distanţei faţă de începutul unui
segment) din cadrul segmentului. Cei doi regiştri pointer sunt: pointerul de stiva SP (Stack Pointer) si
pointerul de baza (Base Pointer). SP si BP sunt 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 regiştri 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

Push ax

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
Arhitectura Calculatoarelor 8
bazată indexată a datelor.
Regiştrii de index, de 16 biti sunt: SI (Source Index) si DI (Destination Index). Regiştrii de index
sunt folosite pentru accesul la elementele unui tablou sau a unei tabele. Aceşti regiştri sunt folosite
îndeosebi in prelucrarea șirurilor de caractere.
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
Regiştrii 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ă
Arhitectura Calculatoarelor 9
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 cei 4 regiştri 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.
Î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
Arhitectura Calculatoarelor 10
.STACK 512
.DATA

definirea datelor

.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. Regiştrii 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
regiştrilor microprocesoarelor pe 64 de biţi şi setul de regiştri 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 că regiştrii de
16 biți se regăsesc ca subregiştri ai regiştrilor de 32 de biți. Pentru accesarea regiştrilor de 32 biţi a fost
adăugat un set de instrucţiuni.
Regiştrii din figură, de exemplu al, ah, ax , indică regiştri pe 8 şi 16 biţi ale registrului extins eax
pe 32 biți (prefix „e” (Extended)).
Arhitectura Calculatoarelor 11

Figura 2.7 - Setul de regiştri de uz general

Regiştrii generale ax, bx, cx, dx, si, di, bp şi sp de 16 biți fac parte din regiştrii 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 aceşti
regiştri sunt regiştrii generali ai microprocesoarelor de 16 biti.
Analog regiştrii IP si FLAGS de 16 biți sunt extinse la 32 biți in cazul regiştrilor EIP şi ELAGS
de 32 biți. Registrul FLAGS se regăsește în primii 16 biți ai registrului EFLAGS.
rsegment au fost păstrate de 16 biți, dar s-au adăugat doi noi regiştri FS şi GS.
Pe lângă aceşti regiştri, microprocesoarele de 32 (64) de biți dispun de alţi regiştri 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 regiştrilor 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 12
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 72-79) la adresa cea mai mare.
Arhitectura Calculatoarelor 13

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
Arhitectura Calculatoarelor 14
word3 WORD ? ; neiniţializat
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 regiştri 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 regiştri 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 15

e) Ten Bytes
Valorile Ten – byte (tbyte) ocupă 10 octeți consecutivi de memorie, sau unul din regiştrii
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 regiştrii
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.
Arhitectura Calculatoarelor 16
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
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);
 Regiştrii 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:
Arhitectura Calculatoarelor 17

.data
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
Arhitectura Calculatoarelor 18

.data
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

b) Instrucţiunea XCHG ( Exchange Data )


Interschimbă sursa cu destinaţia. Forma generală:
XCHG dest, sursa
Restricţii:
 Regiştrii 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

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
Arhitectura Calculatoarelor 19
.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
mov eax,[arrayD+4] ; EAX = 20000h
mov eax,[arrayD+4] ; EAX = 20000h

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.
Arhitectura Calculatoarelor 20
Exemple:
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]

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ă:
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
Arhitectura Calculatoarelor 21
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 regiştrilor 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 regiştrilor 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
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
Arhitectura Calculatoarelor 22
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 32 biţi (FFFFFFFFh + FFFFFFFFh), producănd un rezultat pe


64-biţi, suma va fi in EDX:EAX, care este 00000001FFFFFFFEh:

mov edx,0
mov eax,0FFFFFFFFh
add eax,0FFFFFFFFh
adc edx,0

c) Instrucţiunea SUB (Substrat)


Forma generală:
SUB dest, sursa ; [dest]  [dest] – [sursa]
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
Arhitectura Calculatoarelor 23
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
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
Arhitectura Calculatoarelor 24
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.

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
..........
Arhitectura Calculatoarelor 25
j) Instrucţiunea CWD (Convert Word to Double Word)
Are ca efect extinderea bitului de semn din AX [AX 15] la întreg registrul DX, obţinându-se astfel DX: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 (dw) și unul reprezentat pe cuvânt
(sw)
dw dword 12345678h
sw 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 [EAX 31] la întreg registrul EDX, obţinându-se astfel o
valoare de 64 de biţi in perechea de regiştri EDX:EAX, adică:
daca semnul [EAX31] = 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
MUL reg/mem32
MUL reg/mem64

unde reg poate fi un registru sau o locaţie de memorie mem de 8, 16, 32, 64 biţi. Rezultatul se obţine pe
un număr dublu de biţi (16, 32, 64, 128). 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 regiştri:

Dacă sursa este pe cuvânt avem:


[DX:AX]  [AX] * [reg/mem16]
Arhitectura Calculatoarelor 26

.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 regiştri:

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 regiştri:

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)

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
Arhitectura Calculatoarelor 27
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)


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ă
Arhitectura Calculatoarelor 28
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
; 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
Arhitectura Calculatoarelor 29
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

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
Arhitectura Calculatoarelor 30
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 Irvine32.inc
.data
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 registrii ax si bx
mov ax,bx ; Folosind registrul cx
mov ax,cx ;
xchg ax,bx ; Interschimba direct cei 2 regiştri.
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
Arhitectura Calculatoarelor 31
; 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 Irvine32.inc
.data
a dw 5
b db 6
cd db 10
d dw 5
f dw 6
g db 10
h db 11
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
Arhitectura Calculatoarelor 32
mov rez, al

exit
main ENDP
END main

Fişierul Irvine32.inc 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: user32.dll, kernel32.dll şi gdi32.dll).
Fereastra consolei (sau fereastra – linie de comandă, cmd.exe) 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
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
Arhitectura Calculatoarelor 33
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+4 ;14
intgr = intgr-3 ;11
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ă
Randomize Setează (iniţializează) generatorul de numere aleatoare
Random32 Procedura generează și returnează un număr întreg aleator pe 32 de biți în
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
Arhitectura Calculatoarelor 34
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
WriteWindowsMs Afișează un șir care conține cele mai recente erori generate de MS-Windows
g

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

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

Randomize. Această procedură stabilește valoarea inițială a unui generator de numere aleatorii pentru
formulele care sunt utilizate în procedurile Random32 și RandomRange. Când apelați procedura
Randomize ca valoare inițială a generatorului se folosește timpul curent, rotunjit la 1/100 sec. Acest lucru
asigură că la fiecare pornire, valoarea inițială a generatorului va fi diferită și, prin urmare, secvența de
numere aleatoare generate vor fi, de asemenea, diferite.
Este suficient ca procedura să fie rulată o singură dată, la începutul programului.
Ex. Să generăm un şir din 10 numere.

Call Randomize
mov есх,10
l1: Call Random32
Arhitectura Calculatoarelor 35
;Aici in registrul ЕАХ se afla un numar aleator
; El poate fi salvat intr-o variabila (masiv),
;sau afisat pe ecran
lоор l1

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
mov hexVal,eax

ReadInt. Procedura ReadInt citește un întreg de 32-biţi, cu semn, de la tastatură și încarcă valoarea în
Arhitectura Calculatoarelor 36
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 irvine32.inc. 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:
call WaitMsg
Arhitectura Calculatoarelor 37

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 38
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 39
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
jng L5 ; jump not taken (+32 <= -35 is false)
Arhitectura Calculatoarelor 40
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)


Forma generala:
LOOPZ eticheta
sau
Arhitectura Calculatoarelor 41
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 42
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)
sar al,1 ; AL = 11111000b (-8), CF = 0

mov dl,-128 ; DL = 10000000b


sar dl,3 ; DL = 11110000b
Arhitectura Calculatoarelor 43
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).
clc ; CF = 0
mov bl,88h ; CF,BL = 0 10001000b
rcl bl,1 ; CF,BL = 1 00010000b
rcl bl,1 ; CF,BL = 0 00100001b
Arhitectura Calculatoarelor 44
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ă:

Exemple:
.data
wval WORD 9BA6h
.code
Arhitectura Calculatoarelor 45
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

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:
Arhitectura Calculatoarelor 46

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)


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
Arhitectura Calculatoarelor 47
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,esi
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 regiştri 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
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.
Arhitectura Calculatoarelor 48
 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
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ă.
Arhitectura Calculatoarelor 49
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
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 Irvine32.inc
.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]
Arhitectura Calculatoarelor 50
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: regiştri, 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
[[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
Arhitectura Calculatoarelor 51
...
; 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:
1.Definirea 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.

2.Apelul 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.


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:
Arhitectura Calculatoarelor 52
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

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.
Arhitectura Calculatoarelor 53

MEMORY

Magistrala date

Magistrala adrese
CPU

Mgistrala control

I/O

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
Arhitectura Calculatoarelor 54
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
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.
Arhitectura Calculatoarelor 55

a) b)
Figura 3.2 - Circuitul RFID -a, b – fără antenă

Informații detaliate le puteți găsi pe site-ul www.rfid.org.

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,
Arhitectura Calculatoarelor 56
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,
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.
Arhitectura Calculatoarelor 57

Î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):


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
Arhitectura Calculatoarelor 58
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.

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 C.mmp (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: C.mmp, Burroughs D825, Cray-2, S1, Cray X-MP, SGI/Cray Power
Arhitectura Calculatoarelor 59
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.

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
Arhitectura Calculatoarelor 60
III/Sixth
Pentium4/ 2000 64/36 64K+64K 100 1300-3800
Seventh
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 cei patru
regiştri 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 regiştrilor 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 regiştri de 32 de biţi, utilizate atât pentru
păstrarea datelor, cât şi pentru adresare. Pentru compatibilitate cu procesoarele anterioare, aceşti regiştri
s-au obţinut prin extinderea regiştrilor de 16 biţi, fiind posibilă utilizarea în continuare a vechilor regiştri,
acestea constituind jumătatea de ordin inferior ai regiştrilor 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. Regiştrii 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
Arhitectura Calculatoarelor 61
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
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 regiştri în interiorul UCP.
Arhitectura Calculatoarelor 62
 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
(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 regiştrii interni ale UCP. Unele din proiectele de arhitecturi RISC
folosesc un set mare de ferestre de regiştri 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 regiştri î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 regiştrii
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
Arhitectura Calculatoarelor 63
 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;
 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 Regiştrii) ș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


Arhitectura Calculatoarelor 64
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
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 mobilă
U V
magistrala
FPU

Regiştri

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 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.
Arhitectura Calculatoarelor 66
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).
Regiştrii generali 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

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
Arhitectura Calculatoarelor 67
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 regiştrilor, ş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 regiştri temporari. 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 regiştrii microarhitecturii (cele
opt regiştri ai procesorului şi opt regiştri ai 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.
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 regiştri ș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 68

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).
Arhitectura Calculatoarelor 69

În microarhitectura Intel Core a fost introdus un set de tehnologii care au primit numele Intel Wide
Dynamic Execution. Cele mai importante sunt:
 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
Arhitectura Calculatoarelor 70
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 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 71

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 72

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 regiştri, în paranteze, se indică începând de la care model a apărut grupul dat de
regiştri în modelul program al microprocesoarelor Intel. Dacă nu este indicat, grupul dat de regiştri 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 regiştri generali;
 Setul de regiştri de segment;
 Setul de regiştri de stare şi control;
 Setul de regiştri ai unităţii de calcul în virgulă mobilă (coprocesorului);
 Setul de regiştri destinate extensiilor MMX, reflectaţi pe registrii coprocesorului (Pentium MMX);
 Setul de regiştri 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 regiştri
Modelul program include câteva grupe de regiştri folosite de programe:
 Regiştrii 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. Aceşti regiştri conţin, de regulă, operanzi şi/sau rezultate aferente instrucţiunilor de transfer
şi prelucrare a datelor;
 Regiştrii segment cs, ds, ss, es, fs, gs. Aceşti regiştri sunt folosite pentru crearea diviziunilor logice
în memorie numite segmente;
 Regiştrii 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ă;
 Regiştrii extensiilor MMX (date împachetate, întregi) mmx0, mmx1, mmx2, mmxЗ, mmx4, mmx5,
mmx6, mmx7;
 Regiştri extensiilor XMM (date împachetate, în virgulă mobilă) хmm0, хmm1, хmm2, хmmЗ,
хmm4, хmm5, хmm6, хmm7;
 Regiştri 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;
 Regiştrii de sistem – dedicate controlului modurilor de funcţionare microprocesorului.
Conponenţa setului regiştrilor 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ă regiştri pe 8 şi 16 biţi ale registrului extins eax
pe 32 biţi (prefix „e” (Extended)).
Grupele de regiştri de uz general, segment, registrul indicator de instrucţiuni, registrul de fanioane ale
Pentium IV au destinaţii identice cu regiştrii respectivi ale i8086, diferând numai prin lungimea lor.
Grupul de regiştri segment a fost extins cu doi regiştri de date „gs” şi „fs”.
În registrul de fanioane au fost introduşi indicatori noi (tabelul 5.1).
Arhitectura Calculatoarelor 73

Figura 5.1 Modelul program IA-32

Tabelul 5.1
RF Fanionul 16 Se foloseşte la prelucrarea întreruperilor provenite de
reluare la registrul de reglare
(Resume Flag)
VM Fanionul 17 Indicatorul funcţionării microprocesorului în mod
modului virtual 8086:
virtual 8086 1 —microprocesorul funcţionează în modul virtual
AC (Virtual 8086 18
Fanionul 8086
Destinat controlului alinierii la adresarea memoriei
alinierii
(Alignment
VIF Fanionul 19 În modul virtual este analogic fanionului if. Fanionul
Întreruperii vif se foloseşte împreună cu fanionul vip. A fost
Virtuale introdus în Pentium.
(Virtual
Interrupt Flag)
VIP Fanionul 20 Se setează în 1 pentru indicarea întreruperii amânate.
Întreruperii Se foloseşte în modul V împreună cu fanionul vif.
Virtuale Introdus la Pentium.
amânate
(Virtual
Arhitectura Calculatoarelor 74
ID Fanionul 21 Indică susţinerea instrucţiunii cpuid.
identificării
(IDentification
flag)

Modelul program ale microprocesoarelor х86-64


Extensiile х86-64 şi ЕМ64Т sunt destinate pentru majorarea spaţiului de memorie adresabilă: regiştrii
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 regiştri arhitecturali
(MMX, XMM, noi regiştri 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 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
regiştrilor 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
Arhitectura Calculatoarelor 75
î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).
Regiştri 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 regiştrii săi interni.
Componenţa regiştrilor la care au acces aplicaţiile este prezentată în figura 5.2.
Notaţiile regiştrilor pe 64 biţi încep cu litera R.
Microprocesoarele includ un set de regiştri de sistem ce nu sunt folosite de aplicaţii (în figură nu sunt
prezentaţi). La ei se referă regiştrii de adrese de sistem, regiştrii de control, regiştrii pentru reglări şi
testări. Un şir din aceşti regiştri sunt specifici (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.

Figura 5.2 Regiştrii microprocesoarelor х86-64

Regiştrii de uz general
Structura şi destinaţia regiştrilor pe 32 biţi este analogică IA-32. Au fost adăugate 8 regiştri de uz
general (R8...R15), adresarea a fost unificată: adresarea la fiecare din 16 regiştri 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.

Regiştrii FPU
Regiştrile 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
Arhitectura Calculatoarelor 76
împachetate în regiştri pe 64 biţi: 8 Byte, 4 cuvinte, 2 cuvinte duble, cuvânt pe 64 biţi. Aceste date sunt
prelucrate în regiştrile MMX0-MMX7, care reprezintă 64 biţi inferiori ai regiştrilor 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
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
regiştrilor blocului XMM (8 regiştri pe 128 biţi la microprocesoarele pe 32 biţi, 16 - la microprocesoarele
x86-64).
Regiştrii 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 regiştrii MMX pe 64 biţi. Ei operează cu
date întregi şi în virgulă mobilă, sunt destinate media aplicaţiilor ce prelucrează blocuri de date. Au apărut
cu implementarea regiştrilor MMX, setul a fost extins cu instrucţiuni AMD Extension toMMX
Arhitectura Calculatoarelor 77

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 regiştrii 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 regiştri
de uz general. Un şir de instrucţiuni pot fi executate şi în blocul MMX (şi FPU) şi în blocul XMM.
Arhitectura Calculatoarelor 78
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 2 n-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 pagefile.sys). 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 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
Arhitectura Calculatoarelor 79
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 regiştri cache care prelungesc,
transparent pentru utilizator, informaţia din regiştrile 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 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
Arhitectura Calculatoarelor 80
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 232 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 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 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.
Arhitectura Calculatoarelor 81
 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 2 13 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


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 regiştrii de segment procesorul utilizează numai
regiştrii 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.
Regiştrii 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 82

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 P DPL S E C R A
4
3
2
1
70

Figura 6.4
Arhitectura Calculatoarelor 83

 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.
 Câmpul LIMITA indică o dimensiune maximă de 2 20 = 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:
Arhitectura Calculatoarelor 84
 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 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ă regiştriile 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.
Arhitectura Calculatoarelor 85

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 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 asigurat de instrucţiuni privilegiate, astfel încât un
utilizator obişnuit să nu poată avea acces la redefinirea acestei tabele (reamintim că GDT este folosită de
toate procesele, inclusiv de sistemul de operare).
Arhitectura Calculatoarelor 86

15 0 31 0
SELECTO AE

7 0
INDEX
TI=0

7 Tabela 0 Segment
AF
+
descriptori
LIMITA
selectat

Descriptor
de
segment
BAZA

Baza tabelei de
descriptori

31 0 31 0
BAZA_GDT LIMITA_GDT
:
GDTR

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 Regiştri "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 regiştrii
segment şi decât schimbarea procesului activ (deci schimbarea selectorului din LDTR) s-a recurs la
folosirea unor regiştri ascunşi ("cache").
Figura 6.7 prezintă regiştrii cache ale microprocesorului.
Arhitectura Calculatoarelor 87
Se observă că regiştrii 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 aceşti regiştri 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 predefinite a segmentului, dacă segmentul e prezent, ce tip
de segment este vizat etc).
SELECTOR Registre cache
15 0
CS

SS

DS

ES

FS
GS

ATRIBUTE BAZA seg.selectat LIMITA

LDTR

ATRIBUTE BAZA LDTR LIMITA


LDTR
Figura 6.7

Regiştrii 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 regiştrii care iau parte la mecanismul gestionării memoriei,
deşi principiul regiştrilor 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.
Arhitectura Calculatoarelor 88
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 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 regiştrii de control ai 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.

Figura 6.8
Arhitectura Calculatoarelor 89
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),
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 90

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 TLB 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 91
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)
Arhitectura Calculatoarelor 92
 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:
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:
- ATA (1 magistrală).
- SATA (2 porturi).
- USB 2.0 (8 porturi)
- 4 porturi PCI-E x1.
- Interfaţa AC-link (Audio kodek).
Arhitectura Calculatoarelor 93
- 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.
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.
Arhitectura Calculatoarelor 94

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 95

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 (microprocesorul cu Host bridge), ce
asigură configurarea tuturor dispozitivelor şi gestionează funcţionarea HT.
Arhitectura Calculatoarelor 96
- 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 regiştri, 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).
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:
Arhitectura Calculatoarelor 97
- 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ă.
(216=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.
 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
Arhitectura Calculatoarelor 98
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 regiştri (pe 8 bits), ce nu se referă la spaţiul de memorie şi nici la spaţiul de
intrare/ieşire). Accesul la aceşti regiştri se petrece în faze speciale ale magistralei Configuration Read şi
Configuration Write. Numărul funcţiei (function number), în tranzacţiile de 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
Arhitectura Calculatoarelor 99
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, 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ă.
 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
Arhitectura Calculatoarelor
100
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”.
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.
Arhitectura Calculatoarelor
101

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.

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.
Arhitectura Calculatoarelor
102

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.

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.
Arhitectura Calculatoarelor
103

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.

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.
Arhitectura Calculatoarelor
104
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 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.
Arhitectura Calculatoarelor
105

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 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
(www.scsita.org).

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
106

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 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.
Arhitectura Calculatoarelor
107
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:
http://www.usb.org.
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ă


Arhitectura Calculatoarelor
108
Î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

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.
Arhitectura Calculatoarelor
109
Un hub constă din două părţi: un controler şi un repetor. Controlerul conţine regiştri 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 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
110

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 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
Arhitectura Calculatoarelor
111
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 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


Arhitectura Calculatoarelor
112

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
 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).
Arhitectura Calculatoarelor
113

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 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ă.
Arhitectura Calculatoarelor
114
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

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
115

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.

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:
Arhitectura Calculatoarelor
116

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 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
Arhitectura Calculatoarelor
117
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

Figura 7.34

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