Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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).
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).
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.
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.
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.
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).
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).
definirea datelor
.CODE
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.
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
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.
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.
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.
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:
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
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:
67 45 4a bc bb 03 3e 05 fd e1 03 e1 62 61
beta +2 +4 +6 +8 +12
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 :
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 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.
Î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:
mnemonic
mnemonic [destinatie]
mnemonic [destinatie],[sursa]
mnemonic [destinatie],[ sursa-1],[ sursa-2]
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.
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
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
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
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
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
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
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
mov edx,0
mov eax,0FFFFFFFFh
add eax,0FFFFFFFFh
adc edx,0
Exemple:
cmp ax, alfa[bx][si]
cmp [si], 0
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:
.data
val1 WORD 2000h
val2 WORD 0100h
.code
mov ax,val1 ; AX = 2000h
mul val2 ; DX:AX = 00200000h, CF = 1
mov eax,12345h
mov ebx,1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF = 0
mov rax,0FFFF0000FFFF0000h
mov rbx,2
mul rbx ; RDX:RAX = 0000000000000001FFFE0001FFFE0000
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:
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!
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]
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.
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.
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.
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.
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
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:
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:
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
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
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:
Constantele sunt predefinite în irvine32.inc. Următoarele constante indică culoarea galben a caracterului
pe fundal albastru:
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"
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:
ș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)).
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
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)
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
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.
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
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
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
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
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
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
Structura instrucţiunii:
SHLD reg16,reg16,CL/imm8
SHLD mem16,reg16,CL/imm8
SHLD reg32,reg32,CL/imm8
SHLD mem32,reg32,CL/imm8
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
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
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ţ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
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).
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
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 î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 î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
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:
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.
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.
3 Structura calculatoarelor
MEMORY
Magistrala date
Magistrala adrese
CPU
Mgistrala control
I/O
Figura 3.1
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ă
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.
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).
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
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.
Î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.
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
Regiştri
Memoria cache
8k
date
Figura 4.1
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.
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.
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.
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
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)
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.
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.
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
ş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ă.
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.
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
Î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.
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
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ă.
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
SS
DS
ES
FS
GS
LDTR
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.
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 911 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ă.
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
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).
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.
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.
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.
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
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.
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.
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.
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.
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).
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
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.
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 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).
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.
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),
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.
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.
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.
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.
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.
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