29.04.2013 Views

Arhitectura Sistemelor de Calcul - Universitatea din Oradea

Arhitectura Sistemelor de Calcul - Universitatea din Oradea

Arhitectura Sistemelor de Calcul - Universitatea din Oradea

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSITATEA DIN ORADEA – FACULTATEA DE ȘTIINȚE<br />

<strong>Arhitectura</strong> <strong>Sistemelor</strong><br />

<strong>de</strong> <strong>Calcul</strong><br />

[suport <strong>de</strong> curs]<br />

Lect. univ. dr. Horea Oros<br />

[an univ. 2009­2010]<br />

[Lucrarea reprezintă suportul <strong>de</strong> curs pentru disciplina “<strong>Arhitectura</strong> <strong>Sistemelor</strong> <strong>de</strong> <strong>Calcul</strong>”<br />

<strong>din</strong> planul <strong>de</strong> învățământ al stu<strong>de</strong>nților <strong>de</strong> la specializările Informatică anul I.]


Cuprins<br />

1. Introducere ................................................................................................................. 5<br />

Scurtă istorie a evoluției sistemelor <strong>de</strong> calcul ............................................................ 5<br />

Mo<strong>de</strong>lul von Neumann .................................................................................................. 7<br />

Mo<strong>de</strong>lul System Bus (magistrală sistem) .................................................................... 7<br />

Niveluri ale maşinilor <strong>de</strong> calcul .................................................................................... 8<br />

Un sistem <strong>de</strong> calcul tipic ............................................................................................. 12<br />

Supercalculatoare ........................................................................................................ 13<br />

Concluzii ....................................................................................................................... 14<br />

2. Reprezentarea datelor ............................................................................................. 15<br />

Introducere .................................................................................................................. 15<br />

Reprezentarea numerelor în virgulă fixă .................................................................. 15<br />

Reprezentarea numerelor în virgulă mobilă ............................................................. 24<br />

Coduri <strong>de</strong> caractere ..................................................................................................... 34<br />

Concluzii ....................................................................................................................... 37<br />

3. Logica digitală .......................................................................................................... 39<br />

Logică combinațională ................................................................................................ 39<br />

Tabele <strong>de</strong> a<strong>de</strong>văr ......................................................................................................... 40<br />

Porți logice ................................................................................................................... 41<br />

Algebră booleană ......................................................................................................... 43<br />

Forma sumă <strong>de</strong> produse şi diagrame logice .............................................................. 45<br />

Forma produs <strong>de</strong> sume ............................................................................................... 47<br />

Componente digitale ................................................................................................... 48<br />

Logică secvențială ....................................................................................................... 58<br />

Flip‐flop ........................................................................................................................ 58<br />

Maşini cu număr finit <strong>de</strong> stări .................................................................................... 58<br />

4. Aritmetică ................................................................................................................. 59<br />

Introducere .................................................................................................................. 59<br />

Adunarea şi scă<strong>de</strong>rea numerelor în virgulă fixă ....................................................... 59<br />

Înmulțirea şi împărțirea numerelor în virgulă fixă .................................................. 65<br />

Aritmetică în virgulă mobilă ....................................................................................... 70<br />

Studiu <strong>de</strong> caz: Aritmetica BCD .................................................................................... 71<br />

Concluzie ...................................................................................................................... 75<br />

5. <strong>Arhitectura</strong> setului <strong>de</strong> instrucțiuni ......................................................................... 76<br />

Introducere .................................................................................................................. 76<br />

Componentele hardware ale arhitecturii setului <strong>de</strong> instrucțiuni (ASI) .................. 76<br />

ARC – „A RISC Computer” ........................................................................................... 82<br />

Pseudo‐operații ........................................................................................................... 89<br />

Exemple <strong>de</strong> programe în limbaj <strong>de</strong> asamblare ......................................................... 89<br />

Variații în arhitecturile sistemelor <strong>de</strong> calcul şi în modul <strong>de</strong> adresare .................... 90<br />

Accesarea datelor în memorie – moduri <strong>de</strong> adresare .............................................. 92<br />

Link‐editarea subrutinelor şi stivă ............................................................................ 93<br />

Intrare‐ieşire în limbaj <strong>de</strong> asamblare ........................................................................ 98<br />

Studiu <strong>de</strong> caz – ASI pentru Maşina Virtuală Java .................................................... 100<br />

Concluzie .................................................................................................................... 101


6. Limbaje şi maşină ................................................................................................... 102<br />

Introducere ................................................................................................................ 102<br />

Procesul <strong>de</strong> compilare ............................................................................................... 102<br />

Procesul <strong>de</strong> asamblare .............................................................................................. 108<br />

Link‐editare şi încărcare ........................................................................................... 115<br />

Un exemplu <strong>de</strong> programare ...................................................................................... 119<br />

Macrouri ..................................................................................................................... 120<br />

Concluzii ..................................................................................................................... 122<br />

7. Comunicații ............................................................................................................. 124<br />

Mo<strong>de</strong>muri ................................................................................................................... 124<br />

Medii <strong>de</strong> transmisie ................................................................................................... 126<br />

Arhitecturi <strong>de</strong> rețea: LAN .......................................................................................... 129<br />

Erori <strong>de</strong> comunicație şi coduri corectoare <strong>de</strong> erori ................................................ 133<br />

Arhitecturi <strong>de</strong> rețea: Internet ................................................................................... 141<br />

Concluzii ..................................................................................................................... 147


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

1. Introducere<br />

<strong>Arhitectura</strong> calculatoarelor (AC) se ocupă cu comportamentul funcțional al<br />

sistemelor <strong>de</strong> calcul aşa cum este văzut <strong>de</strong> programator. Aici sunt incluse aspecte<br />

cum ar fi: dimensiunea tipurilor <strong>de</strong> date (<strong>de</strong> ex. folosirea a 16 cifre binare pentru<br />

reprezentarea unui întreg) şi tipurile <strong>de</strong> operații ce sunt permise (<strong>de</strong> ex. adunarea,<br />

scă<strong>de</strong>rea şi apelul <strong>de</strong> subrutine).<br />

Organizarea calculatoarelor se ocupă cu relațiile structurale care nu sunt vizibile<br />

programatorului, cum ar fi interfețele cu dispozitivele periferice, frecvența <strong>de</strong> ceas şi<br />

tehnologiile utilizate pentru memorie.<br />

În acest curs vom discuta atât <strong>de</strong>spre arhitectură cât şi <strong>de</strong>spre organizare, termenul<br />

„arhitectură” va inclu<strong>de</strong> atât arhitectura cât şi organizarea sistemelor <strong>de</strong> calcul.<br />

În arhitectura calculatoarelor apare conceptul <strong>de</strong> nivel. I<strong>de</strong>ea este că există mai<br />

multe niveluri la care poate fi privit un sistem <strong>de</strong> calcul, <strong>de</strong> la nivelul <strong>de</strong> sus un<strong>de</strong><br />

rulează programele până la nivelul <strong>de</strong> jos format <strong>din</strong> tranzistori şi circuite integrate.<br />

Între aceste două niveluri există o serie <strong>de</strong> niveluri intermediare.<br />

Scurtă istorie a evoluţiei sistemelor <strong>de</strong> calcul<br />

Încă <strong>din</strong> secolul XVI existau mecanisme mecanice<br />

pentru controlul unor operații complexe <strong>de</strong><br />

exemplu cilindrii care se roteau într‐o cutie<br />

muzicală şi produceau melodii. Maşinile ce<br />

efectuau calcule au apărut în secolul următor.<br />

Blaise Pascal (1632‐1662) a creat un calculator<br />

mecanic pentru a‐l ajuta pe tatăl său, care se ocupa<br />

cu strângerea taxelor, la efectuarea calculelor.<br />

<strong>Calcul</strong>atorul lui Pascal se numea „Pascaline”.<br />

De abia în secolul XIX, Charles Babbage (1791‐1871) reuşeşte să proiecteze o<br />

maşină <strong>de</strong> calcul care reunea conceptul <strong>de</strong> control mecanic şi calcule mecanice într‐<br />

un singur dispozitiv care are toate componentele esențiale <strong>din</strong>tr‐un calculator<br />

mo<strong>de</strong>rn aşa cum îl cunoaştem astăzi. Babbage este consi<strong>de</strong>rat „bunicul”<br />

calculatoarelor şi nu „părintele” pentru că el nu a construit efectiv maşina respectivă<br />

ci doar a proiectat‐o. Babbage a creat o maşină <strong>de</strong> calcul pentru calcularea unor<br />

tabele matematice folosite la vremea respectivă în navigație şi munca ştiințifică.<br />

Tabelele <strong>de</strong> până atunci conțineau numeroase erori. Maşina lui Babbage putea citi<br />

date <strong>din</strong> intrare, putea stoca date, efectua calcule, producea date la ieşire şi efectua<br />

controlul automat al operațiilor maşinii. Acestea sunt funcțiile <strong>de</strong> bază ce există în<br />

orice calculator mo<strong>de</strong>rn <strong>din</strong> zilele noastre. Babbage a creat un prototip pentru acest<br />

motor diferenţial, care evalua polinoame folosind metoda diferențelor finite.<br />

Succesul acestui motor a dus la proiectarea unui motor mult mai complex şi anume<br />

motorul analitic, care era mult mai sofisticat, avea mecanisme pentru ramificare<br />

5


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

(luarea <strong>de</strong> <strong>de</strong>cizii) şi mecanisme pentru a fi programat folosind cartele perforate în<br />

stilul cunoscut sub numele <strong>de</strong> războiul <strong>de</strong> ţesut al lui Jacquard. Motorul analitic a<br />

fost proiectat dar nu a fost realizat efectiv la vremea respectivă datorită faptului ca<br />

nu exista tehnologia necesară. O versiunea a motorului diferențial al lui Babbage a<br />

fost realizat efectiv la Muzeul Ştiinței <strong>din</strong> Londra în 1991 şi poate fi văzut şi astăzi.<br />

Următorul pas important în evoluția sistemelor <strong>de</strong> calcul s‐a făcut după un secol în<br />

timpul celui <strong>de</strong>‐al doilea război mondial când submarinele germane produceau<br />

Aliaților pagube semnificative în Atlantic. Aceste submarine primeau or<strong>din</strong>ele <strong>de</strong> la<br />

baze <strong>din</strong> Germania criptat. Criptarea se realiza cu ajutorul unei maşini <strong>de</strong> calcul<br />

numite ENIGMA produsă <strong>de</strong> Siemens AG. Procesul <strong>de</strong> criptare era cunoscut <strong>de</strong> mult<br />

timp dar <strong>de</strong>criptarea mesajelor, fără cunoaşterea codului secret folosit la criptare,<br />

era o operație foarte dificilă. Alan Turing (1912‐1954) şi alți oameni <strong>de</strong> ştiință <strong>din</strong><br />

Anglia au reuşit să „spargă” codurile produse <strong>de</strong> ENIGMA. Turing a transformat<br />

criptografia <strong>din</strong>tr‐o artă practicată <strong>de</strong> oameni obişnuiți pentru a <strong>de</strong>scifra limbi vechi<br />

<strong>de</strong> mult dispărute (hieroglifele egiptenilor) într‐o ramură a matematicii. Turing a<br />

creat o maşină <strong>de</strong> <strong>de</strong>criptare numită Colossus. Implicarea lui Turing în acest proiect<br />

nu este foarte bine documentată datorită confi<strong>de</strong>nțialității care a planat asupra<br />

acestui proiect.<br />

În aceeaşi perioadă J. Presper Eckert şi John Mauchly au creat o maşină pentru<br />

calculul tabelelor balistice pentru armata SUA. Rezultatul a fost ENIAC (Electronic<br />

Numerical Integrator And Computer). ENIAC era format <strong>din</strong> 18000 <strong>de</strong> tuburi vidate,<br />

care formau partea <strong>de</strong> calcul a maşinii. Programarea şi introducerea datelor se<br />

efectuau cu ajutorul unor întrerupătoare şi prin schimbarea unor cabluri. Nu exista<br />

conceptul <strong>de</strong> program stocat şi nu exista unitate centrală <strong>de</strong> memorie. A <strong>de</strong>venit<br />

operațional <strong>de</strong> abia în 1946 şi a fost folosit timp <strong>de</strong> nouă ani, fiind consi<strong>de</strong>rat un<br />

succes.<br />

După succesul cu ENIAC, lui Eckert şi Mauchly li s‐a alăturat John von Neumann<br />

(1903‐1957). Împreună au proiectat o maşină <strong>de</strong> calcul cu program stocat numită<br />

6


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

EDVAC. În 1947 Maurice Wilkes (<strong>Universitatea</strong> Cambridge) a construit o maşină <strong>de</strong><br />

calcul cu program stocat numită EDSAC.<br />

Mo<strong>de</strong>lul von Neumann<br />

<strong>Calcul</strong>atoarele digitale convenționale au o bază comună care îi este atribuită lui<br />

von Neumann. Mo<strong>de</strong>lul von Neumann constă în cinci componente majore la fel ca în<br />

figură. Unitatea <strong>de</strong> intrare furnizează instrucțiuni şi date sistemului, care sunt<br />

stocate ulterior în Unitatea <strong>de</strong> Memorie. Instrucțiunile şi datele sunt procesate <strong>de</strong><br />

Unitatea Aritmetică şi Logică (ULA) sub controlul Unităţii <strong>de</strong> Control. Rezultatele<br />

sunt trimise la Unitatea <strong>de</strong> Ieşire. ULA şi UC poartă <strong>de</strong>numirea generică <strong>de</strong> CPU<br />

(Unitate Centrală <strong>de</strong> Procesare).<br />

Programul stocat este cel mai important aspect al mo<strong>de</strong>lului von Neumann. Un<br />

program este stocat în memoria calculatorului împreună cu datele ce sunt<br />

procesate. Înainte <strong>de</strong> apariția calculatoarelor cu program stocat, programele erau<br />

stocate pe medii externe cum ar fi cartele perforate. În calculatorul cu program<br />

stocat programul poate fi manipulat ca şi cum ar reprezenta date. Aceasta a dus la<br />

apariția compilatoarelor şi sistemelor <strong>de</strong> operare şi face posibilă marea versatilitate<br />

a calculatoarelor mo<strong>de</strong>rne.<br />

Mo<strong>de</strong>lul System Bus (magistrală sistem)<br />

<strong>Calcul</strong>atoarele mo<strong>de</strong>rne se bazează pe mo<strong>de</strong>lul von Neumann. Totuşi acest mo<strong>de</strong>l a<br />

fost organizat (restructurat, simplificat) într‐un alt mo<strong>de</strong>l şi anume mo<strong>de</strong>lul System<br />

Bus. Acest mo<strong>de</strong>l împarte sistemul <strong>de</strong> calcul în trei subunități: CPU, Memorie şi<br />

Intrare‐Ieşire. Această îmbunătățire a mo<strong>de</strong>lului von Neumann combină ULA şi<br />

unitatea <strong>de</strong> control într‐o singură unitate funcțională (CPU – Central Processing<br />

Unit). Intrarea şi ieşirea sunt combinate <strong>de</strong> asemenea într‐o singură unitate.<br />

Caracteristica principală a mo<strong>de</strong>lului System Bus este comunicarea între diferitele<br />

componente care se face printr‐o cale numită magistrală sistem, formată <strong>din</strong><br />

magistrala <strong>de</strong> date (care transportă informația transmisă), magistrala <strong>de</strong> adrese<br />

(care i<strong>de</strong>ntifică un<strong>de</strong> este trimisă informația) şi magistrala <strong>de</strong> control (care <strong>de</strong>scrie<br />

aspecte ce țin <strong>de</strong> modul în care este trimisă informația). Există <strong>de</strong> asemenea şi<br />

7


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

magistrala <strong>de</strong> energie (curent electric) pentru alimentarea electrică a<br />

componentelor, care nu este prezentată în figură dar prezența ei se subînțelege.<br />

Unele arhitecturi pot avea o magistrală <strong>de</strong> intrare‐ieşire separată.<br />

Fizic, magistralele sunt formate <strong>din</strong> colecții <strong>de</strong> fire grupate pe funcții. O magistrală<br />

<strong>de</strong> 32 <strong>de</strong> biți are 32 <strong>de</strong> fire separate, fiecare transmițând un bit <strong>de</strong> date. Magistrala<br />

sistem este un grup <strong>de</strong> magistrale individuale clasificate după funcțiile lor.<br />

Magistrala <strong>de</strong> data transportă datele între diferitele componente ale sistemului.<br />

Unele sisteme au magistrale <strong>de</strong> date separate pentru transportul datelor la/<strong>de</strong> la<br />

procesor (data‐in şi data‐out). Magistralele, cel mai frecvent, transportă datele într‐<br />

un singur sens la un moment dat.<br />

Dacă magistrala trebuie partajată <strong>de</strong> diferitele entități care comunică, atunci aceste<br />

entități trebuie să aibă adrese distincte. În unele sisteme <strong>de</strong> calcul toate adresele<br />

sunt adrese <strong>de</strong> memorie indiferent dacă fac parte <strong>din</strong> memoria calculatorului sau<br />

sunt dispozitive <strong>de</strong> I/E. Pe <strong>de</strong> altă parte, unele sisteme au adrese separate pentru<br />

adresele <strong>de</strong> intrare‐ieşire ale dispozitivelor <strong>de</strong> I/E.<br />

O adresă <strong>de</strong> memorie, sau locație, i<strong>de</strong>ntifică locația <strong>de</strong> memorie la care sunt stocate<br />

datele. În timpul unei operații <strong>de</strong> citire sau scriere <strong>de</strong> memorie, adresa <strong>de</strong> magistrală<br />

conține adresa locației <strong>de</strong> memorie <strong>de</strong> la care se vor citi datele sau la care se vor<br />

scrie datele. Termenii „citire” respectiv „scriere” se referă la CPU care citeşte datele<br />

<strong>din</strong> memorie şi scrie datele în memorie. Dacă datele se citesc <strong>din</strong> memorie atunci<br />

magistrala <strong>de</strong> date conține valoarea citită <strong>de</strong> la adresa <strong>de</strong> memorie respectivă. Dacă<br />

datele se scriu în memorie atunci magistrala <strong>de</strong> date conține valoarea care se va<br />

scrie în memorie.<br />

Magistrala <strong>de</strong> control coordonează accesul la magistrala <strong>de</strong> date şi la magistrala <strong>de</strong><br />

adrese şi direcționează datele spre diferite componente.<br />

Niveluri ale maşinilor <strong>de</strong> calcul<br />

La fel ca orice sistem complex, un calculator poate fi privit <strong>din</strong> mai multe perspective<br />

sau niveluri <strong>de</strong> la nivelul cel mai <strong>de</strong> sus, nivelul utilizator până la nivelul cel mai <strong>de</strong><br />

jos, nivelul circuitelor integrate. Fiecare nivel reprezintă o abstractizare a<br />

calculatorului. Probabil că succesul calculatoarelor se datorează şi gradului la care<br />

aceste niveluri <strong>de</strong> abstractizare sunt separate (in<strong>de</strong>pen<strong>de</strong>nte) unele <strong>de</strong> altele. Un<br />

utilizator care rulează o aplicație <strong>de</strong> tehnoredactare pe un calculator nu trebuie să<br />

8


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

ştie nimic <strong>de</strong>spre modul în care aplicația respectivă a fost programată. De asemenea<br />

programatorul nu trebuie să ştie nimic <strong>de</strong>spre porțile logice <strong>din</strong> structura unui<br />

calculator. O modalitate interesantă în care această separare a nivelurilor a fost<br />

exploatată este <strong>de</strong>zvoltarea <strong>de</strong> sisteme compatibile „în sus”.<br />

Compatibilitatea „în sus” – invenția tranzistorilor a dus la o <strong>de</strong>zvoltare rapidă a<br />

hardware‐ului pentru calculatoare, dar o dată cu această <strong>de</strong>zvoltare a apărut<br />

problema compatibilității. Utilizatorii doreau să utilizeze cele mai noi şi mai rapi<strong>de</strong><br />

calculatoare dar fiecare mo<strong>de</strong>l nou <strong>de</strong> calculator avea o arhitectură nouă iar<br />

software‐ul vechi nu mai rula pe calculatoare noi. Această problemă a<br />

compatibilității hardware/software a <strong>de</strong>venit atât <strong>de</strong> acută încât utilizatorii amânau<br />

achiziționarea <strong>de</strong> calculatoare noi datorită costurilor ridicate <strong>de</strong> rescriere a soft‐ului<br />

pentru a rula pe noul hardware. Conversia soft‐ului vechi pentru a rula pe<br />

hardware‐ul nou dura <strong>de</strong>stul <strong>de</strong> mult.<br />

IBM a inventat şi implementat conceptul <strong>de</strong> „familie <strong>de</strong> maşini” începând cu seria<br />

360. <strong>Calcul</strong>atoare mai performante <strong>din</strong> aceeaşi familie puteau rula programe scrise<br />

pentru maşini mai puțin performante şi mai vechi fără a modifica acele programe ‐<br />

compatibilitatea „în sus”.<br />

Nivelurile<br />

Figura prezintă cele şapte niveluri <strong>din</strong> cadrul unui sistem <strong>de</strong> calcul, <strong>de</strong> la nivelul<br />

utilizator până la nivelul circuitelor integrate. Pe măsură ce coborâm nivelurile<br />

<strong>de</strong>vin tot mai puțin abstracte şi se expune tot mai mult <strong>din</strong> structura internă.<br />

Nivelul <strong>de</strong> sus<br />

Nivelul <strong>de</strong> jos<br />

Nivel utilizator: programele <strong>de</strong> aplicaţie<br />

Limbaje <strong>de</strong> nivel înalt<br />

Limbaj <strong>de</strong> asamblare / cod maşină<br />

Control<br />

Unităţile funcţionale (memorie, ULA etc.)<br />

Porţi logice<br />

Tranzistori şi circuite integrate<br />

Nivel utilizator sau nivelul programelor <strong>de</strong> aplicaţie<br />

9


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Este nivelul cu care suntem cel mai familiarizați. La acest nivel utilizatorul<br />

interacționează cu calculatorul prin rularea programelor <strong>de</strong> aplicație. Utilizatorul<br />

ve<strong>de</strong> calculatorul prin intermediul programelor <strong>de</strong> aplicație. Structura internă sau<br />

structurile <strong>de</strong> nivel jos sunt foarte puțin vizibile.<br />

Nivelul limbajelor <strong>de</strong> nivel înalt<br />

Este nivelul cu care interacționează cei care programează într‐un limbaj <strong>de</strong> nivel<br />

înalt (Pascal, C, C++, Java, C#). Programatorul ve<strong>de</strong> doar limbajul şi nu <strong>de</strong>taliile <strong>de</strong><br />

nivel jos. Programatorul ve<strong>de</strong> tipurile <strong>de</strong> date, instrucțiunile limbajului <strong>de</strong> nivel înalt<br />

dar nu ve<strong>de</strong> exact cum sunt implementate acele date şi instrucțiuni la nivel maşină.<br />

Compilatorul este cel care face asocierea între tipurile <strong>de</strong> date şi instrucțiunile <strong>de</strong> la<br />

nivelul limbajului <strong>de</strong> programare şi hardware‐ul maşinii. Programele scrise într‐un<br />

limbaj <strong>de</strong> nivel înalt pot fi recompilate pe diferite maşini şi probabil că vor rula fără<br />

probleme (spunem că programele sursă scrise în aceste limbaje <strong>de</strong> programare sunt<br />

portabile). Această compatibilitate poartă numele <strong>de</strong> compatibilitate la nivel <strong>de</strong><br />

cod sură. Acest nivel nu are o legătură foarte mare cu maşina propriu‐zisă pentru<br />

care este translatat codul sursă. Compilatorul transformă codul sursă în<br />

instrucţiuni maşină.<br />

Nivelul limbajului <strong>de</strong> asamblare / limbajului maşină<br />

Limbajul maşină se ocupă cu problemele <strong>de</strong> hardware cum ar fi registre şi transferul<br />

<strong>de</strong> date între aceştia. Colecția <strong>de</strong> instrucțiuni maşină pentru un anumit calculator<br />

poartă numele <strong>de</strong> set <strong>de</strong> instrucţiuni al maşinii. Codul maşină este format doar <strong>din</strong><br />

cifre binare. Programarea folosind doar cifre binare este foarte dificilă aşa că printre<br />

primele programe <strong>de</strong> calculator care au fost create a fost asamblorul care<br />

transformă mnemonice <strong>de</strong> limbaj obişnuite cum ar fi MOVE, ADD, SUB în secvența<br />

corespunzătoare în limbaj maşină (cod maşină). Acest limbaj în care există<br />

corespon<strong>de</strong>nțe unu‐la‐un cu codul maşină se numeşte limbaj <strong>de</strong> asamblare.<br />

Ca rezultat al acestei separări a nivelurilor putem avea maşini ce diferă în<br />

implementarea <strong>de</strong> nivel jos dar care au acelaşi set (sau sub‐set sau super‐set) <strong>de</strong><br />

instrucțiuni. Aceasta a permis IBM să proiecteze seria IBM 360 care garanta faptul<br />

că programele vechi rulează pe sisteme noi (compatibilitate în sus). Acest tip <strong>de</strong><br />

compatibilitate este cunoscută sub numele <strong>de</strong> compatibilitate binară <strong>de</strong>oarece codul<br />

binar rulează nemodificat pe oricare membru al familiei <strong>de</strong> sisteme. Acesta a fost în<br />

mare parte motivul pentru succesul seriei IBM 360.<br />

Intel a accentuat această compatibilitate la nivel binar. Programele scrise pentru<br />

procesorul 8086 rulau nemodificate şi pe 80186, 80286, 80386, 80486, Pentium.<br />

Există şi alte familii <strong>de</strong> procesoare care au un alt set <strong>de</strong> instrucțiuni incompatibile cu<br />

familii diferite. Transportul programelor pe acele procesoare nu este un proces la fel<br />

<strong>de</strong> simplu.<br />

Nivelul control<br />

Unitatea <strong>de</strong> control este cea care efectuează transferul <strong>de</strong> date între registre. Pentru<br />

aceasta foloseşte semnale <strong>de</strong> control care transferă datele <strong>din</strong>tr‐un registru într‐<br />

10


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

altul, eventual printr‐un circuit logic care eventual poate să transforme datele.<br />

Unitatea <strong>de</strong> control interpretează instrucțiunile maşinii una câte una, <strong>de</strong>terminând<br />

transferul <strong>de</strong> date între registre sau o altă acțiune.<br />

Modul în care se realizează aceasta nu trebuie să privească pe programatorul în<br />

limbaj <strong>de</strong> asamblare. Familia <strong>de</strong> procesoare 8086 este proiectată în aşa fel încât<br />

fiecare membru al familiei poate executa setul original 8086 şi în plus orice alte<br />

instrucțiuni suplimentare (noi) implementate pentru membrul respectiv al familiei.<br />

Prin urmare un program scris pentru 8086 va rula pe orice alt procesor <strong>din</strong> familie.<br />

Unitatea <strong>de</strong> control se poate implementa în două moduri: hardware, mod în care<br />

semnalele <strong>de</strong> control sunt generate <strong>din</strong>tr‐un bloc <strong>de</strong> componente cu logică digitală;<br />

software, mod în care un microprogram scris într‐un limbaj <strong>de</strong> nivel jos şi<br />

implementat în hardware interpretează instrucțiunile maşină. Acest microprogram<br />

se numeşte firmware pentru că are atât elemente hardware cât şi software.<br />

Firmware‐ul se execută în microcontrolere.<br />

Nivelul unităţilor funcţionale<br />

Transferul <strong>de</strong> date între registre şi alte operații implementate <strong>de</strong> unitatea <strong>de</strong> control<br />

transferă date în şi <strong>din</strong> unitățile funcționale (registre interne a CPU, ULA, memoria<br />

principală). Unitățile funcționale execută operațiile esențiale pentru sistemul <strong>de</strong><br />

calcul.<br />

Nivelul porţilor logice şi al tranzistorilor<br />

Nivelul cel mai <strong>de</strong> jos este nivelul porților logice şi nivelul tranzistorilor. La acest<br />

nivel încă se ve<strong>de</strong> funcționalitatea <strong>de</strong> la nivelurile superioare. Unitățile funcționale<br />

sunt construite <strong>din</strong> porți logice iar porțile logice sunt construite <strong>din</strong> tranzistori.<br />

Porțile logice implementează operațiile logice la nivelul cel mai <strong>de</strong> jos, operații pe<br />

care se bazează funcționalitatea calculatorului. La nivelul cel mai <strong>de</strong> jos calculatorul<br />

este format <strong>din</strong> tranzistori dar la acest nivel funcționarea calculatorului este<br />

exprimată în termeni <strong>de</strong> tensiuni ale curentului electric (voltaj), propagarea<br />

semnalului, efecte cuantice toate fiind la un nivel foarte jos.<br />

Interacţiunea <strong>din</strong>tre niveluri<br />

Uneori separarea <strong>din</strong>tre niveluri este foarte vagă. O nouă arhitectură poate avea o<br />

implementare completă pentru instrucțiuni cu numere în virgulă mobilă, pe când o<br />

altă implementare mai minimalistă poate avea doar implementarea operațiilor cu<br />

numere întregi. Instrucțiunile cu numere reale sunt înlocuite cu secvențe <strong>de</strong><br />

instrucțiuni în limbaj maşină care imită (emulează) instrucțiunile cu numere reale.<br />

Aşa se întâmplă cu microprocesoarele care au ca opțiune coprocesorul matematic<br />

pentru operațiile cu numere reale. Instrucțiunile ce emulează operațiile cu numere<br />

reale sunt stocate în ROM (Read‐Only Memory). Nivelul limbaj <strong>de</strong> asamblare şi<br />

nivelurile superioare privesc ambele implementări i<strong>de</strong>ntic singura diferență fiind<br />

viteza <strong>de</strong> execuție. Orice emulare funcționează mai încet. Se poate emula întregul set<br />

11


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

<strong>de</strong> instrucțiuni al unui sistem <strong>de</strong> calcul pe un alt sistem <strong>de</strong> calcul. Un astfel <strong>de</strong><br />

software se numeşte emulator.<br />

Perspectiva programatorului – arhitectura set <strong>de</strong> instrucţiuni<br />

Programatorul în limbaj <strong>de</strong> asamblare este preocupat <strong>de</strong> limbajul <strong>de</strong> asamblare şi <strong>de</strong><br />

unitățile funcționale ale sistemului <strong>de</strong> calcul. Colecția <strong>de</strong> mulțimi <strong>de</strong> instrucțiuni şi<br />

unități funcționale se numeşte arhitectura set <strong>de</strong> instrucțiuni (Instruction Set<br />

Architecture ‐ ISA) a sistemului <strong>de</strong> calcul.<br />

Perspectiva arhitectului <strong>de</strong> sisteme <strong>de</strong> calcul<br />

Arhitectul <strong>de</strong> sisteme <strong>de</strong> calcul trebuie să aibă o perspectivă asupra sistemului <strong>de</strong> la<br />

toate nivelurile. Arhitectul care se concentrează pe proiectarea calculatorului este<br />

preocupat <strong>de</strong> cerințele <strong>de</strong> performanță şi este constrâns <strong>de</strong> costuri. Performanța<br />

poate fi specificată prin viteza <strong>de</strong> execuție, capacitatea <strong>de</strong> stocare sau alți parametri.<br />

Costul poate fi reflectat în bani, dimensiune, greutate sau consum <strong>de</strong> energie.<br />

Design‐ul propus <strong>de</strong> un arhitect <strong>de</strong> sisteme <strong>de</strong> calcul trebuie să încerce să atingă<br />

țelurile <strong>de</strong> performanță şi în acelaşi timp să respecte constrângerile <strong>de</strong> buget.<br />

Aceasta necesită <strong>de</strong> multe ori compromisuri între diferitele niveluri ale sistemului<br />

<strong>de</strong> calcul.<br />

Un sistem <strong>de</strong> calcul tipic<br />

<strong>Calcul</strong>atoarele mo<strong>de</strong>rne au evoluat <strong>de</strong> la „monştri” anilor 50, 60 la calculatoare mult<br />

mai mici şi mai performante. Cu toate inovațiile tehnologice apărute între timp, cele<br />

cinci unități <strong>de</strong> bază <strong>din</strong> mo<strong>de</strong>lul von Neumann se pot i<strong>de</strong>ntifica şi astăzi în<br />

calculatoarele mo<strong>de</strong>rne.<br />

Unitatea <strong>de</strong> intrare: tastatură, mouse.<br />

Unitate <strong>de</strong> ieşire: monitor, imprimantă.<br />

Unitatea aritmetică şi logică şi unitatea <strong>de</strong> control = CPU<br />

Unitatea <strong>de</strong> memorie: RAM, hard‐disk, discheta, CD‐ROM.<br />

12


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Nucleul unui calculator mo<strong>de</strong>rn este conținut pe placa <strong>de</strong> bază. Placa <strong>de</strong> bază conține<br />

circuite integrate, sloturi pentru plăci <strong>de</strong> extensie şi cabluri pentru conectarea<br />

acestora.<br />

Supercalculatoare<br />

Unul <strong>din</strong> motivele pentru care supercalculatoarele dispar este progresul tehnologic<br />

în domeniul calculatoarelor ceea ce face ca sistemele <strong>de</strong> calcul obişnuite să atingă o<br />

putere <strong>de</strong> calcul ce reprezintă o fracțiune importantă <strong>din</strong> puterea <strong>de</strong> calcul a<br />

supercalculatoarelor, la un preț foarte mic ce şi‐l permite aproape oricine. Raportul<br />

preț/performanță pentru calculatoarele <strong>de</strong>sktop este foarte bun datorită<br />

comercializării acestor calculatoare pe scară largă. Supercalculatoarele nu se pot<br />

vin<strong>de</strong> în cantități foarte mari aşa că acestea au un raport preț/performanță mare.<br />

13


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Mark I – <strong>Universitatea</strong> Manchester, lansat în 21 iunie 1948. (a nu se confunda cu Harvard Mark I,<br />

donat Universității Harvard <strong>de</strong> către IBM în august 1944)<br />

Gordon Moore – co‐fondatorul Intel (1968), la ora actuală „Chairman Emeritus of<br />

the board” este cunoscut pe plan mondial prin celebra „lege a lui Moore”. În 1965 el<br />

a prevăzut că în fiecare an se va dubla numărul <strong>de</strong> tranzistori ce pot fi puşi într‐un<br />

chip <strong>de</strong> calculator. În 1975 şi‐a actualizat previziunea spunând că la fiecare doi ani<br />

se va dubla numărul tranzistorilor <strong>din</strong>tr‐un chip. Această lege a <strong>de</strong>venit un principiu<br />

care a ghidat industria semiconductorilor în a furniza chip‐uri tot mai performante<br />

cu costuri tot mai scăzute. Investițiile într‐o uzină ce produce microprocesoare sunt<br />

enorme. Moore spunea că cel mai urât coşmar al său ar fi ca într‐o zi să se trezească<br />

şi omenirea să nu mai aibă nevoie <strong>de</strong> mai multă putere <strong>de</strong> calcul.<br />

Concluzii<br />

AC se ocupă cu acele aspecte ale sistemelor <strong>de</strong> calcul ce sunt vizibile pentru<br />

programator, în timp ce organizarea calculatoarelor se ocupă cu aspectele ce sunt la<br />

un nivel fizic şi nu sunt foarte vizibile pentru programator. De‐a lungul timpului<br />

programatorii trebuiau să se ocupe <strong>de</strong> fiecare aspect al calculatorului – Babbage cu<br />

dispozitive mecanice, ENIAC cu cabluri şi conectori. Pe măsură ce calculatoarele au<br />

<strong>de</strong>venit mai sofisticate, conceptul <strong>de</strong> nivel al maşinii a <strong>de</strong>venit tot mai important,<br />

permițând calculatoarelor să aibă comportament extern respectiv intern foarte<br />

diferit, gestionând complexitatea prin intermediul nivelurilor stratificate. Cea mai<br />

importantă inovație care face posibilă aceasta este programul stocat, care este<br />

încarnat în mo<strong>de</strong>lul von Neumann. Mo<strong>de</strong>lul von Neumann este cel pe care îl ve<strong>de</strong>m<br />

în ziua <strong>de</strong> astăzi în calculatoarele convenționale.<br />

14


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

2. Reprezentarea datelor<br />

Introducere<br />

La începuturile apariției calculatoarelor existau o serie <strong>de</strong> mituri în ceea ce priveşte<br />

calculatoarele. Un mit era că un calculator este o maşină uriaşă <strong>de</strong> calculat. Chiar şi<br />

la vremea respectivă calculatoarele puteau face mult mai mult <strong>de</strong>cât nişte calcule.<br />

Un alt mit era că un calculator poate face „orice”. Astăzi ştim că există clase <strong>de</strong><br />

probleme care sunt <strong>de</strong> nerezolvat chiar şi pentru cele mai performante<br />

calculatoarele create după mo<strong>de</strong>lul von Neumann. A<strong>de</strong>vărul în legătura cu<br />

calculatoarele este un<strong>de</strong>va pe la jumătatea distanței <strong>din</strong>tre cele două mituri.<br />

Noi suntem familiarizați cu operații ale calculatorului ce nu sunt aritmetice: grafică,<br />

audio sau chiar mişcarea mouse‐ului. Indiferent <strong>de</strong> tipul <strong>de</strong> informație ce este<br />

prelucrată <strong>de</strong> calculator, informația trebuie reprezentată sub formă <strong>de</strong> 0 şi 1.<br />

Aceasta ridică imediat problema reprezentării informației respective în calculator<br />

(codificarea datelor ‐ enco<strong>din</strong>g). Orice informație trebuie reprezentată într‐un mod<br />

sistematic, neambiguu.<br />

Noi folosim în mod curent reprezentarea zecimală pentru numere pentru că este<br />

reprezentarea pe care o cunoaştem cel mai bine, dar folosirea informației binare<br />

pentru transmiterea datelor s‐a folosit încă înainte <strong>de</strong> apariția calculatoarelor sub<br />

forma codului Morse.<br />

În continuarea vom prezenta câteva <strong>din</strong> cele mai simple moduri <strong>de</strong> codificare a<br />

informației: reprezentarea numerelor în virgulă fixă cu semn şi fără semn,<br />

reprezentarea numerelor reale (în virgulă mobilă) şi reprezentarea caracterelor.<br />

Vom ve<strong>de</strong>a că întot<strong>de</strong>auna există mai multe moduri în care pot fi codificate datele,<br />

fiecare mod fiind util într‐un anumit context.<br />

Vom ve<strong>de</strong>a că <strong>de</strong>ciziile în legătură cu numărul <strong>de</strong> biți pe care o arhitectură<br />

particulară îi foloseşte pentru reprezentarea unor întregi (<strong>de</strong> exemplu 32 <strong>de</strong> biți) au<br />

o consecință importantă asupra numărului <strong>de</strong> valori ce pot fi reprezentate şi asupra<br />

operațiilor ce se pot efectua. Suma a două valori întregi reprezentate pe 32 <strong>de</strong> biți s‐<br />

ar putea să nu se poată reprezenta pe 32 <strong>de</strong> biți ceea ce duce la o condiție numită<br />

<strong>de</strong>păşire (overflow).<br />

Reprezentarea numerelor în virgulă fixă<br />

Într‐un sistem <strong>de</strong> numerație cu virgulă fixă, fiecare număr are acelaşi număr <strong>de</strong> cifre<br />

iar „punctul” zecimal este întot<strong>de</strong>auna în aceeaşi poziție. De exemplu 0.23, 5.12,<br />

9.11. În aceste exemple fiecare număr e format <strong>din</strong> trei cifre iar punctul zecimal este<br />

poziționat după prima cifră. În sistemul <strong>de</strong> numerație binar putem scrie <strong>de</strong><br />

asemenea astfel <strong>de</strong> numere: 11.10, 01.10 şi 00.11. Diferența <strong>din</strong>tre reprezentarea<br />

numerelor cu virgulă fixă pe hârtie respectiv în calculator este că în calculator<br />

punctul zecimal nu se scrie nicăieri el se consi<strong>de</strong>ră că se afla într‐o anumită poziție.<br />

Se spune că punctul zecimal se află doar în mintea programatorului.<br />

15


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Interval şi precizie la numerele cu virgulă fixă<br />

O reprezentare cu virgulă fixă poate fi caracterizată prin intervalul <strong>de</strong> valori<br />

reprezentabile (adică distanța <strong>din</strong>tre cel mai mic şi cel mai mare număr) şi precizia<br />

(adică distanța <strong>din</strong>tre două numere consecutive). Pentru exemplu zecimal <strong>de</strong> mai<br />

sus (cu trei cifre) intervalul este [0.00, 9.99] iar precizia este 0.01. Eroare în acest<br />

caz este ½ <strong>din</strong> diferența <strong>din</strong>tre două numere consecutive. Astfel eroarea este 0.01/2<br />

= 0.005. Astfel, putem reprezenta orice număr <strong>din</strong> intervalul [0.00, 9.99] cu o<br />

precizie <strong>de</strong> 0.005.<br />

Putem observa că există un compromis între interval şi precizie. Dacă luăm<br />

intervalul [000, 999] se pot reprezenta numere <strong>din</strong>tr‐un interval mai mare dar şi<br />

eroarea este mai mare. De asemenea dacă consi<strong>de</strong>răm intervalul [.000, .999]<br />

eroarea este .001.<br />

În fiecare <strong>din</strong> cele trei cazuri numărul <strong>de</strong> numere reprezentabile este 1000,<br />

indiferent un<strong>de</strong> punem punctul zecimal.<br />

Intervalul nu este obligatoriu să înceapă cu 0. Un sistem zecimal <strong>de</strong> reprezentare a<br />

numerelor cu două cifre poate avea intervalul [00, 99] sau intervalul [‐50, +49] sau<br />

[‐99, 0]. Despre reprezentarea numerelor negative vom discuta mai mult într‐un alt<br />

paragraf.<br />

Intervalul şi precizia sunt două aspecte importante în arhitectura calculatoarelor<br />

pentru că ambele sunt finite în implementarea arhitecturii dar infinite în realitate,<br />

aşa că utilizatorul trebuie să fie conştient <strong>de</strong> limitări în momentul în care încearcă să<br />

reprezinte informație externă într‐o formă internă.<br />

Axioma asociativităţii <strong>din</strong> algebră nu este întot<strong>de</strong>auna valabilă în<br />

reprezentarea datelor<br />

Ştim <strong>de</strong> la algebră că (a+b)+c = a + (b+c). Aceasta este axioma asociativității.<br />

Dacă consi<strong>de</strong>răm un sistem în virgulă fixă cu o singură cifră zecimală intervalul <strong>de</strong><br />

valori ce poate fi reprezentat este [‐9, 9]. Dacă consi<strong>de</strong>răm a=7, b=4 şi c=‐3 atunci<br />

vom constata că a + (b+c) = 7+(4+ ‐3) = 7+1=8 ceea cea este corect şi (a+b)+c =<br />

(7+4)+(‐3)= 11+ ‐3, dar 11 nu este o valoare reprezentabilă în acest sistem aşa că va<br />

fi trunchiată la 1 şi rezultatul final va fi ‐2 ceea ce este greşit. Aşadar, chiar dacă<br />

rezultatul final corect (8) poate fi reprezentat dacă într‐un calcul intermediar apare<br />

o <strong>de</strong>păşire rezultatul final nu va mai fi corect.<br />

Pentru a rezolva această problemă nu se poate face nimic practic cu excepția<br />

<strong>de</strong>tectării <strong>de</strong>păşirii şi a informării utilizatorului <strong>de</strong> apariția ei.<br />

Baze <strong>de</strong> numeraţie<br />

În această secțiune vom ve<strong>de</strong>a cum se lucrează cu baze <strong>de</strong> numerație diferite,<br />

concentrându‐ne atenția asupra bazelor 2 (binar), 8 (octal) şi 16 (hexazecimal).<br />

16


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Baza unui sistem <strong>de</strong> numerație <strong>de</strong>fineşte intervalul <strong>de</strong> valori posibile pentru cifrele<br />

ce pot fi folosite. În baza zece cifrele sunt {0, 1, …, 9}. <strong>Calcul</strong>atorul foloseşte baza 2<br />

pentru reprezentarea datelor.<br />

Forma generală pentru <strong>de</strong>terminarea valorii zecimale a unui număr în baza k<br />

reprezentat în virgulă fixă este:<br />

n−1<br />

∑<br />

Valoare = b ⋅k<br />

i=−m i<br />

i<br />

Valoare cifrei <strong>din</strong> poziția i este dată <strong>de</strong> bi. Avem n cifre la partea întreagă şi m cifre la<br />

partea zecimală.<br />

Exemplu: să se evalueze numărul (541.25)10, un<strong>de</strong> indicele 10 reprezintă baza.<br />

Avem, n=3, m=2 şi k=10.<br />

5 x 102 + 4 x 101 + 1 x 100 + 2 x 10 ‐1 + 5 x 10 ‐2 = (500)10 + (40)10 + (1)10 + (2/10)10 +<br />

(5/100)10 = (541.25)10<br />

Putem consi<strong>de</strong>ra un alt exemplu în baza 2 (1010.01)2 un<strong>de</strong>, n=4, m=2 şi k=2:<br />

1 x 23 + 0 x 22 + 1 x 21 + 0 x 20 + 0 x 2 ‐1 + 1 x 2 ‐2 = (8)10 + (0)10 + (2)10 + (0)10 +<br />

(0/2)10 + (1/4)10<br />

De aici rezultă o modalitate <strong>de</strong> conversie <strong>din</strong>tr‐o bază arbitrară în baza 10 folosind<br />

metoda polinomială.<br />

În această modalitate <strong>de</strong> reprezentare a numerelor în baza 2 introducem noțiunile<br />

<strong>de</strong> bit cel mai semnificativ (bitul <strong>din</strong> stânga prin convenție) respectiv bit cel mai<br />

puţin semnificativ (bitul <strong>din</strong> dreapta prin convenție).<br />

Conversii între baze<br />

Am văzut cum se face conversia <strong>din</strong> baza 2 în baza 10 (metoda polinomială).<br />

Conversia inversă <strong>din</strong> baza 10 în baza 2 este puțin mai complicată. Cea mai simplă<br />

metodă <strong>de</strong> conversie este să convertim partea întreagă şi partea zecimală separat.<br />

De exemplu vrem să convertim 23.375 <strong>din</strong> baza 10 în baza 2.<br />

Conversia părții întregi se face prin împărțiri succesive la baza în care se face<br />

conversia şi prin reținerea resturilor (metoda resturilor). Primul rest obținut<br />

reprezintă cifra cea mai puțin semnificativă a numărului întreg convertit. La a două<br />

împărțire <strong>de</strong>împărțitul este câtul <strong>de</strong> la împărțirea prece<strong>de</strong>ntă. Procesul se continuă<br />

până se obține câtul zero.<br />

17


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Putem converti orice număr <strong>din</strong> baza 10 în orice altă bază prin împărțiri succesive la<br />

baza în care se face conversia.<br />

Conversia părții fracționare se face prin metoda înmulțirii. Partea fracționară este<br />

mai mică <strong>de</strong>cât 1 iar prin înmulțirea cu 2 rezultatul va fi mai mic <strong>de</strong>cât 2 aşa că<br />

partea întreagă a acestui rezultat va fi chiar cifra cea mai semnificativă a părții<br />

fracționare a numărului în baza 2. La pasul următor se înmulțeşte cu 2 partea<br />

fracționară a rezultatului obținut la pasul prece<strong>de</strong>nt şi aşa mai <strong>de</strong>parte până<br />

obținem partea fracționară 0 sau până când obținem numărul <strong>de</strong> cifre dorit.<br />

Multiplicatorul este baza în care se face conversia.<br />

Rezultatul final va fi (23.375)10 = (10111.011)2<br />

Fracţii periodice<br />

Cu toate că această metodă <strong>de</strong> conversie funcționează pentru orice baze, se poate<br />

întâmpla ca să se piardă o parte <strong>din</strong> precizie în timpul conversiei. Nu toate fracțiile<br />

neperiodice <strong>din</strong> baza 10 au o reprezentarea neperiodică în baza 2. De exemplu<br />

(0.2)10 = (0.(0011))2. Aşadar 0.2 <strong>din</strong> baza 10 este o fracție periodică în baza 2.<br />

18


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

De ce se întâmplă aceasta? O fracție neperiodică <strong>din</strong> baza 10 se poate reprezenta sub<br />

forma i/10 k = i/(5 kx2 k) = j/2 k, un<strong>de</strong> j = i/5 k. Aşadar 5 k trebuie să fie un factor al lui i.<br />

Reprezentare binară – reprezentare zecimală<br />

Majoritatea calculatoarelor folosesc intern baza 2 pentru reprezentarea datelor şi<br />

operațiilor aritmetice. Totuşi există unele calculatoare care folosesc intern baza 10<br />

pentru reprezentarea datelor aşa că nu suferă <strong>de</strong> problema conversiilor prezentată<br />

mai sus. Metoda folosirii interne a bazei 10 nu este numai pentru evitarea erorilor<br />

ce pot apărea la conversii ci şi pentru a evita procesul <strong>de</strong> conversie la unitățile <strong>de</strong><br />

intrarea şi ieşire, proces pentru care se alocă <strong>de</strong>stul <strong>de</strong> mult timp.<br />

Reprezentări în binar, octal şi hexazecimal<br />

Numerele binare reflectă reprezentarea internă efectivă a numerelor în majoritatea<br />

sistemelor <strong>de</strong> calcul. Totuşi această modalitatea <strong>de</strong> scriere a numerelor are<br />

<strong>de</strong>zavantajul că numerele folosesc mult mai multe cifre <strong>de</strong>cât în alte baze <strong>de</strong><br />

numerație. Numerele în baza 2 se reprezintă ca şiruri lungi <strong>de</strong> 0 şi 1. Bazele 8 şi 16<br />

se folosesc mult mai <strong>de</strong>s pentru scrierea şi afişarea numerelor <strong>din</strong> reprezentarea<br />

internă pentru că aceste două numere reprezintă puteri ale lui 2 şi conversia <strong>din</strong><br />

baza 2 în aceste baze se poate face foarte repe<strong>de</strong> şi foarte simplu printr‐un proce<strong>de</strong>u<br />

pe care îl vom <strong>de</strong>scrie în continuare. Există o serie <strong>de</strong> avantaje practice pentru<br />

reprezentarea numerelor în aceste două baze.<br />

Cifrele bazei 8 sunt {0, 1, …, 7} iar cifrele bazei 16 sunt {0, 1, …, 9, A, B, C, D, E, F}<br />

un<strong>de</strong> A este o cifră care corespun<strong>de</strong> valorii zecimale 10, B lui 11, …, F lui 15.<br />

Baza 2 Baza 8 Baza 10 Baza 16<br />

0 0 0 0<br />

1 1 1 1<br />

19


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

10 2 2 2<br />

11 3 3 3<br />

100 4 4 4<br />

101 5 5 5<br />

110 6 6 6<br />

111 7 7 7<br />

1000 10 8 8<br />

1001 11 9 9<br />

1010 12 10 A<br />

1011 13 11 B<br />

1100 14 12 C<br />

1101 15 13 D<br />

1110 16 14 E<br />

1111 17 15 F<br />

Din tabel se ve<strong>de</strong> că avem nevoie <strong>de</strong> 3 biți pentru a reprezenta orice cifră <strong>din</strong> baza 8<br />

şi <strong>de</strong> 4 biți pentru a reprezenta orice cifră <strong>din</strong> baza 16. În general este nevoie <strong>de</strong> k<br />

biți pentru a reprezenta toate cifrele bazei 2 k.<br />

Pentru a converti un număr <strong>din</strong> baza 2 în baza 8 creăm grupe <strong>de</strong> câte 3 cifre binare<br />

începând <strong>de</strong> la punctul zecimal spre stânga şi înspre dreapta. Dacă ultima grupă nu<br />

este completă se adaugă zero. Fiecare astfel <strong>de</strong> triplet se converteşte direct în baza<br />

8, în cifra corespunzătoare.<br />

De exemplu:<br />

(10110)2 = (010)2(110)2 = (2)8(6)8 = (26)8.<br />

Pentru a converti în baza 16 se proce<strong>de</strong>ază analog numai că în loc <strong>de</strong> grupe <strong>de</strong> câte 3<br />

cifre binare se creează grupe <strong>de</strong> câte 4 cifre.<br />

Exemplu:<br />

(10110110)2 = (1011)2(0110)2 = (B)16(6)16 = (B6)16.<br />

Pentru a converti un număr <strong>din</strong>tr‐o bază x într‐o altă bază y (un<strong>de</strong> x şi y sunt diferite<br />

<strong>de</strong> 10) prima dată se face conversia <strong>din</strong> baza x în baza 10 (prin metoda polinomială)<br />

iar mai apoi <strong>din</strong> baza 10 în baza y prin metoda împărțirii pentru partea întreagă şi<br />

prin metoda înmulțirii pentru partea zecimală.<br />

Operaţiile aritmetice ale calculatorului<br />

Vom prezenta modul în care se efectuează adunările binare pentru că această<br />

operație este importantă în reprezentarea numerelor binare cu semn. Adunarea<br />

binară se face similar cu modul în care facem adunarea zecimală, aşa cum se ve<strong>de</strong> în<br />

figură:<br />

20


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Două numere A şi B sunt adunate <strong>de</strong> la dreapta la stânga, creând o sumă şi un<br />

„carry” în fiecare poziție. Din moment ce avem două cifre în momentul în care le<br />

adunăm avem patru situații diferite 0+0, 0+1, 1+0 şi 1+1. Pentru fiecare <strong>din</strong> aceste<br />

patru situații apare şi un „carry” a cărui valoare poate fi tot 0 sau 1 aşa că în total<br />

sunt opt situații ce trebuie consi<strong>de</strong>rate la adunare, situații ce sunt ilustrate în figură.<br />

Dacă avem la dispoziție opt biți pentru reprezentarea numerelor atunci numărul<br />

total <strong>de</strong> numere ce pot fi reprezentate este 256. Până acum am luat în calcul doar<br />

numerele pozitive dar evi<strong>de</strong>nt trebuie să putem reprezenta şi numere negative. În<br />

continuare vom trece în revistă patru moduri <strong>de</strong> reprezentare a numerelor cu semn<br />

în baza 2.<br />

Numere cu semn în virgulă fixă<br />

Cele patru moduri <strong>de</strong> reprezentare a numerelor cu semn în virgulă fixă sunt:<br />

magnitu<strong>din</strong>e cu semn, complement față <strong>de</strong> unu, complement față <strong>de</strong> doi şi notația cu<br />

exces. Vom prezenta fiecare <strong>din</strong> aceste moduri <strong>de</strong> reprezentare folosind numere<br />

întregi pentru exemple. De‐a lungul prezentării se poate consulta tabelul <strong>de</strong> mai jos<br />

în care apar reprezentările tuturor numerelor pe trei biți în toate cele patru moduri.<br />

Zecimal Fără Magn. Comp. 1 Comp. 2 Exces 4<br />

semn cu semn<br />

7 111 ‐ ‐ ‐ ‐<br />

6 110 ‐ ‐ ‐ ‐<br />

5 101 ‐ ‐ ‐ ‐<br />

4 100 ‐ ‐ ‐ ‐<br />

3 011 011 011 011 111<br />

2 010 010 010 010 110<br />

1 001 001 001 001 101<br />

+0 000 000 000 000 100<br />

‐0 ‐ 100 111 000 100<br />

‐1 ‐ 101 110 111 011<br />

21


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

‐2 ‐ 110 101 110 010<br />

‐3 ‐ 111 100 101 001<br />

‐4 ‐ ‐ ‐ 100 000<br />

1. Magnitu<strong>din</strong>e cu semn<br />

Este cea mai familiară reprezentare pentru noi întrucât o folosim la<br />

reprezentarea numerelor în baza 10. Semnul plus sau minus în stânga numărului<br />

indică dacă numărul este pozitiv sau negativ (+1210 sau ‐1210). În reprezentarea<br />

magnitu<strong>din</strong>e cu semn în baza 2, cel mai semnificativ bit este folosit ca bit <strong>de</strong><br />

semn. Bitul 0 semnifică număr pozitiv, iar bitul 1 semnifică număr negativ.<br />

Restul biților reprezintă valoarea absolută a numărului.<br />

Exemplu <strong>de</strong> reprezentare pe 8 biți:<br />

(+12)10 = (00001100)2<br />

(‐12)10 = (10001100)2<br />

Numărul negativ se formează prin simpla schimbare a bitului <strong>de</strong> semn <strong>din</strong> 0 în 1.<br />

Pentru zero există două reprezentări (zero pozitiv şi zero negativ): (00000000)2,<br />

(10000000)2<br />

Pe 8 biți există 256 secvențe binare diferite, iar <strong>din</strong> acestea doar 255 reprezintă<br />

numere distincte pentru că +0 şi ‐0 reprezintă acelaşi număr.<br />

2. Complement faţă <strong>de</strong> unu<br />

Operația complement față <strong>de</strong> unu este foarte simplu <strong>de</strong> efectuat: se convertesc<br />

toți biții <strong>din</strong> 0 în 1 şi <strong>din</strong> 1 în 0. Dacă bitul cel mai semnificativ este 0 numărul<br />

este pozitiv, dacă este 1 numărul este negativ, la fel ca şi la reprezentarea<br />

magnitu<strong>din</strong>e cu semn. Această operație <strong>de</strong> schimbare a biților <strong>din</strong> 0 în 1 şi <strong>din</strong> 0<br />

în 1 poartă numele <strong>de</strong> complementare. Aici avem următoarele reprezentări<br />

pentru valorile <strong>din</strong> exemplu prece<strong>de</strong>nt, tot pe 8 biți:<br />

(+12)10 = (00001100)2<br />

(‐12)10 = (11110011)2<br />

Şi aici avem tot două reprezentări pentru zero aşa că numărul <strong>de</strong> numere<br />

distincte reprezentabile pe 8 biți este tot 255. Acest mod <strong>de</strong> reprezentare nu este<br />

foarte <strong>de</strong>s folosit datorită faptului că este greu <strong>de</strong> efectuat operația <strong>de</strong><br />

comparație atunci când există două reprezentări pentru zero.<br />

3. Complement faţă <strong>de</strong> doi<br />

Se formează într‐un mod asemănător cu complementul față <strong>de</strong> unu dar în plus se<br />

mai adună 1. Dacă rezultă un „carry out” <strong>de</strong> la cel mai semnificativ bit atunci acel<br />

bit se ignoră. Şi în această reprezentare dacă bitul cel mai semnificativ este 0<br />

avem <strong>de</strong> a face cu un număr pozitiv, iar dacă este 1 avem <strong>de</strong> a face cu un număr<br />

negativ. Avantajul acestui mod <strong>de</strong> reprezentare este că aici nu avem două<br />

reprezentări pentru 0.<br />

(+0)10 = (00000000)2<br />

22


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Complementul față <strong>de</strong> unu este (11111111)2 iar adunarea lui 1 ne dă:<br />

(00000000)2 aşadar (‐0)10 = (00000000)2<br />

Fiind o singură reprezentare pentru zero, în complement față <strong>de</strong> doi putem<br />

reprezenta pe 8 biți 256 <strong>de</strong> valori distincte.<br />

Exemplu:<br />

(+12)10 = (00001100)2<br />

(‐12)10 = (11110100)2<br />

Numărul <strong>de</strong> numere pozitive reprezentabile este egal cu numărul <strong>de</strong> numere<br />

negative reprezentabile (dacă îl consi<strong>de</strong>răm pe zero număr pozitiv). Pe opt biți<br />

putem reprezenta în complement față <strong>de</strong> doi numerele cu semn <strong>din</strong> intervalul: [‐<br />

128, 127]. Pentru numărul ‐128 nu putem să găsim numărul pozitiv<br />

corespunzător. Dacă încercăm să facem acest lucru vom obține: (‐<br />

128)10=(10000000)2, prin complementare față <strong>de</strong> unu obținem (01111111)2 iar<br />

prin adunarea lui 1 obținem (10000000)2, adică numărul inițial.<br />

În calculatoarele convenționale această reprezentare se foloseşte cel mai<br />

frecvent.<br />

4. Reprezentare în exces<br />

Aici numărul este tratat ca număr fără semn, dar valoarea este „<strong>de</strong>plasată” prin<br />

scă<strong>de</strong>rea unei valori (excesul). Cea mai mică valoare <strong>din</strong> această reprezentare<br />

(cea care are toți biții zero) va fi opusul excesului iar celelalte secvențe <strong>de</strong> biți<br />

vor fi numerele în or<strong>din</strong>e crescătoare. În reprezentarea exces numărul este <strong>de</strong><br />

fapt suma <strong>din</strong>tre complementul față <strong>de</strong> doi al său şi o valoare numită „exces”.<br />

Acum vom reprezenta <strong>din</strong> nou valorile (+12)10 şi (‐12)10 pe opt biți folosind<br />

reprezentarea exces 128. Un umăr în forma exces 128 se obține prin adunarea<br />

lui 128 la numărul original şi prin crearea versiunii binare fără semn a lui.<br />

Pentru (+12)10<br />

<strong>Calcul</strong>ăm (128 + 12 = 140)10 şi rezultă secvența <strong>de</strong> biți (10001100)2.<br />

Pentru (‐12)10 calculăm (‐12 + 128 = 116)10 ceea ce în baza 2 este (01110100)2.<br />

Valoarea folosită pentru exces nu are o importanță numerică <strong>de</strong>osebită, ea fiind<br />

folosită doar pentru <strong>de</strong>plasarea reprezentării numerelor în complement față <strong>de</strong><br />

doi.<br />

Şi aici zero are o singură reprezentare, <strong>de</strong>oarece reprezentarea în exces este<br />

doar o versiune <strong>de</strong>plasată a reprezentării în complement față <strong>de</strong> doi.<br />

Pentru exemplul prece<strong>de</strong>nt, valoarea <strong>de</strong> exces este aleasă în aşa fel încât are<br />

reprezentarea în baza doi i<strong>de</strong>ntică cu cel mai mic număr negativ pe care vrem să<br />

îl reprezentăm, ceea ce are ca efect ca secvențele <strong>de</strong> biți să fie sortate crescător<br />

dacă sunt interpretate ca numere fără semn. Astfel cel mai mic număr negativ<br />

este (‐128)10 = (00000000)2 iar cel mai mare număr pozitiv pe opt biți este<br />

(+127)10=(11111111)2.<br />

Această reprezentare simplifică efectuarea comparațiilor între numere, <strong>de</strong>oarece<br />

secvențele <strong>de</strong> biți pentru numerele negative, interpretate ca valori fără semn,<br />

sunt mai mici <strong>de</strong>cât secvențele <strong>de</strong> biți pentru numerele pozitive interpretate <strong>de</strong><br />

asemenea ca valori fără semn.<br />

23


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Reprezentarea zecimală codificat binar (BCD – Binary Co<strong>de</strong>d Decimal)<br />

Numerele pot fi reprezentate folosind baza 10 dar codificarea să se facă în baza 2<br />

astfel încât fiecare cifră <strong>din</strong> baza 10 ocupă patru poziții binare. Aceasta se numeşte<br />

codificare BCD. Există 10 cifre şi 16 secvențe binare diferite <strong>de</strong> lungime 4 aşa că<br />

rezultatul este că 6 secvențe sunt nefolosite. În figură sunt patru cifre zecimale aşa<br />

că avem 10 4 = 10000 secvențe <strong>de</strong> biți vali<strong>de</strong> cu toate că există 2 16 = 65536 secvențe<br />

<strong>de</strong> biți distincte pe 16 biți.<br />

Cu toate că unele secvențe <strong>de</strong> biți sunt nefolosite, formatul BCD este folosit în<br />

calculatoare şi aplicații <strong>de</strong> bussines. În această reprezentare sunt mai puține<br />

probleme în reprezentarea fracțiilor neperiodice în baza 10 (fracții ce nu au o<br />

reprezentare neperiodică în baza 2). Nu este nevoie <strong>de</strong> a se face conversia la intrare<br />

<strong>din</strong> baza 10 în baza 2 şi nici la ieşire <strong>din</strong> baza 2 în baza 10.<br />

Efectuarea operațiilor aritmetice asupra numerelor BCD cu semn nu este foarte<br />

evi<strong>de</strong>ntă. Cu toate că suntem obişnuiți să folosim pentru baza 10 reprezentarea<br />

magnitu<strong>din</strong>e cu semn, în sistemele <strong>de</strong> calcul se foloseşte o altă metodă pentru<br />

reprezentarea numerelor în baza 10. În sistemul <strong>de</strong> numerație complement față <strong>de</strong><br />

9, numerele pozitive sunt reprezentate în BCD dar cifra cea mai <strong>din</strong> stânga este mai<br />

mică <strong>de</strong>cât 5 pentru numere pozitive şi mai mare sau egală <strong>de</strong>cât 5 pentru numerele<br />

negative. Numărul negativ în complement față <strong>de</strong> 9 se formează prin scă<strong>de</strong>rea <strong>din</strong> 9<br />

a fiecărei cifre. De exemplu, numărul +301 <strong>din</strong> baza 10 este reprezentat ca 0301<br />

(sau mai simplu 301) atât în complement față <strong>de</strong> 9 cât şi complement față <strong>de</strong> 10, aşa<br />

cum se ve<strong>de</strong> în figura <strong>de</strong> mai sus la punctul a). Complementul față <strong>de</strong> 9 negativ al lui<br />

este 9698 ceea ce se obține prin scă<strong>de</strong>rea <strong>din</strong> 9 a fiecărei cifre lui 0301 (figură<br />

punctul b)).<br />

Complementul față <strong>de</strong> 10 negativ se obține adunând valoare 1 la complementul față<br />

<strong>de</strong> 9 negativ, prin urmare reprezentarea în complement față <strong>de</strong> 10 a lui ‐301 este<br />

9698 +1 = 9699 (figură punctul c)). Pentru acest exemplu, intervalul <strong>de</strong> numere<br />

pozitive ce se pot reprezenta este [0, 4999] iar numerele negative sunt [5000, 9999].<br />

Reprezentarea numerelor în virgulă mobilă<br />

În reprezentarea numerelor cu virgulă fixă numărul <strong>de</strong> cifre <strong>din</strong> partea stângă,<br />

respectiv <strong>din</strong> partea dreaptă a punctului zecimal este fixat. În virgulă fixă e nevoie<br />

<strong>de</strong> multe cifre pentru a reprezenta un interval <strong>de</strong> valori care să aibă o importanță<br />

practică. De exemplu, un calculator care poate reprezenta numere până la un trilion<br />

24


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

în virgulă are nevoie <strong>de</strong> cel puțin 40 <strong>de</strong> biți în partea stângă a virgulei <strong>de</strong>oarece 2 40<br />

este aproximativ 10 12 . Dacă acelaşi calculator vrea să reprezinte în virgulă fixă 1/un<br />

trilion atunci are nevoie 40 <strong>de</strong> cifre binare în partea dreaptă a punctului zecimal,<br />

ceea ce duce la un total <strong>de</strong> 80 <strong>de</strong> cifre binare.<br />

În practică apar numere mult mai mari şi mult mai mici <strong>de</strong>cât cele menționate mai<br />

sus, ceea ce măreşte şi mai mult resursele ce trebuie să le aloce calculatorul pentru<br />

reprezentarea lor. Nu numai că trebuie alocate mai multe resurse acestor<br />

reprezentări <strong>de</strong> numere dar şi calculele se vor efectua mai lent dacă folosim<br />

reprezentări cu atât <strong>de</strong> multe cifre binare. Totuşi, atunci când lucrăm cu numere<br />

foarte mari, nu avem nevoie <strong>de</strong> o precizie foarte mare iar când lucrăm cu numere<br />

foarte mici nu avem nevoie <strong>de</strong> intervale mari. Putem mări eficiența prin reținerea<br />

doar a preciziei <strong>de</strong> care e nevoie.<br />

Interval şi precizie în reprezentarea numerelor în virgulă mobilă<br />

Reprezentarea în virgulă mobilă permite reprezentarea unui interval mult mai mare<br />

<strong>de</strong> numere cu un număr mai mic <strong>de</strong> cifre prin separarea cifrelor folosite pentru<br />

precizie <strong>de</strong> cifrele folosite pentru interval.<br />

Exemplu: Reprezentarea în virgulă mobilă în baza 10 a numărului lui Avogadro:<br />

+6,023x10 23 .<br />

Aici, intervalul este reprezentat <strong>de</strong> o putere a lui 10 iar precizia este reprezentată <strong>de</strong><br />

numărul în virgulă fixă 6,023. În acest context numărul în virgulă fixă se numeşte<br />

mantisă sau significand al numărului. Astfel, un număr în virgulă mobilă poate fi<br />

caracterizat printr‐un triplet <strong>de</strong> numere: semn, exponent şi mantisă.<br />

Intervalul este <strong>de</strong>terminat în primul rând <strong>de</strong> numărul <strong>de</strong> cifre <strong>din</strong> exponent (aici se<br />

folosesc două) şi <strong>de</strong> baza folosită (aici este baza 10) iar precizia este <strong>de</strong>terminată în<br />

primul rând <strong>de</strong> numărul <strong>de</strong> cifre <strong>din</strong> mantisă (aici sunt patru). Astfel, tot numărul<br />

poate fi reprezentat prin semn şi şase cifre, două pentru exponent şi patru pentru<br />

mantisă. În figura <strong>de</strong> mai jos este prezentat modul în care tripletul semn, exponent şi<br />

mantisă ar putea fi formatat în calculator.<br />

Această modalitate <strong>de</strong> grupare a celor trei elemente vom ve<strong>de</strong>a că este utilă în<br />

momentul în care se compară două numere reprezentate în virgulă mobilă. Punctul<br />

zecimal nu este stocat pentru că acesta întot<strong>de</strong>auna este în aceeaşi poziție în cadrul<br />

mantisei (punctul zecimal este doar în mintea programatorului).<br />

Dacă avem nevoie <strong>de</strong> un interval mai mare şi suntem dispuşi să sacrificăm pentru<br />

aceasta precizia, atunci putem folosi doar trei cifre pentru mantisă iar pentru<br />

25


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

exponent, în loc <strong>de</strong> două cifre să folosim trei. În felul acesta mărim intervalul fără să<br />

mărim numărul <strong>de</strong> cifre folosite pentru reprezentarea numărului. O altă modalitate<br />

<strong>de</strong> mărire a intervalului este <strong>de</strong> a mări baza ceea ce duce şi la mărirea preciziei<br />

pentru numerele mici dar şi la scă<strong>de</strong>rea preciziei pentru numerele mari.<br />

Compromisul între interval şi precizie este un avantaj important în reprezentarea<br />

numerelor în virgulă mobilă, dar precizia redusă poate provoca în anumite situații<br />

neplăceri.<br />

Normalizare şi bitul ascuns<br />

O problemă la reprezentarea numerelor în virgulă mobilă este că acelaşi număr<br />

poate fi reprezentat în mai multe moduri, ceea ce face ca operațiile <strong>de</strong> comparație şi<br />

cele aritmetice să fie dificile.<br />

De exemplu:<br />

3584.1 x 10 0 = 3.5841 x 10 3 = .35841 x 10 4 .<br />

Pentru a evita această problemă a reprezentării multiple, numerele în virgulă fixă<br />

sunt păstrate în forma normalizată. Punctul zecimal este <strong>de</strong>plasat la stânga sau la<br />

dreapta astfel încât să fie în stânga celei mai semnificative cifre, iar exponentul este<br />

ajustat în consecință. În exemplul <strong>de</strong> mai sus ultima formă a numărului este forma<br />

normalizată. Numărul zero nu poate fi reprezentat astfel, aşa că pentru zero se face<br />

o excepție: toate cifrele <strong>din</strong> mantisă sunt egale cu 0.<br />

Dacă mantisa este reprezentată în baza 2 atunci evi<strong>de</strong>nt vom avea cifra cea mai<br />

semnificativă a numărului 1 (cifra cea mai <strong>din</strong> stânga). Majoritatea formatelor în<br />

virgulă mobilă (inclusiv IEEE 754) nu salvează acest bit. Această cifră nu trebuie<br />

stocată pentru că se subînțelege că este acolo. Consecința este că avem un bit<br />

suplimentar pentru precizie. Acest bit cel mai semnificativ se numeşte bitul ascuns.<br />

De exemplu, dacă mantisa în formă normalizată este .11010, atunci e suficient să se<br />

stocheze 1010. Bitul cel mai semnificativ (<strong>din</strong> stânga) este trunchiat.<br />

Reprezentarea numerelor în virgulă mobilă în calculator<br />

Vom proiecta un format simplu <strong>de</strong> stocare a numerelor în virgulă mobilă pentru a<br />

ilustra factorii importanți care intervin. Pentru mantisă vom folosi o reprezentare în<br />

magnitu<strong>din</strong>e cu semn, cu un bit pentru semn şi trei cifre hexazecimale pentru<br />

mantisă. Exponentul va fi reprezentat ca număr pe 3 biți în exces‐4 cu baza 16.<br />

Forma normalizată a numărului are punctul zecimal în stânga celor trei cifre<br />

hexazecimale. Biții vor fi combinați în felul următor: bitul <strong>de</strong> semn este bitul <strong>din</strong><br />

stânga, urmat <strong>de</strong> 3 biți pentru exponent, urmați <strong>de</strong> cele trei cifre hexazecimale ale<br />

mantisei. Baza şi punctul zecimal nu vor fi stocate în această formă.<br />

Motivul pentru care am ales această reprezentare este ca să se poată efectua cu<br />

uşurință operațiile <strong>de</strong> comparație în forma împachetată (egalitate, inegalitate, mai<br />

mic sau egal, mai mare sau egal).<br />

26


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Bitul <strong>de</strong><br />

semn<br />

Pentru a‐l reprezenta pe (358)10 în acest format procedăm în felul următor:<br />

Primul pas este convertirea numărului în virgulă fixă <strong>din</strong> baza originală într‐un<br />

număr în virgulă fixă în baza țintă. Conversia numărului <strong>din</strong> baza 10 în baza 16 se<br />

face astfel:<br />

Câtul Restul<br />

358/16 = 22 6<br />

22/16 = 1 6<br />

1/16 = 0 1<br />

Astfel, (358)10 = (166)16. Următorul pas este convertirea numărului în virgulă fixă în<br />

număr în virgulă mobilă:<br />

(166)16 = (166.)16 x 16 0 . (Expresia 16 0 ne sugerează faptul că avem <strong>de</strong> a face cu baza<br />

16, pe când numărul 16 trebuie interpretat în baza 10 – <strong>de</strong> fapt (16 0)10 = (10 0)16).<br />

Următorul pas este normalizarea numărului:<br />

(166.)16 x 16 0 = (.166)16 x 16 3 .<br />

Ultimul pas este completarea biților numărului. Numărul este pozitiv aşa că punem<br />

bitul 0 ca bit <strong>de</strong> semn. Exponentul este 3, dar îl reprezentăm în exces 4, aşa că<br />

secvența <strong>de</strong> biți pentru exponent se calculează în felul următor:<br />

011 (+3)10<br />

Exces 4 + 100 (+4)10<br />

Exponent exces 4= 111<br />

În final, fiecare cifră în baza 16 este reprezentată în binar ca: 1=0001, 6=0110,<br />

6=0110. Secvența <strong>de</strong> biți va fi:<br />

Bitul <strong>de</strong><br />

semn (+)<br />

Trei biţi<br />

pentru<br />

exponent<br />

0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0<br />

3<br />

Exponentul<br />

Punctul zecimal<br />

1 6 6<br />

27<br />

Trei cifre în baza 16<br />

Partea zecimală


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Punctul zecimal nu este reprezentat explicit în secvența <strong>de</strong> biți. Prezența acestuia<br />

este sub‐înțeleasă. În memoria calculatorului secvența <strong>de</strong> biți va fi:<br />

0111000101100110, fără spații între biții consecutivi, aşa cum apar în figură.<br />

Folosirea reprezentării exces 4 pentru exponent în loc <strong>de</strong> complement față <strong>de</strong> 2<br />

simplifică operațiile <strong>de</strong> adunare şi scă<strong>de</strong>re a numerelor în virgulă mobilă. Pentru a<br />

aduna sau a scă<strong>de</strong>a două numere normalizate reprezentate în virgulă mobilă,<br />

exponentul mai mic trebuie mărit la exponentul mai mare (aceasta păstrează<br />

intervalul). Astfel, numărul mai mic nu va mai fi în formă normalizată. Pentru a<br />

<strong>de</strong>termina care exponent este mai mare, trebuie să tratăm secvența <strong>de</strong> biți ca un<br />

număr fără semn şi să facem comparația. Folosind reprezentarea exces 4, cel mai<br />

mic exponent este ‐4, adică 000. Cel mai mare exponent este +3, adică 111. Restul<br />

secvențelor <strong>de</strong> biți, pentru ‐3, ‐2, ‐1, 0, 1, 2 vor fi 001, 010, 011, 100, 101 şi 110.<br />

Dacă avem o secvență <strong>de</strong> biți pentru (358)10, împreună cu o <strong>de</strong>scriere a<br />

reprezentării în virgulă mobilă, putem <strong>de</strong>termina cu uşurință numărul. Bitul <strong>de</strong><br />

semn este 0, ceea ce înseamnă că numărul este pozitiv. Exponentul în forma fără<br />

semn este (+7)10, dar <strong>din</strong> moment ce folosim exces 4, trebuie să scă<strong>de</strong>m 4 <strong>din</strong> el şi<br />

obținem exponentul real (+7‐4 =+3)10. Fracția se grupează în cifre hexazecimale <strong>de</strong><br />

câte 4 biți fiecare, obținând (0166)16. Concluzionând (+.166 x 16 3)16 = (358)10.<br />

Acum, să presupunem că la partea fracționară sunt permişi doar 10 biți, în loc <strong>de</strong> 12<br />

cum era mai sus. Întrebarea este cum se schimbă reprezentarea. O variantă ar fi să<br />

rotunjim fracția şi să ajustăm exponentul pe măsură. O altă variantă, pe care o şi<br />

<strong>de</strong>scriem în continuare, este să trunchiem biții cei mai puțin semnificativi prin<br />

eliminarea lor şi astfel evităm ajustarea exponentului, aşa că numărul pe care îl<br />

reprezentăm este <strong>de</strong> fapt:<br />

0 1 1 1 0 0 0 1 0 1 1 0 0 1 x x<br />

Bitul <strong>de</strong><br />

semn (+)<br />

3<br />

Exponentul<br />

1 6 4<br />

Dacă biții lipsă sunt interpretați ca fiind 0, atunci această secvență <strong>de</strong> biți reprezintă<br />

(.164 x 16 3)16.<br />

Această metodă <strong>de</strong> trunchiere produce o eroare neuniformă, <strong>din</strong> moment ce valorile<br />

00, 01, 10, 11 sunt toate tratate ca 0, aşa că eroarea este în intervalul [0, (.003)16].<br />

Indiferent ce format folosim pentru reprezentarea numerelor în virgulă mobilă, acel<br />

format trebuie cunoscut <strong>de</strong> toți cei care vor să stocheze respectiv să obțină valorile<br />

reprezentate. IEEE (Institute of Electrica land Electronics Engineers), a standardizat<br />

formatele <strong>de</strong> reprezentare în virgulă mobilă. Standardul IEEE 754 pentru<br />

reprezentarea numerelor în virgulă mobilă este standardul universal acceptat şi<br />

folosit. Acest standard îl vom prezenta într‐un paragraf ulterior.<br />

28<br />

Partea zecimală


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Erori în reprezentarea numerelor în virgulă mobilă<br />

Faptul că precizia finită introduce erori înseamnă că ar trebui să analizăm cât <strong>de</strong><br />

mare este acea eroare (prin eroare înțelegem distanța <strong>din</strong>tre două numere<br />

consecutive reprezentabile), şi dacă eroarea este acceptabilă pentru aplicația<br />

noastră. De exemplu, o sursă potențială <strong>de</strong> erori este reprezentarea numărului un<br />

milion ca număr real în virgulă mobilă şi scă<strong>de</strong>rea <strong>din</strong> el <strong>de</strong> un milion <strong>de</strong> ori a valorii<br />

1. La sfârşit poate să rămână tot un milion dacă eroarea este mai mare <strong>de</strong>cât 1.<br />

Pentru a caracteriza eroarea, intervalul şi precizia folosim următoarele notații:<br />

b baza<br />

s numărul <strong>de</strong> cifre semnificative ale părții fracționare<br />

M cel mai mare exponent<br />

m cel mai mic exponent<br />

Numărul <strong>de</strong> cifre semnificative ale părții fracționare este reprezentat <strong>de</strong> s, ceea ce<br />

este diferit <strong>de</strong> numărul <strong>de</strong> biți <strong>din</strong> partea fracționară dacă baza este diferită <strong>de</strong> 2 (<strong>de</strong><br />

ex. în baza 16 e nevoie <strong>de</strong> 4 biți pentru reprezentarea fiecărei cifre). Dacă baza este<br />

2 k atunci e nevoie <strong>de</strong> k biți pentru reprezentarea fiecărei cifre. Folosirea unui bit 1<br />

ascuns măreşte valoarea lui s cu 1 cu toate că nu măreşte numărul <strong>de</strong> numere<br />

reprezentabile. În exemplul prece<strong>de</strong>nt, există trei cifre semnificative la partea<br />

fracționară a numărului în baza 16 şi există 12 biți ce formează cele trei cifre. Există<br />

trei biți în exponentul reprezentat în exces 4, ceea ce permite reprezentarea oricărui<br />

exponent <strong>din</strong> intervalul [‐2 2, 2 2‐1]. Pentru acest caz, b = 16, s = 3, M = 3 şi m = ‐4.<br />

În reprezentarea numerelor în virgulă mobilă sunt cinci caracteristici pe care le<br />

luăm în consi<strong>de</strong>rare: numărul <strong>de</strong> numere reprezentabile, numerele cu cea mai mare<br />

respectiv cea mai mică mantisă şi dimensiunea celei mai mari respectiv a celei mai<br />

mici diferențe <strong>din</strong>tre două numere succesive.<br />

Numărul <strong>de</strong> numere reprezentabile poate fi <strong>de</strong>terminat după formula <strong>de</strong> mai jos:<br />

Bitul <strong>de</strong> semn poate lua două valori (A). Numărul total <strong>de</strong> exponenți este indicat la<br />

poziția (B). Nu toate secvențele <strong>de</strong> biți sunt vali<strong>de</strong> în toate reprezentările.<br />

Standardul IEEE 754 pentru reprezentarea numerelor reale în virgulă mobilă, are<br />

cel mai mic exponent ‐126 cu toate că exponentul, fiind reprezentat pe 8 biți, poate<br />

29


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

reprezenta numerele negative până la ‐128. Secvențele <strong>de</strong> biți ce nu pot fi folosite<br />

sunt rezervate pentru numere speciale: zero şi infinit.<br />

Prima cifră a părții fracționare poate lua orice valoare cu excepția lui zero, în<br />

reprezentare normalizată (cu excepția utilizării bitului ascuns) aşa cum este indicat<br />

<strong>de</strong> valoarea (b­1) <strong>din</strong> poziția (C). Restul cifrelor părții fracționare pot lua orice<br />

valoare <strong>din</strong> cele b valori ale cifrelor bazei aşa cum este indicat <strong>de</strong> valoarea b s­1 <strong>din</strong><br />

poziția (D). Dacă se foloseşte bitul ascuns, atunci poziția C este eliminată şi poziția D<br />

este înlocuită cu b s . Avem nevoie şi <strong>de</strong> o reprezentare pentru zero şi pentru asta<br />

apare şi poziția (E).<br />

Cel mai mic număr reprezentabil are cel mai mic exponent şi cea mai mică formă<br />

normalizată diferită <strong>de</strong> zero. Prima cifră trebuie să fie diferită <strong>de</strong> zero. Şi, <strong>din</strong><br />

moment ce 1 este cea mai mică valoare ce poate fi plasată rezultă că cea mai mică<br />

valoare reprezentabilă este b ­1 . Numărul cu cea mai mică magnitu<strong>din</strong>e este atunci:<br />

b mb ­1 = b m­1. Numărul cu cea mai mare magnitu<strong>din</strong>e are cel mai mare exponent şi cea<br />

mai mare parte fracționară adică: b M (1­b ­s ).<br />

Ca exemplu, să consi<strong>de</strong>răm reprezentarea în virgulă mobilă în care avem un bit <strong>de</strong><br />

semn, un exponent pe 2 biți reprezentat în exces 2 şi o parte fracționară în baza 2<br />

reprezentată pe 3 biți în formă normalizată în care bitul cel mai semnificativ este<br />

vizibil (adică nu este ascuns). Reprezentarea lui zero este secvența <strong>de</strong> biți 000000.<br />

În figura <strong>de</strong> mai jos sunt prezentate toate numerele ce pot fi reprezentate în acest<br />

format.<br />

Se observă că între 0 şi primul număr reprezentabil este o distanță <strong>de</strong>stul <strong>de</strong> mare;<br />

aceasta se întâmplă pentru că reprezentarea normalizată nu suportă secvențe <strong>de</strong><br />

biți ce corespund numerelor <strong>din</strong>tre zero şi primul număr reprezentabil.<br />

Cel mai mic număr reprezentabil este cel pentru care exponentul şi partea<br />

fracționară au cele mai mici valori. Cel mai mic exponent este ‐2 şi cea mai mică<br />

parte fracționară normalizată este (.100)2. Cel mai mic număr reprezentabil este b m<br />

x b ­1 = b m­1 =2 ‐2‐1 =1/8.<br />

Cel mai mare număr reprezentabil este cel pentru care exponentul şi partea<br />

fracționară au cele mai mari valori. Cea mai mare parte fracționară este cea pentru<br />

care toți biții sunt egali cu 1, adică număr care este cu 2 ‐3 mai mic <strong>de</strong>cât 1, <strong>din</strong><br />

moment ce are trei cifre la partea fracționară. Cel mai mare număr reprezentabil<br />

este b M x (1‐b ­s ) = 2 1 x (1 – 2 ‐3 ) = 7/4.<br />

30


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Cea mai mică diferență <strong>din</strong>tre două numere reprezentabile succesive se obține<br />

atunci când exponentul are cea mai mică valoare şi cel mai semnificativ bit al părții<br />

fracționare se modifică, adică b m x b ­s = b m­s = 2 ‐2‐3 = 1/32.<br />

Cea mai mare diferență <strong>din</strong>tre două numere reprezentabile succesive se obține<br />

atunci când exponentul are cea mai mare valoare iar cel mai semnificativ bit al părții<br />

fracționare se modifică, adică b M x b ­s = b M­s = 2 1‐3 = ¼.<br />

Numărul <strong>de</strong> secvențe <strong>de</strong> biți care reprezintă numere vali<strong>de</strong> este mai mic <strong>de</strong>cât<br />

numărul total <strong>de</strong> secvențe <strong>de</strong> biți, datorită normalizării. Numărul <strong>de</strong> numere<br />

reprezentabile este format <strong>din</strong> cinci părți (aşa cum am discutat mai sus). La<br />

stabilirea acestui număr se ține cont <strong>de</strong> bitul <strong>de</strong> semn, exponentul, prima cifră<br />

semnificativă, restul cifrelor şi secvența <strong>de</strong> biți pentru zero. Aceasta se calculează<br />

după formula:<br />

2 x ((M ­ m) + 1) x (b ‐ 1) x b s‐1 + 1 = 2 x (1 ‐ ( ‐ 2) + 1) x (2 ‐ 1) x 2 3‐1 + 1 = 33.<br />

Se observă că diferențele <strong>din</strong>tre două numere succesive sunt mici pentru numere<br />

mici şi sunt mari pentru numerele mari. Eroarea relativă este aproximativ aceeaşi<br />

pentru toate numerele. Dacă facem raportul <strong>din</strong>tre diferența <strong>din</strong>tre două numere<br />

mari şi un număr mare respectiv raportul <strong>din</strong>tre diferența <strong>din</strong>tre două numere mici<br />

şi un număr mic vom observa că rapoartele sunt aceleaşi.<br />

Distanţă mare<br />

Număr mare<br />

Distanţă mică<br />

Număr mic<br />

Aici s‐a folosit reprezentarea pentru un „număr mic”, în locul reprezentării pentru<br />

cel mai mic număr <strong>de</strong>oarece diferența <strong>din</strong>tre zero şi primul număr reprezentabil<br />

este un caz particular.<br />

Exemplu:<br />

Să se convertească (9.375 x 10 ‐2)10 în baza 2 notație ştiințifică. Rezultatul trebuie să<br />

aibă forma x.yy x 2 z .<br />

Prima dată convertim numărul <strong>din</strong> reprezentarea în virgulă mobilă în reprezentarea<br />

în virgulă fixă prin mutarea punctului zecimal cu două poziții la dreapta şi obținem:<br />

0.09375. Mai apoi convertim numărul <strong>din</strong> baza zece reprezentare virgulă fixă în<br />

baza 2 reprezentare virgulă fixă prin metoda înmulțirii:<br />

31


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

.09375 x 2 = 0.1875<br />

.1875 x 2 = 0.375<br />

.375 x 2 = 0.75<br />

.75 x 2 = 1.5<br />

.5 x 2 = 1.0<br />

Astfel (.09375)10 = (.00011)2.<br />

La sfârşit convertim numărul <strong>din</strong> reprezentarea în virgulă mobilă în forma<br />

normalizată în baza 2: .00011 = .00011 x 2 0 = 1.1 x 2 ‐4.<br />

Standardul IEEE 754 pentru reprezentarea în virgulă mobilă<br />

Există numeroase moduri <strong>de</strong> reprezentare a numerelor în virgulă mobilă, o parte<br />

<strong>din</strong> acestea fiind trecute <strong>de</strong>ja în revistă. Fiecare reprezentare are propriile<br />

caracteristici în ceea ce priveşte intervalul, precizia şi numărul <strong>de</strong> numere<br />

reprezentabile. Pentru a îmbunătăți portabilitatea software‐ului şi pentru a asigura<br />

o uniformitatea a calculelor cu numere reprezentate în virgulă mobilă, a fost<br />

<strong>de</strong>zvoltat standardul IEEE 754 pentru reprezentarea numerelor binare în virgulă<br />

mobilă (în 1985). Toate arhitecturile noi oferă suport pentru acest standard.<br />

Standardul IEEE 754, aşa cum îl vom <strong>de</strong>scrie în continuare, trebuie să fie suportat <strong>de</strong><br />

sistemul <strong>de</strong> calcul şi nu <strong>de</strong> întreg hardware‐ul. Aşadar se poate folosi o combinație<br />

hardware‐software pentru a respecta standardul.<br />

Există două formate principale în acest standard: precizie simplă şi precizie dublă.<br />

În figura <strong>de</strong> mai jos se prezintă schematic cele două formate:<br />

Formatul în simplă precizie ocupă 32 <strong>de</strong> biți, iar formatul în dublă precizie ocupă 64<br />

<strong>de</strong> biți.<br />

Bitul <strong>de</strong> semn este bitul cel mai semnificativ (bitul <strong>din</strong> stânga). Urmează exponentul<br />

pe 8 biți reprezentat în exces 127 pentru care secvențele <strong>de</strong> biți 00000000<br />

respectiv 11111111 sunt rezervate pentru cazuri speciale. Pentru formatul în dublă<br />

precizie exponentul se reprezintă pe 11 biți în exces 1023. Urmează partea<br />

fracționară reprezentată pe 23 <strong>de</strong> biți şi există un bit ascuns în stânga punctului<br />

zecimal aşa că rezultă un total <strong>de</strong> 24 <strong>de</strong> biți pentru significand. La formatul în dublă<br />

32


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

precizie <strong>de</strong> asemenea este un bit ascuns ceea ce duce la un total <strong>de</strong> 53 <strong>de</strong> biți pentru<br />

significand. Pentru ambele formate, numerele sunt normalizate.<br />

Există cinci tipuri <strong>de</strong> numere ce pot fi reprezentate: numere normalizate diferite <strong>de</strong><br />

zero, „zero pur‐curat” reprezentat prin secvența 00000000 în exponent şi toți biții<br />

egali cu zero la partea fracționară. Bitul <strong>de</strong> semn poate fi 0 sau 1 ceea ce înseamnă că<br />

există două reprezentări pentru zero +0 şi ‐0.<br />

Infinit are o reprezentare în care exponentul conține secvența <strong>de</strong> biți rezervată<br />

11111111 iar partea fracționară conține doar zerouri, bitul <strong>de</strong> semn fiind 0 sau 1.<br />

Infinit este util atunci când trebuie tratate situații <strong>de</strong> <strong>de</strong>păşire sau când trebuie să<br />

dăm o reprezentare validă unui număr diferit <strong>de</strong> zero ce a fost împărțit la zero. Dacă<br />

zero este împărțit la zero sau infinit este împărțit la infinit rezultatul este ne<strong>de</strong>finit.<br />

Aceasta se reprezintă prin formatul NaN (Not a Number) în care exponentul conține<br />

secvența <strong>de</strong> biți rezervată 11111111, iar significandul este diferit <strong>de</strong> zero în timp ce<br />

bitul <strong>de</strong> semn poate fi 0 sau 1. NaN poate fi produs şi prin încercarea <strong>de</strong> a extrage<br />

rădăcina pătrată <strong>din</strong> ‐1.<br />

Aşa cum se întâmplă cu toate formele normalizate, există o diferență mare între zero<br />

şi primul număr reprezentabil. Folosirea reprezentării <strong>de</strong>normalizate („zero<br />

murdar”) permite reprezentarea unor numere <strong>din</strong> acest interval (cuprins între zero<br />

şi primul număr reprezentabil). Bitul <strong>de</strong> semn poate fi 0 sau 1, exponentul conține<br />

secvența <strong>de</strong> biți rezervată 00000000 ceea ce reprezintă ‐126 pentru precizie simplă<br />

şi ‐1022 pentru preciziei dublă, iar significandul conține secvența <strong>de</strong> biți efectivă<br />

pentru magnitu<strong>din</strong>ea numărului. Aici nu există bit ascuns. Reprezentarea<br />

<strong>de</strong>normalizată nu este o reprezentare nenormalizată. Diferența este că există o<br />

singură reprezentare pentru fiecare număr <strong>de</strong>normalizat şi o infinitate <strong>de</strong><br />

reprezentări pentru forma nenormalizată.<br />

În figura <strong>de</strong> mai jos dăm câteva exemple <strong>de</strong> numere reprezentate în virgulă mobilă.<br />

Exemplele <strong>de</strong> la (a) la (h) sunt exemple <strong>de</strong> numere reprezentate cu formatul precizie<br />

simplă, iar exemplu (i) este reprezentarea unui număr în precizie dublă.<br />

33


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

În exemplul (a) signifcandul este 1.101 dar este reprezentată explicit doar partea<br />

fracționară 101. Exemplu (b) foloseşte cel mai mic exponent (precizie simplă) care<br />

este ‐126 iar exemplul (c) foloseşte cel mai mare exponent (precizie simplă) care<br />

este 127.<br />

Exemplele (d) şi (e) ilustrează două reprezentări pentru zero. Exemplul (f) prezintă<br />

o secvență <strong>de</strong> biți pentru reprezentarea lui infinit. Exemplul (g) este un număr<br />

<strong>de</strong>normalizat. Exemplu (h) prezintă reprezentarea lui NaN care poate fi pozitiv sau<br />

negativ. Ultimul exemplu (i) prezintă reprezentarea lui 2 ‐128 în dublă precizie.<br />

Pe lângă reprezentările în precizie simplă şi dublă există şi formatele single<br />

exten<strong>de</strong>d şi double exten<strong>de</strong>d. Formatele extinse nu sunt vizibile utilizatorului, dar<br />

acestea sunt folosite pentru a reține un număr mai mare <strong>de</strong> precizie internă la<br />

efectuarea calculelor pentru a reduce efectul <strong>de</strong> eroare <strong>de</strong> rotunjire. Formatele<br />

extinse măresc lărgimea exponenților şi a părții fracționare cu un număr <strong>de</strong> biți ce<br />

poate varia <strong>de</strong> la o implementare la alta. De exemplu, formatul single exten<strong>de</strong>d<br />

adaugă cel puțin trei biți la exponent şi opt biți la partea fracționară. Formatul<br />

double exten<strong>de</strong>d are <strong>de</strong> regulă 80 <strong>de</strong> biți cu 15 biți la exponent şi 64 <strong>de</strong> biți la partea<br />

fracționară.<br />

O implementare a IEEE 754 trebuie să furnizeze cel puțin precizie simplă, celelalte<br />

formate sunt opționale. Rezultatul oricărei operații cu numere în virgulă mobilă<br />

trebuie să fie corect până la jumătate <strong>de</strong> bit <strong>din</strong> bitul cel mai puțin semnificativ al<br />

părții fracționare. Aceasta înseamnă că în timpul operațiilor trebuie reținuți câțiva<br />

biți suplimentari pentru precizie (numiți biți gardă) şi trebuie să fie o metodă<br />

potrivită pentru rotunjirea rezultatului intermediar la numărul <strong>de</strong> biți al fracției.<br />

Există patru moduri <strong>de</strong> rotunjire în standardul IEEE 754. Unul <strong>din</strong> moduri<br />

rotunjeşte înspre zero, altul înspre infinit iar altul rotunjeşte înspre minus infinit.<br />

Modul implicit rotunjeşte la cel mai apropiat număr reprezentabil. În jumătate <strong>din</strong><br />

cazuri rotunjirea se va face la numărul pentru care cifra cea mai puțin semnificativă<br />

este pară. De exemplu, 1.01101 se rotunjeşte la 1.0110 pe când 1.01111 se<br />

rotunjeşte la 1.1000.<br />

Coduri <strong>de</strong> caractere<br />

Spre <strong>de</strong>osebire <strong>de</strong> numerele reale, numărul <strong>de</strong> caractere este finit. Un set <strong>de</strong><br />

caractere complet poate fi reprezentat cu ajutorul unui număr mic <strong>de</strong> biți/caracter.<br />

În continuare vom <strong>de</strong>scrie trei <strong>din</strong>tre cele mai obişnuite reprezentări pentru<br />

caractere: ASCII, EBCDIC şi Unico<strong>de</strong>.<br />

Setul <strong>de</strong> caractere ASCII<br />

ASCII = American Standard Co<strong>de</strong> for Information Interchange este prezentat în<br />

figura <strong>de</strong> mai jos.<br />

Este un cod pe şapte biți ceea ce permite reprezentarea a 2 7 =128 <strong>de</strong> caractere<br />

diferite. Pozițiile <strong>de</strong> la 00 la 1F şi poziția 7F sunt caractere speciale <strong>de</strong> control<br />

34


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

folosite pentru transmisii, controlul tipăririi şi alte scopuri care nu au legătură cu<br />

textul obişnuit. Restul caracterelor sunt toate caractere afişabile: litere, cifre,<br />

semne <strong>de</strong> punctuație, spațiu. Cifrele <strong>de</strong> la 0 la 9 apar una după alta, la fel şi<br />

literele mari, respectiv mici. Această organizare simplifică manipularea<br />

caracterelor. Pentru a schimba reprezentarea unei cifre în valoarea ei numerică<br />

trebuie să scă<strong>de</strong>m <strong>din</strong> codul cifrei valoarea hexazecimal (30)16. Pentru a obține<br />

codul literei mici atunci când ştim codul literei mari corespunzătoare trebuie să<br />

adunăm la codul literei mici valoarea hexazecimal (20)16. Caracterul care<br />

reprezintă litera A are codul (41)16, iar caracterul care reprezintă litera a are<br />

codul (61)16.<br />

Setul <strong>de</strong> caractere EBCDIC<br />

Problema cu setul <strong>de</strong> caractere ASCII este că pot fi reprezentate doar 128 <strong>de</strong><br />

caractere, ceea ce este o limitare <strong>de</strong>stul <strong>de</strong> drastică pentru multe tastaturi care<br />

au multe alte caractere în plus față <strong>de</strong> literele mari şi mici. Codul EBCDIC<br />

(Exten<strong>de</strong>d Binary Co<strong>de</strong>d Decimal Interchange Co<strong>de</strong>) este un cod pe 8 biți folosit<br />

intens pe calculatoare mainframe IBM.<br />

Codul ASCII se reprezintă pe 7 biți dar se stochează pe 8 (un caracter/byte). De<br />

cele mai multe ori se adaugă un bit suplimentar <strong>de</strong> regulă în poziția cea mai<br />

semnificativă o octetului. Prin urmare folosirea codului EBCDIC nu necesită în<br />

realitatea mai mulți biți. În schimb la transmiterea serială a datelor bitul<br />

suplimentar are un impact mai mare. În figura <strong>de</strong> mai jos prezentăm codul<br />

35


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

EBCDIC. Se poate observa că există unele poziții care nu au atribuit un caracter.<br />

Acele poziții pot fi folosite pentru caractere speciale la nivel <strong>de</strong> aplicație.<br />

Codul <strong>de</strong><br />

caractere<br />

EBCDIC<br />

EBCDIC este un<br />

cod pe 8 biţi<br />

Setul <strong>de</strong> caractere Unico<strong>de</strong><br />

Codurile <strong>de</strong> caractere ASCII şi EBCDIC suportă setul <strong>de</strong> caractere „Latin”. Pe<br />

lângă acest set <strong>de</strong> caractere ce conține literele <strong>de</strong> la a la z există o serie <strong>de</strong> alte<br />

seturi <strong>de</strong> caractere în diferite limbi (chineză, japoneză, arabă etc.) Evi<strong>de</strong>nt că nu<br />

se poate face o asociere simplă, unu‐la‐unu, <strong>de</strong> la codul ASCII la orice set <strong>de</strong><br />

caractere aşa că s‐a creat un standard pentru caractere universal numit Unico<strong>de</strong><br />

care suportă majoritatea caracterelor <strong>din</strong> cele mai importante limbi.<br />

Unico<strong>de</strong> este un standard în permanentă <strong>de</strong>zvoltare. Se schimbă pe măsură ce<br />

noi seturi <strong>de</strong> caractere sunt introduse şi pe măsură ce seturile <strong>de</strong> caractere<br />

existente evoluează şi reprezentarea lor se perfecționează.<br />

Unico<strong>de</strong> a fost creat pentru a permite schimbul, procesarea şi afişarea textelor<br />

scrise în diferite limbi şi în diferite discipline tehnice <strong>din</strong> lumea mo<strong>de</strong>rnă. De<br />

asemenea suportă texte clasice şi istorice <strong>din</strong> multe limbi scrise.<br />

Standardul Unico<strong>de</strong> foloseşte 16 biți pentru reprezentarea caracterelor şi în anul<br />

2005 a ajuns la versiunea 4.<br />

Unico<strong>de</strong> atribuie un număr unic pentru fiecare caracter, este in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong><br />

platformă, in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> aplicație, in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> limbă.<br />

Fundamental, un calculator lucrează numai cu numere. Pentru a stoca în memorie<br />

litere sau alte semne, este necesar ca fiecărui caracter să‐i fie asignat un număr.<br />

Înainte <strong>de</strong> inventarea Unico<strong>de</strong>‐ului, au existat sute <strong>de</strong> sisteme diferite <strong>de</strong> codare<br />

pentru asignarea acestor numere. Dar, nici unul <strong>din</strong>tre acestea nu a fost satisfăcător,<br />

36


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

neputând codifica suficiente caractere: <strong>de</strong> exemplu, numai Uniunea Europeană<br />

necesită mai multe codificări diferite pentru a acoperi toate limbile existente în<br />

cadrul ei. Nici măcar pentru o singură limbă, cum ar fi limba engleză, nu a existat un<br />

singur sistem <strong>de</strong> codare a<strong>de</strong>cvat pentru toate literele, semnele <strong>de</strong> punctuație şi<br />

simbolurile tehnice uzuale.<br />

De asemenea, sistemele <strong>de</strong> codare existente intră <strong>de</strong>seori în conflict între ele<br />

<strong>de</strong>oarece, două sisteme diferite pot utiliza acelaşi număr pentru două caractere<br />

diferite sau pot utiliza numere diferite pentru acelaşi caracter. <strong>Calcul</strong>atoarele, în<br />

special serverele, sunt nevoite să suporte mai multe sisteme diferite <strong>de</strong> codare; <strong>de</strong><br />

aceea, <strong>de</strong> fiecare dată când datele sunt transferate între platforme cu sisteme<br />

diferite <strong>de</strong> codare, apare riscul coruperii lor.<br />

Unico<strong>de</strong> schimbă toate acestea!<br />

Unico<strong>de</strong> furnizează un număr unic pentru fiecare caracter, indiferent <strong>de</strong> platformă,<br />

aplicație sau limba folosită. Standardul Unico<strong>de</strong> a fost adoptat <strong>de</strong> multe companii <strong>de</strong><br />

vârf, cum ar fi Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase,<br />

Unisys şi multe altele. De asemenea, Unico<strong>de</strong> este necesar standar<strong>de</strong>lor mo<strong>de</strong>rne ca<br />

<strong>de</strong> exemplu XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML etc. şi<br />

reprezintă implementarea oficială a standardului ISO/IEC 10646. Unico<strong>de</strong> este<br />

suportat <strong>de</strong> multe sisteme <strong>de</strong> operare, navigatoare mo<strong>de</strong>rne <strong>de</strong> internet şi multe alte<br />

produse. Apariția standardului Unico<strong>de</strong> precum şi disponibilitatea instrumentelor<br />

care îl suportă, reprezintă cea mai semnificativă ten<strong>din</strong>ță spre globalizarea<br />

<strong>de</strong>zvoltării <strong>de</strong> software.<br />

Utilizarea Unico<strong>de</strong> în aplicațiile client‐server sau multi‐tier precum şi în situri web<br />

oferă, pe lângă simplificarea arhitecturii, şi scă<strong>de</strong>ri semnificative ale costului<br />

comparativ cu seturile tradiționale <strong>de</strong> caractere. Unico<strong>de</strong> permite ca o aplicație sau<br />

un sit web unice să poată fi utilizate simultan şi fără modificări pe platforme şi în<br />

țări diferite, folosind diverse limbi, permițând totodată şi transferul datelor între<br />

sisteme diferite fără pericolul coruperii lor.<br />

Pentru mai multe <strong>de</strong>talii consultați sit‐ul www.unico<strong>de</strong>.org<br />

Concluzii<br />

Datele în calculator sunt reprezentate sub formă <strong>de</strong> biți ce pot fi recunoscuți şi<br />

interpretați în diferite moduri: ca întregi, ca numere în virgulă fixă, ca numere în<br />

virgulă mobilă sau ca şi caractere. Codurile <strong>de</strong> caractere cum sunt ASCII, EBCDIC şi<br />

Unico<strong>de</strong> au dimensiuni finite şi pot fi reprezentate în totalitate pe un număr finit <strong>de</strong><br />

biți. Numărul <strong>de</strong> biți folosiți pentru reprezentarea numerelor este <strong>de</strong> asemenea finit<br />

ceea ce înseamnă că putem reprezenta doar o submulțime a numerelor reale (mai<br />

exact raționale). Aceasta duce la noțiunile <strong>de</strong> interval, precizie şi eroare. Intervalul<br />

<strong>de</strong>fineşte cea mai mică şi cea mai mare valoare ce poate fi reprezentată. Aceste două<br />

valori sunt <strong>de</strong>terminate <strong>de</strong> baza şi numărul <strong>de</strong> biți ai exponentului reprezentării în<br />

virgulă mobilă. Precizia este <strong>de</strong>terminată <strong>de</strong> numărul <strong>de</strong> biți folosiți în<br />

37


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

reprezentarea magnitu<strong>din</strong>ii (excluzând biții <strong>din</strong> exponent în reprezentarea<br />

numerelor în virgulă mobilă). Eroarea apare în reprezentarea în virgulă a numerelor<br />

datorită faptului că există numere reale în intervalul <strong>din</strong>tre două numere<br />

reprezentabile consecutive.<br />

38


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

3. Logica digitală<br />

În acest capitol vom trece în revistă câteva principii <strong>de</strong> bază ale logicii digitale,<br />

principii ce pot fi aplicate în proiectarea calculatoarelor digitale. La început vom<br />

discuta <strong>de</strong>spre logică combinațională, în care <strong>de</strong>ciziile logice se iau doar în funcție <strong>de</strong><br />

combinații ale intrărilor. După care, vom trece în revistă logica secvențială în care<br />

<strong>de</strong>ciziile se iau în funcție <strong>de</strong> intrările curente şi intrările mai vechi. Prin înțelegerea<br />

acestor principii <strong>de</strong> bază vom putea proiecta circuite logice cu ajutorul cărora se pot<br />

construi calculatoare complete. Vom începe cu partea fundamentală a calculatorului<br />

digital, unitatea combinațională logică.<br />

Logică combinaţională<br />

O unitate combinațională logică (UCL) transformă o mulțime <strong>de</strong> intrări într‐o altă<br />

mulțime <strong>de</strong> ieşiri conform uneia sau a mai multor funcții. Ieşirile UCL sunt calculate<br />

strict ca funcție a intrărilor, iar ieşirile sunt actualizate imediat ce intrările se<br />

schimbă. Un mo<strong>de</strong>l <strong>de</strong> bază pentru UCL este dat în figura <strong>de</strong> mai jos.<br />

O mulțime <strong>de</strong> intrări i0 – in, vor <strong>de</strong>termina ca UCL să producă o mulțime <strong>de</strong> ieşiri<br />

conform funcțiilor f0, f1,…, fm. Într‐un UCL nu există un feedback <strong>de</strong> la ieşire înspre<br />

intrare.<br />

Intrările şi ieşirile unui UCL au <strong>de</strong> regulă două valori: high şi low. Când valorile sunt<br />

luate <strong>din</strong>tr‐o mulțime finită, circuitele care le folosesc sunt numite digitale. Un<br />

circuit digital electronic primeşte intrări şi furnizează ieşiri în care 0 volți (0 V) se<br />

consi<strong>de</strong>ră ca fiind valoarea low, iar +5 V este consi<strong>de</strong>rată valoarea high. Această<br />

convenție nu este folosită peste tot: circuitele <strong>de</strong> viteză mare folosesc <strong>de</strong> regulă<br />

voltaje mai joase; unele circuite ale calculatoarelor operează în domeniul analog, în<br />

care sunt permise o continuitate <strong>de</strong> valori. O aplicație în care circuitele analogice ar<br />

fi mai potrivite este simularea zborurilor, <strong>din</strong> moment ce circuitele analogice<br />

aproximează mai exact mecanica unui avion, față <strong>de</strong> circuitele analogice.<br />

Cu toate că majoritatea calculatoarelor digitale sunt binare, există şi circuite multi‐<br />

valoare. Un mediu <strong>de</strong> transmisie capabil să transmită mai mult <strong>de</strong> două valori poate<br />

fi mai eficient la transmiterea informației <strong>de</strong>cât un mediu care transmite doar două<br />

valori. Un circuit digital multi‐valoare este diferit față <strong>de</strong> un circuit analog prin aceea<br />

că un circuit multi‐valoare poate lua o valoarea <strong>din</strong>tr‐o mulțime finită, pe când un<br />

circuit analogic poate lua o infinitate <strong>de</strong> valori. Utilizarea circuitelor multi‐valoare<br />

39


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

are o utilitate teoretică, dar în practică este dificilă crearea acestor circuite capabile<br />

<strong>de</strong> a face distincție între mai mult <strong>de</strong> două valori.<br />

Noi ne vom concentra atenția doar pe circuitele binare digitale, în care sunt permise<br />

doar două valori pentru intrare sau ieşire.<br />

Tabele <strong>de</strong> a<strong>de</strong>văr<br />

În 1854 George Boole a publicat o lucrare importantă în legătură cu o algebră<br />

pentru reprezentarea logicii. Boole era interesat în scoaterea în evi<strong>de</strong>nță a<br />

matematicii gândirii şi a <strong>de</strong>zvoltat o reprezentare a informației factuale cum ar fi:<br />

„Uşa este <strong>de</strong>schisă” sau „Uşa nu este <strong>de</strong>schisă”. Algebra lui Boole a fost <strong>de</strong>zvoltată<br />

mai <strong>de</strong>parte <strong>de</strong> Clau<strong>de</strong> Shannon în forma pe care o folosim astăzi. În algebra<br />

Booleană, presupunem existența unui postulat <strong>de</strong> bază şi anume că o variabilă<br />

binară ia o singură valoare care poate fi 0 sau 1. Această valoare corespun<strong>de</strong><br />

voltajelor <strong>de</strong> 0 respectiv +5 menționate mai sus. Atribuirea se poate face şi în or<strong>din</strong>e<br />

inversă. Pentru a înțelege comportamentul circuitelor digitale, putem abstractiza<br />

corespon<strong>de</strong>nța fizică cu voltaje şi să consi<strong>de</strong>răm doar valorile simbolice 0 şi 1.<br />

O contribuție importantă a lui Boole a fost tabelele <strong>de</strong> a<strong>de</strong>văr, care prezintă relații<br />

într‐un format tabelar. Să consi<strong>de</strong>răm o cameră în care sunt două întrerupătoare A<br />

şi B, ce controlează un bec Z. Un întrerupător poate fi sus altul jos sau ambele<br />

întrerupătoare pot fi sus, respectiv jos. Când un singur întrerupător este sus becul<br />

este aprins. Când ambele întrerupătoare sunt sus sau jos becul este stins.<br />

Se poate construi o tabelă <strong>de</strong> a<strong>de</strong>văr care enumeră toate valorile posibile pe care le<br />

pot avea cele două întrerupătoare, aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai sus. În tabel, un<br />

întrerupător primeşte valoarea 0 dacă este jos şi valoarea 1 dacă este sus. Becul este<br />

aprins atunci când valoarea lui Z este 1.<br />

Într‐o tabelă <strong>de</strong> a<strong>de</strong>văr, toate combinațiile posibile <strong>de</strong> variabile binare <strong>de</strong> la intrare<br />

sunt enumerate şi o valoare corespunzătoare <strong>de</strong> 0 sau 1 este atribuită fiecărei<br />

combinații. În tabela <strong>de</strong> a<strong>de</strong>văr <strong>din</strong> figura <strong>de</strong> mai sus, ieşirea Z <strong>de</strong>pin<strong>de</strong> <strong>de</strong> variabilele<br />

<strong>din</strong> intrare A şi B. Pentru fiecare combinație <strong>de</strong> variabile <strong>din</strong> intrare există două<br />

valori pe care Z le poate avea: 0 şi 1. Putem alege o altă configurație pentru<br />

întrerupătoare, în care becul este aprins doar atunci când ambele întrerupătoare<br />

sunt sus sau jos, situație în care tabela <strong>de</strong> a<strong>de</strong>văr se transformă în:<br />

40


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Legarea firelor între întrerupătoare ar trebui <strong>de</strong> asemenea să se modifice. Pentru<br />

două valori <strong>de</strong> intrare există 2 2 = 4 combinații şi 2 4 = 16 posibilități <strong>de</strong> atribuire a<br />

valorilor <strong>de</strong> ieşire.<br />

Porţi logice<br />

Dacă enumerăm toate atribuirile <strong>de</strong> setări posibile pentru întrerupătoare cu două<br />

intrări vom obține 16 atribuiri prezentate în tabelul <strong>de</strong> mai jos:<br />

Aceste funcții se numesc funcții logice Booleene. O parte <strong>din</strong> funcții au nume<br />

speciale. Funcția AND produce valoarea 1 doar când A şi B au valoarea 1, pe când<br />

funcția OR produce valoarea 1 (true) atunci când cel puțin una <strong>din</strong> valorile lui A sau<br />

B este 1. Vom consi<strong>de</strong>ra că valoarea unei funcții este false atunci când are valoarea<br />

0. Există şi funcțiile False şi True. Semnul + într‐o expresie Booleană semnifică OR<br />

logic şi nu implică adunarea aritmetică. Juxtapunerea a două variabile, <strong>de</strong> ex. AB,<br />

semnifică operația AND logic între cele două variabile.<br />

Funcțiile A şi B nu fac altceva <strong>de</strong>cât să repete valorile lui A respectiv B <strong>din</strong> intrare, pe<br />

când funcțiile A şi B , complementează valorile lui A şi B, producând 0 atunci când<br />

41


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

valoarea <strong>din</strong> intrare este 1 şi invers. În general o bară <strong>de</strong>asupra unui termen <strong>de</strong>notă<br />

operația <strong>de</strong> complementare, prin urmare funcțiile NAND şi NOR sunt complemente<br />

ale funcțiilor AND şi OR. Funcția XOR are valoarea 1 (true) atunci când una <strong>din</strong><br />

valorile <strong>din</strong> intrare are valoarea 1 iar cealaltă valoarea 0. Funcția XNOR este<br />

complementul funcției XOR.<br />

O poartă logică este un dispozitiv fizic ce implementează o funcție Booleană simplă.<br />

Funcțiile prezentate în tabelul <strong>de</strong> mai sus au reprezentări sub formă <strong>de</strong> simboluri ca<br />

porți logice, o parte <strong>din</strong> aceste simboluri fiind prezentate mai jos. Pentru fiecare<br />

funcție, A şi B sunt intrări binare şi F este ieşirea.<br />

În figura <strong>de</strong> mai sus porțile AND şi OR se comportă exact aşa cum am <strong>de</strong>scris. Buffer‐<br />

ul nu face altceva <strong>de</strong>cât să copieze intrarea în ieşire. Cu toate că buffer‐ul nu are o<br />

semnificație logică, el are un rol practic important şi anume acela <strong>de</strong> amplificator,<br />

permițând unui singur semnal să controleze mai multe porți logice. Poarta NOT<br />

(numită şi invertor) complementează intrarea. Cerculețul <strong>din</strong> vârful triunghiului<br />

<strong>de</strong>notă operația <strong>de</strong> complementare.<br />

Tot în figura <strong>de</strong> mai sus sunt prezentate porțile logice NAND, NOR, XOR şi XNOR,<br />

împreună cu tabla operației.<br />

Simbolurile logice <strong>din</strong> figura <strong>de</strong> mai sus sunt doar formele <strong>de</strong> bază, existând o serie<br />

<strong>de</strong> variante care sunt folosite a<strong>de</strong>sea. De exemplu putem avea porți logice cu mai<br />

mult <strong>de</strong> două intrări aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos (a).<br />

42


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Cerculețul <strong>de</strong>notă complementare şi după cum se ve<strong>de</strong> (b) poate fi plasat nu numai<br />

la ieşire ci şi la intrare pentru a complementa intrarea. În funcție <strong>de</strong> tehnologia<br />

folosită , unele porți logice pot produce două ieşiri complementate. Simbolul logic<br />

corespunzător pentru această situație prezintă ambele ieşiri, aşa cum se ve<strong>de</strong> în<br />

figura <strong>de</strong> mai sus (c).<br />

Algebră booleană<br />

În tabelul <strong>de</strong> mai jos sunt prezentate câteva proprietăți ale algebrei Booleene ce pot<br />

fi aplicate expresiilor booleene logice. Postulatele (cunoscute sub numele <strong>de</strong><br />

postulatele lui Huntington) sunt axiomele algebrei Booleene, aşa că nu au nevoie <strong>de</strong><br />

<strong>de</strong>monstrație. Teoremele pot fi <strong>de</strong>monstrate folosind postulatele. Fiecare relație<br />

prezentată are atât o formă AND cât şi o formă OR datorită principiului dualității.<br />

Forma duală se obține prin interschimbarea lui AND cu OR.<br />

43


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Proprietatea <strong>de</strong> comutativitate spune că or<strong>din</strong>ea în care apar două variabile într‐o<br />

funcție AND sau OR nu este relevantă. Datorită principiului dualității, proprietatea<br />

<strong>de</strong> comutativitate are o formă AND (AB = BA) şi o formă OR (A+B = B + A). Sensul<br />

postulatelor şi teoremelor se poate <strong>de</strong>duce <strong>din</strong> tabel.<br />

În tabela <strong>de</strong> a<strong>de</strong>văr <strong>de</strong> mai jos este <strong>de</strong>monstrată legea lui DeMorgan:<br />

Figura <strong>de</strong> mai sus prezintă echivalența unei porți OR cu o poartă NAND, echivalență<br />

la care se poate ajunge cu legea lui DeMorgan.<br />

44


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Pentru a obține completitu<strong>din</strong>e computațională (posibilitatea <strong>de</strong> a crea orice circuit<br />

logic cu porțile logice disponibile) nu este nevoie <strong>de</strong> toate porțile logice prezentate<br />

până acum. Trei mulțimi <strong>de</strong> porți logice complete computațional sunt: {AND, OR,<br />

NOT}, {NAND}, {NOR} (există şi altele).<br />

Echivalența funcțională între diferite porți logice este importantă <strong>din</strong> punct <strong>de</strong><br />

ve<strong>de</strong>re practic pentru că un tip <strong>de</strong> poartă logică poate avea caracteristici <strong>de</strong> operare<br />

mai bune pentru o anumită tehnologie.<br />

Forma sumă <strong>de</strong> produse şi diagrame logice<br />

Acum vom implementa o funcție mai complexă <strong>de</strong>cât simplele porți logice şi anume<br />

funcția majoritate cu trei intrări <strong>de</strong>scrisă <strong>de</strong> tabela <strong>de</strong> a<strong>de</strong>văr <strong>de</strong> mai jos.<br />

Minterm<br />

In<strong>de</strong>x<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

A B C F<br />

0 0 0 0<br />

0 0 1 0<br />

0 1 0 0<br />

0 1 1 1<br />

1 0 0 0<br />

1 0 1 1<br />

1 1 0 1<br />

1 1 1 1<br />

Funcția majoritate (care poate primi la intrare un număr impar <strong>de</strong> valori) are<br />

valoare 1 (true) atunci când mai mult <strong>de</strong> jumătate <strong>din</strong> intrări sunt 1 şi valoarea 0 în<br />

caz contrar, aşa cum este ilustrat cu ajutorul balanței <strong>din</strong> figură. Aceasta este o<br />

operație obişnuită folosită în anumite aplicații atunci când ieşirile mai multor<br />

circuite i<strong>de</strong>ntice care operează asupra aceloraşi date, sunt comparate şi cel mai<br />

mare număr <strong>de</strong> valori similare <strong>de</strong>termină ieşirea (poate fi consi<strong>de</strong>rată o „votare”).<br />

Din moment ce nici una <strong>din</strong> porțile logice prezentate până acum nu implementează<br />

funcția majoritate în mod direct, vom transforma funcția într‐o ecuație AND‐OR cu<br />

două niveluri iar mai apoi vom implementa funcția folosind porți logice <strong>din</strong><br />

mulțimea {AND, OR, NOT}. Vor fi două niveluri pentru că un nivel <strong>de</strong> variabile<br />

asupra cărora se aplică operația AND va fi urmată <strong>de</strong> un alt nivel la care se aplică<br />

operația OR. Ecuația booleană care <strong>de</strong>scrie funcția majoritate are valoarea true <strong>de</strong><br />

fiecare dată când F este true în tabela <strong>de</strong> a<strong>de</strong>văr.<br />

O modalitate <strong>de</strong> a reprezenta ecuațiile logice este folosirea formei sumă <strong>de</strong> produse,<br />

ce poate fi <strong>de</strong>finită ca o colecție <strong>de</strong> expresii formate prin operația OR şi fiecare<br />

termen al expresiei este format <strong>din</strong> variabile asupra cărora se aplică operația AND.<br />

Ecuația logică booleană care exprimă funcția majoritate este:<br />

F = ABC<br />

+ ABC<br />

+ ABC<br />

+ ABC<br />

Semnul '+' semnifică OR iar juxtapunerea AND.<br />

45<br />

1<br />

0 0<br />

0-si<strong>de</strong> 1-si<strong>de</strong><br />

A balance tips to the left or<br />

right <strong>de</strong>pen<strong>din</strong>g on whether<br />

there are more 0’s or 1’s.


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Prin examinarea ecuației observăm că poate este implementată cu patru porți logice<br />

AND cu trei intrări, iar ieşirile acestor patru porți logice AND vor fi conectate la<br />

intrarea unei porți logice OR cu patru intrări aşa cum este prezentat în figura <strong>de</strong> mai<br />

jos.<br />

În figură este prezentat modul <strong>de</strong> reprezentare a situației când este conexiune<br />

respectiv când aceasta lipseşte, mod care este prezentat şi în figura <strong>de</strong> mai jos.<br />

Atunci când un produs conține exact o instanță a fiecărei variabile, într‐o anumită<br />

formă, complementată sau nu, acesta se numeşte mintermen. Un mintermen are<br />

valoarea 1 pentru o singură linie <strong>din</strong> tabela <strong>de</strong> a<strong>de</strong>văr – adică, un număr minim <strong>de</strong><br />

termeni (unul) va face funcția true. Ca alternativă, funcția este uneori scrisă ca sumă<br />

logică peste intrările true. Ecuația pentru funcția majoritate poate fi rescrisă sub<br />

forma: F = ∑ 3,<br />

5,<br />

6,<br />

7 .<br />

Această formă este potrivită pentru forma canonică a ecuației Booleene, care<br />

conține doar mintermeni.<br />

46


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Forma produs <strong>de</strong> sume<br />

Ca dual la forma sumă <strong>de</strong> produse, o ecuație Booleană poate fi reprezentată în forma<br />

produs <strong>de</strong> sume. O astfel <strong>de</strong> ecuație conține o colecție <strong>de</strong> variabile asupra cărora se<br />

aplică operația OR iar asupra rezultatele operațiilor OR se aplică operație AND. O<br />

metodă <strong>de</strong> a obține forma produs <strong>de</strong> sume este <strong>de</strong> a porni <strong>de</strong> la complementul<br />

formei sumă <strong>de</strong> produse şi <strong>de</strong> a aplica teorema DeMorgan. De exemplu, dacă ne<br />

referim <strong>din</strong> nou la tabela <strong>de</strong> a<strong>de</strong>văr a funcției majoritate, complementul se obține<br />

prin selectarea termenilor care produc 0 le ieşire, aşa cum se ve<strong>de</strong> în ecuația <strong>de</strong> mai<br />

jos.<br />

F = ABC<br />

+ ABC<br />

+ ABC<br />

+ ABC<br />

Complementarea ambelor părți va duce la: F = ABC<br />

+ ABC<br />

+ ABC<br />

+ ABC<br />

, iar prin<br />

aplicarea teoremei DeMorgan în forma W + X + Y + Z = W X Y Z vom obține:<br />

F = ( ABC)(<br />

ABC)(<br />

ABC)(<br />

ABC)<br />

. Aplicând <strong>din</strong> nou teorema DeMorgan în forma:<br />

WXYZ = W + X + Y + Z vom obține:<br />

F = ( A + B + C)(<br />

A + B + C)(<br />

A + B + C)(<br />

A + B + C)<br />

Această ultimă ecuație este în forma produs <strong>de</strong> sume şi conține patru maxtermeni,<br />

în care fiecare variabilă apare o singură dată în forma complementată sau nu. Un<br />

maxtermen, <strong>de</strong> ex. (A+B+C), are valoarea 0 pentru o singură linie <strong>din</strong> tabela <strong>de</strong><br />

a<strong>de</strong>văr. Adică, este true pentru numărul maxim <strong>de</strong> linii <strong>din</strong> tabela <strong>de</strong> a<strong>de</strong>văr fără a se<br />

reduce la funcția trivială care are valoarea true întot<strong>de</strong>auna. O ecuație care este<br />

formată numai <strong>din</strong> maxtermeni în forma produs <strong>de</strong> sume, se spune că este în forma<br />

canonică produs <strong>de</strong> sume. Un circuit OR‐AND care implementează ecuația este<br />

prezentat în figura <strong>de</strong> mai jos:<br />

Forma OR‐AND este logic echivalentă cu forma AND‐OR.<br />

47


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Un motiv pentru utilizare formei produs <strong>de</strong> sume față <strong>de</strong> forma sumă <strong>de</strong> produse<br />

este acela că aceasta ar putea duce la o ecuație Booleană mai mică. O ecuație<br />

Booleană mai mică implică un circuit mai simplu.<br />

Contorul <strong>de</strong> poarta este o măsură a complexității unui circuit şi se obține prin<br />

numărarea tuturor porților logice. Contorul <strong>de</strong> intrări poartă este o altă măsură<br />

pentru complexitatea unui circuit şi se obține prin numărarea tuturor intrărilor în<br />

toate porțile logice ce alcătuiesc circuitul.<br />

Componente digitale<br />

Circuitele digitale <strong>de</strong> nivel înalt sunt create <strong>de</strong> regulă cu ajutorul unor colecții <strong>de</strong><br />

porți logice numite componente şi nu cu porți logice simple. Aceasta permite ca într‐<br />

o anumită măsură gradul <strong>de</strong> complexitate al circuitului să fie abstractizată şi <strong>de</strong><br />

asemenea se simplifică procesul <strong>de</strong> mo<strong>de</strong>lare a comportamentului circuitelor şi<br />

procesul <strong>de</strong> caracterizare a performanțelor acestora. Aici vom prezenta câteva <strong>din</strong><br />

cele mai uzuale circuite.<br />

Niveluri <strong>de</strong> integrare<br />

Până acum ne‐am concentrat atenția asupra circuitelor logice combinaționale. Din<br />

moment ce am prezentat doar porți logice individuale înseamnă că am lucrat la<br />

nivelul <strong>de</strong> integrare la scală mică (small scale integration ‐ SSI), în care există 10<br />

până la 100 <strong>de</strong> componente/chip. (Aici termenul <strong>de</strong> „componentă” are un alt înțeles<br />

şi anume se referă la tranzistori şi alte elemente discrete). Cu toate că uneori în<br />

practică e nevoie să lucrăm la acest nivel <strong>de</strong> integrare jos, <strong>de</strong> obicei pentru circuitele<br />

cu performanțe ridicate, microelectronica ne permite să lucrăm la un nivel <strong>de</strong><br />

integrare mult mai mare. În nivelul <strong>de</strong> integrare medie (medium scale integration ‐<br />

MSI) pe un chip apar între 100 şi 1000 <strong>de</strong> componente. În nivelul <strong>de</strong> integrare mare<br />

(large scale integration ‐ LSI) avem un număr cuprins între 1000 şi 10000 <strong>de</strong><br />

componente iar în nivelul <strong>de</strong> integrare foarte mare (very large scale integration ‐<br />

VLSI) avem peste 10000 <strong>de</strong> componente. Nu există nişte limite foarte fixe pentru<br />

diferitele niveluri <strong>de</strong> integrare, dar este important să facem această distincție pentru<br />

compararea complexității relative a circuitelor.<br />

Multiplexor<br />

Un multiplexor (MUX) este o componentă care conectează o serie <strong>de</strong> intrări la o<br />

singură ieşire. O diagramă bloc şi tabela <strong>de</strong> a<strong>de</strong>văr corespunzătoare pentru un MUX<br />

4‐la‐1 sunt prezentate mai jos.<br />

48


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Ieşirea F va avea valoarea intrării selectate <strong>de</strong> liniile <strong>de</strong> control A şi B. De exemplu,<br />

dacă AB = 00, atunci valoarea <strong>de</strong> pe linia D0 (0 sau 1) va apărea la F. Circuitul AND‐<br />

OR corespunzător este prezentat în figura <strong>de</strong> mai jos:<br />

Atunci când se proiectează circuite ce folosesc MUX, se foloseşte forma abstractizată<br />

(cutia neagră) în locul formei <strong>de</strong>taliate <strong>din</strong> figura <strong>de</strong> mai sus. Astfel putem<br />

abstractiza o parte <strong>din</strong> <strong>de</strong>talii atunci când proiectăm circuite complexe.<br />

MUX poate fi folosit pentru a implementa funcții Booleene. În figura <strong>de</strong> mai jos un<br />

MUX 8‐la‐1 implementează funcția majoritate.<br />

49


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Datele <strong>de</strong> intrare sunt luate direct <strong>din</strong> tabela <strong>de</strong> a<strong>de</strong>văr a funcției majoritate, iar<br />

datele <strong>de</strong> intrare pentru control sunt atribuite variabilelor A, B şi C. MUX<br />

implementează funcția majoritate prin transmiterea unui 1 <strong>de</strong> la intrarea fiecărui<br />

mintermen la ieşire. Intrarea 0 marchează porțiuni <strong>din</strong> MUX care nu sunt necesare<br />

pentru implementarea funcției, iar rezultatul – o serie <strong>de</strong> porți logice rămân<br />

neutilizate. Cu toate că porțiuni <strong>din</strong> MUX sunt aproape întot<strong>de</strong>auna neutilizate în<br />

implementarea funcțiilor Booleene, multiplexoarele sunt folosite pe scară largă<br />

pentru că ele simplifică procesul <strong>de</strong> proiectare, iar modularitatea lor simplifică<br />

implementarea.<br />

Ca un alt exemplu, să consi<strong>de</strong>răm implementarea unei funcții <strong>de</strong> trei variabile<br />

folosind un MUX 4‐la‐1. În figura <strong>de</strong> mai jos este prezentată o tabelă <strong>de</strong> a<strong>de</strong>văr cu<br />

trei variabile şi un MUX 4‐la‐1 care implementează funcția F. Vom permite ca datele<br />

<strong>de</strong> intrare să fie luate <strong>din</strong> mulțimea {0, 1, C, C } iar gruparea se obține aşa cum este<br />

prezentat în tabela <strong>de</strong> a<strong>de</strong>văr. Atunci când AB = 00, F = 0, indiferent <strong>de</strong> valoarea lui<br />

C. Când AB = 01, F = 1, indiferent <strong>de</strong> valoarea lui C. Când AB = 10, F = C iar când AB =<br />

11, F = C . Astfel putem implementa o funcție cu trei variabile folosind un MUX cu<br />

două variabile.<br />

50


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Demultiplexor<br />

Demultiplexorul (DEMUX) este opusul multiplexorului. O diagramă bloc pentru un<br />

<strong>de</strong>multiplexor 1‐la‐4 şi tabela <strong>de</strong> a<strong>de</strong>văr corespunzătoare sunt prezentate în figura<br />

<strong>de</strong> mai jos.<br />

Un DEMUX trimite singura intrare, D, la un <strong>din</strong> ieşiri Fi, confirm valorilor intrărilor<br />

<strong>de</strong> control. Circuitul corespunzător un DEMUX este prezentat în figura <strong>de</strong> mai jos:<br />

Rolul unui DEMUX este <strong>de</strong> a transmite date <strong>de</strong> la o singură intrare la mai multe<br />

ieşiri, <strong>de</strong> ex. chemare celui mai apropiat lift prin simpla apăsare a unui buton.<br />

DEMUX nu este folosit <strong>de</strong> regulă la implementarea funcțiilor Booleene, cu toate că se<br />

poate face şi acest lucru.<br />

Decodor<br />

Un <strong>de</strong>codor transformă o codificare logică într‐o locația spațială. Exact una <strong>din</strong><br />

ieşirile <strong>de</strong>codorului este high (valoarea logică 1), fiind <strong>de</strong>terminat <strong>de</strong> configurația<br />

51


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

intrărilor <strong>de</strong> control. O diagramă bloc şi o tabelă <strong>de</strong> a<strong>de</strong>văr pentru un <strong>de</strong>codor 2‐la‐4<br />

sunt prezentate în figura <strong>de</strong> mai jos.<br />

Diagramă logică asociată care implementează <strong>de</strong>codorul este prezentată în figura <strong>de</strong><br />

mai jos:<br />

Un <strong>de</strong>codor poate fi folosit pentru a controla alte circuite, dar uneori nu este potrivit<br />

pentru activarea altor circuite. Din acest motiv, adăugăm o intrare <strong>de</strong> activare<br />

<strong>de</strong>codorului, care <strong>de</strong>termină toate ca toate ieşirile să fie 0 dacă este aplicat la intrare<br />

un 0. (Între un DEMUX şi un <strong>de</strong>co<strong>de</strong>r cu intrarea 1 există o echivalență logică).<br />

O aplicație pentru <strong>de</strong>codor este la translatarea adreselor <strong>de</strong> memorie în locații fizice.<br />

Decodoarele pot fi folosite şi la implementarea funcțiilor Booleene. Din moment ce<br />

fiecare linie <strong>de</strong> la ieşire corespun<strong>de</strong> unui alt mintermen, o funcție poate fi<br />

implementată prin efectuarea operației OR logic asupra ieşirilor ce corespund<br />

mintermenilor reali ai funcției. De exemplu, în figura <strong>de</strong> mai jos, un <strong>de</strong>codor 3‐la‐8<br />

implementează funcția majoritate. Ieşirile neutilizate rămân <strong>de</strong>conectate.<br />

52


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Enco<strong>de</strong>r cu prioritate<br />

Un enco<strong>de</strong>r transformă o mulțime <strong>de</strong> intrări într‐o codificare binară şi poate fi privit<br />

ca opusul unui <strong>de</strong>co<strong>de</strong>r. Un enco<strong>de</strong>r cu prioritate este un tip <strong>de</strong> enco<strong>de</strong>r, la care este<br />

impusă o or<strong>din</strong>e în valorile <strong>de</strong> intrare. O diagramă bloc şi tabela <strong>de</strong> a<strong>de</strong>văr<br />

corespunzătoare este prezentată în figura <strong>de</strong> mai jos pentru un enco<strong>de</strong>r cu<br />

prioritate 4‐la‐2.<br />

O schemă <strong>de</strong> prioritate este impusă asupra intrărilor în care Ai are o prioritate mai<br />

mare <strong>de</strong>cât Ai+1. Ieşire, formată <strong>din</strong> doi biți, poate lua valorile 00, 01, 10 sau 11 în<br />

funcție <strong>de</strong> care intrări sunt active (au valoarea logică 1) şi <strong>de</strong> prioritatea lor relativă.<br />

Când nu este activă nici o intrare, ieşirea va avea o valoarea implicită în care A0 are<br />

prioritate (F0F1 = 00).<br />

Enco<strong>de</strong>rul cu prioritate este folosit ca arbitru pentru diferite dispozitive ce folosesc<br />

aceleaşi resurse. Diagrama unui circuit ce reprezintă un enco<strong>de</strong>r cu prioritate 4‐la‐2<br />

este prezentată în figura <strong>de</strong> mai jos.<br />

53


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Tablouri logice programabile<br />

Un tablou logic programabil (progammable logic array ‐ PLA) este o componentă<br />

formată <strong>din</strong>tr‐o matrice AND configurabilă urmată <strong>de</strong> o matrice OR configurabilă. În<br />

figura <strong>de</strong> mai jos este prezentat un PLA cu trei intrări şi două ieşiri. Cele trei intrări<br />

A, B şi C şi complementele lor sunt disponibile la intrările fiecăreia <strong>din</strong> cele opt porți<br />

AND care generează 8 termeni (fiecare termen fiind un produs). Ieşirile porților<br />

AND sunt disponibile la intrarea fiecărei porți OR care generează funcțiile F0 şi F1.<br />

O siguranță (engl. fuse) programabilă este plasată în fiecare punct <strong>de</strong> intersecție în<br />

matricile AND şi OR. Matricile sunt configurate pentru diferite funcții prin<br />

54


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

<strong>de</strong>zactivarea siguranțelor. Atunci când o siguranță este <strong>de</strong>zactivată la o intrare într‐<br />

o poartă AND, poarta AND se comportă ca şi cum intrarea este întot<strong>de</strong>auna 1.<br />

Analog, o intrare <strong>de</strong>zactivată la o poartă OR în PLA se comportă ca şi cum intrarea<br />

este întot<strong>de</strong>auna 0.<br />

Ca exemplu <strong>de</strong> utilizare a PLA, vom implementa funcția majoritate folosind un PLA<br />

3x2 (trei variabile <strong>de</strong> intrare x două ieşiri). În figura <strong>de</strong> mai jos este prezentat în<br />

mod simplificat PLA‐ul corespunzător.<br />

Cele şase intrări în fiecare poartă AND aici sunt reprezentate printr‐o singură linie<br />

iar cele opt intrări în fiecare <strong>din</strong> cele două porți OR sunt reprezentate <strong>de</strong> asemenea<br />

printr‐o singură linie (pentru simplitate). Cercurile <strong>din</strong> punctele <strong>de</strong> intersecția a<br />

liniilor indică locul în care sunt făcute conexiunile. Din figură se observă că funcția<br />

majoritate este implementată folosind doar jumătate <strong>din</strong> PLA, cealaltă jumătate fiind<br />

disponibilă pentru implementarea altei funcții.<br />

PLA‐urile sunt componentele cele mai <strong>de</strong>s folosite în cadrul circuitelor digitale. Un<br />

avantaj al utilizării PLA‐urilor este că au doar câteva intrări şi câteva ieşiri, iar<br />

numărul porților logice <strong>din</strong>tre intrări şi ieşiri este mare. Este importantă<br />

minimizarea numărului <strong>de</strong> conexiuni la limitele unui circuit pentru a modulariza un<br />

sistem în componente discrete care sunt proiectate şi implementate separat.<br />

Un PLA se poate reprezenta ca o cutie neagră aşa cum se ve<strong>de</strong> mai jos (pentru a<br />

respecta principiul modularității).<br />

55


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Exemplu: sumator cu propagare <strong>de</strong> transport<br />

Ca un exemplu al modului în care un PLA este folosit la proiectarea circuitelor<br />

digitale vom consi<strong>de</strong>ra în continuare un circuit care adună două numere binare.<br />

Adunarea binară se efectuează similar cu modul în care efectuăm adunarea zecimală<br />

aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos.<br />

Două numere binare A şi B sunt adunate <strong>de</strong> la dreapta la stânga şi se formează<br />

pentru fiecare poziție o sumă şi un transport (engl. carry). Doi biți <strong>de</strong> intrare şi un<br />

carry‐in trebuie adunați la fiecare poziție, astfel încât trebuie să avem în ve<strong>de</strong>re 8<br />

combinații posibile, aşa cum se ve<strong>de</strong> în tabela <strong>de</strong> a<strong>de</strong>văr <strong>de</strong> mai jos.<br />

Tabela <strong>de</strong> a<strong>de</strong>văr <strong>de</strong> mai sus <strong>de</strong>scrie un element numit sumator complet, prezentat<br />

schematic în figura <strong>de</strong> mai sus. Un sumator incomplet (engl. half ad<strong>de</strong>r) ar putea fi<br />

56


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

folosit pentru adunarea celor mai puțin semnificativi biți, pentru că în acea poziție<br />

nu avem carry‐in. Un sumator incomplet adună doi biți şi produce o sumă şi un<br />

transport (carry‐out).<br />

Putem înlănțui patru sumatori compleți pentru a forma un sumator suficient <strong>de</strong><br />

mare pentru adunarea unor numere reprezentate pe 4 biți. Schema unui astfel <strong>de</strong><br />

circuit este prezentată în figura <strong>de</strong> mai jos.<br />

Sumatorul <strong>din</strong> partea dreaptă are un carry‐in egal cu zero.<br />

Se poate observa că o anumită sumă nu poate fi calculată până când nu a fost<br />

calculat transportul <strong>de</strong> la sumatorul complet prece<strong>de</strong>nt. Circuitul se numeşte<br />

sumator cu propagare <strong>de</strong> transport pentru că valorile corecte pentru bitul <strong>de</strong><br />

transport se propagă prin circuit <strong>de</strong> la dreapta la stânga. Cu toate că circuitul pare a<br />

fi paralele, în realitate biții sumă sunt calculați serial <strong>de</strong> la dreapta la stânga. Acesta<br />

este un <strong>de</strong>zavantaj important al circuitului.<br />

O modalitate <strong>de</strong> a proiecta sumatori compleți este utilizarea unui tablou logic<br />

programabil.<br />

57


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Logică secvenţială<br />

Flip­flop<br />

Maşini cu număr finit <strong>de</strong> stări<br />

58


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

4. Aritmetică<br />

Introducere<br />

După ce am prezentat modul <strong>de</strong> reprezentare a numerelor în calculator vom trece în<br />

revistă cele patru operații fundamentale ce pot fi efectuate cu aceste numere:<br />

adunarea, scă<strong>de</strong>rea, înmulțirea şi împărțirea. Prima dată vom prezenta modul în<br />

care aceste operații se efectuează asupra numerelor reprezentate în virgulă fixă iar<br />

mai apoi asupra numerelor reprezentate în virgulă mobilă.<br />

Adunarea şi scă<strong>de</strong>rea numerelor în virgulă fixă<br />

Vom trece în revistă adunare şi scă<strong>de</strong>rea atât a numerelor cu semn cât şi a<br />

numerelor fără semn. Ne vom concentra mai mult pe numerele reprezentate în<br />

complement față <strong>de</strong> doi datorită faptului că această reprezentare este folosită<br />

aproape în exclusivitate în sistemele mo<strong>de</strong>rne <strong>de</strong> calcul. Vom trece în revistă şi<br />

operațiile efectuate cu numere reprezentate în complement față <strong>de</strong> unu (acestea au<br />

o importanță în domenii cum ar fi rețelistica) şi în BCD (importante pentru<br />

calculatoarele <strong>de</strong> buzunar).<br />

Adunarea şi scă<strong>de</strong>rea în complement faţă <strong>de</strong> 2<br />

Vom prezenta adunarea numerelor cu semn reprezentate în complement față <strong>de</strong> doi.<br />

În mod implicit vom prezenta şi scă<strong>de</strong>rea pe baza principiului:<br />

a­b = a+(­b).<br />

Putem obține opusul unui număr prin complementarea lui (şi adunarea lui 1 dacă<br />

reprezentarea este în complement față <strong>de</strong> doi). Acest fapt este important pentru<br />

hardware întrucât nu e nevoie <strong>de</strong> crearea <strong>de</strong> hardware specializat pentru operațiile<br />

<strong>de</strong> scă<strong>de</strong>re.<br />

Vom modifica interpretarea pe care o dăm rezultatelor operațiilor <strong>de</strong> adunare atunci<br />

când adunăm două numere reprezentate în complement față <strong>de</strong> doi. Pentru aceasta<br />

vom consi<strong>de</strong>ra figura <strong>de</strong> mai jos:<br />

59


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Atunci când adunăm două numere reprezentate pe axa numerelor reale, numerele<br />

pot fi oricât <strong>de</strong> mari sau oricât <strong>de</strong> mici. Aşadar, pe axa numerelor reale se pot<br />

reprezenta oricâte numere. În figura <strong>de</strong> mai sus sunt prezentate circular toate<br />

numerele reprezentate în complement față <strong>de</strong> 2 pe 3 biți împreună cu echivalentul<br />

lor zecimal.<br />

Folosind acest cerc putem aduna sau scă<strong>de</strong>a numere prin traversarea cercului în<br />

sensul acelor <strong>de</strong> ceasornic (pentru adunare) sau invers (pentru scă<strong>de</strong>re). Numerele<br />

pot fi scăzute prin complementarea față <strong>de</strong> 2 a <strong>de</strong>scăzutului şi adunarea la scăzător.<br />

Trebuie remarcat că poate să apară situația <strong>de</strong> <strong>de</strong>păşire în cazul adunării unor<br />

operanzi cu acelaşi semn. Depăşirea apare atunci când se face trecerea <strong>de</strong> la +3 la ‐4<br />

în timpul unei operații <strong>de</strong> adunare şi <strong>de</strong> la ‐4 la +3 în timpul unei operații <strong>de</strong> scă<strong>de</strong>re.<br />

Urmează două exemple <strong>de</strong> adunare a unor numere reprezentate în complement față<br />

<strong>de</strong> doi pe 8 biți, prima dată două numere pozitive iar mai apoi un umăr pozitiv şi<br />

unul negativ:<br />

00001010 (+10)10<br />

+ 00010111 (+23)10<br />

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />

00100001 (+33)10<br />

00000101 (+5)10<br />

+ 11111110 (‐2)10<br />

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />

Elimin (1) 00000011 (+3)10<br />

Transportul produs la bitul cel mai semnificativ este eliminat la adunarea în<br />

complement față <strong>de</strong> doi. O situație similară este atunci când adunăm două numere<br />

negative şi avem transport la poziția cea mai semnificativă:<br />

11111111 (‐1)10<br />

+ 11111100 (‐4)10<br />

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />

Elimin (1) 11111011 (‐5)10<br />

60


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Bitul <strong>de</strong> transport <strong>de</strong> la poziția cea mai semnificativă este eliminat pentru că<br />

sistemul <strong>de</strong> numerație este modular ‐ „se întoarce” <strong>de</strong> la cel mai mare număr pozitiv<br />

la cel mai mic număr negativ.<br />

Cu toate că la operația <strong>de</strong> adunare poate apare un transport la poziția celui mai<br />

semnificativ bit aceasta nu însemnă întot<strong>de</strong>auna că rezultatul este greşit. La ambele<br />

exemple <strong>de</strong> mai sus rezultatul este corect cu toate că avem un transport în poziția<br />

celui mai semnificativ bit.<br />

Depăşire<br />

Atunci când adunăm două numere mari cu acelaşi semn poate să apară situația <strong>de</strong><br />

<strong>de</strong>păşire, adică rezultatul nu se poate reprezenta pe numărul <strong>de</strong> biți folosiți în<br />

reprezentare. De exemplu numerele (+80)10 şi (+50)10 reprezentate pe opt biți în<br />

complement față <strong>de</strong> doi. Rezultatul ar trebui să fie (+130)10 dar, aşa cum ve<strong>de</strong>m mai<br />

jos, rezultatul este (‐126)10.<br />

01010000 (+80)10<br />

+ 00110010 (+50)10<br />

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />

10000010 (‐126)10<br />

Cel mai mare număr ce se poate reprezenta pe 8 biți în complement față <strong>de</strong> 2 este<br />

127 aşa că este evi<strong>de</strong>nt că 130 nu poate fi reprezentat. Rezultatul interpretat ca<br />

număr fără semn pe 8 biți este într‐a<strong>de</strong>văr 130.<br />

În general, dacă se adună două numere cu semn opus, atunci nu poate să apară<br />

<strong>de</strong>păşire. Motivul intuitiv pentru acest rezultat este că valoarea absolută a<br />

rezultatului nu poate fi mai mare <strong>de</strong>cât valoare absolută a operandului mai mare<br />

(cel pozitiv). Aşadar, putem da <strong>de</strong>finiția <strong>de</strong>păşirii la complement față <strong>de</strong> 2:<br />

Dacă numerele care se adună au acelaşi semn şi rezultatul are semn opus, atunci are<br />

loc <strong>de</strong>păşire şi rezultatul nu este corect. Dacă numerele ce se adună au semne opuse<br />

atunci nu apare niciodată <strong>de</strong>păşire. O metodă alternativă <strong>de</strong> <strong>de</strong>pistare a <strong>de</strong>păşirii<br />

este: dacă transportul în bitul cel mai semnificativ diferă <strong>de</strong> transportul ce iese <strong>de</strong> la<br />

bitul cel mai semnificativ atunci şi numai atunci avem <strong>de</strong>păşire.<br />

Dacă un număr pozitiv se sca<strong>de</strong> <strong>din</strong>tr‐un număr negativ şi rezultatul este pozitiv, sau<br />

dacă un număr negativ se sca<strong>de</strong> <strong>din</strong>tr‐un număr pozitiv şi rezultatul este negativ,<br />

atunci avem <strong>de</strong>păşire. Dacă numerele ce se scad au acelaşi semn atunci nu va apare<br />

niciodată <strong>de</strong>păşire.<br />

Implementarea hardware a unor sumatori şi a unor scăzători<br />

În figura <strong>de</strong> mai jos este prezentat un sumator cu propagare <strong>de</strong> transport <strong>de</strong> patru<br />

biți.<br />

61


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Două numere A şi B se adună <strong>de</strong> la dreapta la stânga, creând o sumă şi un transport<br />

la fiecare poziție binară reprezentată printr‐un sumator complet. Sumatorul este<br />

mo<strong>de</strong>lat după modul în care efectuăm operație <strong>de</strong> adunare normală.<br />

În figura <strong>de</strong> mai jos patru sumatori cu propagare <strong>de</strong> transport sunt înlănțuiți pentru<br />

a crea un sumator pe 16 biți. Sumatorul complet <strong>din</strong> partea dreaptă are ca transport<br />

<strong>de</strong> intrare valoarea zero.<br />

Scă<strong>de</strong>rea numerelor binare se face într‐un mod similar cu adunarea. Putem scă<strong>de</strong>a<br />

un număr <strong>din</strong>tr‐altul prin efectuarea operației într‐o coloană la un moment dat,<br />

scăzând cifrele <strong>de</strong>scăzutului bi <strong>din</strong> cifrele scăzătorului ai, pe măsură ce mergem <strong>de</strong> la<br />

dreapta la stânga. La fel ca şi în scă<strong>de</strong>rea zecimală, dacă <strong>de</strong>scăzutul este mai mare<br />

<strong>de</strong>cât scăzătorul sau dacă este un împrumut <strong>de</strong> la o cifră prece<strong>de</strong>ntă atunci<br />

împrumutul trebuie să se propage la următorul bit semnificativ. Figura <strong>de</strong> mai jos<br />

prezintă tabela <strong>de</strong> a<strong>de</strong>văr şi un circuit pentru scă<strong>de</strong>re.<br />

62


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Scăzători compleți pot fi înlănțuiți pentru a forma scăzători cu împrumut în acelaşi<br />

mod ca şi sumatorii compleți. În figura <strong>de</strong> mai jos este prezentat un scăzător cu<br />

împrumut pe patru biți format <strong>din</strong> patru scăzători compleți:<br />

O metodă alternativă pentru a implementa scă<strong>de</strong>rea este <strong>de</strong> a forma complementul<br />

față <strong>de</strong> doi negat al <strong>de</strong>scăzutului şi să‐l adunăm la scăzător. Circuitul <strong>de</strong> mai jos<br />

efectuează atât adunarea cât şi scă<strong>de</strong>rea unor numere reprezentate pe patru biți în<br />

complement față <strong>de</strong> doi prin permiterea ca intrările bi să fie complementate atunci<br />

când vrem să facem scă<strong>de</strong>re.<br />

63


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Linia <strong>de</strong> control ADD / SUBSTRACT <strong>de</strong>termină care funcție este efectuată. Bara<br />

<strong>de</strong>asupra lui ADD indică faptul că operația ADD este activă atunci când semnalul<br />

este low sau zero. Dacă valoare <strong>de</strong> control este 0 atunci intrările ai şi bi sunt<br />

transmise prin sumator iar suma este generată la ieşirile si. Dacă semnalul <strong>de</strong><br />

control 1, atunci intrările ai sunt transmise sumatorului nemodificate iar intrările bi<br />

vor fi complementate <strong>de</strong> către poarta XOR înainte <strong>de</strong> a fi transmise sumatorului.<br />

Pentru a forma complementul față <strong>de</strong> doi negativ, trebuie să adunăm 1<br />

complementului față <strong>de</strong> unu negativ, ceea ce se realizează prin setarea lui c0 la 1.<br />

Astfel, putem folosi hardware‐ul folosit pentru adunare şi la scă<strong>de</strong>re.<br />

Adunare şi scă<strong>de</strong>re în complement faţă <strong>de</strong> unu<br />

Reprezentarea în complement față <strong>de</strong> unu nu se mai foloseşte în ziua <strong>de</strong> astăzi prea<br />

mult în calculatoarele mo<strong>de</strong>rne dar s‐a folosit cândva – la primele calculatoare.<br />

Adunarea în complement față <strong>de</strong> unu este tratată diferit <strong>de</strong> adunarea în complement<br />

față <strong>de</strong> doi: transportul care iese la poziția bitului cel mai semnificativ nu este<br />

eliminat, ci este adunat înapoi la poziția bitului cel mai puțin semnificativ aşa cum se<br />

ve<strong>de</strong> în figura <strong>de</strong> mai jos:<br />

64


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Pentru a vizualiza mai bine motivul pentru care e nevoie <strong>de</strong> „end‐arround‐carry”<br />

prin examinarea cercului numerelor reprezentate pe 3 biți în complement față <strong>de</strong><br />

unu.<br />

În acest cerc sunt două poziții pentru zero. Atunci când adunăm două numere,<br />

traversăm atât +0 cât şi ‐0, aşa că trebuie să compensăm faptul că zero este parcurs<br />

<strong>de</strong> două ori. „End‐arround‐carry” avansează rezultatul cu o poziție pentru această<br />

situație.<br />

Înmulţirea şi împărţirea numerelor în virgulă fixă<br />

Înmulțirea şi împărțirea numerelor reprezentate în virgulă fixă poate fi efectuată cu<br />

operații <strong>de</strong> adunare, scă<strong>de</strong>re şi <strong>de</strong>plasare. În continuare vom prezenta meto<strong>de</strong><br />

pentru efectuarea acestor operații atât pentru numere fără semn cât şi pentru cele<br />

cu semn.<br />

Înmulţirea numerelor fără semn<br />

Înmulțirea numerelor binare fără semn se face într‐un mod similar cu modul în care<br />

facem operație cu creionul pe hârtie. În figura <strong>de</strong> mai jos prezentăm modul în care se<br />

realizează acest proces pentru doi întregi fără semn:<br />

Fiecare bit al multiplicatorului <strong>de</strong>termină dacă multiplicandul, <strong>de</strong>plasat în mod<br />

corespunzător spre stânga este adunat la rezultatul final. Dacă înmulțim două<br />

65


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

numere fără semn reprezentate pe n biți rezultatul va avea lungimea <strong>de</strong> 2n biți. În<br />

figura <strong>de</strong> mai sus înmulțirea a doi operanzi pe patru biți va produce un rezultat pe<br />

opt biți. Dacă înmulțim două numere cu semn reprezentate pe n biți, rezultatul se va<br />

reprezenta pe maxim 2(n­1)+1 = 2n­1 biți.<br />

Mai jos prezentăm schema pentru o implementare hardware pentru înmulțirea<br />

întregilor pe 4 biți, în care este un sumator pe patru biți, o unitate <strong>de</strong> control, trei<br />

registre <strong>de</strong> patru biți şi un registru <strong>de</strong> un bit pentru transport.<br />

Pentru a înmulți două numere, multiplicandul este plasat în registrul M,<br />

multiplicatorul este plasat în registrul Q iar registre A şi C se setează la zero. În<br />

timpul înmulțirii, bitul cel mai puțin semnificativ al multiplicatorului <strong>de</strong>termină<br />

dacă multiplicandul este adunat la produs la fiecare pas. După ce multiplicandul este<br />

adunat la produs, multiplicatorul şi registrul A sunt <strong>de</strong>plasate la dreapta simultan.<br />

Figura <strong>de</strong> mai jos prezintă procesul <strong>de</strong> înmulțire.<br />

66


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Inițial C şi A au valoarea zero, iar M şi Q conțin multiplicandul respectiv<br />

multiplicatorul. Bitul cel mai <strong>din</strong> dreapta al lui Q este 1, aşa că multipicatorul M este<br />

adunat la produs în registrul A. Registre A şi Q formează produsul pe 8 biți, dar în<br />

registrul A se adună multiplicandul. După ce M este adunat la A, registre A şi Q sunt<br />

<strong>de</strong>plasați la dreapta. Din moment ce A şi Q sunt legați pentru a forma produsul <strong>de</strong> 8<br />

biți, bitul cel mai <strong>din</strong> dreapta al lui A este <strong>de</strong>plasat în bitul cel mai <strong>din</strong> stânga (cel mai<br />

semnificativ) al lui Q. Bitul cel mai <strong>din</strong> dreapta al lui Q este eliminat, C este <strong>de</strong>plasat<br />

în bitul cel mai semnificativ al lui A şi C <strong>de</strong>vine zero.<br />

Procesul continuă pentru toți biții <strong>din</strong> multiplicator. La a doua iterație, bitul cel mai<br />

<strong>din</strong> dreapta al lui Q este <strong>din</strong> nou 1, aşa că multiplicandul este adunat la A şi<br />

combinația C/A/Q este <strong>de</strong>plasată la dreapta. La ultima iterație, bitul cel mai <strong>din</strong><br />

dreapta al lui Q este 1 aşa că M este adunat la A şi combinație C/A/Q este <strong>de</strong>plasată<br />

la dreapta. Produsul este conținut în registre A şi Q, în care A conține partea cea mai<br />

semnificativă iar Q conține partea cea mai puțin semnificativă.<br />

Împărţirea numerelor fără semn<br />

La împărțirea binară, încercăm să scă<strong>de</strong>m împărțitorul <strong>din</strong> <strong>de</strong>împărțit, folosind<br />

numărul minim <strong>de</strong> biți în <strong>de</strong>împărțit. Din figura <strong>de</strong> mai jos reiese că (11)2 nu încape<br />

în 0 sau 01, dar încape în 011.<br />

Împărțirea binară în calculator poate fi rezolvată similar, numai că singurul mod în<br />

care putem să <strong>de</strong>ci<strong>de</strong>m dacă împărțitorul „încape” în <strong>de</strong>împărțit este <strong>de</strong> a face<br />

efectiv operația <strong>de</strong> scă<strong>de</strong>re şi să verificăm dacă rezultatul este negativ. Dacă<br />

rezultatul este negativ atunci scă<strong>de</strong>rea trebuie anulată prin adunarea înapoi a<br />

împărțitorului.<br />

În figura <strong>de</strong> mai jos prezentăm schema unui divizor serial pentru numere pe patru<br />

biți.<br />

67


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Aici avem un sumator <strong>de</strong> 5 biți, o unitate <strong>de</strong> control, un registru <strong>de</strong> 4 biți pentru<br />

<strong>de</strong>împărțitul Q şi două registre <strong>de</strong> 5 biți pentru împărțitorul M respectiv pentru<br />

restul A. Registre <strong>de</strong> 5 biți sunt folosiți pentru A şi M în locul unor registre <strong>de</strong> 4 biți,<br />

datorită faptului că e nevoie <strong>de</strong> un bit suplimentar care să indice semnul rezultatului<br />

intermediar. Cu toate că această metodă <strong>de</strong> împărțire este pentru numere fără semn,<br />

este folosită şi operația <strong>de</strong> scă<strong>de</strong>re aşa că putem obține şi rezultate negative, iar<br />

bitul suplimentar este pentru bitul <strong>de</strong> semn.<br />

Pentru a împărți două numere pe 4 biți, <strong>de</strong>împărțitul este plasat în registrul Q,<br />

împărțitorul este plasat în registrul M iar registrul A şi bitul cel mai semnificativ al<br />

lui M sunt setate la zero. Bitul cel mai semnificativ al lui A <strong>de</strong>termină dacă<br />

împărțitorul este adunat la <strong>de</strong>împărțit la fiecare pas. Aceasta este necesar pentru a<br />

restaura <strong>de</strong>împărțitul atunci când rezultatul este negativ. Când rezultatul este<br />

pozitiv, cel mai puțin semnificativ bit al lui Q este setat la 1, ceea ce indică faptul că<br />

împărțitorul „încape” în <strong>de</strong>împărțit.<br />

În figura <strong>de</strong> mai jos este prezentat procesul <strong>de</strong> împărțire.<br />

68


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Înmulţirea şi împărţirea numerelor cu semn<br />

Dacă aplicăm meto<strong>de</strong>le <strong>de</strong> înmulțire şi împărțire <strong>de</strong>scrise pentru numere fără semn<br />

la numere cu semn, vom întâmpina unele probleme. Consi<strong>de</strong>răm înmulțirea lui ‐1 cu<br />

1 folosind o reprezentare pe 4 biți aşa cum este în figura <strong>de</strong> mai jos:<br />

Ceea ce se produce este echivalentul lui +15 reprezentat pe 8 biți. Ceea ce s‐a<br />

întâmplat a fost că bitul <strong>de</strong> semn nu s‐a propagat înspre stânga, înspre bitul <strong>de</strong><br />

semn. Aceasta nu este o problemă pentru numerele negative care oricum au bitul <strong>de</strong><br />

semn 0.<br />

O soluție este prezentată în figura <strong>de</strong> mai sus, în care fiecare produs parțial este<br />

extins la lățimea rezultatului şi doar primii 8 biți mai puțin semnificativi sunt<br />

reținuți. Dacă ambii operanzi sunt negativi, atunci semnele extinse pentru ambii<br />

operanzi, reținând tot primii 8 biți mai puțin semnificativi.<br />

69


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Aritmetică în virgulă mobilă<br />

Operațiile aritmetice cu numere reprezentate în virgulă mobilă pot fi efectuate<br />

folosind meto<strong>de</strong>le <strong>de</strong>scrise pentru numerele reprezentate în virgulă fixă, cu câteva<br />

ajustări. În continuare vom prezenta modul în care se fac aceste operații în baza 2 şi<br />

baza 10.<br />

Adunarea şi scă<strong>de</strong>rea numerelor în virgulă mobilă<br />

Aritmetica pentru numerele reale diferă <strong>de</strong> aritmetică pentru întregi întrucât<br />

trebuie tratat atât exponentul cât şi mantisa operanzilor. La fel ca şi la aritmetica în<br />

baza 10 utilizând notație ştiințifică, exponenții operanzilor trebuie să fie egalizați<br />

pentru adunare şi scă<strong>de</strong>re. Părțile fracționare sunt apoi adunate sau scăzute iar<br />

rezultatul se normalizează.<br />

Acest proces <strong>de</strong> ajustare a părții fracționare şi rotunjirea poate duce la pier<strong>de</strong>rea <strong>de</strong><br />

precizie în rezultat. Să consi<strong>de</strong>răm adunarea a două numere reale fără semn (.101 x<br />

2 3 + .111 x 2 4 ) în care partea fracționară are trei cifre semnificative. Prima dată vom<br />

ajusta exponentul mai mic pentru a fi egal cu cel mai mare şi vom modifica în<br />

consecință partea fracționară. Astfel vom avea: .101 x 2 3 = .010 x 2 4 , pierzând astfel<br />

.001 x 2 3 <strong>din</strong> precizie în acest proces. Suma care rezultă este:<br />

(.010 + .111) x 2 4 = 1.001 x 2 4 = .1001 x 2 5<br />

iar rotunjind la 3 cifre semnificative avem: .100 x 2 5 , pierzând încă .001 x 2 4 <strong>din</strong><br />

precizie.<br />

Numerele reale au o structură complicată (mantisa este păstrată în reprezentare<br />

magnitu<strong>din</strong>e cu semn, exponentul este reprezentat în exces iar bitul <strong>de</strong> semn este<br />

separat) dar această structură permite realizarea operațiilor <strong>de</strong> comparație (, =)<br />

fără a fi necesară <strong>de</strong>spachetarea numărului. Înaintea unei operații <strong>de</strong> adunare,<br />

numărul trebuie <strong>de</strong>spachetat <strong>din</strong> reprezentarea internă (IEEE754): exponentul şi<br />

mantisa trebuie extrase, trebuie efectuate operațiile iar mai apoi rezultatul trebuie<br />

renormalizat şi rotunjit iar secvența <strong>de</strong> biți este reîmpachetată în formatul intern.<br />

La comparare bitul <strong>de</strong> semn este cel mai important şi prin urmare este bitul cel mai<br />

semnificativ în formatul IEEE754. După aceea cel mai important în compararea a<br />

două numere reale este exponentul, <strong>din</strong> moment ce o modificare <strong>de</strong> ± 1în exponent<br />

schimbă numărul cu un factor <strong>de</strong> 2 (în baza 2), pe când o schimbare ± 1 chiar şi în<br />

cel mai semnificativ bit al părții fracționare va avea un efect mai mic asupra<br />

numărului.<br />

Pentru a ține cont <strong>de</strong> bitul <strong>de</strong> semn, fracțiile reprezentate în magnitu<strong>din</strong>e cu semn<br />

sunt reprezentate ca întregi şi sunt convertite în complement față <strong>de</strong> 2. După<br />

operația <strong>de</strong> adunare sau scă<strong>de</strong>re în complement față <strong>de</strong> 2, apare nevoia <strong>de</strong> a<br />

normaliza rezultatul şi <strong>de</strong> a ajusta bitul <strong>de</strong> semn. Rezultatul este mai apoi convertit<br />

înapoi în forma magnitu<strong>din</strong>e cu semn.<br />

70


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Înmulţirea şi împărţirea numerelor în virgulă mobilă<br />

Înmulțirea şi împărțirea numerelor reprezentate în virgulă mobilă se face similar cu<br />

adunarea şi scă<strong>de</strong>rea numerelor reprezentate în virgulă mobilă, cu excepția că<br />

semnul, exponentul şi mantisa rezultatului pot fi calculate separat. Dacă operanzii<br />

au acelaşi semn, atunci semnul rezultatului este pozitiv. Semne diferite vor produce<br />

semnul rezultatului negativ. Exponentul rezultatului înainte <strong>de</strong> normalizare se<br />

obține prin adunarea exponenților operanzilor sursă la înmulțire şi prin scă<strong>de</strong>rea<br />

lor la împărțire. Se efectuează operația dorită şi urmează normalizarea.<br />

Să consi<strong>de</strong>răm că folosim fracții pe 3 biți pentru a efectua operația în baza 2: (+.101<br />

x 2 2 ) x (‐.110 x 2 ‐3 ). Semnul operanzilor diferă, ceea ce înseamnă că semnul<br />

rezultatului va fi negativ. Efectuăm înmulțire aşa că adunăm exponenții şi rezultatul<br />

va fi 2+ ‐3 = ‐1. Înmulțim partea fracționară, ceea ce ne dă .01111. Normalizarea<br />

produsului şi reținerea a doar 3 biți va produce ‐.111 x 2 ‐2 .<br />

Un alt exemplu, (+.110 x 2 5) / (+.100 x 2 4). Operanzii au acelaşi semn, cea ce<br />

înseamnă că rezultatul va avea semn pozitiv. Scă<strong>de</strong>m exponenții şi obținem 5 – 4 = 1.<br />

Împărțim fracțiile, ceea ce se poate face în mai multe moduri. Dacă tratăm fracțiile<br />

ca întregi fără semn, atunci vom avea 110/100 = 1 rest 10. Ceea ce dorim este o<br />

secvență contiguă <strong>de</strong> biți ce reprezintă fracția în loc <strong>de</strong> valori separate pentru cât şi<br />

rest, aşa că putem scala <strong>de</strong>împărțitul la stânga cu două poziții, ceea ce ne dă:<br />

11000/100 = 110. După aceea <strong>de</strong>plasăm rezultatul la dreapta cu două poziții şi<br />

obținem 1.10. În concluzie, rezultatul împărțirii lui (+.110 x 2 5 ) la (+.100 x 2 4 ) este<br />

(+1.10 x 2 1 ). După normalizare, rezultatul final este: (+.110 x 2 1 ).<br />

Studiu <strong>de</strong> caz: Aritmetica BCD<br />

Aritmetica în calculatoarele <strong>de</strong> buzunar se face în baza 10, în loc <strong>de</strong> baza 2. Aceste<br />

calculatoare trebuie să fie mici şi ieftine aşa că numerele se reprezintă în BCD<br />

folosind patru biți pentru fiecare cifră zecimală. Reprezentarea în baza 2 ar necesita<br />

conversii <strong>de</strong> baze pentru care e nevoie <strong>de</strong> resurse <strong>de</strong>stul <strong>de</strong> mari. O unitatea<br />

aritmetică şi logică <strong>de</strong> 4 biți poate face operațiile aritmetice serial, cifră cu cifră.<br />

<strong>Calcul</strong>atorul HP9100A, care a apărut în anii ’60 efectua operații aritmetice<br />

elementare: adunare, scă<strong>de</strong>re, înmulțire şi împărțire, precum şi rădăcina pătrată, e x,<br />

71


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

ln x şi log x, funcții trigonometrice şi alte funcții, toate folosind aritmetica în baza 10.<br />

<strong>Calcul</strong>atorul putea afişa 10 cifre semnificative dar toate calculele se făcea folosind<br />

12 cifre, ultimele două cifre (cele mai puțin semnificative) fiind folosite pentru<br />

trunchieri şi erori <strong>de</strong> rotunjire. Cu toate că acest calculator în ziua <strong>de</strong> astăzi pare o<br />

relicvă, meto<strong>de</strong>le aritmetice sunt încă relevante.<br />

În continuare vom prezenta tehnicile generale pentru efectuarea adunării şi scă<strong>de</strong>rii<br />

în virgulă fixă şi mobilă folosind BCD.<br />

Adunare şi scă<strong>de</strong>re BCD<br />

Să consi<strong>de</strong>răm adunarea numerelor (+255)10 şi (+63)10 reprezentate în BCD.<br />

Fiecare cifră BCD ocupă patru biți şi adunarea se efectuează cifră cu cifră (nu bit cu<br />

bit), <strong>de</strong> la dreapta la stânga, aşa cum am face în mod obişnuit. Rezultatul (+318)10<br />

este produs tot în format BCD.<br />

Scă<strong>de</strong>rea în BCD se efectuează similar cu modul în care se efectuează scă<strong>de</strong>rea în<br />

complement față <strong>de</strong> doi (se adună opusul <strong>de</strong>scăzutului) cu excepția faptului că se<br />

foloseşte complement față <strong>de</strong> 10 în loc <strong>de</strong> complement față <strong>de</strong> 2.<br />

La efectuarea operației (255 + (‐63) = 192)10, formăm complementul față <strong>de</strong> 9 al lui<br />

63 după care adunăm 1 pentru a obține complementul față <strong>de</strong> 10.<br />

Adunarea se poate acum efectua aşa cum este prezentat în figura <strong>de</strong> mai jos:<br />

72


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Transportul ce iese <strong>de</strong> la cea mai semnificativă cifră este eliminat, la fel ca şi la<br />

adunarea în complement față <strong>de</strong> doi.<br />

Spre <strong>de</strong>osebire <strong>de</strong> reprezentarea în complement față <strong>de</strong> doi nu putem să examinăm<br />

bitul cel mai semnificativ pentru a <strong>de</strong>termina semnul. În complement față <strong>de</strong> 10,<br />

numărul este pozitiv dacă cifra BCD <strong>din</strong> stânga (cea mai semnificativă) este între 0 şi<br />

4. Dacă este între 5 şi 9 atunci numărul este negativ. Secvența <strong>de</strong> biți pentru 4 este<br />

0100 iar pentru 5 este 0101. Ambele secvențe au bitul cel mai semnificativ 0 dar, cu<br />

toate acestea, cifra 4 înseamnă număr pozitiv iar cifra 5 <strong>de</strong>ja înseamnă număr<br />

negativ. Dacă folosim exces 3 pentru a codifica fiecare cifră, atunci bitul <strong>din</strong> stânga<br />

va indica semnul. În figura <strong>de</strong> mai jos este prezentată această codificare:<br />

Un sumator complet BCD trebuie să adune două cifre BCD şi un transport şi trebuie<br />

să producă o cifră BCD ca rezultat al adunării şi un transport la ieşire, toate<br />

reprezentate în exces 3. În figura <strong>de</strong> mai jos este prezentat un astfel <strong>de</strong> sumator care<br />

foloseşte sumatoare complete în complement față <strong>de</strong> doi.<br />

73


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Cifrele BCD reprezentate în exces 3 sunt adunate în cele patru sumatoare complete<br />

în complement față <strong>de</strong> doi <strong>din</strong> partea superioară. Din moment ce fiecare operand<br />

este reprezentat în exces 3, rezultatul este în exces 6. Pentru a stoca rezultatul în<br />

exces 3, trebuie să scă<strong>de</strong>m 3 <strong>din</strong> rezultat. Ca o alternativă putem aduna 13 la rezultat<br />

pentru că 16 – 3 = 16 + 13 într‐o reprezentare pe patru biți, eliminând transportul<br />

care iese <strong>de</strong> la bitul cel mai semnificativ. În figura <strong>de</strong> mai sus am folosit această<br />

ultimă alternativă, un<strong>de</strong> 1310 = 11012 este adunat la rezultat. Aceasta funcționează<br />

doar dacă nu avem transport. Când avem transport, atunci trebuie să mai scă<strong>de</strong>m 10<br />

(sau să adunăm 6) <strong>din</strong> rezultat şi să producem un transport. Aici am adunat 310 =<br />

00112 ceea ce are acelaşi efect cu adunarea (6+13) % 16 = 3.<br />

Pentru a efectua scă<strong>de</strong>ri BCD, putem crea un scăzător în complement față <strong>de</strong> 10<br />

folosind scăzători compleți în baza 10. Ca o alternativă putem crea complementul<br />

față <strong>de</strong> 10 negativ al <strong>de</strong>scăzutului şi să aplicăm o operație <strong>de</strong> adunare BCD. În figura<br />

<strong>de</strong> mai jos prezentăm calculul (21‐34 = ‐13)10 folosind această ultimă metodă <strong>de</strong><br />

scă<strong>de</strong>re pentru numere formate <strong>din</strong> patru cifre.<br />

Complementul față <strong>de</strong> 10 negativ al lui 34 este adunat la 21, ceea ce ne dă 9987 în<br />

complement față <strong>de</strong> 10, ceea ce este (‐13)10 în magnitu<strong>din</strong>e cu semn.<br />

Adunarea şi scă<strong>de</strong>rea BCD a numerelor în virgulă mobilă<br />

Să consi<strong>de</strong>răm o reprezentare în virgulă mobilă în baza 10 cu exponentul<br />

reprezentat pe două cifre în magnitu<strong>din</strong>e cu semn şi mantisa reprezentată pe 8 cifre<br />

în magnitu<strong>din</strong>e cu semn. Un exemplu <strong>de</strong> ceea ce ve<strong>de</strong> utilizatorul ar putea fi: ‐<br />

.37100000 x 10 ‐12 , care este în forma normalizată.<br />

Un calculator foloseşte intern o reprezentare în complement față <strong>de</strong> 10 atât pentru<br />

exponent cât şi pentru partea fracționară. Pentru exemplul <strong>de</strong> mai sus<br />

74


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

reprezentarea în complement față <strong>de</strong> 10 ar fi: 88 pentru exponent şi 62900000<br />

pentru partea fracționară. Folosind reprezentarea în exces 3 în binar va rezulta<br />

exponentul 1011 1011 şi partea fracționară: 1001 0101 1100 0011 0011 0011 0011<br />

0011. Din moment ce folosim bitul cel mai <strong>din</strong> stânga pentru semn, exponentul<br />

variază între ‐50 şi 49 iar partea fracționară între ‐.50000000 şi +.49999999.<br />

Dacă încercăm să reprezentăm +.9 în baza 10, atunci suntem <strong>din</strong> nou în impas<br />

pentru că bitul cel mai <strong>din</strong> stânga al este folosit pentru semn. Adică, nu putem folosi<br />

1100 ca cifră cea mai semnificativă, <strong>de</strong>oarece, cu toate că e reprezentarea în exces 3<br />

a lui 9, fracția va apărea ca fiind negativă. Pentru aceasta avem o soluție mai bună:<br />

folosim complementul față <strong>de</strong> 10 pentru aritmetica în baza 10 la exponent şi folosim<br />

reprezentarea în magnitu<strong>din</strong>e cu semn pentru partea fracționară.<br />

Pentru a concluziona: Folosim reprezentarea în complement față <strong>de</strong> 10 pentru<br />

exponent <strong>de</strong>oarece este întreg şi folosim reprezentarea în magnitu<strong>din</strong>e cu semn în<br />

baza 10 pentru partea fracționară. Un bit <strong>de</strong> semn separat este alocat pentru partea<br />

fracționară, aşa că fiecare cifră poate lua oricare <strong>din</strong> cele 10 valori <strong>de</strong> la 0 la 9 (cu<br />

excepția primei cifre, care nu poate fi zero) aşa că acum putem reprezenta +.9.<br />

Exponentul trebuie reprezentat în exces 50 pentru a putea face mai uşor<br />

comparațiile. Exemplul prece<strong>de</strong>nt va arăta intern astfel:<br />

Bitul <strong>de</strong> semn: 1<br />

Exponentul: 0110 1011<br />

Fracția: 0110 1010 0100 0011 0011 0011 0011 0011 0011<br />

Este reprezentat în exces 3, cu două cifre pentru exponent în exces 50.<br />

Pentru a aduna două numere în aceasta reprezentare, trebuie să parcurgem aceeaşi<br />

paşi ca şi pentru reprezentarea în baza 2 a numerelor reprezentate în virgulă<br />

mobilă. Vom ajusta exponentul şi partea fracționară a operandului mai mic până<br />

când exponenții ambilor operanzi sunt egali. Dacă diferența <strong>din</strong>tre exponenți este<br />

atât <strong>de</strong> mare încât partea fracționară a operandului mai mic este <strong>de</strong>plasat complet la<br />

dreapta atunci operandul mai mic este tratat ca zero. După ajustarea părții<br />

fracționare mai mici, convertim unul sau ambii operanzi <strong>din</strong> reprezentarea în<br />

magnitu<strong>din</strong>e cu semn în complement față <strong>de</strong> 10 în funcție <strong>de</strong> operația pe care o<br />

facem: adunare sau scă<strong>de</strong>re şi în funcție <strong>de</strong> semnul operanzilor.<br />

Concluzie<br />

Aritmetica în calculatoare poate fi efectuată exact la fel cum procedăm atunci când<br />

efectuăm adunare zecimală cu creionul pe hârtie, luând în calcul baza <strong>de</strong> numerație.<br />

Reprezentarea în complement față <strong>de</strong> 2 sau complement față <strong>de</strong> 10 se foloseşte <strong>de</strong><br />

regulă pentru întregi, iar reprezentarea în magnitu<strong>din</strong>e cu semn se foloseşte <strong>de</strong><br />

regulă pentru fracții datorită dificultății manipulării fracțiilor pozitive şi negative<br />

într‐o manieră uniformă.<br />

Se poate îmbunătăți performanța operațiilor aritmetice prin folosirea unor algoritmi<br />

specializați.<br />

75


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

5. <strong>Arhitectura</strong> setului <strong>de</strong> instrucţiuni<br />

Introducere<br />

În continuare vom trece în revistă un subiect important pentru arhitectura<br />

calculatoarelor şi anume: limbajul înțeles <strong>de</strong> hardware‐ul sistemului <strong>de</strong> calcul numit<br />

limbaj maşină. Despre limbajul maşină se discută <strong>de</strong> regulă în termenii limbajului<br />

<strong>de</strong> asamblare asociat, care este echivalent <strong>din</strong> punct <strong>de</strong> ve<strong>de</strong>re funcțional limbajului<br />

maşină corespunzător, cu excepția faptului că limbajul <strong>de</strong> asamblare foloseşte nume<br />

intuitive cum ar fi: Move, Add, Jump în locul cuvintelor binare ale limbajului maşină.<br />

(Programatorii înțeleg mult mai simplu instrucțiuni <strong>de</strong> forma "Add r0, r1, r2" <strong>de</strong>cât<br />

secvențe <strong>de</strong> genul 0110101110101101.)<br />

Pentru a <strong>de</strong>scrie limbajul <strong>de</strong> asamblare şi programare în limbaj <strong>de</strong> asamblare, vom<br />

folosi ca mo<strong>de</strong>l arhitectural maşina ARC, care este o simplificare a arhitecturii<br />

SPARC <strong>de</strong> la SUN.<br />

Componentele hardware ale arhitecturii setului <strong>de</strong> instrucţiuni (ASI)<br />

ASI a unui sistem <strong>de</strong> calcul prezintă programatorului în limbaj <strong>de</strong> asamblare o<br />

viziune asupra sistemului <strong>de</strong> calcul care inclu<strong>de</strong> tot hardware‐ul accesibil<br />

programatorului şi instrucțiunile care manipulează datele în hardware. În<br />

continuare vom prezenta componentele hardware aşa cum sunt văzute <strong>de</strong><br />

programatorul în limbaj <strong>de</strong> asamblare.<br />

Mo<strong>de</strong>lul „Magistrală sistem”<br />

Scopul magistralei este <strong>de</strong> a reduce numărul <strong>de</strong> interconexiuni <strong>din</strong>tre procesor şi<br />

subsistemele sale. În loc să aibă căi <strong>de</strong> comunicație separate între memorie şi<br />

dispozitivele <strong>de</strong> I/E, procesorul este interconectat cu memoria şi fiecare dispozitiv<br />

<strong>de</strong> I/E printr‐o magistrală sistem partajată. Într‐un sistem mai complex ar putea<br />

exista magistrale separate între procesor (CPU) şi memorie şi între procesor şi<br />

dispozitivele <strong>de</strong> I/E.<br />

Nu toate componentele sunt conectate la magistrala sistem în acelaşi mod.<br />

Procesorul generează adrese care sunt plasate pe magistrala <strong>de</strong> adrese iar memoria<br />

recepționează adresele <strong>de</strong> la magistrala <strong>de</strong> adrese. Memoria nu generează niciodată<br />

76


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

adrese, iar procesorul nu recepționează niciodată adrese aşa că săgețile<br />

corespunzătoare <strong>din</strong> figura <strong>de</strong> mai sus sunt unidirecționale.<br />

Scenariul obişnuit este: utilizatorul scrie programul într‐un limbaj <strong>de</strong> programare <strong>de</strong><br />

nivel înalt, compilatorul îl traduce în limbaj <strong>de</strong> asamblare. Asamblorul traduce<br />

programul <strong>din</strong> limbaj <strong>de</strong> asamblare în program în cod maşină, program care este<br />

stocat pe disc. Înainte <strong>de</strong> execuție, programul în cod maşină este încărcat <strong>de</strong> pe disc<br />

în memoria principală <strong>de</strong> către sistemul <strong>de</strong> operare.<br />

În timpul execuției fiecare instrucțiune este adusă pe rând în unitatea aritmetică şi<br />

logică <strong>din</strong> memorie, împreună cu datele necesare pentru execuția ei. Datele <strong>de</strong> ieşire<br />

ale programului sunt plasate pe un dispozitiv cum ar fi un display vi<strong>de</strong>o sau pe disc.<br />

Toate aceste operații sunt orchestrate <strong>de</strong> unitatea <strong>de</strong> control. Comunicația între cele<br />

trei componente (CPU, memorie, I/E) se realizează prin magistrale.<br />

Instrucțiunile se execută în unitatea aritmetică şi logică (UAL), cu toate că<br />

instrucțiunile şi datele sunt stocate inițial în memorie. Aceasta înseamnă că<br />

instrucțiunile şi datele trebuie încărcate <strong>din</strong> memorie în registre UAL iar rezultatul<br />

trebuie stocat înapoi în memorie.<br />

Memoria<br />

Este formată <strong>din</strong>tr‐o colecție <strong>de</strong> registre numerotate consecutiv (adresați), fiecare<br />

registru poate stoca în mod normal un octet. Fiecare registru are o adresă numită<br />

locație <strong>de</strong> memorie. Termenii bit respectiv byte (octet) au acelaşi înțeles pentru<br />

orice arhitectură în schimb termenul cuvânt <strong>de</strong>pin<strong>de</strong> <strong>de</strong> procesor. Dimensiuni tipice<br />

pentru un cuvânt sunt: 16, 32, 64 sau 128 biți, cel mai <strong>de</strong>s în ziua <strong>de</strong> astăzi, în<br />

sistemele <strong>de</strong> calcul actuale folosindu‐se cuvinte <strong>de</strong> 32 <strong>de</strong> biți.<br />

Într‐un sistem <strong>de</strong> calcul în care adresarea se face la nivel <strong>de</strong> octet, cel mai mic obiect<br />

ce poate fi referit în memorie este octetul, cu toate că există instrucțiuni care citesc<br />

şi scriu cuvinte formate <strong>din</strong> mai mulți octeți. Cuvintele formate <strong>din</strong> mai mulți octeți<br />

sunt stocate ca secvențe <strong>de</strong> octeți şi sunt adresate prin octetul cuvântului care are<br />

77


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

adresa cea mai mică. Majoritatea sistemelor actuale au instrucțiuni care pot accesa<br />

octeți, jumătăți <strong>de</strong> cuvânt, cuvinte şi cuvânt dublu.<br />

Atunci când se folosesc cuvinte formate <strong>din</strong> mai mulți octeți, există două variante<br />

pentru stocare octeților în memorie: cel mai semnificativ octet la adresa cea mai<br />

mică, adică big­endian, sau cel mai puțin semnificativ octet la adresa cea mai mică,<br />

adică little­endian.<br />

Exemple pentru cele două variante sunt date în figura <strong>de</strong> mai jos în care sunt<br />

prezentate cuvinte formate <strong>din</strong> patru octeți:<br />

Octeții într‐un cuvânt format <strong>din</strong> mai mulți octeți sunt stocați la adrese consecutive<br />

aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai sus. Dacă avem <strong>de</strong> a face cu memorie adresabilă la<br />

nivel <strong>de</strong> octet fiecare octet poate fi adresat prin adresa lui specifică. Cuvântul format<br />

<strong>din</strong> patru octeți se accesează prin referențierea adresei octetului cu cea mai mică<br />

adresă (x în figură). Aceasta este valabil indiferent dacă varianta <strong>de</strong> stocare este<br />

little­endian sau big­endian.<br />

În continuare vom folosi memoria prezentată în figura <strong>de</strong> mai jos.<br />

Această memorie are un spațiu <strong>de</strong> adresare <strong>de</strong> 32 <strong>de</strong> biți, ceea ce înseamnă că un<br />

program poate accesa un octet <strong>din</strong> memorie oriun<strong>de</strong> în intervalul 0..2 32 ‐1. Spațiul <strong>de</strong><br />

78


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

adresare este împărțit pentru arhitectura noastră în regiuni distincte care sunt<br />

folosite pentru sistemul <strong>de</strong> operare, pentru intrare‐ieşire, programul utilizator, stiva<br />

sistemului, care formează harta memoriei aşa cum este prezentată în figură. Harta<br />

memoriei diferă <strong>de</strong> la o implementare la alta, acesta fiind unul <strong>din</strong> motivele pentru<br />

care un program compilat pentru acelaşi tip <strong>de</strong> procesor s‐ar putea să nu fie<br />

compatibil <strong>de</strong> la un sistem la altul.<br />

Primii 2048 <strong>de</strong> octeți sunt rezervați pentru sistemul <strong>de</strong> operare. Spațiu utilizator<br />

este locul în care se încarcă programele şi poate creşte <strong>de</strong> la poziția 2048 până<br />

întâlneşte stiva sistem. Stiva sistem începe la locația 2 31‐4 şi poate creşte înspre<br />

adrese mai mici. Spațiul <strong>de</strong> adresare <strong>de</strong> la 2 31 la 2 32 ‐1 este rezervat pentru<br />

dispozitivele <strong>de</strong> intrare‐ieşire. Din moment ce dispozitivele <strong>de</strong> intrare‐ieşire sunt<br />

tratate ca locații <strong>de</strong> memorie, comenzile obişnuite <strong>de</strong> citire şi scriere în memorie pot<br />

fi folosite pentru citirea şi scrierea dispozitivelor.<br />

Trebuie făcută distincția între adresă şi date. O adresă are 32 <strong>de</strong> biți iar un cuvânt<br />

este tot 32 <strong>de</strong> biți dar nu sunt acelaşi lucru. O adresă este un pointer la o locație <strong>de</strong><br />

memorie care conține date. O adresă <strong>de</strong> memorie <strong>de</strong> n biți poate specifica 2 n<br />

elemente aşa că dimensiunea memoriei ce poate fi accesată <strong>de</strong>pin<strong>de</strong> <strong>de</strong> numărul <strong>de</strong><br />

biți rezervați pentru adrese <strong>de</strong> memorie ce pot fi plasate <strong>de</strong> procesor pe magistrala<br />

<strong>de</strong> adrese.<br />

Microprocesorul<br />

Microprocesorul este format <strong>din</strong>tr‐o secțiune <strong>de</strong> date care conține registre şi<br />

Unitatea Aritmetică şi Logică (UAL) şi o secțiune <strong>de</strong> control care interpretează<br />

instrucțiunile şi efectuează transferul între registre aşa cum este prezentat în figura<br />

<strong>de</strong> mai jos.<br />

Secțiunea <strong>de</strong> date se mai numeşte Datapath.<br />

Unitatea <strong>de</strong> control este responsabilă <strong>de</strong> executarea instrucțiunilor programului, ce<br />

sunt stocate în memorie principală. (Vom consi<strong>de</strong>ra că instrucțiunile sunt<br />

interpretate una câte una). Există două registre care formează interfața între<br />

unitatea <strong>de</strong> control şi unitatea <strong>de</strong> date, numite Program Counter (PC – contor<br />

program) şi Instruction Register (IR – registru instrucțiune). PC conține adresa<br />

79


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

instrucțiunii care se execută. Instrucțiunea indicată <strong>de</strong> PC este extrasă <strong>din</strong> memorie<br />

şi este stocată în IR un<strong>de</strong> este interpretată. Paşii pe care îi efectuează unitatea <strong>de</strong><br />

control la execuția unui program sunt:<br />

1. Extrage <strong>din</strong> memorie următoare instrucțiune ce se va executa<br />

2. Decodifică codul operației<br />

3. Citeşte operandul (operanzii) <strong>din</strong> memorie, dacă există<br />

4. Execută instrucțiunea şi stochează rezultatul<br />

5. Salt la pasul 1.<br />

Acesta este ciclul extragere­execuţie.<br />

Unitatea <strong>de</strong> control este responsabilă pentru coordonarea diferitelor unități în<br />

execuția unui program. Aceasta ia <strong>de</strong>cizii în legătură cu modul în care se comportă<br />

restul sistemului.<br />

Datapath‐ul este format <strong>din</strong>tr‐o colecție <strong>de</strong> registre numite register file, şi <strong>din</strong> UAL<br />

aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos:<br />

Register file poate privit ca o memorie mică şi rapidă separată <strong>de</strong> memoria<br />

sistemului, care este folosită pentru stocarea temporară în timpul operațiilor<br />

aritmetice. Dimensiunea acestuia este <strong>de</strong> obicei cuprinsă între câteva registre până<br />

la câteva mii. Fiecare registru are alocată o adresă la fel ca şi memoria începând <strong>de</strong><br />

la zero. Aceste „adrese” <strong>de</strong> registre sunt mult mai mici <strong>de</strong>cât adresele <strong>de</strong> memorie.<br />

Pentru un register file ce conține 32 <strong>de</strong> registre dimensiunea adresei este <strong>de</strong> 5 biți.<br />

Diferența majora <strong>din</strong>tre register file şi memorie este că e conținut în microprocesor<br />

şi <strong>de</strong> aceea este mult mai rapid. Din acest motiv programele ce folosesc intens<br />

registre sunt mult mai rapi<strong>de</strong> <strong>de</strong>cât programele ce folosesc intens memoria, chiar<br />

dacă e nevoie <strong>de</strong> mai multe operații cu registre <strong>de</strong>cât cu memorie pentru a efectua o<br />

operație.<br />

80


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Setul <strong>de</strong> instrucţiuni este o colecție <strong>de</strong> instrucțiuni pe care procesorul poate să le<br />

execute şi acestea <strong>de</strong>finesc procesorul. Setul <strong>de</strong> instrucțiuni este diferit <strong>de</strong> la un<br />

procesor la altul. Aceste instrucțiuni diferă prin dimensiunea instrucțiunilor, tipul<br />

operațiilor pe care le permit, tipul operanzilor asupra cărora operează şi tipul<br />

rezultatelor generate. Această compatibilitate la nivel <strong>de</strong> set <strong>de</strong> instrucțiuni este în<br />

contrast cu compatibilitatea limbajelor <strong>de</strong> programare <strong>de</strong> nivel înalt cum sunt C,<br />

Pascal. Programele scrise în aceste limbaje pot rula aproape nemodificate pe multe<br />

procesoare dacă sunt recompilate pentru procesorul respectiv.<br />

(O excepție la această incompatibilitate la nivel <strong>de</strong> limbaj maşină este Java byteco<strong>de</strong>,<br />

care reprezintă un limbaj maşină pentru o maşină virtuală. Aceste programe vor<br />

rula nemodificate pe orice procesor care rulează Maşina Virtuală Java. MVJ este<br />

scrisă în limbajul <strong>de</strong> asamblare al procesorului țintă. MVJ interceptează bytecodul<br />

Java şi îl execută ca şi cum ar rula pe un hardware Java)<br />

Datorită acestei incompatibilități în setul <strong>de</strong> instrucțiuni, sistemele <strong>de</strong> calcul sunt<br />

a<strong>de</strong>sea i<strong>de</strong>ntificate prin tipul <strong>de</strong> procesor cu care sunt dotate. Setul <strong>de</strong> instrucțiuni<br />

<strong>de</strong>termină programele pe care sistemul le poate executa şi are un efect important<br />

asupra performanței. Programele compilate pentru IBM PC (sau compatibil)<br />

folosesc setul <strong>de</strong> instrucțiuni al unui procesor 80x86, un<strong>de</strong> x se înlocuieşte cu o cifră<br />

ce corespun<strong>de</strong> versiunii <strong>de</strong> procesor: 2, 3, 4, 5 (Pentium). Aceste programe nu vor<br />

rula pe Apple Macintosh sau IBM RS6000 <strong>din</strong> moment ce sistemele IBM execută<br />

setul <strong>de</strong> instrucțiuni ale procesorului Motorola PowerPC. Chiar şi un program scris<br />

pentru un procesor nu va rula întot<strong>de</strong>auna pe sisteme diferite datorită diferențelor<br />

între sistemele <strong>de</strong> operare şi convențiilor <strong>de</strong> intrare‐ieşire.<br />

Software pentru generarea <strong>de</strong> programe în limbaj maşină sunt <strong>de</strong> regulă<br />

compilatoarele şi asambloarele.<br />

Un compilator este un program care transformă programul scris într‐un limbaj <strong>de</strong><br />

programare <strong>de</strong> nivel înalt în limbaj maşină. Compilatoarele pentru un limbaj <strong>de</strong><br />

programare vor avea partea „<strong>din</strong> față” (cea care recunoaşte construcțiile <strong>din</strong><br />

limbajul <strong>de</strong> programare <strong>de</strong> nivel înalt) i<strong>de</strong>ntică, iar „partea <strong>din</strong> spate” (cea care<br />

creează codul maşină) diferită pentru fiecare tip <strong>de</strong> sistem <strong>de</strong> calcul. Se poate ca<br />

acelaşi program compilat cu compilatoare diferite pentru acelaşi sistem <strong>de</strong> calcul să<br />

producă cod diferit.<br />

În procesul <strong>de</strong> compilare al unui program, programul sursă, scris într‐un limbaj <strong>de</strong><br />

programare <strong>de</strong> nivel înalt, este transformat în cod în limbaj <strong>de</strong> asamblare iar mai<br />

apoi codul în limbaj <strong>de</strong> asamblare este transformat în cod maşină <strong>de</strong> către asamblor.<br />

Aceste traduceri au loc în faza <strong>de</strong> compilare respectiv <strong>de</strong> asamblare. Programul<br />

obiect care rezultă poate fi link‐editat cu alte programe obiect în faza <strong>de</strong> link‐<br />

editare. Programul link‐editat, stocat <strong>de</strong> regulă pe disc, este încărcat în memoria<br />

principală în faza <strong>de</strong> încărcare a programului şi este executat <strong>de</strong> către procesor în<br />

faza <strong>de</strong> execuție (run‐time).<br />

Cu toate că majoritatea programelor se scriu în limbaje <strong>de</strong> nivel înalt, programatorii<br />

pot scrie programe sau secvențe <strong>din</strong> unele programe, care trebuie să ruleze foarte<br />

81


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

repe<strong>de</strong>, în asamblare. În plus, s‐ar putea să nu existe compilatoare pentru anumite<br />

procesoare speciale sau compilatoarele să nu poată fi folosite pentru a efectua<br />

anumite operații speciale. În aceste cazuri, programatorul este nevoit să recurgă <strong>din</strong><br />

nou la limbajul <strong>de</strong> asamblare.<br />

Limbajele <strong>de</strong> programare <strong>de</strong> nivel înalt ne permit să ignorăm arhitectura sistemului<br />

<strong>de</strong> calcul țintă. Pe <strong>de</strong> altă parte, la nivel limbaj maşină, arhitectura este cel mai<br />

important aspect <strong>de</strong> care trebuie ținut cont.<br />

ARC – „A RISC Computer”<br />

În continuare vom prezenta un mo<strong>de</strong>l arhitectural bazat pe arhitectura SPARC<br />

(Scalable Processor Architecture) <strong>de</strong>zvoltată <strong>de</strong> SUN la mijlocul anilor 60.<br />

<strong>Arhitectura</strong> SPARC a <strong>de</strong>venit populară datorită naturii sale „<strong>de</strong>schise”: <strong>de</strong>finiția<br />

completă a arhitecturii SPARC a fost făcută publică în 1992. Noi, vom prezenta doar<br />

o submulțime a SPARC, pe care o vom numi ARC (A RISC Computer).<br />

Memoria ARC<br />

ARC este o maşină pe 32 <strong>de</strong> biți cu memoria adresabilă la nivel <strong>de</strong> octet. Poate<br />

manipula tipuri <strong>de</strong> date <strong>de</strong> 32 <strong>de</strong> biți, dar toate datele sunt stocate în memorie ca<br />

octeți iar adresa unui cuvânt <strong>de</strong> 32 <strong>de</strong> biți eset adresa bitului care se află la adresa<br />

cea mai mică. Memoria este împărțită în mai multe zone aşa cum prezentat harta<br />

memoriei într‐o figură prece<strong>de</strong>ntă. Zonele memoriei sunt: zona rezervată sistemului<br />

<strong>de</strong> operare, zona rezervată programelor utilizator, stiva sistem şi zona pentru<br />

operații <strong>de</strong> intrare‐ieşire.<br />

ARC‐ul are mai multe tipuri <strong>de</strong> date (octet, jumătate <strong>de</strong> cuvânt, cuvânt). Fiecare<br />

întreg este stocat în memorie ca patru octeți în format big‐endian, aşa că octetul cel<br />

mai semnificativ este la adresa cea mai mică.<br />

Setul <strong>de</strong> instrucţiuni ARC<br />

Procesorul ARC are:<br />

• 32 <strong>de</strong> registre <strong>de</strong> 32 <strong>de</strong> biți pentru uz general, precum şi registrele PC şi IR.<br />

• Registrul PSR (Processor Status Register) care conține informații <strong>de</strong>spre<br />

starea procesorului, inclusiv informații <strong>de</strong>spre operațiile aritmetice. „Indicatorii<br />

aritmetici” <strong>din</strong> PSR se numesc coduri condiționale. Acestea specifică dacă o<br />

anumită operație aritmetică a generat valoarea zero (z), valoare negativă (n),<br />

transport <strong>din</strong> UAL (c) şi <strong>de</strong>păşire (v). Bitul v este setat atunci când rezultatul<br />

operației aritmetice este prea mare pentru a putea fi tratat <strong>de</strong> UAL.<br />

• Toate instrucțiunile au dimensiunea <strong>de</strong> un cuvânt (32 <strong>de</strong> biți).<br />

• ARC este o maşină <strong>de</strong> calcul <strong>de</strong> tip încărcare‐stocare: singurele operații <strong>de</strong><br />

acces la memorie permise sunt cele <strong>de</strong> încărcare a unei valori <strong>din</strong> memorie într‐<br />

un registru şi stocarea unei valori <strong>din</strong>tr‐un registru într‐o locație <strong>de</strong> memorie.<br />

Toate operațiile aritmetice operează asupra unor valori ce sunt conținute în<br />

82


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

registre iar rezultatul este plasat tot într‐un registru. <strong>Arhitectura</strong> SPARC are<br />

aproximativ 200 <strong>de</strong> instrucțiuni. Pentru ARC vom consi<strong>de</strong>ra doar 15 – cele mai<br />

importante. Acestea sunt prezentate în tabelul <strong>de</strong> mai jos împreună cu<br />

mnemonicele asociate (numele care reprezintă instrucțiunea).<br />

Mnemonică Înțeles<br />

Memorie ld Încarcă un registru <strong>din</strong> memorie<br />

st Stochează un registru în memorie<br />

Logic sethi Încarcă cei mai semnificativi 22 <strong>de</strong> biți ai unui registru<br />

andcc AND logic pe biți<br />

orcc SAU logic pe biți<br />

orncc NOR logic pe biți<br />

srl Deplasare la dreapta (logic)<br />

Aritmetic addcc Adunare<br />

Control call Apel <strong>de</strong> subrutină<br />

jmpl Salt şi legătură (return <strong>din</strong> apel <strong>de</strong> subrutină)<br />

be Ramificare în caz <strong>de</strong> egalitate<br />

bneg Ramificare dacă e negativ<br />

bcs Ramificare dacă există transport<br />

bvs Ramificare dacă apare <strong>de</strong>păşire<br />

ba Ramificare întot<strong>de</strong>auna<br />

Instrucțiunile ld (load) şi st (store) transferă un cuvânt între memorie şi unul <strong>din</strong><br />

registrele ARC. Acestea sunt singurele instrucțiuni care pot accesa memoria în ARC.<br />

Instrucțiunea sethi setează cei mai semnificativi 22 <strong>de</strong> biți ai unui registru cu o<br />

constantă pe 22 <strong>de</strong> biți conținută în instrucțiune. Este folosită pentru a construi o<br />

constantă pe 32 <strong>de</strong> biți într‐un registru, împreună cu o altă instrucțiune care setează<br />

cei 10 biți mai puțin semnificativi ai registrului.<br />

Instrucțiunile andcc, orcc, orncc efectuează operațiile AND, OR, NOR pe biți asupra<br />

operanzilor lor. Unul <strong>din</strong> cei doi operanzi sursă trebuie să fie într‐un registru.<br />

Rezultatul este stocat într‐un registru. Sufixul cc indică faptul că după terminarea<br />

operației biții „cod condiție” <strong>din</strong> PSR sunt actualizați pentru a reflecta rezultatul<br />

operației. Bitul z este setat dacă rezultatul este zero, bitul n este setat dacă cel mai<br />

semnificativ bit al rezultatului este 1, iar c şi v sunt setați la zero.<br />

Instrucțiunile call şi jmpl formează o pereche <strong>de</strong> instrucțiuni folosite la apelul şi<br />

întoarcerea <strong>din</strong>tr‐o subrutină. Instrucțiunea jmpl este folosită şi pentru a transfera<br />

controlul unei alte părți a programului.<br />

Ultimele cinci instrucțiuni provoacă o ramificare în execuția programului. Aceste<br />

instrucțiuni verifică anumiți biți <strong>din</strong> PSR şi execută ramificarea în funcție <strong>de</strong><br />

valoarea acestora. Aceste instrucțiuni sunt folosite pentru implementarea unor<br />

instrucțiuni <strong>din</strong> cadrul limbajelor <strong>de</strong> nivel înalt cum sunt: goto, if‐then‐else, do‐<br />

while.<br />

83


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Formatul instrucţiunilor în limbaj <strong>de</strong> asamblare ARC<br />

Fiecare limbaj <strong>de</strong> asamblare are propria sintaxă. Pentru ARC formatul va fi:<br />

Operand Operand<br />

Etichetă Mnemonică sursă <strong>de</strong>stinaţie Comentariu<br />

Avem patru câmpuri: o etichetă opțională, un câmp pentru opcod (codul operației),<br />

unul sau mai multe câmpuri care specifică operanzii sursă şi <strong>de</strong>stinație, un<br />

comentariu (opțional). Limbajul face distincție între literele mari şi mici.<br />

<strong>Arhitectura</strong> ARC conține 32 <strong>de</strong> registre etichetate %r0 ‐ %r31, fiecare având 32 <strong>de</strong><br />

biți. Există un registru <strong>de</strong> 32 <strong>de</strong> biți PSR (Processor State Register) care <strong>de</strong>scrie<br />

starea curentă a procesorului şi un registru <strong>de</strong> 32 <strong>de</strong> biți PC (Program Counter), care<br />

ține evi<strong>de</strong>nța instrucțiunii care se execută. Figura <strong>de</strong> mai jos prezintă aceste registre.<br />

Registrele %r14 şi %r15 sunt folosiți ca pointer stivă (%sp) şi registru link.<br />

Operanzii instrucțiunilor în limbaj <strong>de</strong> asamblare sunt separați prin virgule iar<br />

operandul <strong>de</strong>stinație apare întot<strong>de</strong>auna ultimul. Baza implicită pentru operațiile<br />

aritmetice este baza 10. Dacă valorile sunt precedate <strong>de</strong> 0x sau se termină cu H<br />

atunci se consi<strong>de</strong>ră a fi în baza 16. Instrucțiunea:<br />

addcc %r1, 12, %r3<br />

are ca efect adunarea valorii <strong>din</strong> registrul %r1 cu constanta 12 iar rezultatul este<br />

plasat în registrul %r13.<br />

Formatul instrucţiunilor ARC<br />

Formatul instrucțiunilor <strong>de</strong>fineşte modul în care câmpurile <strong>de</strong> biți ale<br />

instrucțiunilor sunt create <strong>de</strong> către asamblor şi cum sunt interpretate <strong>de</strong> unitatea <strong>de</strong><br />

84


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

control a ARC. <strong>Arhitectura</strong> ARC are doar câteva formate <strong>de</strong> instrucțiuni şi anume<br />

cinci:<br />

Fiecare instrucțiune are o mnemonică cum ar fi ld şi un opcod. Câmpul <strong>de</strong> 5 biți rd<br />

i<strong>de</strong>ntifică registrul țintă sau sursă pentru operație.<br />

Formatul datelor pentru ARC<br />

ARC suportă 12 formate diferite pentru date aşa cum sunt prezentate în figura <strong>de</strong><br />

mai jos.<br />

ARC nu face distincție între întregi cu semn sau fără semn. Aceştia sunt stocați şi<br />

manipulați ca întregi în complement față <strong>de</strong> doi. Ceea ce variază este interpretarea<br />

lor.<br />

Descrierea instrucţiunilor ARC<br />

În continuare referirea conținutului unei locații <strong>de</strong> memorie (pentru ld sau st) este<br />

indicat prin "ld [x], %r1" ce are ca efect copierea conținutului locației x în registrul<br />

%r1. O referință la adresa unei locații <strong>de</strong> memorie se specifică direct, fără paranteze<br />

drepte "call sub_r", ceea ce va apela subrutina sub_r. Doar ld şi st pot accesa<br />

memoria, prin urmare sunt singurele instrucțiuni la care se folosesc parantezele<br />

drepte. Când utilizăm registre întot<strong>de</strong>auna se accesează conținutul şi niciodată nu se<br />

ia adresa acestora aşa că nu e nevoie să fie pus numele unui registru între paranteze<br />

drepte.<br />

85


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Instrucţiunea: ld<br />

Descriere: încarcă un registru cu o valoare <strong>din</strong> memoria principală. Adresa <strong>de</strong><br />

memorie trebuie să fie la începutul unui cuvânt (să fie divizibilă cu 4). Adresa se<br />

calculează prin adunarea conținutului registrului <strong>din</strong> câmpul rs1 cu conținutul<br />

registrului <strong>din</strong> câmpul rs2 sau cu valoarea câmpului simm13.<br />

Exemple: ld [x], %r1<br />

ld [x], %r0, %r1<br />

ld %r0+x, %r1<br />

Înţeles: copiază conținutul locației <strong>de</strong> memorie x în registrul %r1.<br />

Instrucţiunea: st<br />

Descriere: stochează conținutul unui registru în memorie. Adresa <strong>de</strong> memorie<br />

trebuie să fie divizibilă cu 4. Adresa se calculează prin adunarea conținutului<br />

registrului <strong>din</strong> câmpul rs1 cu conținutul registrului <strong>din</strong> câmpul rs2 sau cu valoarea<br />

câmpului simm13. Câmpul rd este folosit pentru registrul sursă.<br />

Exemple: st %r1, [x]<br />

Înţeles: Copiază conținutul registrului %r1 în locația <strong>de</strong> memorie x.<br />

Instrucţiunea: sethi<br />

86


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Descriere: setează cei mai semnificativi 22 <strong>de</strong> biți şi pune pe zero ceilalți 10 (mai<br />

puțin semnificativi). Dacă operandul este zero şi registrul este %r0, atunci<br />

instrucțiunea se comportă ca NOP (no operation) adică nu are loc nici o operație.<br />

Exemple: sethi 0x304F15, %r1<br />

Înţeles: setează cei 22 <strong>de</strong> biți mai semnificativi la valoarea indicată iar ceilalți 10 la<br />

zero.<br />

Instrucţiunea: andcc<br />

Descriere: ŞI logic pe biți între operanzii sursă iar rezultatul este salvat în<br />

operandul <strong>de</strong>stinație. Codurile <strong>de</strong> condiție sunt setate conform rezultatului.<br />

Exemple: andcc %r1, %r2, %r3<br />

Înţeles: se efectuează operația ŞI logic între valorile <strong>din</strong> %r1 şi %r2 iar rezultatul<br />

este salvat în %r3.<br />

Instrucţiunea: orcc<br />

Descriere: SAU logic pe biți între operanzii sursă iar rezultatul este salvat în<br />

operandul <strong>de</strong>stinație. Codurile <strong>de</strong> condiție sunt setate conform rezultatului.<br />

Exemple: orcc %r1, 1, %r1<br />

Înţeles: setează cel mai semnificativ bit al lui %r1 la 1.<br />

Instrucţiunea: orncc<br />

Descriere: NOR logic pe biți între operanzii sursă iar rezultatul este salvat în<br />

operandul <strong>de</strong>stinație. Codurile <strong>de</strong> condiție sunt setate conform rezultatului.<br />

Exemple: orncc %r1, %r0, %r1<br />

Înţeles: Complementează %r1.<br />

Instrucţiunea: srl<br />

Descriere: <strong>de</strong>plasează un registru la dreapta cu 0‐31 biți. Biții <strong>din</strong> partea dreaptă<br />

vor avea valoarea 0.<br />

Exemple: srl %r1, 3, %r2<br />

Înţeles: <strong>de</strong>plasează %r1 la dreapta cu trei biți şi stochează rezultatul în %r2.<br />

Instrucţiunea: addcc<br />

Descriere: adună operanzii sursă şi stochează rezultatul în operandul <strong>de</strong>stinație<br />

folosind aritmetica în complement față <strong>de</strong> 2.<br />

Exemple: addcc %r1, 5, %r1<br />

Înţeles: Adună 5 la %r1.<br />

Instrucţiunea: call<br />

Descriere: apelează o subrutină şi stochează adresa instrucțiunii curente (un<strong>de</strong> este<br />

stocat apelul) în %r15, ceea ce are ca efect o operație <strong>de</strong> „apel şi legătură”. În codul<br />

asamblat, câmpul disp30 <strong>din</strong> formatul <strong>de</strong> apel va conține <strong>de</strong>plasamentul pe 30 <strong>de</strong><br />

biți <strong>din</strong> adresa instrucțiunii call.<br />

87


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Exemple: call sub_r<br />

Înţeles: Apelează o subrutină care începe la locația sub_r.<br />

Instrucţiunea: jmpl<br />

Descriere: salt şi link (întoarecere <strong>din</strong> subrutină). Salt la o nouă adresă şi stocarea<br />

adresei instrucțiunii curente (un<strong>de</strong> este plasată instrucțiunea jmpl) în registrul<br />

<strong>de</strong>stinație.<br />

Exemple: jmpl %r15 + 4, %r0<br />

Înţeles: Întoarcere <strong>din</strong> subrutină. Valoarea registrului PC pentru instrucțiunea call a<br />

fost salvat inițial în %r15 aşa că adresa <strong>de</strong> întoarcere ar trebui calculată <strong>din</strong><br />

instrucțiunea care urmează apelului, la %r15+4. Adresa curentă este eliminată în<br />

%r0.<br />

Instrucţiunea: be<br />

Descriere: Dacă codul <strong>de</strong> condiție z este 1, atunci ramifică la adresa calculată prin<br />

adunarea valorii 4 x disp22 <strong>din</strong> formatul instrucțiunii <strong>de</strong> ramificare la adresa<br />

instrucțiunii curente. Dacă codul <strong>de</strong> condiție z este 0, atunci controlul este transferat<br />

la instrucțiunea următoare.<br />

Exemple: be etichetă<br />

Înţeles: Ramifică la etichetă dacă codul <strong>de</strong> condiție z este 1.<br />

Instrucţiunea: bneg<br />

Descriere: Dacă codul <strong>de</strong> condiție n este 1, atunci ramifică execuția la adresa<br />

calculată prin adunarea valorii 4 x disp22 <strong>din</strong> formatul instrucțiunii <strong>de</strong> ramificare la<br />

adresa instrucțiunii curente. Dacă codul <strong>de</strong> condiție n este 0, atunci controlul este<br />

transferat la instrucțiunea următoare.<br />

Exemple: bneg etichetă<br />

Înţeles: Ramifică la etichetă dacă codul <strong>de</strong> condiție n este 1.<br />

Instrucţiunea: bcs<br />

Descriere: Dacă codul <strong>de</strong> condiție c este 1, atunci ramifică execuția la adresa<br />

calculată prin adunarea valorii 4 x disp22 <strong>din</strong> formatul instrucțiunii <strong>de</strong> ramificare la<br />

adresa instrucțiunii curente. Dacă codul <strong>de</strong> condiție c este 0, atunci controlul este<br />

transferat la instrucțiunea următoare.<br />

Exemple: bcs etichetă<br />

Înţeles: Ramifică execuția programului la etichetă dacă codul <strong>de</strong> condiție c este 1.<br />

Instrucţiunea: bvs<br />

Descriere: Dacă codul <strong>de</strong> condiție v este 1, atunci ramifică execuția la adresa<br />

calculată prin adunarea valorii 4 x disp22 <strong>din</strong> formatul instrucțiunii <strong>de</strong> ramificare la<br />

88


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

adresa instrucțiunii curente. Dacă codul <strong>de</strong> condiție v este 0, atunci controlul este<br />

transferat la instrucțiunea următoare.<br />

Exemple: bvs etichetă<br />

Înţeles: Ramifică execuția programului la etichetă dacă codul <strong>de</strong> condiție v este 1.<br />

Instrucţiunea: ba<br />

Descriere: Ramifică execuția la adresa calculată prin adunarea valorii 4 x disp22<br />

<strong>din</strong> formatul instrucțiunii <strong>de</strong> ramificare la adresa instrucțiunii curente.<br />

Exemple: ba etichetă<br />

Înţeles: Ramifică execuția programului la etichetă indiferent <strong>de</strong> valoare codurilor <strong>de</strong><br />

condiție.<br />

Pseudo­operaţii<br />

Pe lângă instrucțiunile ARC suportate <strong>de</strong> arhitectură, există şi pseudo‐operații care<br />

nu reprezintă opcoduri. Acestea sunt instrucțiuni pentru asamblor pentru a efectua<br />

unele acțiuni la asamblare. O listă cu pseudo‐operații şi exemple <strong>de</strong> utilizare a lor<br />

este prezentată în lista <strong>de</strong> mai jos.<br />

Spre <strong>de</strong>osebire <strong>de</strong> opcoduri care sunt specifice sistemului <strong>de</strong> calcul, tipul şi natura<br />

pseudo‐operațiilor sunt specifice unui anumit asamblor, <strong>de</strong>oarece acestea sunt<br />

executate <strong>de</strong> asamblor.<br />

Exemple <strong>de</strong> programe în limbaj <strong>de</strong> asamblare<br />

Procesul <strong>de</strong> scriere a unui program în limbaj <strong>de</strong> asamblare este similar cu procesul<br />

<strong>de</strong> scriere a unui program într‐un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt, cu excepția<br />

89


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

faptului că multe <strong>de</strong>talii ce sunt abstractizate în limbajele <strong>de</strong> nivel înalt, în limbajele<br />

<strong>de</strong> asamblare trebuie scrise explicit.<br />

Program: Adunarea a doi întregi (15+9)<br />

Program: Suma unui tablou <strong>de</strong> întregi<br />

Variaţii în arhitecturile sistemelor <strong>de</strong> calcul şi în modul <strong>de</strong> adresare<br />

ARC este un calculator <strong>de</strong> tip încărcare/salvare. Programele scrise pentru astfel <strong>de</strong><br />

sisteme se execută <strong>de</strong> regulă mai repe<strong>de</strong>, datorită reducerii traficului <strong>din</strong>tre<br />

procesor şi memorie prin încărcarea operanzilor în procesor o singură dată şi prin<br />

90


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

stocarea rezultatelor doar când calculul este încheiat. Mărirea dimensiunii memoriei<br />

programului este un preț care merită plătit.<br />

Dacă ARC‐ul poate face operații aritmetice şi logice doar cu operanzi care se află în<br />

registre, trebuie ştiut faptul că unele sisteme <strong>de</strong> calcul aveau instrucțiunii aritmetice<br />

care efectuau operațiile aritmetice folosind trei, două sau o adresă <strong>de</strong> memorie.<br />

Să consi<strong>de</strong>răm modul în care este evaluată expresia A = B*C + D <strong>de</strong> fiecare <strong>din</strong> cele<br />

trei tipuri <strong>de</strong> instrucțiuni. În exemplele <strong>de</strong> mai jos atunci când ne referim la variabila<br />

„A” va însemna operandul a cărui adresă este „A”. Pentru a efectua statisticile <strong>de</strong><br />

performanță pentru fragmentele <strong>de</strong> cod <strong>de</strong> mai jos vom face următoarele<br />

presupuneri:<br />

• Adresele şi cuvintele sunt <strong>de</strong> 16 biți<br />

• Opcodurile sunt <strong>de</strong> 8 biți<br />

• Operanzii şi opcodurile sunt mutate <strong>din</strong> şi în memorie câte un cuvânt.<br />

Vom calcula atât dimensiunea programului, în octeți cât şi traficul <strong>de</strong> memorie<br />

ținând cont <strong>de</strong> aceste valori.<br />

Traficul <strong>de</strong> memorie are două componente: codul propriu‐zis, care trebuie extras<br />

<strong>din</strong> memorie şi încărcat în procesor pentru a fi executat şi valorile – operanzii care<br />

trebuie mutați în procesor pentru a fi efectuate calculele, iar rezultatul trebuie<br />

mutat înapoi în memorie la încheierea calculelor. Astfel putem ve<strong>de</strong>a<br />

compromisurile între dimensiunea programelor şi traficul <strong>de</strong> memorie oferit <strong>de</strong><br />

diferitele clase <strong>de</strong> instrucțiuni.<br />

Instrucţiuni cu trei adrese<br />

Expresia A = B*C + D poate fi codificată astfel:<br />

mult B, C, A<br />

add D, A, A<br />

ceea ce înmulțeşte B cu C şi salvează rezultatul în A (operațiile mult şi add sunt<br />

generice – ele nu sunt instrucțiuni ARC) după care se adună D la A şi se stochează<br />

rezultatul la adresa A. Dimensiunea programului este 2 x (1+2+2+2) = 14 octeți iar<br />

traficul <strong>de</strong> memorie este 2 x (7 + (2 + 2 +2)) = 26 octeți (7 octeți pentru încărcarea<br />

instrucțiunii şi 6 octeți pentru traficul <strong>de</strong> date).<br />

Instrucţiuni cu două adrese<br />

Expresia <strong>de</strong> mai sus poate fi codificată astfel:<br />

load B, A<br />

mult C, A<br />

add D, A<br />

Dimensiunea programului este acum 3 x (1 + 2 + 2) = 15 octeți. Traficul <strong>de</strong> memorie<br />

este (5 + 4) + (5 + 6) + (5 + 6) = 31 octeți. La fiecare instrucțiune sunt 5 octeți pentru<br />

91


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

încărcarea instrucțiunii. La prima instrucțiune mai sunt 4 octeți pentru variabile, iar<br />

la ultimele două instrucțiuni sunt câte 6 octeți (cu 2 mai mult <strong>de</strong>cât la prima) pentru<br />

că ambii operanzi trebuie încărcați în CPU. Salvarea rezultatului <strong>din</strong> CPU în memorie<br />

se face la fiecare <strong>din</strong> cele trei instrucțiuni ceea ce necesită 2 octeți.<br />

Instrucţiuni cu o adresă sau instrucţiuni acumulator<br />

O instrucțiuni cu o adresă foloseşte un singur registru al procesorului, numit<br />

acumulator. Acumulatorul conține un operand aritmetic şi serveşte şi ca țintă<br />

pentru rezultatul unei operații aritmetice. Acest format nu este obişnuit în ziua <strong>de</strong><br />

astăzi dar era folosit frecvent mai <strong>de</strong>mult când procesoarele aveau registre puține şi<br />

erau folosite pentru mai multe scopuri. Aceste registre au rolul <strong>de</strong> a stoca temporar<br />

unul <strong>din</strong> operanzi şi rezultatul. Expresia <strong>de</strong> mai sus se poare exprima astfel:<br />

load B<br />

mult C<br />

add D<br />

store A<br />

Fiecare instrucțiune are 1 + 2 = 3 octeți aşa că dimensiunea programului este 4 x 3 =<br />

12 octeți. Traficul <strong>de</strong> memorie pentru fiecare instrucțiune este 3 + 2 = 5 octeți aşa că<br />

traficul total <strong>de</strong> memorie este 4 x 5 = 20 <strong>de</strong> octeți.<br />

Registre speciale<br />

Pe lângă registrele generale, majoritatea arhitecturilor mo<strong>de</strong>rne includ şi alte<br />

registre <strong>de</strong>dicate unor scopuri speciale. De exemplu:<br />

• Registre pentru in<strong>de</strong>x <strong>de</strong> memorie: registrele SI (Source In<strong>de</strong>x) şi DI<br />

(Destination In<strong>de</strong>x) <strong>de</strong> la Inter 80x86. Acestea sunt folosite pentru a indica<br />

începutul sau sfârşitul unui tablou <strong>din</strong> memorie.<br />

• Registre pentru virgulă mobilă: multe procesoare au registre speciale şi<br />

instrucțiuni care se ocupă <strong>de</strong> numerele reprezentate în virgulă mobilă.<br />

• Registre pentru tratarea timpului şi sincronizarea operațiilor.<br />

• Registre pentru suportul sistemelor <strong>de</strong> operare.<br />

• Registre care pot fi accesate doar prin „instrucțiuni privilegiate”.<br />

Accesarea datelor în memorie – moduri <strong>de</strong> adresare<br />

Până acum am văzut patru moduri <strong>de</strong> calculare a adresei unei valori <strong>din</strong> memorie:<br />

1. o valoarea constantă, cunoscută la asamblare,<br />

2. conținutul unui registru,<br />

3. suma a două registre,<br />

4. suma <strong>din</strong>tre un registru şi o constantă.<br />

Tabelul <strong>de</strong> mai jos dă nume acestor moduri <strong>de</strong> adresare şi prezintă câteva moduri<br />

suplimentare:<br />

92


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Sintaxa <strong>din</strong> tabel diferă <strong>de</strong> cea a maşinii ARC. Notația M[x] presupune că memoria<br />

este un tablou, M, a cărui in<strong>de</strong>x este dat <strong>de</strong> calculul adresei <strong>din</strong>tre parantezele<br />

drepte. Fiecare mod <strong>de</strong> adresare are propria utilizare:<br />

• Modul <strong>de</strong> adresare „Imediat” permite referirea unei constante care este<br />

cunoscută la asamblare.<br />

• Modul <strong>de</strong> adresare „Direct” este folosit pentru a accesa date a căror adresă<br />

este cunoscută la asamblare.<br />

• Modul <strong>de</strong> adresare „Indirect” este folosit pentru a accesa o variabilă pointer a<br />

cărei adresă este cunoscută la compilare. Aceste mod nu este foarte folosit<br />

întrucât instrucțiunea este prea complicată.<br />

• Modul <strong>de</strong> adresare „Register indirect” este folosit atunci când adresa<br />

operandului nu este cunoscută <strong>de</strong>cât la execuție.<br />

Link­editarea subrutinelor şi stivă<br />

O subrutină, numită şi funcție sau procedură, este o secvență <strong>de</strong> instrucțiuni care<br />

este invocată ca şi cum ar fi o singură instrucțiuni văzută <strong>de</strong> la un nivel superior.<br />

Atunci când un program apelează o subrutină, controlul execuției este transferat <strong>de</strong><br />

la program la subrutină, care execută o secvență <strong>de</strong> instrucțiuni după care se<br />

întoarce la instrucțiunea <strong>din</strong> program imediat următoare instrucțiunii <strong>de</strong> apel.<br />

Există mai multe modalități <strong>de</strong> a transmite argumente la rutina apelată şi <strong>din</strong> rutina<br />

apelată, modalități care se numesc convenţii <strong>de</strong> apel. Procesul <strong>de</strong> transmitere a<br />

argumentelor între rutine se numeşte link‐editarea subrutinelor.<br />

O convenție <strong>de</strong> apel este plasarea argumentelor în registre. Codul <strong>de</strong> mai jos încarcă<br />

două argumente în registrele %r1 şi %r2, apelează subrutina add_1 şi salvează<br />

rezultatul în registrul %r3 înainte <strong>de</strong> a se întoarce cu jmpl.<br />

93


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Această metodă este rapidă şi simplă dar nu va funcționa dacă numărul <strong>de</strong><br />

argumente transmise între rutine <strong>de</strong>păşeşte numărul <strong>de</strong> registre libere sau dacă<br />

apelurile <strong>de</strong> subrutine sunt imbricate (încuibate) pe mai multe niveluri.<br />

O a doua convenție <strong>de</strong> apel este crearea <strong>de</strong> zone pentru legătura datelor. Adresa<br />

zonei <strong>de</strong> legătură a datelor este transmisă într‐un registru pre<strong>de</strong>finit rutinei apelate.<br />

Codul <strong>de</strong> mai jos foloseşte această convenție:<br />

Psedu‐operația .dwb <strong>din</strong> rutina apelantă stabileşte zona pentru legătura datelor care<br />

are dimensiunea <strong>de</strong> 3 cuvinte la adresa x, x+4 şi x+8. Rutina apelantă încarcă cele<br />

două argumente la x şi x+4, apelează subrutina add_2 <strong>din</strong> memorie <strong>de</strong> la adresa x+8<br />

şi ia rezultatul transmis <strong>din</strong> add_2 <strong>de</strong> la locația <strong>de</strong> memorie x+8. Adresa zonei pentru<br />

legătura datelor, x, este transmisă rutinei add_2 în registrul %r5.<br />

Instrucțiunea sethi trebuie să aibă ca operand sursă o constantă astfel că asamblorul<br />

recunoaşte construcția sethi şi îl înlocuieşte pe x cu adresa lui. Instrucțiunea srl ce<br />

urmează mută adresa lui x în cei mai puțin semnificativi 22 <strong>de</strong> biți ai lui %r5, <strong>din</strong><br />

moment ce sethi plasează operandul în cei 22 <strong>de</strong> biți <strong>din</strong> stânga ai registrului țintă. O<br />

alternativă pentru încărcarea adresei lui x în %r5 ar fi să folosim o locație <strong>de</strong> stocare<br />

pentru adresa lui x şi să folosim instrucțiunea ld pentru a încărca adresa în %r5.<br />

Subrutina add_2 citeşte cei doi operanzi <strong>din</strong> zona pentru legătura datelor <strong>de</strong> la<br />

locațiile %r5 şi %r5 + 4, şi plasează rezultatul în zona pentru legătura datelor la<br />

locația %r5 + 8 înainte <strong>de</strong> a se termina. Folosind zona pentru legătura datelor,<br />

putem transmite şi întoarce <strong>din</strong> subrutine blocuri <strong>de</strong> orice dimensiune fără a copia<br />

94


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

mai mult <strong>de</strong> un registru. Recursivitatea poate complica lucrurile pentru că o rutină<br />

care se auto‐apelează va avea nevoie <strong>de</strong> mai multe zone pentru legătura datelor.<br />

Zonele pentru legătura datelor au avantajul că dimensiunea lor poate fi nelimitată,<br />

dar au şi <strong>de</strong>zavantajul că dimensiunea acestei zone trebuie să fie cunoscută în faza<br />

<strong>de</strong> asamblare.<br />

O a treia convenție <strong>de</strong> apel este folosirea stivei. I<strong>de</strong>ea este că rutina apelantă pune<br />

toate argumentele (sau pointeri la argumente, dacă obiectele <strong>de</strong> date sunt mari) pe o<br />

stivă <strong>de</strong> tip ultimul intrat‐primul ieşit. Rutina apelată scoate <strong>din</strong> stivă argumentele<br />

transmise şi pune în stivă valorile pe care le întoarce. Rutina apelantă scoate valorile<br />

întoarse <strong>din</strong> stivă şi îşi continuă execuția. Un registru al procesorului numit stack<br />

pointer (pointer <strong>de</strong> stivă), conține adresa vârfului stivei. Multe sisteme <strong>de</strong> calcul au<br />

instrucțiuni push şi pop care <strong>de</strong>crementează şi incrementează automat pointerul <strong>de</strong><br />

stivă pe măsură ce obiectele sunt plasate în stivă respectiv sunt scoase <strong>din</strong> stivă.<br />

Un avantaj al folosirii stivei este că aceasta poate creşte şi <strong>de</strong>screşte după nevoi,<br />

ceea ce duce la posibilitatea imbricării nelimitate a apelurilor <strong>de</strong> subrutine fără a fi<br />

nevoie să se <strong>de</strong>clare dimensiunea stivei la asamblare. Mai jos dăm un exemplu <strong>de</strong><br />

utilizare a stivei:<br />

Registrul %r14 are rolul <strong>de</strong> pointer <strong>de</strong> stivă (%sp) care este inițializat <strong>de</strong> sistemul<br />

<strong>de</strong> operare înainte <strong>de</strong> execuția rutinei apelante. Rutina apelantă plasează<br />

argumentele (%r1 şi %r2) pe stivă <strong>de</strong>crementând pointerul <strong>de</strong> stivă (se mută %sp la<br />

următorul cuvânt liber <strong>de</strong>asupra stivei) şi stocând fiecare argument pe noul vârf al<br />

stivei. Subrutina add_3 este apelată, ceea ce va <strong>de</strong>termina scoaterea argumentelor ei<br />

<strong>din</strong> stivă, efectuarea operației <strong>de</strong> adunare, şi stocarea valorii calculate în vârful stivei<br />

înainte <strong>de</strong> întoarcerea în rutina apelantă. Rutina apelantă scoate argumentul <strong>din</strong><br />

vârful stivei şi îşi continuă execuția.<br />

Pentru fiecare convenție <strong>de</strong> apel, este folosită instrucțiunea call, care salvează PC‐ul<br />

(Program Counter) curent în %r15. Când o subrutină se termină, trebuie să întoarcă<br />

controlul la instrucțiunea care urmează apelului, instrucțiune care este la un cuvânt<br />

(patru octeți) distanță <strong>de</strong> contorul program (PC) salvat. Astfel, instrucțiunea „jmpl<br />

%r15 + 4, %r0” termină apelul. Dacă rutina apelată, apelează la rândul ei o altă<br />

95


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

rutină, atunci valoarea lui PC salvată inițial în %r15 va fi suprascrisă aşa că<br />

întoarcerea la rutina inițială nu va mai fi posibilă prin intermediul lui %r15. Pentru<br />

a permite apeluri imbricate, valoarea curentă a registrului %r15 (care se numeşte<br />

link register) trebuie salvată pe stivă, împreună cu orice alt registru care trebuie<br />

restaurat după terminarea apelului.<br />

Dacă se foloseşte o convenție <strong>de</strong> apel bazată pe registre, atunci link register trebuie<br />

salvat în unul <strong>din</strong> registrele nefolosite înainte <strong>de</strong> apelul unei subrutine. Dacă este<br />

folosită o zonă pentru legătura <strong>de</strong> date, atunci ar trebui rezervat spațiu pentru<br />

register link. Dacă se foloseşte o schemă bazată pe stivă, atunci register link trebuie<br />

salvat pe stivă. Pentru fiecare convenție <strong>de</strong> apel, register link şi variabilele locale <strong>din</strong><br />

rutina apelată trebuie să fie salvate înainte <strong>de</strong> a se face un alt apel, altfel, un apel<br />

imbricat la aceeaşi rutină va <strong>de</strong>termina suprascrierea variabilelor locale.<br />

Cea mai folosită convenție <strong>de</strong> apel este cea bazată pe stivă. Când se apelează mai<br />

multe rutine imbricate se creează un stack frame care conține argumentele<br />

transmise rutinei apelate, adresa <strong>de</strong> întoarcere pentru rutina apelantă şi orice<br />

variabile locale. În exemplul <strong>de</strong> mai jos dăm un exemplu <strong>de</strong> program scris într‐un<br />

limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt care conține apeluri imbricate:<br />

Operațiile efectuate <strong>de</strong> program nu sunt importante, nici faptul că am folosit<br />

limbajul C, ceea este important este modul în care sunt implementate apelurile <strong>de</strong><br />

subrutine.<br />

Comportamentul stivei pentru acest program este prezentat în figura <strong>de</strong> mai jos:<br />

96


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Programul principal apelează func_1 cu argumentele 1 şi 2, iar mai apoi apelează<br />

func_2 cu argumentul 10 înainte <strong>de</strong> a‐şi încheia execuția. Funcția func_1 are două<br />

variabile locale i şi j care sunt folosite pentru a calcula valoarea întoarsă j. Funcția<br />

func_2 are două variabile locale m şi n care sunt folosite pentru a crea argumentele<br />

ce se transmit lui func_1 înainte întoarcerea valorii m.<br />

Pointerul <strong>de</strong> stivă (%r14 prin convenție la care ne referim prin %sp) este inițializat<br />

înainte <strong>de</strong> pornirea programului, <strong>de</strong> obicei <strong>de</strong> sistemul <strong>de</strong> operare. Compilatorul<br />

este responsabil pentru implementarea convenției <strong>de</strong> apel, aşa că va produce cod<br />

pentru încărcarea parametrilor şi întoarcerea adreselor pe stivă, rezervând spațiu<br />

pe stivă pentru variabilele locale, iar mai apoi reversând procesul la întoarcerea <strong>din</strong><br />

rutine.<br />

La începutul execuției programului principal, pointerul <strong>de</strong> stivă indică elementul <strong>din</strong><br />

vârful stivei sistem (fig. a). Când funcția main apelează func_1 în linia 03 cu<br />

argumentele 1 şi 2, acestea sunt puse în stivă (fig. b). Controlul este transferat<br />

funcției func_1 printr‐o instrucțiune call (nu este prezentată), şi func_1 salvează pe<br />

stivă adresa <strong>de</strong> întoarcere în %r15 ca rezultat al instrucțiunii call (fig. c). Pe stivă se<br />

rezervă spațiu pentru variabilele locale i şi j ale lui func_1 (fig. d). În acest moment<br />

avem un stack frame complet pentru funcția func_1, care este format <strong>din</strong><br />

argumentele transmise funcției func_1, adresa <strong>de</strong> întoarecere în rutina principală şi<br />

variabilele locale pentru func_1.<br />

Înainte ca func_1 să pre<strong>de</strong>a controlul rutinei apelante, eliberează spațiul <strong>din</strong> stivă<br />

rezervat pentru variabilele ei locale, preia adresa <strong>de</strong> întoarcere <strong>din</strong> stivă, eliberează<br />

97


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

spațiul <strong>din</strong> stivă rezervat argumentelor pe care le‐a primit, şi pune în stivă valoarea<br />

<strong>de</strong> return (fig.. e). Controlul este întors la rutina apelantă prin instrucțiunea jmpl, şi<br />

rutina apelantă este responsabilă pentru luarea valorii întoarse <strong>din</strong> stivă şi<br />

<strong>de</strong>crementarea pointerului <strong>de</strong> stivă la poziția la care a fost înainte <strong>de</strong> apel (fig. f).<br />

Rutina func_2 este mai apoi executată, şi procesul <strong>de</strong> construire a stack‐frame‐ului<br />

reîncepe (fig. g). Din moment ce func_2 apelează func_1 înainte <strong>de</strong> a se termina, vor<br />

fi stack‐frame atât pentru func_2 cât şi pentru func_1 în acelaşi timp (fig. h). În final<br />

pointerul <strong>de</strong> stivă va fi la poziția inițială (fig. i‐k).<br />

Intrare­ieşire în limbaj <strong>de</strong> asamblare<br />

Vom trece în revistă modul în care un program în limbaj <strong>de</strong> asamblare poate<br />

comunica cu exteriorul (activitățile <strong>de</strong> intrare‐ieşire). O modalitatea <strong>de</strong> tratare a<br />

comunicației cu dispozitivele <strong>de</strong> intrare‐ieşire este folosirea unor instrucțiuni<br />

speciale, şi cu o magistrală <strong>de</strong> intrare‐ieşire specială rezervată pentru acest scop. O<br />

metodă alternativă <strong>de</strong> interacțiune cu dispozitivele <strong>de</strong> intrare‐ieşire este prin<br />

folosirea memoriei asociată I/E, în care dispozitivele ocupă secțiuni <strong>din</strong> spațiul <strong>de</strong><br />

adresare un<strong>de</strong> nu avem memorie obişnuită. Dispozitivele sunt accesate ca şi cum ar<br />

fi locații <strong>de</strong> memorie, aşa că nu e nevoie <strong>de</strong> tratarea dispozitivelor <strong>de</strong> intrare‐ieşire<br />

cu instrucțiuni noi.<br />

Ca un exemplu <strong>de</strong> memorie asociată I/E, să consi<strong>de</strong>răm harta memoriei pentru ARC<br />

<strong>din</strong> figura <strong>de</strong> mai jos:<br />

Aici ve<strong>de</strong>m două regiuni noi <strong>de</strong> memorie, pentru două module vi<strong>de</strong>o şi pentru un<br />

dispozitiv touchscreen. Un touchscreen poate fi <strong>de</strong> două tipuri: fotonic şi electric. O<br />

ilustrare a versiunii fotonice este prezentată în figura <strong>de</strong> mai jos:<br />

98


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

O matrice <strong>de</strong> raze acoperă ecranul atât pe verticală cât şi pe orizontală. Dacă raza<br />

este întreruptă (prin atingere cu <strong>de</strong>getul) atunci poziția este <strong>de</strong>terminată <strong>de</strong> razele<br />

întrerupte.<br />

Memoria reală ocupă spațiul <strong>de</strong> adresare cuprins între 2 22 şi 2 23‐1. (2 23‐4 este adresa<br />

octetului <strong>din</strong> stânga a ultimului cuvânt în format big‐endian). Restul spațiului <strong>de</strong><br />

adresare este ocupat <strong>de</strong> alte componente. Spațiu <strong>de</strong> adresare cuprins între 0 şi 2 16‐1<br />

conține programele programul inclus <strong>de</strong> pornire a sistemului şi rutinele grafice<br />

elementare. Spațiul <strong>de</strong> adresare cuprins între 2 16 şi 2 19 ‐1 este folosit pentru două<br />

module <strong>de</strong> memorie vi<strong>de</strong>o.<br />

Spațiul <strong>de</strong> adresare cuprins între 2 23 şi 2 24 ‐1 este folosit pentru dispozitivele <strong>de</strong><br />

intrare‐ieşire. Pentru acest sistem, coordonatele X şi Y care marchează poziția la<br />

care un utilizator a făcut o selecție sunt actualizate automat în registre şi sunt<br />

plasate în memorie. Registrele sunt accesate prin citirea <strong>din</strong> memorie a locațiilor la<br />

care sunt localizate aceste registre. Locația „Screen flash” <strong>de</strong>termină ecranul să<br />

pâlpâie <strong>de</strong> fiecare dată când se scrie ceva.<br />

Să presupunem că vrem să scriem un program care <strong>de</strong>termină pâlpâirea ecranului<br />

<strong>de</strong> fiecare dată când utilizatorul schimbă poziția. Schema logică <strong>de</strong> mai jos ilustrează<br />

modul în care se poate face aceasta:<br />

99


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Acesta este un exemplu <strong>de</strong> metodă programată <strong>de</strong> accesare a unui dispozitiv <strong>de</strong><br />

intrare‐ieşire.<br />

Studiu <strong>de</strong> caz – ASI pentru Maşina Virtuală Java<br />

Java este un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt <strong>de</strong>zvoltat <strong>de</strong> Sun Microsystems. Un<br />

aspect esențial al Java este că codul binar Java este in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> platformă, ceea<br />

ce înseamnă că acelaşi cod compilat va rula fără modificări pe orice sistem care<br />

suportă Maşina Virtuală Java (MVJ). MVJ este modul în care Java realizează<br />

in<strong>de</strong>pen<strong>de</strong>nța <strong>de</strong> platformă: o specificare standard a MVJ este implementată cu<br />

mulțimea <strong>de</strong> instrucțiuni native ale sistemului pe care rulează iar codul compilat<br />

Java poate rula în orice mediu MVJ.<br />

Programele scrise în limbaje cum sunt C, C++ sunt compilate direct în cod nativ ale<br />

arhitecturii țintă şi acestea nu sunt portabile pe platforme diferite fără recompilarea<br />

codului sursă. Limbajele interpretate, cum sunt Perl, Tcl, AppleScript sunt<br />

in<strong>de</strong>pen<strong>de</strong>nte <strong>de</strong> platformă dar se execută mult mai încet (<strong>de</strong> 100‐200 <strong>de</strong> ori mai<br />

încet) <strong>de</strong>cât un limbaj compilat. Programele Java sunt compilate într‐o formă<br />

intermediară numită byteco<strong>de</strong>, care se execută mult mai încet <strong>de</strong>cât un program<br />

compilat în limbaj nativ dar, chiar şi cu acest inconvenient, faptul că este<br />

in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> platformă îl plasează înaintea altor limbaje pentru multe tipuri <strong>de</strong><br />

aplicații.<br />

În figura <strong>de</strong> mai jos dăm programul Java care adună numerele 15 şi 9 şi byteco<strong>de</strong>‐ul<br />

în care a fost compilat. Byteco<strong>de</strong>‐ul este numit şi fişier class Java.<br />

100


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

O modalitatea <strong>de</strong> îmbunătățire a vitezei <strong>de</strong> rulare a programelor Java este<br />

reprezentat <strong>de</strong> compilatoarele „Just in time” (JIT). Acestea, în loc să interpreteze<br />

bytecodul instrucțiune cu instrucțiune, profită <strong>de</strong> faptul că majoritatea timpului <strong>de</strong><br />

execuție a programelor este alocat unor bucle şi altor rutine iterative. De fiecare<br />

când „Jitter”‐ul întâlneşte o linie <strong>de</strong> cod pentru prima dată, o compilează în cod nativ<br />

şi o stochează în memorie pentru o utilizare ulterioară. La următoarele execuții ale<br />

acelei instrucțiuni nu mai trebuie realizată compilarea <strong>din</strong> bytecod în cod nativ.<br />

Concluzie<br />

Am prezentat arhitectura setului <strong>de</strong> instrucțiuni pentru un sistemul ARC şi am<br />

trecut în revistă unele proprietăți generale ale ASI. În proiectarea unui set <strong>de</strong><br />

instrucțiuni, trebuie păstrat un echilibru între performanța sistemului şi<br />

caracteristicile tehnologiei în care este implementat procesorul. Interacțiunea între<br />

procesor şi memorie este un punct important.<br />

Când se face un acces la memorie, modul în care este calculată adresa este numit<br />

modul <strong>de</strong> adresare a memoriei.<br />

Am trecut în revistă mai multe componente ale sistemului <strong>de</strong> calcul care joacă un rol<br />

important în execuția programelor. Am văzut că programele sunt secvențe <strong>de</strong><br />

instrucțiuni care fac parte <strong>din</strong> setul <strong>de</strong> instrucțiuni al procesorului.<br />

101


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

6. Limbaje şi maşină<br />

Introducere<br />

În continuarea vom trece în revistă procesul <strong>de</strong> asamblare, link‐editare şi încărcare<br />

a unui program. Vom prezenta legătura <strong>din</strong>tre limbajele <strong>de</strong> programare şi sistemul<br />

<strong>de</strong> calcul.<br />

Prima dată vom discuta <strong>de</strong>spre compilare, procesul <strong>de</strong> traducere a programului<br />

scris într‐un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt într‐un program, echivalent<br />

funcțional, scris în limbaj <strong>de</strong> asamblare. După aceasta, vom discuta <strong>de</strong>spre procesul<br />

<strong>de</strong> asamblare adică, traducerea programului <strong>din</strong> asamblare într‐un program<br />

echivalent funcțional în limbaj maşină. Vom prezenta link­editarea, procesul <strong>de</strong><br />

legare împreună a modulelor asamblate separat într‐un singur program şi<br />

încărcarea, procesul <strong>de</strong> mutare a programului în memorie şi pregătirea lui pentru<br />

execuție. Vom prezenta folosirea macro‐urilor în limbaj <strong>de</strong> asamblare, care pot fi<br />

privite ca proceduri în limbaj <strong>de</strong> asamblare, cu excepția faptului că acestea sunt<br />

plasate inline, în programul în limbaj <strong>de</strong> asamblare în fiecare loc în care sunt<br />

apelate.<br />

Procesul <strong>de</strong> compilare<br />

Procesul <strong>de</strong> transformare a unui program <strong>din</strong> limbaj <strong>de</strong> asamblare în limbaj maşină<br />

este foarte simplu pentru că există o corespon<strong>de</strong>nță unu‐la‐una între instrucțiunile<br />

<strong>din</strong> limbaj <strong>de</strong> asamblare şi instrucțiunile binare <strong>din</strong> codul maşină. Limbajele <strong>de</strong><br />

programare <strong>de</strong> nivel înalt reprezintă o problemă mult mai complexă.<br />

Paşii compilării<br />

Să consi<strong>de</strong>răm o instrucțiune simplă <strong>de</strong> atribuire:<br />

A = B + 4;<br />

Compilatorul trebuie să execute o serie <strong>de</strong> sarcini <strong>de</strong>stul <strong>de</strong> complexe pentru a<br />

converti această instrucțiune în una sau mai multe instrucțiuni în asamblare:<br />

• Reducerea textului programului la simbolurile elementare ale limbajului, <strong>de</strong><br />

exemplu în i<strong>de</strong>ntificatori cum sunt A şi B, notații cum ar fi valoare constantă 4 şi<br />

<strong>de</strong>limitatori <strong>de</strong> program cum ar fi + şi =. Această parte a compilării se numeşte<br />

analiză lexicală.<br />

• Parsing‐ul (Analizarea/Separarea intrării în componente mai uşor <strong>de</strong><br />

procesat) simbolurilor pentru a recunoaşte structura programului. În<br />

instrucțiunea <strong>de</strong> mai sus, parser‐ul trebuie să recunoască instrucțiunea ca fiind o<br />

instrucțiune <strong>de</strong> atribuire <strong>de</strong> forma: I<strong>de</strong>ntificator „=” Expresie, un<strong>de</strong> Expresie<br />

poate fi separată mai <strong>de</strong>parte în forma: I<strong>de</strong>ntificator „+” Constantă. Această fază<br />

<strong>de</strong> separare se mai numeşte analiză sintactică.<br />

102


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

• Analiza numelor: asocierea numelor A şi B cu anumite variabile <strong>din</strong> program<br />

şi asocierea lor mai <strong>de</strong>parte cu locații <strong>de</strong> memorie particulare un<strong>de</strong> se vor localiza<br />

variabilele la execuție.<br />

• Analiza tipurilor: <strong>de</strong>terminarea tipurilor tuturor unităților <strong>de</strong> date. În<br />

exemplul <strong>de</strong> mai sus, variabilele A şi B şi constanta 4 vor fi recunoscute ca fiind<br />

<strong>de</strong> tip int în unele limbaje. Analiza numelor şi a tipurilor se mai numeşte analiză<br />

semantică: <strong>de</strong>terminarea înțelesului componentelor program.<br />

• Maparea <strong>de</strong> acțiune şi generarea <strong>de</strong> cod: asocierea instrucțiunilor<br />

programului cu secvențele corespunzătoare <strong>din</strong> limbaj <strong>de</strong> asamblare. În<br />

instrucțiunea <strong>de</strong> mai sus secvențele în limbaj <strong>de</strong> asamblare pot fi:<br />

! Instructiunea <strong>de</strong> atribuire<br />

ld [B], %r0, %r1 ! variabila B este incarcata in registru<br />

add %r1, 4, %r2 ! calculeaza valoare expresiei<br />

st %r2, %r0, [A] ! efectueaza atribuirea<br />

• Există paşi suplimentari pe care compilatorul trebuie să‐i efectueze: alocarea<br />

<strong>de</strong> variabile registrelor, urmărirea utilizării registrelor şi optimizarea<br />

programului.<br />

Specificaţiile asocierilor compilatorului<br />

Atunci când se creează un compilator, trebuie incluse în el informații <strong>de</strong>spre<br />

arhitectura setului <strong>de</strong> instrucțiuni pentru care este creat. (ASI‐ul pe care se execută<br />

compilatorul nu trebuie să fie i<strong>de</strong>ntic cu ASI‐ul pentru care generează cod, proces<br />

numit cross‐compilare). Această inclu<strong>de</strong>re se mai numeşte specificare <strong>de</strong> asociere<br />

pentru compilator. De exemplu, cel care scrie compilatorul trebuie să <strong>de</strong>cidă cum să<br />

asocieze variabilele şi constantele <strong>de</strong> tipuri diferite în resursele sistemului <strong>de</strong> calcul.<br />

Aceasta ar putea fi o funcție atât a sistemului cât <strong>de</strong> calcul cât şi a limbajului <strong>de</strong><br />

programare <strong>de</strong> nivel înalt. În limbajul C, întregii (int) pot fi <strong>de</strong> 16 sau 32 <strong>de</strong> biți pe<br />

când în Java întot<strong>de</strong>auna tipul int are 32 <strong>de</strong> biți.<br />

Cel care scrie compilatorul trebuie să țină cont <strong>de</strong> particularitățile şi limitările<br />

sistemului <strong>de</strong> calcul atunci când asociază construcțiile <strong>din</strong> limbajul <strong>de</strong> programare<br />

<strong>de</strong> nivel înalt la instrucțiuni sau secvențe <strong>de</strong> instrucțiuni în limbaj <strong>de</strong> asamblare. De<br />

exemplu, setul <strong>de</strong> instrucțiuni ARC necesită ca toți operanzii aritmetici să fie<br />

constante imediate sau variabile registru. De aceea, compilatorul trebuie să<br />

genereze cod pentru încărcarea tuturor variabilelor în registre înainte <strong>de</strong> a se putea<br />

orice instrucțiune aritmetică. Acesta este motivul pentru instrucțiunea:<br />

ld [B], %r1<br />

<strong>din</strong> exemplul <strong>de</strong> mai sus.<br />

Noi vom prezenta asocierea construcțiilor <strong>din</strong> limbajele <strong>de</strong> nivel înalt în echivalentul<br />

lor în limbaj <strong>de</strong> asamblare, ignorând <strong>de</strong>taliile ce țin <strong>de</strong> analiza sintactică şi<br />

semantică.<br />

103


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Modul în care compilatorul asociază cele trei clase <strong>de</strong> instrucţiuni în cod<br />

în asamblare<br />

Vom prezenta în <strong>de</strong>taliu asocierea celor trei clase <strong>de</strong> instrucțiuni – mişcarea datelor,<br />

aritmetice şi controlul fluxului – <strong>din</strong> limbajele <strong>de</strong> programare <strong>de</strong> nivel înalt în limbaj<br />

<strong>de</strong> asamblare. În discuția şi exemplele ce urmează vom folosi limbajul C. Cu toate că<br />

limbajul este un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt, sintaxa şi semantica lui este<br />

<strong>de</strong>stul <strong>de</strong> aproape <strong>de</strong> conceptele <strong>din</strong> limbaj <strong>de</strong> asamblare.<br />

În exemplele <strong>de</strong> până acum s‐a presupus că variabilele pot fi accesate direct prin<br />

numele lor, nume ce este asociat unei locații <strong>de</strong> memorie ce este cunoscută la<br />

asamblare. În exemplul prece<strong>de</strong>nt, A = B + 4, se presupune că variabilele A şi B au<br />

adrese ce sunt cunoscute atunci când instrucțiunea este compilată. În C doar<br />

variabilele globale statice, au adrese ce sunt cunoscute la compilare. Variabilele<br />

<strong>de</strong>clarate în funcții sau în blocuri ce nu sunt <strong>de</strong>clarate explicit static sau global, sunt<br />

create la intrarea în funcție sau în bloc şi dispar atunci când funcția sau blocul se<br />

termină. Aceste variabile se numesc locale, sau automatice în C. În majoritatea<br />

programelor variabilele locale sunt mult mai <strong>de</strong>s folosite <strong>de</strong>cât variabilele globale.<br />

Având în ve<strong>de</strong>re acest caracter efemer al variabilelor locale, o modalitate naturală<br />

<strong>de</strong> a le implementa este o stivă <strong>de</strong> tip ultimul intrat‐primul ieşit. Variabilele stocate<br />

în stivă se creează la apelul funcției şi dispar când funcția se termină. Dacă în<br />

capitolul prece<strong>de</strong>nt am folosit pointerul <strong>de</strong> stivă %sp pentru a accesa stack frame‐ul,<br />

aici vom folosi un al registru %fp (frame pointer) pentru a accesa stiva pe durata<br />

execuției funcției. Motivul este că variabilele temporare pot fi puse şi scoase <strong>din</strong><br />

stivă în permanență pe durata execuției funcției, ceea ce duce la modificarea offset‐<br />

ului <strong>din</strong>tre %sp şi elementele <strong>din</strong> stivă. Folosirea lui %fp va permite compilatorului<br />

să folosească un offset constant între %fp şi valoarea stocată pe stivă, care rămâne<br />

fixat pe durata <strong>de</strong> viață a frame‐ului stivei. Adresarea cu bază (based addresing) este<br />

folosită pentru a accesa variabilele <strong>de</strong> pe stivă. De exemplu, o variabilă ARC<br />

localizată la 12 octeți sub %fp poate fi încărcată în %r1 prin instrucțiunea<br />

ld %fp, ‐12, %r1<br />

sau, să folosească o notație obişnuită:<br />

ld [%fp‐12], %r1<br />

Folosirea adresării cu bază permite ca aritmetica adresei („adună conținutul lui %fo<br />

la ‐12”) să fie efectuată într‐o singură instrucțiune. Adresarea cu bază este atât <strong>de</strong><br />

obişnuită încât toate seturile <strong>de</strong> instrucțiuni conțin acest mod <strong>de</strong> adresare. Unele<br />

mulțimi <strong>de</strong> instrucțiuni conțin moduri <strong>de</strong> adresare mai complicate pentru a putea<br />

accesa structuri <strong>de</strong> date complexe ce sunt stocate pe stivă.<br />

104


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Variabilele ce sunt stocate pe stivă au adrese <strong>de</strong> memorie ce sunt cunoscute <strong>de</strong> abia<br />

la execuție. Adresele lor <strong>de</strong> la momentul compilării sunt cunoscute ca offset‐uri <strong>de</strong> la<br />

%fp. De abia la intrarea în funcție se ştie care este adresa <strong>de</strong> memorie exactă a<br />

valorii. Astfel, cu toate că adresele variabilelor <strong>de</strong> pe stivă cum este [%fp ‐ 12] sunt<br />

mult mai obişnuite <strong>de</strong>cât adresele <strong>de</strong> variabile globale cum este A, vom presupune în<br />

continuare că sunt folosite variabilele globale pentru că este mai uşor <strong>de</strong> înțeles<br />

relația <strong>din</strong>tre numele variabilelor <strong>din</strong> limbajele <strong>de</strong> nivel înalt şi adresă aşa cum este<br />

specificată în limbaj <strong>de</strong> asamblare.<br />

În continuarea vom prezenta cele trei clase <strong>de</strong> instrucțiuni: mişcarea datelor,<br />

aritmetice şi controlul execuției programelor.<br />

Mişcarea datelor<br />

Pe lângă variabilele scalare simple, majoritatea limbajelor <strong>de</strong> programare furnizează<br />

diferite tipuri <strong>de</strong> structuri <strong>de</strong> date mai complexe, inclusiv structurile fixe (struct în<br />

C) şi tablourile.<br />

Un exemplu <strong>de</strong> structură este reprezentarea unui punct <strong>din</strong> spațiul tri‐dimensional,<br />

care are trei coordonate întregi x, y, z. O astfel <strong>de</strong> structură se poate <strong>de</strong>clara astfel:<br />

struct point<br />

{<br />

int x:<br />

int y;<br />

int z;<br />

};<br />

O instanță a acestei structuri se <strong>de</strong>fineşte astfel:<br />

struct point pt;<br />

Definind punctul pt, programatorul poate referi componentele individuale ale lui pt<br />

prin notația pt.x, care se referă la componenta x a structurii. Compilatorul va pune în<br />

memorie această structură ca trei locații <strong>de</strong> memorie consecutive.<br />

Adresa <strong>de</strong> memorie a structurii este cea mai mică valoare sau adresa <strong>de</strong> bază a<br />

structurii, aşa că componenta x va fi localizată la adresa pt, componenta y va fi<br />

localizată la adresa pt+4 iar componenta z la adresa pt+8. Aşadar, componenta y a<br />

structurii pt se încarcă în registrul %r1 prin instrucțiunea:<br />

ld [pt + 4], %r1 ! %r1


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Această <strong>de</strong>finiție va produce o colecție <strong>de</strong> 10 întregi in<strong>de</strong>xați <strong>de</strong> la 0 la 9.<br />

Componentele unei structuri trebuie numite explicit când se scrie programul, <strong>de</strong> ex.<br />

pt.z. Referințe cum ar fi pt.i, un<strong>de</strong> i este o variabilă a cărei nume nu este <strong>de</strong>terminat<br />

până la execuție nu sunt permise. La tablouri, in<strong>de</strong>xul poate fi calculat la execuție. De<br />

exemplu, programatorul poate specifica un element al tabloului prin A[i], un<strong>de</strong> i este<br />

o variabilă a cărei valoare este calculată la execuție şi care poate lua orice valoare<br />

cuprinsă între 0 şi 9. Dacă în C in<strong>de</strong>xul primului element al tabloului este<br />

întot<strong>de</strong>auna 0, în alte limbaje <strong>de</strong> programare există o flexibilitate mai mare. De<br />

exemplu, în Pascal se poate <strong>de</strong>clara un tablou astfel:<br />

A: array [‐10..10] of integer<br />

În cazul acesta calculul in<strong>de</strong>cşilor la execuție este mai complicat. Expresia generală<br />

pentru calculul adresa maşină a unui element al tabloului este dată <strong>de</strong>:<br />

AdresăElement = BAZA + (INDEX ‐ START)*DIMENSIUNE<br />

un<strong>de</strong> BAZA este adresa <strong>de</strong> început a tabloului, INDEX este in<strong>de</strong>xul elementului dorit,<br />

START este primul in<strong>de</strong>x pentru tablou iar SIZE este dimensiunea unui element<br />

individual în octeți. Astfel, elementul 5 <strong>din</strong> tabloul <strong>de</strong>clarat în Pascal <strong>de</strong> mai sus are<br />

adresa A + (5 – (‐10))*4 = A +60. În limbajul <strong>de</strong> asamblare ARC, dacă presupunem că<br />

BASE este în %r2, INDEX este în %r3, START este în %r4 şi presupunând că SIZE<br />

este 4, codul pentru încărcarea unei valori a tabloului în memorie este:<br />

ld %r3, %r4, ! %r6


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

registrelor”, şi pentru a <strong>de</strong>ci<strong>de</strong> când nu mai este nevoie <strong>de</strong> o anumită valoare <strong>din</strong>tr‐<br />

un registru.<br />

Controlul execuţiei programului<br />

Majoritatea arhitecturilor <strong>de</strong> seturi <strong>de</strong> instrucțiuni folosesc ramificări condiționate<br />

şi indicatorii aritmetici ai procesorului pentru a implementa structurilor pentru<br />

controlul execuției programului. În continuare vom prezenta cele mai importante<br />

instrucțiuni pentru controlul execuției.<br />

Cea mai trivială instrucțiune este instrucțiunea goto, „goto Etichetă”, care este<br />

implementată prin instrucțiunea <strong>de</strong> ramificare necondiționată ba (branch always).<br />

Instrucțiunea if­else are în limbajul C sintaxa:<br />

if (expr) instr1. else instr2.<br />

Compilatorul va evalua expresia logică expr, şi va executa una <strong>din</strong> cele două<br />

instrucțiuni în funcție <strong>de</strong> valoarea <strong>de</strong> a<strong>de</strong>văr a expresiei. Dacă presupunem că<br />

expresia este %r1 == %r2 şi introducem instrucțiunea bne („branch if not equal”)<br />

atunci codul pentru implementarea instrucțiunii if‐else este:<br />

subcc %r1, %r2, %r0<br />

bne Over<br />

! codul instrucțiunii 1<br />

ba End<br />

Over: ! codul instrucțiunii 2<br />

End:<br />

Instrucțiunea while, are în limbajul C sintaxa:<br />

while (expr) instr;<br />

Se evaluează expresia şi dacă are valoarea „true” atunci se execută instrucțiunea,<br />

după care se reevaluează condiția. Instrucțiunea se execută cât timp instrucțiunea<br />

are valoarea „true”.<br />

Cea mai eficientă reprezentare a acestei instrucțiuni în limbaj <strong>de</strong> asamblare are<br />

codul pentru evaluarea expresiei după codul instrucțiunii.<br />

Instrucțiunea:<br />

while (%r1 == %r2) %r3 = %r3 + 1;<br />

se poate implementa eficient în asamblare astfel:<br />

ba Test<br />

True: add %r3, 1, %r3<br />

107


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Test: subcc %r1, %r2, %r0<br />

Be True;<br />

Instrucțiunea do­while are, în limbajul C, sintaxa:<br />

do instrucțiune while (expresie)<br />

se implementează în asamblare la fel ca şi instrucțiunea prece<strong>de</strong>ntă cu excepția<br />

faptului că prima instrucțiune ba Test este eliminată.<br />

Instrucțiunea for are, în limbajul C, sintaxa:<br />

for (expr1; expr2; expr3) instrucțiune;<br />

Definiția limbajului C precizează că această instrucțiune este echivalentă cu<br />

secvența:<br />

expr1;<br />

while (expr2) {<br />

instrucțiune;<br />

expr3;<br />

}<br />

Instrucțiunea for se implementează în asamblare la fel ca şi instrucțiunea while cu o<br />

singură modificare: se adaugă codul pentru expr1 şi expr3.<br />

Procesul <strong>de</strong> asamblare<br />

Procesul <strong>de</strong> traducere a programului <strong>din</strong> limbaj <strong>de</strong> asamblare în limbaj maşină este<br />

numit proces <strong>de</strong> asamblare. Procesul <strong>de</strong> asamblare este unul direct şi simplu, <strong>din</strong><br />

moment ce există o corespon<strong>de</strong>nță unu‐la‐unu între instrucțiunile în asamblare şi<br />

instrucțiunile maşină. Spre <strong>de</strong>osebire, la compilare o instrucțiune <strong>din</strong> limbajul <strong>de</strong><br />

programare <strong>de</strong> nivel înalt poate fi tradusă în limbaj <strong>de</strong> asamblare în mai multe<br />

moduri echivalente <strong>din</strong> punct <strong>de</strong> ve<strong>de</strong>re computațional.<br />

Chiar dacă asamblarea se face direct, totuşi este grea şi supusă erorilor dacă este<br />

făcută <strong>de</strong> o persoană. De fapt, asamblorul a fost primul software creat după invenția<br />

calculatorului electronic digital.<br />

Asambloarele au cel puțin următoarele funcții:<br />

• Permit programatorului să specifice locațiile <strong>de</strong> la execuție ale datelor şi<br />

programelor. (<strong>de</strong> cele mai multe ori programatorul nu specifică o locație <strong>de</strong><br />

pornire absolută pentru un program, <strong>de</strong>oarece programul va fi mutat, relocat <strong>de</strong><br />

către link‐editor sau <strong>de</strong> încărcător aşa cum vom ve<strong>de</strong>a mai târziu).<br />

• Furnizează mnemonici în limbaj <strong>de</strong> asamblare pentru toate instrucțiunile<br />

maşină şi modurile <strong>de</strong> adresare şi traduc instrucțiunile vali<strong>de</strong> <strong>din</strong> asamblare în<br />

echivalentul lor binar <strong>din</strong> limbaj maşină.<br />

108


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

• Oferă programatorului posibilitatea <strong>de</strong> a inițializa datele <strong>din</strong> memorie înainte<br />

<strong>de</strong> execuția programului.<br />

• Permit utilizarea <strong>de</strong> etichete simbolice pentru reprezentarea adreselor şi a<br />

constantelor.<br />

• Furnizează programatorului posibilitatea <strong>de</strong> a specifica adresa <strong>de</strong> pornire a<br />

programului, dacă există una. (dacă modulul asamblat este o procedură sau<br />

funcție atunci nu ar fi o adresă <strong>de</strong> pornire).<br />

• Furnizează un anumit grad <strong>de</strong> aritmetică la momentul asamblării.<br />

• Includ mecanisme ce permit variabilelor să fie <strong>de</strong>finite într‐un program în<br />

limbaj <strong>de</strong> asamblare şi să fie folosite într‐un alt program asamblat separat.<br />

• Furnizează suport pentru expansiunea rutinelor macro, adică, rutine care pot<br />

fi <strong>de</strong>finite o singură dată şi instanțiate mai apoi <strong>de</strong> câte ori e nevoie.<br />

Vom ilustra modul în care evoluează procesul <strong>de</strong> asamblare prin „asamblarea<br />

manuală” a unui program simplu pentru ARC. Programul este cel <strong>de</strong> mai jos:<br />

În procesul <strong>de</strong> asamblare a acestui program vom folosi formatele pentru instrucțiuni<br />

<strong>din</strong> figura <strong>de</strong> mai jos:<br />

109


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Figura prezintă codificarea instrucțiunilor pentru maşina ARC, adică specifică<br />

limbajul binar țintă a unui calculator ARC pe care asamblorul trebuie să‐l genereze<br />

<strong>din</strong> textul în limbaj <strong>de</strong> asamblare.<br />

Asamblare şi asambloare în doi paşi<br />

Majoritatea asambloarelor trec peste programul în limbaj <strong>de</strong> asamblare <strong>de</strong> două ori<br />

şi <strong>de</strong> aceea se numesc asambloare în doi paşi. La primul pas se <strong>de</strong>termină adresa<br />

tuturor elementelor <strong>de</strong> date şi instrucțiunilor maşină şi se selectează instrucțiunile<br />

maşină ce se vor produce pentru fiecare instrucțiune în asamblare (la acest pas nu<br />

se generează codul maşină).<br />

Adresele datelor şi instrucțiunilor sunt <strong>de</strong>terminate prin folosirea unui analog la<br />

nivel <strong>de</strong> asamblare pentru contorul program, numit contor <strong>de</strong> locaţie. Contorul <strong>de</strong><br />

locație ține evi<strong>de</strong>nța instrucțiunii curente sau a datelor pe măsură ce se efectuează<br />

compilarea. De regulă este inițializat la zero la începutul primului pas şi este<br />

incrementat cu dimensiunea fiecărei instrucțiuni. Pseudo‐operația .org <strong>de</strong>termină<br />

contorul <strong>de</strong> locație să fie setat la o valoare specificată <strong>de</strong> instrucțiunea .org. Dacă<br />

asamblorul întâlneşte instrucțiunea<br />

.org 1000<br />

va seta contorul <strong>de</strong> locație la 1000, iar instrucțiunea următoare sau datele vor fi<br />

asamblate la acea adresă. În timpul primului pas, asamblorul efectuează orice<br />

aritmetică <strong>de</strong> la momentul asamblării şi inserează <strong>de</strong>finițiile tuturor etichetelor şi<br />

valorilor constante într‐o tabelă, numită tabela <strong>de</strong> simboluri.<br />

Motivul principal pentru existența celui <strong>de</strong>‐al doilea pas este <strong>de</strong> a permite utilizarea<br />

în program a simbolurilor, înainte <strong>de</strong> a fi <strong>de</strong>finite, ceea ce se numeşte referenţiere<br />

înainte (engl. forward referencing). După acest prim pas, asamblorul a i<strong>de</strong>ntificat şi a<br />

introdus în tabela <strong>de</strong> simboluri toate simbolurile, şi în timpul celui <strong>de</strong>‐al doilea pas<br />

se va genera codul maşină, prin inserarea valorilor simbolurilor – valori care sunt<br />

cunoscute al acest al doilea pas.<br />

Acum vom asambla manual programul <strong>de</strong> mai sus. Când asamblorul întâlneşte<br />

prima instrucțiune:<br />

ld [x], %r1<br />

foloseşte un proces „pattern matching” pentru a recunoaşte că e vorba <strong>de</strong><br />

instrucțiunea „load”. Mai <strong>de</strong>parte se va i<strong>de</strong>ntifica faptul că încărcarea se face la o<br />

adresă specificată <strong>de</strong> o valoare constantă (aici x) într‐un registru (aici %r1). Aceasta<br />

corespun<strong>de</strong> celui <strong>de</strong>‐al doilea format <strong>de</strong> instrucțiuni <strong>de</strong> memorie, astfel că găsim<br />

câmpul op al acestei instrucțiuni (11). Destinația acestei instrucțiuni ld este câmpul<br />

rd, care este 00001 pentru %r1 în acest caz. Câmpul op3 este 000000 pentru ld.<br />

110


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Câmpul rs1 i<strong>de</strong>ntifică registrul, %r0 în acest caz, care este adunat cu câmpul<br />

simm13 pentru a forma adresa operandului sursă. Urmează bitul i. Bitul i este folosit<br />

pentru a face distincția între primul format <strong>de</strong> instrucțiune <strong>de</strong> memorie (i=0) şi cel<br />

<strong>de</strong>‐al doilea (i=1). De aceea bitul i este setat la valoarea 1. Câmpul simm13 specifică<br />

adresa etichetei x, care apare la cinci cuvinte după prima instrucțiune. Din moment<br />

ce prima instrucțiune apare la adresa 2048 şi <strong>din</strong> moment ce fiecare cuvânt este<br />

format <strong>din</strong> patru octeți, adresa lui x este la 5 x 4 = 20 <strong>de</strong> octeți după începutul<br />

programului. Adresa lui x va fi 2048 + 20 = 2068, care se reprezintă prin secvența <strong>de</strong><br />

13 biți: 010000010100. Această secvență intră în câmpul <strong>de</strong> 13 biți simm13.<br />

Prin urmare prima linie a programului va fi asamblată astfel:<br />

11 00001 000000 00000 1 0100000010100<br />

op rd op3 rs1 i simm13<br />

Următoarea instrucțiune are o formă asemănătoare, iar secvența <strong>de</strong> biți<br />

corespunzătoare este:<br />

11 00010 000000 00000 1 0100000011000<br />

op rd op3 rs1 i simm13<br />

Procesul <strong>de</strong> asamblare continuă până când toate cele 8 linii sunt asamblate:<br />

ld [x], %r1 1100 0010 0000 0000 0010 1000 0001 0100<br />

ld [y], %r2 1100 0100 0000 0000 0010 1000 0001 1000<br />

addcc %r1,%r2,%r3 1000 0110 1000 0000 0100 0000 0000 0010<br />

st %r3, [z] 1100 0110 0010 0000 0010 1000 0001 1100<br />

jmpl %r15+4, %r0 1000 0001 1100 0011 1110 0000 0000 0100<br />

15 0000 0000 0000 0000 0000 0000 0000 1111<br />

9 0000 0000 0000 0000 0000 0000 0000 1001<br />

0 0000 0000 0000 0000 0000 0000 0000 0000<br />

Asamblorul citeşte instrucțiunile una câte una şi generează cod maşină pentru ele. O<br />

problemă care poate să apară, aşa cum s‐a menționat, este referențierea înainte a<br />

unor simboluri. În secvența <strong>de</strong> mai jos:<br />

111


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

la întâlnirea instrucțiunii call, asamblorul nu ştie care este locația lui sub_r <strong>din</strong><br />

moment ce eticheta sub_r încă nu a fost întâlnită <strong>de</strong> asamblor. Aşa că, referința este<br />

includă în tabela <strong>de</strong> simboluri şi este marcată ca fiind nerezolvată. Referința va fi<br />

rezolvată doar mai târziu când este întâlnită în program.<br />

Asamblare şi tabela <strong>de</strong> simboluri<br />

Tabela <strong>de</strong> simboluri este creată la parcurgerea pentru prima dată a programului (la<br />

un asamblor în doi paşi). Un simbol este ori o etichetă, ori un nume simbolic care se<br />

referă la o valoare folosită în timpul procesului <strong>de</strong> asamblare.<br />

Pentru a ve<strong>de</strong>a cum operează un asamblor în doi paşi, să consi<strong>de</strong>răm asamblarea<br />

codului <strong>de</strong> mai jos:<br />

Asamblorul întâlneşte instrucțiunea .org 2048. Aceasta va <strong>de</strong>termina ca asamblorul<br />

să seteze contorul <strong>de</strong> locație la valoarea 2048 şi asamblarea continuă <strong>de</strong> la acea<br />

adresă. Prima instrucțiune este:<br />

a_start .equ 3000<br />

În tabela <strong>de</strong> simboluri se creează o poziție pentru simbolul a_start, care primeşte<br />

valoarea 3000. (.equ nu generază cod aşa că nu primeşte o adresă la asamblare).<br />

Prima instrucțiune maşină,<br />

112<br />

Crearea tabelei <strong>de</strong><br />

simboluri


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

ld [length], %r1<br />

este asamblată la adresa specificată <strong>de</strong> contorul <strong>de</strong> locație, 2048. Contorul <strong>de</strong> locație<br />

este incrementat cu dimensiunea unei instrucțiuni, adică 4 octeți, la 2052. Când este<br />

întâlnit simbolul length, asamblorul încă nu a văzut <strong>de</strong>finiția lui. În tabela <strong>de</strong><br />

simboluri se creează o poziție pentru length, care este primeşte inițial valoarea<br />

„ne<strong>de</strong>finit” aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai sus (a).<br />

Asamblorul întâlneşte instrucțiunea:<br />

ld [address], %r2<br />

care este asamblată la adresa 2052 şi se introduce în tabela <strong>de</strong> simboluri simbolul<br />

address a cărui valoare se setează <strong>din</strong> nou la „ne<strong>de</strong>finit”. Contorul <strong>de</strong> locații este<br />

mărit cu 4 la 2056. Instrucțiunea andcc este asamblată la adresa 2056, iar contorul<br />

<strong>de</strong> locație este mărit cu 4 octeți, la 2060. Următorul simbol care este întâlnit este<br />

loop, care este introdus în tabela <strong>de</strong> simboluri cu valoarea 2060 – valoarea<br />

contorului <strong>de</strong> locație. Următorul simbol întâlnit este done, simbol ce este introdus în<br />

tabela <strong>de</strong> simboluri fără o valoare <strong>din</strong> moment ce nu este încă <strong>de</strong>finit.<br />

Primul pas al asamblării continuă şi simbolurile nerezolvate: length, address, şi done<br />

primesc valorile 2092, 2096 respectiv 2088. Eticheta a este introdusă în tabela <strong>de</strong><br />

simboluri cu valoarea 3000. Eticheta done apare la locația 2088 <strong>de</strong>oarece sunt 10<br />

instrucțiuni (40 <strong>de</strong> octeți) între începutul programului şi done. Adresele pentru<br />

restul etichetelor sunt calculate într‐un mod similar. Dacă mai rămân etichete<br />

ne<strong>de</strong>finite la sfârşitul primului pas, atunci înseamnă că există o eroare în program şi<br />

asamblorul va semnala care este simbolul ne<strong>de</strong>finit şi va opri procesul <strong>de</strong><br />

asamblare.<br />

După crearea tabelei <strong>de</strong> simboluri începe al doilea pas al asamblării. Programul este<br />

parcurs încă o dată <strong>de</strong> la instrucțiunea .begin, dar <strong>de</strong> data asta se generează cod<br />

obiect. Prima instrucțiune întâlnită ce <strong>de</strong>termină generarea <strong>de</strong> cod este ld la locația<br />

2048. Din tabela <strong>de</strong> simboluri se ve<strong>de</strong> că porțiunea <strong>de</strong> adrese a instrucțiunii ld este<br />

2092 pentru adresa lui length aşa că se generează cod <strong>de</strong> dimensiune egală cu un<br />

cuvânt folosind formatul Memory aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos.<br />

113


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Al doilea pas continuă la fel până când se translatează tot codul.<br />

Sarcinile finale ale asamblorului<br />

După terminarea asamblării se adaugă la modulul asamblat informație suplimentară<br />

ce va fi folosită <strong>de</strong> link‐editor şi asamblor.<br />

• Numele modulului şi dimensiunea. Dacă mo<strong>de</strong>lul <strong>de</strong> execuție implică<br />

segmente <strong>de</strong> memorie pentru cod, date şi stivă atunci trebuie precizate<br />

dimensiunile şi i<strong>de</strong>ntitățile diferitelor segmente.<br />

• Adresa simbolului <strong>de</strong> start, dacă este <strong>de</strong>finită în modul. Majoritatea<br />

asambloarelor şi limbajelor <strong>de</strong> nivel înalt furnizează o etichetă rezervată specială<br />

ce permit programatorului să specifice locul în care programul trebuie să înceapă<br />

execuția. De exemplu, în C este funcția main(). Eticheta main este un semnal<br />

pentru asamblor că execuția trebuie să înceapă în acel loc.<br />

• Informație <strong>de</strong>spre simbolurile globale şi externe. Link‐editorul va trebui să<br />

ştie adresa simbolurilor globale <strong>de</strong>finite în modul şi exportate <strong>de</strong> modul, şi va<br />

trebui să ştie ce simboluri rămân ne<strong>de</strong>finite în modul <strong>de</strong>oarece acestea sunt<br />

<strong>de</strong>finite ca globale în alte module.<br />

• Informație <strong>de</strong>spre rutinele <strong>de</strong> bibliotecă care sunt referențiate <strong>de</strong> modul.<br />

Unele biblioteci conțin funcționalitate ce apare <strong>de</strong> multe ori cum ar fi funcție<br />

matematice sau alte funcții specializate.<br />

• Valorile constantelor ce trebuie încărcate în memorie. Unele încărcătoare cer<br />

ca inițializarea datelor să fie specificată separat <strong>de</strong> codul binar.<br />

114


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

• Informație <strong>de</strong> relocare. Când link‐editorul este invocat majoritatea modulelor<br />

ce trebuie link‐editate vor trebui relocate în momentul când modulele sunt<br />

concatenate.<br />

Localizarea programelor în memorie<br />

Până acum am presupus că programele sunt localizate în memorie la o adresă ce<br />

este specificată <strong>de</strong> pseudo‐operația .org. Aceasta s‐ar putea să fie în regulă pentru<br />

programare <strong>de</strong> sisteme, atunci când programatorul are un motiv bine întemeiat<br />

pentru ca programul să se afle la acea locație <strong>de</strong> memorie dar, <strong>de</strong> regulă,<br />

programatorul nu este interesat <strong>de</strong> localizarea programului în memorie. Atunci când<br />

programare asamblate sau compilate separat sunt legate, este dificil sau poate chiar<br />

imposibil pentru un programator să ştie cu exactitate un<strong>de</strong> va fi localizat fiecare<br />

modul după link‐editare. Din acest motiv majoritatea adreselor sunt specificate ca<br />

fiind relocabile în memorie, cu excepția unor adrese particulare cum ar fi adresele<br />

<strong>de</strong> intrare‐ieşire, care sunt fixate la locații <strong>de</strong> memorie absolute. Asamblorul este<br />

responsabil pentru marcare simbolurilor ca fiind relocabile. Dacă un anumit simbol<br />

este relocabil sau nu <strong>de</strong>pin<strong>de</strong> atât <strong>de</strong> limbajul <strong>de</strong> asamblare cât şi <strong>de</strong> convențiile<br />

sistemului <strong>de</strong> operare. Informația <strong>de</strong> relocare este inclusă în modulul asamblat<br />

pentru a fi folosită <strong>de</strong> link‐editor sau <strong>de</strong> încărcător.<br />

Link­editare şi încărcare<br />

Majoritatea aplicațiilor vor fi formate <strong>din</strong>tr‐o serie <strong>de</strong> module compilate sau<br />

asamblate separat. Aceste module pot fi generate <strong>de</strong> diferite limbaje <strong>de</strong> programare<br />

sau pot fi prezente într‐un modul furnizat ca parte a mediului pentru <strong>de</strong>zvoltarea <strong>de</strong><br />

aplicații sau a sistemului <strong>de</strong> operare. Fiecare modul trebuie să furnizeze informația<br />

pe care am prezentat‐o mai sus, pentru ca să poată fi legate împreună pentru<br />

încărcare şi execuție.<br />

Un link‐editor, este un program care combină programele asamblate separat<br />

(numite module obiect) într‐un singur program, numit modul încărcabil. Link‐<br />

editorul rezolvă referințele globale externe şi relochează adresele <strong>de</strong> memorie în<br />

modulele separate. Modulul încărcabil poate fi încărcat în memorie <strong>de</strong> către<br />

încărcător, care la rândul său poate modifica adresele dacă programul este încărcat<br />

la o locație diferită <strong>de</strong> locația <strong>de</strong> încărcare folosită <strong>de</strong> link‐editor.<br />

Tehnica DLL (Dynamic Link Library) <strong>din</strong> Windows, prezentă sub diferite forme şi în<br />

alte sisteme <strong>de</strong> operare, amână link‐editarea unor componente până când este<br />

nevoie <strong>de</strong> ele la execuție.<br />

Link­editare<br />

În procesul <strong>de</strong> combinare a modulelor asamblate sau compilate separat într‐un<br />

modul încărcabil, link‐editorul trebuie să:<br />

115


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

• Rezolve referințele la adrese care sunt externe modulelor pe măsură ce sunt<br />

link‐editate.<br />

• Relocheze fiecare modul prin combinarea lor cap‐la‐cap. În timpul acestui<br />

proces <strong>de</strong> relocare multe adrese <strong>din</strong> modul trebuie să fie schimbate pentru a<br />

reflecta noua lor locație.<br />

• Specifice simbolul <strong>de</strong> pornire al modulului încărcabil.<br />

• Dacă modulul <strong>de</strong> memorie inclu<strong>de</strong> mai mult <strong>de</strong> un segment <strong>de</strong> memorie, link‐<br />

editorul trebuie să specifice i<strong>de</strong>ntitățile şi conținutul diferitelor segmente.<br />

Rezolvarea referinţelor externe<br />

Pentru rezolvarea referințelor externe link‐editorul trebuie să facă distincție între<br />

numele simbolurilor locale (folosite în cadrul unui singur modul sursă) şi numele<br />

simbolurilor globale (folosite în mai mult <strong>de</strong> un modul). Aceasta se realizează prin<br />

folosirea pseudo‐operațiilor .global şi .extern în timpul asamblării. Pseudo‐operația<br />

.global indică asamblorului să marcheze simbolul ca fiind disponibil altor module<br />

obiect în timpul fazei <strong>de</strong> link‐editare. Pseudo‐operația .extern i<strong>de</strong>ntifică o etichetă ce<br />

este folosită într‐un modul dar este <strong>de</strong>finită într‐altul. Astfel, .global este folosit în<br />

modulul în care simbolul este <strong>de</strong>finit şi .extern este folosit în fiecare modul care se<br />

referă la simbol. Doar etichetele <strong>de</strong> adrese pot fi globale sau externe: nu ar avea sens<br />

să marcăm un simbol .equ ca fiind global sau extern, <strong>din</strong> moment ce .equ este o<br />

pseudo‐operație care este folosită doar în timpul procesului <strong>de</strong> asamblare, iar<br />

procesul <strong>de</strong> asamblare este încheiat în momentul în care începe link‐editarea.<br />

Toate etichetele referite <strong>din</strong>tr‐un program referite <strong>din</strong> alte programe, vor avea o<br />

linie <strong>de</strong> forma:<br />

.global simbol1, simbol2, …<br />

Toate celelalte etichete sunt locale, ceea ce înseamnă că aceeaşi etichetă poate fi<br />

folosită în mai mult <strong>de</strong> un modul sursă fără confuzie <strong>din</strong> moment ce etichetele locale<br />

nu sunt folosite după ce procesul <strong>de</strong> asamblare se termină. Un modul ce se referă la<br />

simboluri <strong>de</strong>finite într‐un alt modul trebuie să <strong>de</strong>clare acele simboluri folosind<br />

forma:<br />

.extern simbol1, simbol2, …<br />

Un exemplu <strong>de</strong> utilizare e .global şi .extern este dat în figura <strong>de</strong> mai jos:<br />

116


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Fiecare modul este asamblat separat în module obiect, fiecare cu propria tabelă <strong>de</strong><br />

simboluri, aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos:<br />

Tabelele <strong>de</strong> simboluri au un câmp suplimentar care indică dacă un simbol este<br />

extern sau global. Programul main începe la locația 2048, şi fiecare instrucțiune are<br />

patru octeți, aşa că x şi y sunt la locația 2046 şi 2068.. Simbolul sub este marcat ca<br />

fiind extern ca rezultat al pseudo‐operației .extern. Ca parte a procesului <strong>de</strong><br />

asamblare asamblorul inclu<strong>de</strong> informații antet în modul <strong>de</strong>spre simbolurile ce sunt<br />

globale şi externe aşa că acestea pot fi rezolvate în faza <strong>de</strong> link‐editare.<br />

Relocare<br />

În cele două programe <strong>de</strong> mai sus, atât main cât şi sub au aceeaşi adresă <strong>de</strong> pornire –<br />

2048. Este evi<strong>de</strong>nt că ele nu pot ocupa aceeaşi adresă <strong>de</strong> memorie. Dacă cele două<br />

module sunt asamblate separat, asamblorul nu are cum să <strong>de</strong>tecteze această<br />

problemă. Pentru a rezolva problema, asamblorul marchează ca relocabile<br />

simbolurile a căror adresă se poate schimba în timpul procesului <strong>de</strong> link‐editare, aşa<br />

cum se ve<strong>de</strong> în tabelele <strong>de</strong> mai sus. I<strong>de</strong>ea este că un program asamblat la adresa <strong>de</strong><br />

start 2048 poate fi încărcat la adresa 3000, atâta timp cât toate referințele la adrese<br />

relocabile <strong>din</strong> program sunt mărite 2000‐2048 = 952. Relocarea se face <strong>de</strong> către<br />

link‐editor aşa că adresele relocabile sunt modificate cu aceeaşi valoare cu care s‐a<br />

modificat originea <strong>de</strong> încărcare. Adresele absolute sau non‐relocabile (cum ar fi<br />

adresa cea mai mare posibilă pentru stivă 2 31 ‐4) rămân la fel indiferent <strong>de</strong> originea<br />

la care se încărcă programul.<br />

Asamblorul este responsabil pentru <strong>de</strong>terminarea etichetelor relocabile atunci când<br />

construieşte tabela <strong>de</strong> simboluri. Nu are sens ca o etichetă externă să fie relocabilă,<br />

117


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

<strong>din</strong> moment ce eticheta este <strong>de</strong>finită într‐un alt modul, aşa că în sub nu are nici un<br />

simbol relocabil în tabela <strong>de</strong> simboluri pentru programul main, dar sub este marcat<br />

ca relocabil în biblioteca <strong>de</strong> subrutine. Asamblorul trebuie să i<strong>de</strong>ntifice cod în<br />

modulul obiect ce trebuie să fie modificat ca rezultat al relocării. Numerele absolute,<br />

cum ar fi constantele (marcate cu .equ, sau cele ce apar în locații <strong>de</strong> memorie, cum ar<br />

fi conținutul lui x şi y, care este 105 şi 92) nu sunt relocabile. Locațiile <strong>de</strong> memorie<br />

poziționate relativ la o instrucțiune .org, cum ar fi x şi y (nu conținutul lui x şi y!) <strong>de</strong><br />

obicei sunt relocabile. Referințele la locații fixe, cum ar fi rutinele grafice rezi<strong>de</strong>nte<br />

permanent care sunt înglobate în hardware <strong>din</strong> fabricație, nu sunt relocabile. Toată<br />

informația <strong>de</strong> care este nevoie pentru a reloca un modul este stocat într‐un dicționar<br />

<strong>de</strong> relocare conținut în fişierul asamblat şi, astfel este disponibil link‐editorului.<br />

Încărcare<br />

Încărcătorul este un program care plasează modulul în memoria principală.<br />

Conceptual, sarcina încărcătorului nu este dificilă. Trebuie să încarce diferitele<br />

segmente <strong>de</strong> memorie cu valorile potrivite şi să inițializeze anumite registre, cum ar<br />

fi %sp (stack pointer) şi %pc (program counter), la valori inițiale.<br />

Dacă există un singur modul <strong>de</strong> încărcare ce se execută la un moment dat, atunci<br />

acest mo<strong>de</strong>l funcționează bine. Totuşi, în sistemele <strong>de</strong> operare mo<strong>de</strong>rne mai multe<br />

programe sunt rezi<strong>de</strong>nte în memorie la un moment dat şi asamblorul sau link‐<br />

editorul nu poate şti la ce adrese se vor găsi aceste programe. Încărcătorul trebuie<br />

să relocheze aceste module la încărcare prin adăugarea unui offset codului relocabil<br />

<strong>din</strong> modul. Acest tip <strong>de</strong> încărcător (loa<strong>de</strong>r) se numeşte încărcător cu relocare.<br />

Încărcătorul cu relocare nu repetă doar sarcina link‐editorului. Link‐editorul<br />

combină mai multe module obiect într‐un singur modul <strong>de</strong> încărcare, pe când<br />

loa<strong>de</strong>r‐ul doar modifică adresele relocabile <strong>din</strong>tr‐un singur modul <strong>de</strong> încărcare<br />

astfel ca mai multe programe să poată rezida în memorie simultan. Un loa<strong>de</strong>r cu<br />

legare (linking loa<strong>de</strong>r) efectuează atât procesul <strong>de</strong> link‐editare cât şi procesul <strong>de</strong><br />

încărcare: rezolvă referințele externe, relochează modulele obiect şi le încarcă în<br />

memorie.<br />

Fişierul executabil legat conține informații în antet ce <strong>de</strong>scriu un<strong>de</strong> trebuie încărcat,<br />

adresa <strong>de</strong> start şi eventual informațiile <strong>de</strong> relocare, şi punctele <strong>de</strong> intrare pentru<br />

rutinele care trebuie să fie disponibile extern.<br />

DLL (Dynamic Link Librarie)<br />

Conceptul <strong>de</strong> bibliotecă cu legare <strong>din</strong>amică are numeroase trăsături atractive.<br />

Rutinele folosite în mod obişnuit, cum ar fi cele pentru gestiunea memoriei sau<br />

pachetele grafice trebuie să existe într‐un singur loc, biblioteca DLL. Aceasta duce la<br />

programe <strong>de</strong> dimensiuni mai mici întrucât programele nu trebuie să aibă propria<br />

copie a codului <strong>din</strong> DLL. Toate programele partajează acelaşi cod, chiar şi atunci<br />

când rulează simultan.<br />

118


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

DLL‐urile pot fi actualizate prin bug‐fix‐uri sau prin adăugări <strong>de</strong> funcții<br />

suplimentare, şi programele ce le folosesc nu trebuie recompilate sau re‐legate.<br />

Aceste trăsături pot fi în acelaşi timp şi <strong>de</strong>zavantaje, <strong>de</strong>oarece comportamentul<br />

programelor se poate modifica într‐un mod neprevăzut (ca <strong>de</strong> exemplu epuizarea<br />

memoriei <strong>din</strong> cauza faptului că DLL‐ul este prea mare). Biblioteca DLL trebuie să fie<br />

prezentă întot<strong>de</strong>auna şi trebuie să conțină versiunea pe care o cere fiecare program.<br />

Mulți utilizatori Windows au văzut mesajul „A file missing from the dynamic<br />

library”. Pentru a complica şi mai mult lucrurile, în implementarea Windows există<br />

mai multe locuri în sistemul <strong>de</strong> fişiere un<strong>de</strong> sunt localizate DLL‐urile.<br />

Un exemplu <strong>de</strong> programare<br />

Să consi<strong>de</strong>răm problema adunării a două numere pe 64 <strong>de</strong> biți folosind limbajul <strong>de</strong><br />

asamblare ARC. Putem stoca numerele pe 64 <strong>de</strong> biți în două cuvinte <strong>de</strong> memorie<br />

distincte şi să adunăm separat cele două perechi <strong>de</strong> cuvinte. Dacă se generează<br />

transport la adunarea celor două cuvinte mai puțin semnificative, atunci transportul<br />

este adunat la cuvântul mai semnificativ al rezultatului.<br />

În figura <strong>de</strong> mai jos avem o posibilă soluție la această problemă.<br />

Operanzii pe 64 <strong>de</strong> biți A şi B sunt stocați în memorie în formatul big‐endian, în care<br />

cei mai semnificativi 32 <strong>de</strong> biți sunt stocați la adresa <strong>de</strong> memorie mai mică.<br />

Programul începe prin încărcarea cuvintelor lui A în %r1 (cuvântul mai semnificativ)<br />

şi în %r2 (cuvântul mai puțin semnificativ). Cele două cuvinte ale lui B se încarcă în<br />

%r3 şi %r4. Subrutina add_64 este apelată, care adună A cu B şi plasează cuvântul mai<br />

semnificativ al rezultatului în registrul %r5 iar cuvântul mai puțin semnificativ în<br />

%r6. Rezultatul <strong>de</strong> 64 <strong>de</strong> biți se stochează în C şi programul se termină.<br />

Subrutina add_64 începe prin a aduna cele două cuvinte mai puțin semnificative.<br />

Dacă nu se generează transport, atunci cuvintele mai semnificative sunt adunate şi<br />

rutina se termină. Dacă se generează transport atunci acesta trebuie adunat la<br />

cuvântul mai semnificativ al rezultatului. Dacă nu se generează transport la<br />

adunarea cuvintelor mai semnificative, atunci transportul <strong>de</strong> la cuvântul mai puțin<br />

semnificativ al rezultatului este doar adunat la cuvântul mai semnificativ al<br />

rezultatului şi rutina se termină. Dacă, se generează transport la adunarea<br />

cuvintelor mai semnificative, atunci când transportul <strong>de</strong> la cuvântul mai puțin<br />

semnificativ este adunat la cuvântul mai semnificativ, starea finală a codurilor <strong>de</strong><br />

condiție vor arăta că nu avem transport care iese <strong>din</strong> cuvântul mai semnificativ, ceea<br />

ce este greşit. Codul <strong>de</strong> condiție pentru transport este refăcut prin plasarea unui<br />

număr mare în %r7 şi adunarea cu el însuşi.<br />

119


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Macrouri<br />

Dacă se foloseşte o convenție <strong>de</strong> apel bazată <strong>de</strong> stivă, atunci un anumit număr <strong>de</strong><br />

registre vor fi introduse şi scoase <strong>de</strong> pe stivă în mod frecvent în timpul apelurilor şi<br />

întoarcerilor <strong>din</strong> subrutine. Pentru a pune pe stivă registrul %r15 al ARC, trebuie<br />

prima dată să <strong>de</strong>crementăm pointerul <strong>de</strong> stivă (care este în %r14) iar după aceea să<br />

copiem %r15 în locația <strong>de</strong> memoria indicată <strong>de</strong> %r14, aşa cum prezentăm în<br />

secvența <strong>de</strong> mai jos:<br />

addcc %r14, ‐4, %r14 ! <strong>de</strong>crementarea pointerului <strong>de</strong> stivă<br />

st %r15, %r14 ! se pune %r15 pe stivă<br />

O notație mai compactă pentru realizarea aceluiaşi efect este:<br />

120


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

push %r15<br />

Forma compactă atribuie o nouă etichetă (push) secvenței <strong>de</strong> instrucțiuni care<br />

realizează comanda. Eticheta push este consi<strong>de</strong>rată un macro, iar procesul <strong>de</strong><br />

traducere a macro‐ului în echivalentul în limbaj <strong>de</strong> asamblare se numeşte macro‐<br />

expansiune.<br />

Un macro poate fi creat prin folosirea unei macro‐<strong>de</strong>finiții, aşa cum se ve<strong>de</strong> în figura<br />

<strong>de</strong> mai jos. Macro‐ul începe cu pseudo‐operația .macro şi se termină cu pseudo‐<br />

operația .endmacro.<br />

Pe linia .macro primul simbol este numere macro‐urlui (push), iar restul simbolurilor<br />

sunt argumentele liniei <strong>de</strong> comandă folosite în macro. Există un singur argument<br />

pentru macro‐ul push, şi anume arg1. Aceasta corespun<strong>de</strong> lui %r15 în instrucțiunea<br />

push %r15 sau lui %r1 în instrucțiunea push %r1. Argumentul este legat <strong>de</strong> arg1 în<br />

timpul procesului <strong>de</strong> asamblare.<br />

Pot fi folosiți şi parametri formali suplimentari, separați prin virgulă:<br />

.macro nume arg1, arg2, arg3, …<br />

iar macro‐ul este mai apoi apelat cu acelaşi număr <strong>de</strong> parametri actuali.<br />

nume %r1, %r2, %r3, …<br />

Corpul macro‐ului urmează după pseudo‐operația .macro. Orice comenzi pot urma,<br />

inclusiv alte macro‐uri, sau chiar şi apeluri la acelaşi macro, ceea ce duce la o<br />

<strong>de</strong>zvoltare recursivă la asamblare. Parametri care apar în linia .macro pot fi înlocui<br />

orice text <strong>din</strong> corpul macro‐ului, aşa că aceşti parametri pot fi folosiți pentru<br />

etichete, instrucțiuni sau operanzi.<br />

În timpul macro‐expansiunii parametri formali sunt înlocuiți cu parametri actuali<br />

folosind o substituție simplă textuală. Astfel, macro‐ul push poate fi apelat atât cu<br />

argumente <strong>de</strong> memorie cât şi cu registre.<br />

push %r1 sau push foo<br />

Programatorul trebui să țină cont <strong>de</strong> această trăsătură a macro‐expansiunii atunci<br />

când <strong>de</strong>fineşte un macro.<br />

Pentru macro‐expansiune recursivă este nevoie <strong>de</strong> pseudo‐operații suplimentare.<br />

Pseduo‐operațiile .if şi .endif <strong>de</strong>schid şi închid o secvență <strong>de</strong> asamblare condițională.<br />

121


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Dacă argumentul lui .if este true, atunci codul care urmează până la .endif este<br />

asamblat. Dacă argumentul este false atunci codul <strong>din</strong>tre .if şi .endif este ignorat <strong>de</strong><br />

către asamblor. Operatorii condiționali pentru psedudo‐operația .if pot fi oricare <strong>din</strong><br />

mulțimea {, >=,


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

funcții, prin aceea că macrourile generează cod in‐line la asamblare, pe când<br />

subrutinele sunt rulate la execuție.<br />

Un link‐editor combină modulele asamblate separat într‐un singur modul ce poate fi<br />

încărcat. Modulul este plasat în memorie <strong>de</strong> către loa<strong>de</strong>r şi începe execuția<br />

programului. Loa<strong>de</strong>r‐ul poate face relocare dacă două sau mai multe module se<br />

suprapun în memorie.<br />

În practică <strong>de</strong>taliile asamblării, link‐editării şi încărcării sunt <strong>de</strong>pen<strong>de</strong>nte <strong>de</strong> sistem<br />

şi limbaj. Unele asambloare simple produc fişiere binare direct executabile, dar <strong>de</strong><br />

regulă un asamblor va produce informație suplimentară astfel ca modulele să poată<br />

fi legate împreună <strong>de</strong> către linker. Unele sisteme oferă încărcătoare care efectuează<br />

şi link‐editare. Unele încărcătoare pot încărca programul doar la adresa specificată<br />

în fişierul binar, pe când altele, <strong>de</strong> obicei, încărcătoarele cu relocare pot reloca<br />

programul la o adresă specificată la încărcare. Aceste procese sunt <strong>de</strong>pen<strong>de</strong>nte <strong>de</strong><br />

sistemul <strong>de</strong> operare.<br />

Înainte <strong>de</strong> apariția compilatoarelor, programele erau scrise direct în limbaj <strong>de</strong><br />

asamblare. În ziua <strong>de</strong> astăzi, limbajul <strong>de</strong> asamblare nu mai este folosit pentru a scrie<br />

programe, întrucât compilatoarele pentru limbajele <strong>de</strong> nivel înalt produc un cod<br />

foarte eficient. Cu toate acestea limbajele <strong>de</strong> asamblare sunt importante pentru a<br />

înțelege aspecte <strong>de</strong> arhitectura calculatoarelor cum ar fi: link‐editarea programelor<br />

compilate pentru convenții <strong>de</strong> apel.<br />

123


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

7. Comunicaţii<br />

Comunicația este procesul <strong>de</strong> transferare a informației <strong>de</strong> la o sursă la o <strong>de</strong>stinație.<br />

Sistemele <strong>de</strong> comunicație acoperă distanțele <strong>din</strong>tre calculatoare şi implică sistemul<br />

public <strong>de</strong> telefonie, radio şi televiziune. Sistemele <strong>de</strong> comunicație pe arie largă au<br />

<strong>de</strong>venit foarte complexe, transmițându‐se combinații <strong>de</strong> voce, date şi vi<strong>de</strong>o prin<br />

firele <strong>de</strong> comunicație, fibre optice, radio şi microun<strong>de</strong>. Rutele <strong>de</strong> comunicație trec<br />

atât prin pământ cât şi prin apă, un<strong>de</strong> radio şi sateliți. Datele ce pornesc ca semnal<br />

analogic <strong>de</strong> voce pot fi convertite în fluxuri <strong>de</strong> date digitale pentru o rutare eficientă<br />

peste distanțe mari şi sunt convertite la <strong>de</strong>stinație înapoi în semnal analog, fără ca<br />

cei ce comunică să conştientizeze acest fapt.<br />

În continuare ne vom concentra asupra comunicațiilor între entități localizate la<br />

distanțe cuprinse între câțiva metri până la un kilometru (LAN – Local Area<br />

Network) şi entități localizate la o distanță mult mai mare (WAN – Wi<strong>de</strong> Area<br />

Network), un exemplu tipic fiind chiar rețeaua Internet.<br />

Mo<strong>de</strong>muri<br />

Oamenii comunică prin linii telefonice prin care semnalul sonor este convertit în<br />

semnale electrice, ce sunt transmise la <strong>de</strong>stinatar, un<strong>de</strong> sunt convertite înapoi în<br />

sunet. Aceasta nu înseamnă că oamenii trebuie întot<strong>de</strong>auna să vorbească şi să<br />

asculte pentru a putea comunica prin liniile telefonice. Acest mediu <strong>de</strong> comunicație<br />

poate transmite şi informația non‐auditivă ce este transformată într‐o formă<br />

auditivă.<br />

În figura <strong>de</strong> mai jos prezentăm o configurație în care două calculatoare comunică<br />

prin linia telefonică prin utilizarea <strong>de</strong> mo<strong>de</strong>m‐uri (prescurtare <strong>de</strong> la modulator‐<br />

<strong>de</strong>modulator).<br />

Mo<strong>de</strong>m‐ul transformă semnalul electric <strong>de</strong> la calculator într‐o formă auditivă pentru<br />

a fi transmis şi efectuează operația inversă la <strong>de</strong>stinație. Mo<strong>de</strong>m‐urile sunt folosite<br />

doar pe liniile <strong>de</strong> comunicație telefonice şi în alte sisteme cum ar fi CATV<br />

(transmisia <strong>de</strong> date prin rețelele <strong>de</strong> cablu TV).<br />

Comunicația prin mo<strong>de</strong>m pe liniile telefonice este efectuată într‐un mod serial, în<br />

care biții au o codificare potrivită pentru mediul <strong>de</strong> transmisie. Există numeroase<br />

scheme <strong>de</strong> modulare folosite în comunicație, ce reprezintă codificări ale datelor în<br />

mediul <strong>de</strong> comunicație. În figura <strong>de</strong> mai jos sunt prezentate trei forme obişnuite <strong>de</strong><br />

modulare.<br />

124


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

AM (Amplitu<strong>de</strong> modulation) foloseşte puterea semnalului pentru a codifica<br />

valorile 0 şi 1. AM este <strong>de</strong>stinat unor implementări simple ce se creează ieftin.<br />

Totuşi, <strong>din</strong> moment ce există informație în amplitu<strong>din</strong>ea semnalului, tot ceea ce<br />

modifică amplitu<strong>din</strong>ea afectează semnalul. Pentru un radio AM, o serie <strong>de</strong> situații<br />

afectează amplitu<strong>din</strong>ea semnalului (trecerea pe sub un pod sau prin preajma liniile<br />

<strong>de</strong> înaltă tensiune, fulgerele etc.)<br />

FM (Frequency modulation) nu este atât <strong>de</strong> sensibil ca AM pentru că informația<br />

este codificată în frecvența semnalului şi nu în amplitu<strong>din</strong>ea lui. Semnalul FM pentru<br />

radio este mult mai stabil şi nu se <strong>de</strong>teriorează în situațiile enumerate mai sus.<br />

PM (Phase modulation) este folosit <strong>de</strong> regulă la mo<strong>de</strong>m‐uri. Aici patru faze<br />

(<strong>de</strong>spărțite <strong>de</strong> câte 90 <strong>de</strong> gra<strong>de</strong>) dublează lățimea <strong>de</strong> bandă prin transmiterea a câte<br />

doi biți o dată (ceea ce se numeşte dibit). Folosirea fazei oferă un grad <strong>de</strong> libertate<br />

suplimentar față <strong>de</strong> frecvență şi este folosit atunci când numărul <strong>de</strong> frecvențe<br />

disponibile este limitat.<br />

PCM (Pulse co<strong>de</strong> modulation) un semnal analog este eşantionat şi convertit în<br />

formă binară. În figura <strong>de</strong> mai jos este prezentat procesul <strong>de</strong> conversie al semnalului<br />

analog în secvență binară PCM.<br />

125


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Semnalul original este eşantionat şi se produc valori la intervale discrete.<br />

Eşantioanele sunt codificate în binar şi concatenate pentru a produce o secvență<br />

PCM.<br />

PCM reprezintă o abordare digitală şi are toate avantajele sistemelor informaționale<br />

digitale. Prin folosirea <strong>de</strong> repeatere la intervale regulate semnalul poate fi recuperat<br />

perfect. Prin micşorarea distanței <strong>din</strong>tre repeatere, se poate mări lățimea <strong>de</strong> bandă<br />

în mod semnificativ. Totuşi semnalul analog, poate fi cel mult ghicit şi restaurat doar<br />

aproximativ. Nu există o modalitate bună <strong>de</strong> a face semnalul analog perfect într‐un<br />

mediu cu zgomot.<br />

Medii <strong>de</strong> transmisie<br />

Într‐un mediu închis, calculatoarele pot fi interconectate în diferite moduri. Pentru<br />

sistemele aflate la distanță se poate folosit sistemul public <strong>de</strong> telefonie. Utilizatorii<br />

se pot conecta la sistemul <strong>de</strong> telefonie cu mo<strong>de</strong>m‐uri ce convertesc biții în sunete.<br />

Oamenii pot auzi frecvențe <strong>de</strong> până la 20KHz dar pot emite sunete <strong>de</strong> până la 4KHz,<br />

ceea ce este aproximativ lățimea <strong>de</strong> bandă pe care o linie telefonică o transmite. Un<br />

semnal analog (vocea) care este aproximată cu un semnal digital trebuie să fie<br />

eşantionată cel puțin <strong>de</strong> două ori per ciclu (pentru a capta valorile mari şi mici), aşa<br />

că o rată <strong>de</strong> eşantionare <strong>de</strong> 8 KHz este necesară pentru a digitiza o linie ce transmite<br />

voce. La 8 biți/eşantion, se obține o rată <strong>de</strong> 8biți/ciclu x 8 KHz = 64 Kbit/s. Un<br />

eşantion la fiecare 8 este folosit pentru administrarea liniei telefonice, aşa că rata<br />

maximă posibilă este <strong>de</strong> 56Kbit/s.<br />

O secvență binară transmisă este convertită în valori mari/mici, dar fluctuațiile sunt<br />

atenuate şi distorsionate la frecvențe mari şi pe distanțe lungi. În figura <strong>de</strong> mai jos<br />

este prezentată această problemă a eşantionării.<br />

La receptor<br />

Fluctuaţia i<strong>de</strong>ală<br />

Fluctuaţia transmisă<br />

Secvența binară 01011001 este reprezentată printr‐o fluctuație i<strong>de</strong>ală, care este<br />

aproximată <strong>de</strong> fluctuația transmisă. Fluctuația i<strong>de</strong>ală conține discontinuități, care<br />

sunt dificil <strong>de</strong> produs la fluctuații reale. Frecvențele înalte sunt atenuate mai mult<br />

<strong>de</strong>cât frecvențele joase în majoritatea mediilor şi frecvențe diferite se propagă la<br />

rate diferite, ceea ce duce la distorsiuni ale fluctuațiilor pe măsură ce se propagă.<br />

Gradul <strong>de</strong> distorsiune variază cu mediul <strong>de</strong> transmisie.<br />

126


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Linii <strong>de</strong>schise cu două fire<br />

Cel mai simplu mediu <strong>de</strong> comunicație este o pereche <strong>de</strong> fire ce transportă semnalul<br />

respectiv GND (ground). Firele emit radiații electromagnetice şi preiau zgomot în<br />

cantități diferite pentru cele două linii, ceea ce distorsionează semnalul. Viteza şi<br />

distanța la care se poate transmite semnalul sunt limitate (19.2 KHz respectiv 50m).<br />

Linii torsadate în pereche<br />

Dacă se răsucesc perechile <strong>de</strong> fire <strong>de</strong>schise atunci zgomotul extern va afecta ambele<br />

fire la fel. În felul acesta poate creşte atât viteza cât şi distanța la care poate fi<br />

transmis semnalul (1 Mbps respectiv 100m).<br />

Cablu coaxial<br />

Pentru viteze şi distanțe mai mari (10Mbps, sute <strong>de</strong> metri) firul <strong>de</strong> semnal este<br />

plasat in interiorul lui GND în mod coaxial cu un izolator între ele. I<strong>de</strong>ea este <strong>de</strong> a<br />

forma un scut pentru linia <strong>din</strong> centru care o protejează <strong>de</strong> interferențele externe şi<br />

<strong>de</strong> pier<strong>de</strong>rile <strong>de</strong> semnal datorate radiațiilor electromagnetice.<br />

Fibră optică<br />

Comunicația optică este imună la interferențe electromagnetice şi suportă o lățime<br />

<strong>de</strong> bandă mult mai mare. La fiecare capăt e nevoie <strong>de</strong> o conversie optoelectronică,<br />

ceea ce este disponibil până la câțiva Gbps (folosind dio<strong>de</strong> laser). Fibra optică constă<br />

<strong>din</strong>tr‐un miez optic, un înveliş optic şi un izolator <strong>de</strong> plastic.<br />

Există mai multe tipuri <strong>de</strong> fibre optice cu capabilități şi performanțe diferite:<br />

multimo<strong>de</strong> stepped in<strong>de</strong>x fiber, multimo<strong>de</strong> gra<strong>de</strong>d in<strong>de</strong>x fiber, single mo<strong>de</strong> fible.<br />

127


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Sateliţi<br />

Sateliții <strong>de</strong> comunicație ce orbitează în jurul Pământului sunt folosiți atunci când<br />

este nevoie <strong>de</strong> a transmite semnalul pe o distanță foarte mare cu costuri mai mici<br />

<strong>de</strong>cât liniile <strong>de</strong> comunicație terestre (mai ieftin şi <strong>de</strong>cât fibrele optice).<br />

În comunicația prin sateliți microun<strong>de</strong>le sunt transmise <strong>de</strong> la sol la satelit, un<strong>de</strong> un<br />

transpon<strong>de</strong>r ce acoperă o anumită bandă <strong>de</strong> frecvențe retransmite semnalul la o altă<br />

zonă <strong>de</strong> pe Pământ aflată în aria <strong>de</strong> acoperire a satelitului.<br />

Un satelit are o serie <strong>de</strong> transpon<strong>de</strong>re. O arie <strong>de</strong> acoperire mai mică înseamnă că<br />

semnalul transmis este mai puternic şi că antenele receptoare pot fi mai mici.<br />

Aceasta este tipic la sateliții ce transmit semnal TV. Sateliții folosiți pentru<br />

transmiterea semnalului TV sunt plasați pe orbite joase (aprox. 700 Km) aşa că este<br />

nevoie <strong>de</strong> o zonă mai mică <strong>de</strong> colectare a semnalului, pe când sateliții plasați pe<br />

orbite geosincrone (aprox. 23000 mile <strong>de</strong>asupra Pământului) un<strong>de</strong> forța<br />

gravitațională a Pământului şi forța centrifugă sunt în echilibru, aşa că sateliții par<br />

staționari <strong>de</strong>asupra Pământului, orbita lor fiind <strong>de</strong>asupra ecuatorului. Pentru aceşti<br />

sateliți este nevoie <strong>de</strong> antene mult mai mari îndreptate înspre ecuator.<br />

Pentru comunicație în ambele sensuri cu sateliții, există o întârziere tolerabilă.<br />

Uplink‐ul este mai lent <strong>de</strong>cât downlink‐ul. Aceasta se potriveşte cu modul <strong>de</strong><br />

operare al unui utilizator obişnuit al Internet‐ului, <strong>de</strong>oarece mai puțin <strong>de</strong> 10% <strong>din</strong><br />

traficul <strong>de</strong> Internet este transmis <strong>de</strong> la utilizator înspre afară şi peste 90% <strong>din</strong> trafic<br />

este adus <strong>de</strong> utilizator <strong>din</strong> Internet. Viteza <strong>de</strong> comunicație este limitată <strong>de</strong> c (viteza<br />

luminii în vid), care este aproximativ 300000km/s. pentru o distanță <strong>de</strong> 23000 <strong>de</strong><br />

mile întârzierea este <strong>de</strong> 100ms până la satelit şi încă 100ms înapoi şi în plus mai<br />

apare şi întârzierea <strong>de</strong> procesare.<br />

Microun<strong>de</strong> terestre<br />

Legăturile terestre prin microun<strong>de</strong> sunt utile pe distanțe <strong>de</strong> până la 50Km atunci<br />

când trebuie transmis semnalul în zone greu accesibile dar sunt afectate <strong>de</strong><br />

turbulențele meteorologice.<br />

Radio<br />

În rețelele radio celulare, o stație radio este plasată în mijlocul celulei, care <strong>de</strong> regulă<br />

are diametrul mai mic <strong>de</strong> 20 <strong>de</strong> km. O bandă restricționată <strong>de</strong> frecvențe este folosită<br />

în cadrul celulei, pentru comunicația între dispozitivele celulare şi stație. Celulele<br />

învecinate folosesc o altă bandă <strong>de</strong> frecvențe, aşa că nu există confuzie la granițele<br />

<strong>din</strong>tre celule atunci când un utilizator trece <strong>de</strong> la o celulă la alta în timp ce este în<br />

mişcare. În aceste situații <strong>de</strong> regulă are loc o schimbare <strong>de</strong> frecvență.<br />

128


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Arhitecturi <strong>de</strong> reţea: LAN<br />

Un LAN (Local Area Network) este un mediu <strong>de</strong> comunicație care interconectează<br />

calculatoare într‐o geografică limitată la cel mult câțiva kilometri. Un LAN permite<br />

unui set <strong>de</strong> calculatoare şi alte dispozitive să partajeze resurse comune cum ar fi:<br />

date, aplicații software, imprimante şi dispozitive <strong>de</strong> stocare.<br />

Un LAN este format <strong>din</strong> hardware, software şi protocoale. Hardware‐ul constă <strong>din</strong><br />

cabluri şi circuite <strong>de</strong> interfață. Software‐ul <strong>de</strong> regulă este integrat în sistemul <strong>de</strong><br />

operare şi este responsabil pentru conectarea unui utilizator la rețea. Protocoalele<br />

sunt mulțimi <strong>de</strong> reguli care guvernează formatul, sincronizarea, secvența şi<br />

controlul erorilor. Protocoalele sunt importante pentru asigurarea faptului că datele<br />

sunt împachetate pentru a fi trimise pe rețea şi sunt extrase <strong>din</strong> rețea în mod corect.<br />

Datele sunt <strong>de</strong>scompuse în elemente; fiecărui element i se adaugă un antet care<br />

conține informații <strong>de</strong>spre anumiți parametri cum ar fi <strong>de</strong>stinația, sursa, biții <strong>de</strong><br />

protecție împotriva erorilor şi o marcă <strong>de</strong> timp. Datele sunt combinate cu antetul<br />

pentru a forma pachete ce sunt trimise în rețea. Receptorul recurge la procesul<br />

invers <strong>de</strong> extragere a datelor <strong>din</strong> pachete.<br />

Procesul <strong>de</strong> comunicație prin rețea este <strong>de</strong> regulă efectuat într‐o ierarhie <strong>de</strong> paşi,<br />

fiecare având propriul protocol. Paşii trebuie efectuați în or<strong>din</strong>e pentru transmisie şi<br />

or<strong>din</strong>e inversă pentru recepție. Aceasta duce la noțiunea <strong>de</strong> stivă <strong>de</strong> protocoale, ceea<br />

ce izolează protocolul folosit în cadrul ierarhiei.<br />

Mo<strong>de</strong>lul OSI<br />

Mo<strong>de</strong>lul OSI (Open System Interconnection) este un set <strong>de</strong> protocoale stabilite <strong>de</strong><br />

ISO (International Standard Organization) în încercarea <strong>de</strong> a <strong>de</strong>fini şi a standardiza<br />

comunicația <strong>de</strong> date. Mo<strong>de</strong>lul OSI a fost înlocuit <strong>de</strong> mo<strong>de</strong>lul Internet TCP/IP dar şi în<br />

ziua <strong>de</strong> astăzi influențează comunicația prin rețea, în principal în industria<br />

telecomunicațiilor.<br />

În mo<strong>de</strong>lul OSI procesul <strong>de</strong> comunicație este împărțit în şapte niveluri: aplicație,<br />

prezentare, sesiune, transport, rețea, legătură <strong>de</strong> date şi fizic aşa cum se ve<strong>de</strong> în<br />

figura <strong>de</strong> mai jos.<br />

129


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Modulul OSI nu dă o singură <strong>de</strong>finiție relativ la modul în care are loc efectiv procesul<br />

<strong>de</strong> comunicație a datelor. Mo<strong>de</strong>lul OSI serveşte ca referință pentru modul în care<br />

acest proces al trebuie împărțit şi ce protocoale ar trebuie folosite la fiecare nivel.<br />

Conceptul este ca furnizorii <strong>de</strong> echipamente pot selecta un protocol pentru fiecare<br />

nivel asigurând în acelaşi timp compatibilitate cu echipamente <strong>de</strong> la alți furnizori<br />

care folosesc alte protocoale.<br />

Nivelul cel mai <strong>de</strong> sus în mo<strong>de</strong>lul OSI este nivelul aplicaţie, care furnizează o<br />

interfață ce permite aplicațiilor să comunice una cu alta prin rețea. Oferă suport <strong>de</strong><br />

nivel înalt pentru aplicații care interacționează prin rețea, cum ar fi servicii <strong>de</strong> baze<br />

<strong>de</strong> date pentru programe ce accesează baze <strong>de</strong> date prin rețea, tratarea mesajelor<br />

pentru programele <strong>de</strong> e‐mail şi manipularea fişierelor pentru programele <strong>de</strong><br />

transfer <strong>de</strong> fişiere.<br />

Nivelul prezentare asigură că informația este prezentată aplicațiilor <strong>de</strong> comunicație<br />

într‐un format comun. Aceasta e necesar <strong>de</strong>oarece sisteme diferite pot folosi intern<br />

formate diferite <strong>de</strong> date. De exemplu, unele sisteme folosesc formatul intern big‐<br />

endian pe când altele folosesc little‐endian. Funcția nivelului prezentare este <strong>de</strong> a<br />

izola aplicația <strong>de</strong> aceste diferențe.<br />

Nivelul sesiune stabileşte şi termină sesiunile <strong>de</strong> comunicație între procese. Nivelul<br />

sesiune este responsabil pentru menținerea integrității comunicațiilor chiar şi<br />

atunci când nivelurile <strong>de</strong> mai jos pierd date. De asemenea sincronizează schimbul şi<br />

stabileşte puncte <strong>de</strong> referință pentru continuarea unui proces <strong>de</strong> comunicație<br />

întrerupt.<br />

Nivelul transport asigură transmisia sigură <strong>de</strong> la sursă la <strong>de</strong>stinație. Alocă resurse <strong>de</strong><br />

comunicație astfel ca datele să fie transmise rapid şi eficient. Nivelul sesiune face<br />

cereri nivelul transport, care ordonează cererile şi face compromisuri între viteză,<br />

cost şi capacitate. De exemplu, transmisia poate fi împărțită în mai multe pachete,<br />

care sunt transmise prin mai multe rețele pentru a obține un timp <strong>de</strong> comunicație<br />

mai mic. Pachetele pot ajunge la <strong>de</strong>stinație într‐o or<strong>din</strong>e aleatoare, iar nivelul<br />

transport este responsabil ca nivelul sesiune să primească pachetele în aceeaşi<br />

or<strong>din</strong>e în care au fost trimise. Nivelul transport furnizează corectarea <strong>de</strong> erori <strong>de</strong> la<br />

sursă la <strong>de</strong>stinație şi furnizează controlul fluxului (adică, asigură că vitezele<br />

expeditorului şi receptorului sunt egale).<br />

Nivelul reţea rutează datele prin sisteme intermediare şi subrețele. Spre <strong>de</strong>osebire<br />

<strong>de</strong> nivelurile superioare, nivelul rețea ține cont <strong>de</strong> topologia <strong>de</strong> rețea, care<br />

reprezintă conectivitatea <strong>din</strong>tre diferitele componente <strong>de</strong> rețea. Nivelul rețea<br />

informează nivelul transport <strong>de</strong> starea conexiunilor potențiale şi existente <strong>din</strong> rețea<br />

în ceea ce priveşte viteza, fiabilitatea şi disponibilitatea. Nivelul rețea este <strong>de</strong> regulă<br />

implementat cu routere, care conectează diferite rețele ce folosesc acelaşi protocol<br />

<strong>de</strong> transport.<br />

Nivelul legătură <strong>de</strong> date gestionează conexiunile directe <strong>din</strong>tre componentele rețelei.<br />

Acest nivel este împărțit în LLC (logical link control), care este in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong><br />

topologia <strong>de</strong> rețea şi MAC (media acces control) care este specific topologiei. În<br />

130


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

unele rețele conexiunile fizice <strong>din</strong>tre dispozitive nu sunt permanente, şi este<br />

responsabilitatea nivelului legătură <strong>de</strong> date să informeze nivelul fizic când să<br />

realizeze conexiunile. Acest nivel lucrează cu unități <strong>de</strong> date numite frame (pachete<br />

izolate, sau colecții <strong>de</strong> pachete) ce conțin adrese, date şi informații <strong>de</strong> control.<br />

Nivelul fizic asigură transmisia datelor brute <strong>de</strong> la sursă la <strong>de</strong>stinație prin mediul <strong>de</strong><br />

comunicație fizic. Transmite şi repetă semnalele prin rețea. Nivelul fizic nu inclu<strong>de</strong><br />

hardware‐ul propriu‐zis dar inclu<strong>de</strong> meto<strong>de</strong>le <strong>de</strong> accesare a hardware‐ului.<br />

Topologii<br />

Există trei topologii importante pentru rețele locale aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai<br />

jos:<br />

Ce mai simplă este topologia bus (a). Componentele sunt conectate la o magistrală<br />

sistem prin legarea lor la singurul cablu sau, în cazul rețelelor fără fir (wireless), prin<br />

emiterea <strong>de</strong> semnale într‐un mediu comun. Avantajul acestui tip <strong>de</strong> topologie este că<br />

fiecare componentă poate comunica direct cu orice altă componentă <strong>de</strong> pe<br />

magistrală şi este relativ simplu să se adauge alte componente în rețea. Controlul<br />

este distribuit componentelor, şi nu există o anumită componentă cu rol <strong>de</strong><br />

intermediar, ceea ce reduce costurile inițiale pentru acest tip <strong>de</strong> rețea. Dezavantajele<br />

acestei topologii sunt: lungimea cablului <strong>de</strong> la magistrală la componentele rețelei;<br />

pentru a adăuga o nouă componentă în rețea este necesară întreruperea magistralei,<br />

ceea ce duce la întreruperea întregii rețele. Un exemplu <strong>de</strong> rețea bazată pe bus este<br />

Ethernet.<br />

Topologia inel (b) foloseşte un singur cablu, pentru care capetele sunt legate.<br />

Pachetele sunt transmise prin inel şi trec prin fiecare componentă a rețelei până<br />

când ajung la <strong>de</strong>stinație. La <strong>de</strong>stinație, pachetele sunt extrase <strong>din</strong> rețea şi nu mai<br />

sunt transmise mai <strong>de</strong>parte prin inel. Dacă pachetul ajunge înapoi la sistemul care l‐<br />

a inițiat, atunci înseamnă că transmisia a eşuat, pachetul este oprit şi poate fi<br />

încercată o nouă transmisie. Un exemplu <strong>de</strong> LAN cu topologie inel este IBM token<br />

ring.<br />

În topologia stea, fiecare componentă este conectată la un hub central, care are rolul<br />

<strong>de</strong> intermediar pentru toate comunicațiile prin rețea. Într‐o configurație simplă hub‐<br />

ul primeşte datele <strong>de</strong> la o componentă şi le trimite mai <strong>de</strong>parte la toate celelalte<br />

componente, lăsând în seama componentelor individuale să <strong>de</strong>termine dacă datele<br />

131


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

le sunt adresate. Într‐o configurație mai sofisticată, hub‐ul recepționează datele şi le<br />

trimite doar <strong>de</strong>stinatarului.<br />

Un avantaj al topologiei stea este că majoritate serviciilor <strong>de</strong> rețea, modificările,<br />

cablarea se face la hub‐ul central. Dezavantajul este că dacă se <strong>de</strong>fectează hub‐ul<br />

atunci toată rețeaua se opreşte. Un alt <strong>de</strong>zavantaj este că topologia stea necesită mai<br />

mult cablu pentru a conecta componentele rețelei. Un exemplu <strong>de</strong> topologie stea<br />

este ARCnet.<br />

Transmisia datelor<br />

Comunicația în cadrul unui calculator este sincronizată <strong>de</strong> un ceas, şi transmisia<br />

biților este semnalată <strong>de</strong> voltaje joase/înalte ce sunt eşantionate la momentul<br />

<strong>de</strong>terminat <strong>de</strong> cea. Această schemă este simplă dar nu funcționează pe distanțe mai<br />

mari, aşa cum este un LAN. Problema este că un şir lung <strong>de</strong> biți nu se poate<br />

sincroniza cu exactitate atât cu ceasul sistemului emițător cât şi cu cel al<br />

receptorului. Distanțele <strong>din</strong>tr‐un LAN sunt prea mari pentru a menține atât un ceas<br />

global cât şi o viteză foarte mare. În rețele locale se foloseşte o sincronizare ce este<br />

inclusă în datele ce se transmit.<br />

La nivelul cel mai <strong>de</strong> jos al transmisiei se aplică această sincronizare. Al nivelul<br />

următor fluxul <strong>de</strong> date este <strong>de</strong>scompus în pachete şi cadre (engl. frame) ce sunt<br />

transmise prin rețea într‐o or<strong>din</strong>e aleatoare. Nivelul legătură <strong>de</strong> date este<br />

responsabil pentru <strong>de</strong>scompunerea fluxului <strong>de</strong> date în pachete, transformarea<br />

pachetelor în cadre şi injectarea cadrelor în rețea. Când recepționează cadre, nivelul<br />

legătură <strong>de</strong> date extrage pachetele şi le asamblează într‐un format ce poate fi utilizat<br />

<strong>de</strong> nivelul superior (nivelul rețea). Dimensiunea pachetelor <strong>de</strong> date este <strong>de</strong> regulă<br />

câțiva KB şi necesită câteva microsecun<strong>de</strong> să fie transmise la viteze şi distanțe<br />

obişnuite.<br />

Ethernet este una <strong>din</strong> cele mai populare rețele bazate pe bus. Ethernet foloseşte<br />

CSMA/CD (Carrier Sense Multiple Access with Collision Detection) pentru<br />

transmisie. Cu această tehnologie, atunci când o componentă <strong>de</strong> rețea vrea să<br />

transmită date, prima dată aşteaptă un carrier. Dacă există pe linie un carrier, care<br />

este plasat <strong>de</strong> un dispozitiv ce transmite date, atunci nu va transmite nimic şi va<br />

aştepta o anumită perioadă <strong>de</strong> timp (<strong>de</strong> regulă aleatoare). Perioada aleatoare este<br />

importantă pentru a evita <strong>de</strong>adlock‐urile (situațiile fără ieşire) în care<br />

componentele care încearcă să trimită date pe bus ascultă şi aşteaptă în mod<br />

sincron. Dacă pe bus nu există trafic, atunci poate începe transmisia prin plasarea<br />

unui carrier împreună cu datele. Sursă <strong>de</strong> asemenea monitorizează bus‐ul pentru<br />

coliziuni, situație care apare atunci când două sau mai multe componente transmit<br />

date simultan. O coliziune este <strong>de</strong>tectată atunci când sunt prezenți mai mulți<br />

carrieri. Coliziunile pot apare într‐o rețea ca rezultat al timpului finit necesar<br />

semnalului pentru a traversa lungimea magistralei. Propagarea semnalului pe<br />

magistrală este limitată <strong>de</strong> viteza luminii pe lungimea magistralei, lungime ce poate<br />

fi până la 500 <strong>de</strong> metri pentru o rețea Ethernet tipică. Atunci când au loc coliziuni,<br />

132


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

componentele ce transmit date vor aştepta un timp aleatoriu înainte <strong>de</strong> a<br />

retransmite datele.<br />

Datele sunt transmise în ambele direcții ale magistralei. Fiecare componentă „ve<strong>de</strong>”<br />

fiecare pachet <strong>de</strong> date, dar extrage doar pachetele ce le sunt adresate. După ce un<br />

pachet este recepționat, la <strong>de</strong>stinație se poate genera un mesaj <strong>de</strong> confirmare pentru<br />

transmițător, <strong>de</strong> regulă la nivelul transport. Dacă transmițătorul nu primeşte<br />

confirmarea după o perioadă <strong>de</strong> timp fixată (care trebuie să fie mai mare <strong>de</strong>cât<br />

întârzierea rețelei la un ciclu complet), atunci mesajul este retransmis.<br />

Coliziunile apar rar în practică, aşa că latența dată <strong>de</strong> retransmisii nu este foarte<br />

importantă. O <strong>de</strong>gradare serioasă în performanța Ethernet nu are loc până când<br />

traficul este sub limita <strong>de</strong> 35% <strong>din</strong> capacitatea rețelei.<br />

Bridge, router, gateway<br />

Pe măsură ce creşte dimensiune rețelelor acestea pot fi divizate în rețele mai mici<br />

interconectate. Subrețelele mai mici operează in<strong>de</strong>pen<strong>de</strong>nt una <strong>de</strong> alta şi pot folosi<br />

protocoale şi topologii diferite.<br />

Dacă toate subrețelele folosesc aceeaşi topologie şi aceleaşi protocoale, atunci<br />

rețeaua poate fi extinsă folosind repeatere. Un repeater amplifică semnalul pe<br />

rețea, semnal ce se atenuează pe măsură ce străbate rețeaua. Subrețelele nu sunt<br />

in<strong>de</strong>pen<strong>de</strong>nte în totalitate <strong>de</strong>oarece fiecare subrețea ve<strong>de</strong> tot traficul <strong>de</strong> pe celelalte<br />

subrețele. O rețea ce foloseşte doar repeatere nu se poate extin<strong>de</strong> foarte mult.<br />

Repeaterele amplifică nu numai semnalul ci şi zgomotul <strong>de</strong> pe fir ceea ce va<br />

<strong>de</strong>termina în final dominarea semnalului <strong>de</strong> către zgomot dacă se folosesc prea<br />

multe repeatere.<br />

Un bridge nu numai că amplifică semnalul, acesta restaurează nivelurile individuale<br />

ale semnalului la valorile logice 0 şi 1, ceea ce previne acumularea zgomotului.<br />

Bridge‐urile au un anumit nivel <strong>de</strong> inteligență şi pot interpreta adresele <strong>de</strong>stinație<br />

ale pachetelor şi le pot transmite la rețeaua pentru care sunt adresate. Astfel,<br />

traficul în rețea poate fi redus, <strong>din</strong> moment ce metoda alternativă ar fi trimiterea<br />

pachetelor la fiecare subrețea (aşa cum se întâmplă în cazul folosirii repeaterelor).<br />

Cu toate că bridge‐urile au un anumit nivel <strong>de</strong> inteligență în sensul că analizează<br />

pachetele primite şi le rutează pe baza adresei <strong>de</strong> <strong>de</strong>stinație, acestea nu țin cont <strong>de</strong><br />

protocol. Un router lucrează la un nivel mai înalt. Router‐ul conectează <strong>de</strong> regulă<br />

rețele separate logic care folosesc acelaşi protocol <strong>de</strong> transport.<br />

Un gateway translatează pachete până la nivelul aplicație <strong>din</strong> mo<strong>de</strong>lul OSI<br />

(nivelurile 4 până la 7). Gateway‐urile conectează rețele diferite prin efectuarea<br />

conversiilor <strong>de</strong> protocol, conversii în formatul mesajelor şi alte funcții <strong>de</strong> nivel înalt.<br />

Erori <strong>de</strong> comunicaţie şi coduri corectoare <strong>de</strong> erori<br />

Atunci când are loc o comunicație între sisteme <strong>de</strong> calcul sau chiar şi în cadrul unui<br />

sistem <strong>de</strong> calcul există o anumită probabilitate ca datele să fie recepționate eronat<br />

datorită zgomotului <strong>din</strong> canalul <strong>de</strong> comunicație. Reprezentările pentru date<br />

133


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

consi<strong>de</strong>rate până acum utilizau simbolurile binare 0 şi 1. În realitate, simbolurile<br />

binare au o formă fizică şi anume voltaje sau curent electric. Forma fizică este<br />

supusă zgomotului introdus <strong>de</strong> mediul <strong>de</strong> comunicație, cum ar fi fenomene<br />

atmosferice, raze gamma şi fluctuații ale curentului electric. Zgomotul poate cauza<br />

erori, în care valorile 0 sunt transformate în 1 şi invers.<br />

Presupunem că se transmite caracterul ASCII ‘b’ şi că în timpul transmisiei are loc o<br />

eroare în urma căreia cel mai puțin semnificativ bit este inversat. Secvența binară<br />

corectă pentru ‘b’ este 1100010. Secvența <strong>de</strong> biți recepționată este 1100011, ceea ce<br />

corespun<strong>de</strong> caracterului ‘c’. Receptorul nu are cum să ştie că a avut loc o eroare doar<br />

examinând secvența <strong>de</strong> biți recepționată. Problema este că fiecare <strong>din</strong> cele 128 <strong>de</strong><br />

secvențe <strong>de</strong> 7 biți reprezintă caractere ASCII vali<strong>de</strong> şi dacă unul <strong>din</strong> cei 7 biți se<br />

modifică secvența ce rezultă este tot un caracter ASCII valid.<br />

Expeditorul poate trimite biți <strong>de</strong> verificare suplimentari împreună cu biții <strong>de</strong> date.<br />

Receptorul poate examina aceşti biți şi în anumite condiții nu numai să <strong>de</strong>tecteze<br />

erori dar şi să le corecteze. În continuare vom prezenta două meto<strong>de</strong> pentru a<br />

realiza aceasta.<br />

Definirea ratei <strong>de</strong> erori la nivel <strong>de</strong> bit<br />

Există numeroase moduri în care pot apare erori în cadrul sistemelor iar erorile pot<br />

lua diferite forme. Vom presupune că probabilitatea ca un bit recepționat să fie<br />

eronat este in<strong>de</strong>pen<strong>de</strong>ntă <strong>de</strong> probabilitatea ca biții învecinați să fie eronați. În acest<br />

caz putem <strong>de</strong>fini rata <strong>de</strong> erori la nivel <strong>de</strong> bit ca fiind probabilitatea ca un anumit bit<br />

să fie eronat. Evi<strong>de</strong>nt că acesta este un număr foarte mic, <strong>de</strong> regulă este mai mic <strong>de</strong><br />

10 ‐12 pentru fibra optică. Asta înseamnă că doar unul <strong>din</strong> 10 12 biți vor fi eronați. În<br />

rețelele radio unul <strong>din</strong> 100 <strong>de</strong> pachete pot conține erori.<br />

În cadrul unui sistem rata <strong>de</strong> erori este mai mică <strong>de</strong>cât 10 ‐18. Un procesor <strong>de</strong> 500<br />

MHz care prelucrează 32 <strong>de</strong> biți la fiecare ciclul <strong>de</strong> ceas va avea un număr <strong>de</strong><br />

erori/secundă egal cu 10 ‐18 erori/bit x 500 x 10 6 cuvinte/secundă x 32 biți/cuvânt =<br />

1.6 x 10 ‐18 erori/secundă, adică aproximativ un bit eronat la doi ani <strong>de</strong> zile.<br />

Pe <strong>de</strong> altă parte un flux <strong>de</strong> biți <strong>de</strong> la o linie <strong>de</strong> comunicație serială <strong>de</strong> un milion <strong>de</strong><br />

biți/secundă cu o rată <strong>de</strong> erori <strong>de</strong> 10 ‐10 , va avea un număr <strong>de</strong> erori egal cu 1 x 10 6 x<br />

10 ‐10 sau 10 ‐4 erori/secundă adică, aproximativ 10 erori pe zi.<br />

Detectarea şi corectarea erorilor<br />

Una <strong>din</strong> cele mai simple şi mai vechi meto<strong>de</strong> <strong>de</strong> <strong>de</strong>tectare a erorilor foloseşte bitul<br />

<strong>de</strong> paritate (s‐a folosit în cadrul sistemelor <strong>de</strong> telegraf).<br />

134


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Bitul <strong>de</strong><br />

paritate<br />

Poziţia bitului<br />

Caracter ASCII pe 7<br />

biţi<br />

Caracter<br />

Un bit <strong>de</strong> paritate se adaugă la fiecare caractere transmis astfel încât numărul <strong>de</strong> biți<br />

egali cu 1 în fiecare caracter să fie par sau impar, în funcție <strong>de</strong> paritatea aleasă. În<br />

exemplul nostru <strong>de</strong> transmitere a caracterului ASCII ‘b’, 1100010, presupunem că<br />

dorim să folosim paritate pară şi atunci vom adăuga un bit 1 pentru a face par<br />

numărul <strong>de</strong> biți egali cu 1, rezultând secvența <strong>de</strong> biți 11100010 pentru transmitere.<br />

Bitul <strong>de</strong> paritate se poate adăuga la început sau la sfârşit în funcție <strong>de</strong> convenția<br />

aleasă. Receptorul poate examina secvența <strong>de</strong> biți, şi dacă numărul <strong>de</strong> biți egali cu 1<br />

este par, atunci poate consi<strong>de</strong>ra că a recepționat caracterul fără erori. (Această<br />

metodă nu mai este <strong>de</strong> nici un folos dacă probabilitatea ca doi biți să se modifice<br />

este <strong>de</strong>stul <strong>de</strong> mare. În acest caz trebuie folosite alte meto<strong>de</strong> aşa cum vom ve<strong>de</strong>a în<br />

continuare).<br />

Coduri Hamming<br />

Dacă se adaugă biți suplimentari la date, atunci este posibil nu numai să <strong>de</strong>tectăm<br />

erori, dar şi să le corectăm. Unele <strong>din</strong> cele mai populare coduri corectoare <strong>de</strong> erori<br />

se bazează pe munca lui Richard Hamming <strong>de</strong> la Bell Telephone Laboratories<br />

(Lucent Technology).<br />

Putem <strong>de</strong>tecta un singur bit eronat într‐un cod ASCII prin adăugarea unui bit<br />

redundant. Distanța Hamming <strong>de</strong>fineşte distanța logică <strong>din</strong>tre două cuvinte vali<strong>de</strong>,<br />

ca măsură a numărului <strong>de</strong> cifre binare care diferă între cele două cuvinte. Dacă se<br />

modifică un singur bit într‐un caracter ASCII, atunci secvența <strong>de</strong> biți ce rezultă este<br />

un alt caracter ASCII. Distanța Hamming corespunzătoare pentru acest cod este 1.<br />

Dacă recodificăm tabela ASCII astfel încât distanța Hamming să fie 2, atunci trebuie<br />

modificați doi biți pentru a converti un caracter ASCII valid într‐altul. Astfel putem<br />

<strong>de</strong>tecta un singur bit eronat <strong>de</strong>oarece caracterul invalid va fi între două caractere<br />

vali<strong>de</strong>.<br />

O modalitatea <strong>de</strong> a înregistra un caracter ASCII pentru o distanță Hamming <strong>de</strong> 2 este<br />

<strong>de</strong> a atribui un bit <strong>de</strong> paritate, care ia valoarea 0 sau 1 pentru a face numărul <strong>de</strong> biți<br />

egali cu 1 <strong>din</strong> codificarea caracterului par sau impar. Dacă folosim paritate pară,<br />

atunci bitul <strong>de</strong> paritate pentru caracterul ‘a’ este 1 <strong>de</strong>oarece secvența <strong>de</strong> biți pentru<br />

acest caracter conține 3 biți egali cu 1: 1100001. Bitul <strong>de</strong> paritate pentru caracterul<br />

‘c’ este 0, ceea ce va duce la secvența <strong>de</strong> biți recodificată: 01100011. Dacă folosim<br />

135


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

paritatea impară, atunci biții <strong>de</strong> paritate vor lua valoarea opusă: 0 pentru ‘a’ şi 1<br />

pentru ‘c’.<br />

Tabelul ASCII recodificat are acum 256 <strong>de</strong> poziții, <strong>din</strong> care jumătate (cele care au un<br />

număr impar <strong>de</strong> biți egali cu 1) reprezintă caractere invali<strong>de</strong>. Dacă este recepționat<br />

un caracter invalid, atunci receptorul ştie că a avut loc o eroare şi poate cere<br />

retransmiterea caracterului.<br />

Retransmiterea nu este întot<strong>de</strong>auna practică iar pentru aceste cazuri ar fi util nu<br />

numai să se poată <strong>de</strong>tecta erorile dar să se şi corecteze. Folosirea bitului <strong>de</strong> paritate<br />

va <strong>de</strong>tecta eroarea dar nu va localiza poziția bitului eronat. Dacă este recepționată<br />

secvența <strong>de</strong> biți 11100011 într‐un sistem care foloseşte paritate pară, atunci<br />

eroarea este <strong>de</strong>tectată pentru că paritatea cuvântului este impară. Nu există<br />

suficientă informație pentru a <strong>de</strong>termina doar cu ajutorul bitului <strong>de</strong> paritate care a<br />

fost caracterul transmis (chiar şi bitul <strong>de</strong> paritate poate fi eronat).<br />

Pentru a construi un cod corector <strong>de</strong> erori capabil să <strong>de</strong>tecteze şi să corecteze<br />

cuvinte ce conțin un singur bit eronat, trebuie să adăugăm mai multă redundanță<br />

prin extin<strong>de</strong>rea numărului <strong>de</strong> biți <strong>din</strong> cuvânt. De exemplu, să consi<strong>de</strong>răm secvența<br />

<strong>de</strong> biți pentru caracterul ‘a’ – 1100001. Dacă vrem să <strong>de</strong>tectăm şi să corectăm un<br />

singur bit eronat care poate să apară în orice poziție în cadrul cuvântului, atunci<br />

trebuie să atribuim încă 7 secvențe <strong>de</strong> biți caracterului ‘a’ secvențe în care un singur<br />

bit este modificat față <strong>de</strong> secvența binară corespunzătoare lui ‘a’: 0100001,<br />

1000001, 1110001, 1101001, 1100101, 1100011, 1100000. Putem face acelaşi<br />

lucru şi pentru celelalte caractere, dar trebuie să facem în aşa fel încât nici o<br />

secvență <strong>de</strong> biți să nu fie comună la mai mult <strong>de</strong> un caracter ASCII; altfel nu vom<br />

avea la dispoziție un mod <strong>de</strong> <strong>de</strong>terminare neambiguu a secvenței binare originale.<br />

O problemă cu folosirea redundanței în acest fel este că atribuim 8 secvențe <strong>de</strong> biți<br />

fiecărui caracter: una pentru caracterul original şi încă şapte pentru secvențele <strong>de</strong><br />

biți învecinate eronate. Din moment ce avem 128 <strong>de</strong> caractere ASCII şi 8 secvențe<br />

pentru fiecare caracter, înseamnă că putem recodifica 128/8 = 16 caractere dacă<br />

folosim doar cei 7 biți pentru reprezentarea caracterelor.<br />

Pentru a recodifica toate caracterele ASCII, trebuie să adăugăm biți <strong>de</strong> redundanță<br />

suplimentari (numiți biţi <strong>de</strong> verificare). Acum trebuie să <strong>de</strong>terminăm <strong>de</strong> câți biți<br />

avem nevoie. Dacă cuvintele ce vrem să le recodificăm sunt <strong>de</strong> k biți şi folosim r biți<br />

<strong>de</strong> verificare atunci are loc următoarea relație:<br />

2 k x (k + r + 1)


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

numărul <strong>de</strong> secvențe binare <strong>din</strong> codul corector <strong>de</strong> erori. Pentru k = 7 vom obține r =<br />

4 aşa că vom avea 11 biți în reprezentarea cuvintelor <strong>din</strong> codul corector <strong>de</strong> erori.<br />

Acum vom ve<strong>de</strong>a cum putem recodifica tabela ASCII într‐un cod pe 11 biți. Scopul<br />

este <strong>de</strong> a atribui biții redundanți cuvântului original astfel încât orice bit eronat să<br />

poată fi i<strong>de</strong>ntificat. O modalitate <strong>de</strong> a face această atribuire este prezentată în figura<br />

<strong>de</strong> mai jos:<br />

Biţii <strong>de</strong> verificare Poziţiile<br />

verificate<br />

Fiecare <strong>din</strong> cei 11 biți are un in<strong>de</strong>x <strong>de</strong> la 1 la 11, iar reprezentarea binară pe 4 biți a<br />

întregilor <strong>de</strong> la 1 la 11 este prezentată lângă fiecare in<strong>de</strong>x. Cu aceste atribuire,<br />

fiecare <strong>din</strong> cele 11 linii sunt diferite (nu există două linii în care biții 1 să fie în<br />

aceeaşi poziție).<br />

Citind în jos fiecare <strong>din</strong> cele patru coloane, bitul 1 ne spune că poziția verificată<br />

(care apare în coloana <strong>din</strong> dreapta) va fi inclusă într‐un grup care trebuie să formeze<br />

paritate pară. De exemplu, bitul <strong>de</strong> verificare C8 acoperă un grup <strong>de</strong> 4 biți în pozițiile<br />

8, 9, 10 şi 11, care trebuie să formeze paritate pară. Dacă această proprietate este<br />

satisfăcută atunci când cuvântul <strong>de</strong> 11 biți este transmis, dar o eroare <strong>de</strong> transmisie<br />

produce o paritatea impară la receptor, atunci receptorul va şti că este o eroare la<br />

una <strong>din</strong> pozițiile 8, 9, 10 sau 11. Poziția exactă poate fi <strong>de</strong>terminată prin examinarea<br />

celorlalți biți <strong>de</strong> verificare, aşa cum vom ve<strong>de</strong>a.<br />

Fiecare bit <strong>din</strong> cuvântul codificat <strong>de</strong> 11 biți, care inclu<strong>de</strong> biții <strong>de</strong> verificare, este<br />

atribuit unei combinații unice a celor patru biți <strong>de</strong> verificare C1, C2, C4 şi C8.<br />

Combinațiile sunt calculate ca reprezentare binară a poziției bitului ce este verificat,<br />

începând <strong>de</strong> la poziția 1. C1 este astfel în poziția 1, C2 este în poziția 2, C4 în poziția<br />

4 şi C8 în poziția 8. biții <strong>de</strong> verificare pot apare în orice poziții, dar <strong>de</strong> regulă apar în<br />

poziții ce corespund puterilor lui 2 pentru a simplifica procesul <strong>de</strong> localizare a<br />

erorilor. Acest cod se numeşte SEC (Single Error Correcting co<strong>de</strong>).<br />

Din moment ce poziția fiecărui bit egal cu 1 în fiecare <strong>din</strong> combinație <strong>de</strong> biți <strong>de</strong><br />

verificare este unică, putem localiza o eroare prin observarea unui bit <strong>de</strong> eroare<br />

eronat. Dacă consi<strong>de</strong>răm configurația <strong>din</strong> figura <strong>de</strong> mai jos:<br />

137


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Poziţia bitului<br />

Biţii <strong>de</strong> verificare<br />

valorile biților <strong>de</strong> verificare sunt <strong>de</strong>terminate în conformitatea cu tabelul prece<strong>de</strong>nt.<br />

Bitul <strong>de</strong> verificare C1 = 0 creează paritate pară pentru grupul <strong>de</strong> biți {1, 3, 5, 7, 9,<br />

11}. Membri acestui grup sunt luați <strong>din</strong> pozițiile care au valoarea 1 în coloana C1 <strong>din</strong><br />

tabel. Bitul <strong>de</strong> verificare C2 = 1 creează paritate pară pentru grupul <strong>de</strong> biți {2, 3, 6, 7,<br />

10, 11}. Bitul <strong>de</strong> verificare C4 = 0 creează paritate pară pentru grupul <strong>de</strong> biți {4, 5, 6,<br />

7}. Bitul <strong>de</strong> verificare C8 = 0 creează paritate pară pentru grupul <strong>de</strong> biți {8, 9, 10,<br />

11}.<br />

Ca o alternativă la căutarea într‐un tabel al biților <strong>de</strong> paritate, în general, bitul n al<br />

cuvântului codificat este verificat <strong>de</strong> biții <strong>de</strong> verificare <strong>din</strong> pozițiile b1, b2, …, bj, astfel<br />

încât b1 + b2 + … + bj = n. De exemplu, bitul 7 este verificat <strong>de</strong> biții <strong>din</strong> pozițiile 1, 2 şi<br />

4 pentru că 1 + 2 + 4 = 7.<br />

Acum să presupunem că receptorul primeşte secvența <strong>de</strong> biți 10010111001.<br />

Presupunem că s‐a folosit codul SEC <strong>de</strong>scris mai sus pentru caractere ASCII şi<br />

întrebarea este ce caracter a fost trimis. Prima dată calculăm paritatea pentru<br />

fiecare bit <strong>de</strong> verificare aşa cum se ve<strong>de</strong> în figura <strong>de</strong> mai jos:<br />

Poziţia biţilor<br />

Biţii <strong>de</strong> verificare<br />

Poziţia erorii<br />

Paritate<br />

impară<br />

pară<br />

impară<br />

pară<br />

Aşa cum se ve<strong>de</strong> biții <strong>de</strong> verificare C1 şi C4 au paritate impară. Pentru a localiza<br />

eroarea, adunăm pozițiile biților <strong>de</strong> verificare impari. Astfel, eroarea este în poziția<br />

1+ 4 = 5. Cuvântul trimis este 10010101001. Dacă eliminăm biții <strong>de</strong> verificare,<br />

obținem secvența 1000100, ceea ce corespun<strong>de</strong> caracterului ASCII ‘D’.<br />

O modalitate <strong>de</strong> a privi SEC este: cuvintele vali<strong>de</strong> sunt la o distanță suficient <strong>de</strong> mare<br />

unul <strong>de</strong> altul astfel încât o singură eroare va plasa un cuvânt eronat mai aproape <strong>de</strong><br />

un anumit cuvânt valid față <strong>de</strong> orice alt cuvânt valid. De exemplu, putem consi<strong>de</strong>ra<br />

un cod SEC pentru doar două simboluri {000, 111}. Relația distanței Hamming<br />

pentru toate secvențele <strong>de</strong> 3 biți sunt prezentate în figura <strong>de</strong> mai jos sub forma unui<br />

cub:<br />

138


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Coduri <strong>de</strong><br />

eronate<br />

Cod<br />

valid<br />

Cod<br />

valid<br />

Schimbarea a trei biţi într-un<br />

cod valid duce la o distanţă<br />

Hamming <strong>de</strong> 3<br />

Coduri<br />

eronate<br />

Pentru cuvinte <strong>de</strong> dimensiuni mai mare cubul are un corespon<strong>de</strong>nt numit hipercub.<br />

Cele două cuvinte vali<strong>de</strong> sunt plasate în vârfuri opuse ale cubului. Orice eroare <strong>de</strong> un<br />

singur bit va localiza un cuvânt eronat pe un alt vârf al cubului. Fiecare cuvânt<br />

eronat are un cuvânt valid cel mai apropiat, ceea ce face posibilă corectarea unui<br />

singure erori.<br />

Codifiare SECDED<br />

Dacă consi<strong>de</strong>răm acum că există două erori, atunci putem ve<strong>de</strong>a că codul SEC<br />

funcționează pentru dublă <strong>de</strong>tectarea <strong>de</strong> erori (DDE) dar nu şi pentru dublă<br />

corectare <strong>de</strong> erori (DCE). Aceasta se numeşte codificare SECDDE (engl. SECDED –<br />

SEC double error <strong>de</strong>tection). Din moment ce cuvintele vali<strong>de</strong> sunt <strong>de</strong>spărțite <strong>de</strong> o<br />

distanță Hamming egală cu 3, două erori vor fi localiza un cuvânt eronat pe cub şi<br />

astfel pot fi <strong>de</strong>tectate două erori. Cuvântul valid original însă nu poate fi <strong>de</strong>terminat<br />

în mod neambiguu. Pentru a corecta două erori, trebuie întreținută o distanță<br />

Hamming egală cu 5. În general trebuie întreținută o distanță Hamming egală cu p +<br />

1 pentru a <strong>de</strong>tecta p erori şi o distanță Hamming <strong>de</strong> 2p+1 pentru a corecta p erori.<br />

Verificare verticală a redundanţei<br />

Codul SEC este folosit pentru <strong>de</strong>tectarea şi corectarea unui singur bit eronat. Biții<br />

redundanți sunt adăugați la fiecare cuvânt, fi fiecare cuvânt rezultat este tratat<br />

in<strong>de</strong>pen<strong>de</strong>nt. Schema <strong>de</strong> recodificare se mai numeşte verificare orizontală sau<br />

longitu<strong>din</strong>ală a redundanţei <strong>de</strong>oarece lungimea cuvântului se extin<strong>de</strong> cu numărul <strong>de</strong><br />

biți redundanți.<br />

O abordare alternativă este <strong>de</strong> a folosi verificare verticală a redundanţei în care o<br />

sumă <strong>de</strong> verificare a cuvântului este adăugată la sfârşitul unui grup <strong>de</strong> cuvinte<br />

transmise. În acest caz, paritatea este calculată coloană cu coloană, formând un<br />

cuvânt ce conține suma <strong>de</strong> verificare, cuvânt ce este adăugat mesajului. Cuvântul cu<br />

suma <strong>de</strong> verificare este calculat şi transmis <strong>de</strong> expeditor şi este recalculat şi<br />

comparat cu cuvântul ce conține suma <strong>de</strong> verificare recepționată <strong>de</strong> către receptor.<br />

Dacă se <strong>de</strong>tectează o eroare, atunci receptorul trebuie să ceară retransmiterea<br />

cuvântului <strong>din</strong> moment ce nu există suficientă redundanță pentru a i<strong>de</strong>ntifica poziția<br />

eronată.<br />

139


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Verificare ciclică a redundanţei (Cyclic Redundancy Checking ­ CRC)<br />

CRC este o schemă mai puternică <strong>de</strong> <strong>de</strong>tectare şi corectare a erorilor care operează<br />

în prezența unor burst errors, care încep şi se termină cu un bit eronat, cu zero sau<br />

mai mulți biți intermediari eronați. Biții eronați <strong>de</strong> la capete sunt incluşi în burst<br />

error. Dacă lungimea unui burst error este B, atunci trebuie să fie B sau mai mulți biți<br />

corecți între mai multe burst errors.<br />

CRC foloseşte coduri polinomiale, în care un cadru <strong>de</strong> date ce trebuie transmis este<br />

împărțit cu un polinom iar restul împărțirii este adăugat cadrului <strong>de</strong> date ca o<br />

secvență <strong>de</strong> verificare a cadrului (engl. Frame Check Sequence ‐ FCS), numită cifre<br />

CRC. După recepționarea cadrului, receptorul face aceleaşi calcule, folosind acelaşi<br />

polinom, şi dacă restul împărțirii este i<strong>de</strong>ntic cu cel recepționat atunci nu există<br />

erori <strong>de</strong>tectabile. Pot exista erori ne<strong>de</strong>tectabile, iar scopul la crearea unui cod CRC<br />

este <strong>de</strong> a selecta un polinom care acoperă cele mai probabile erori pentru un anumit<br />

mo<strong>de</strong>l.<br />

Abordarea este <strong>de</strong> a lua un mesaj <strong>de</strong> k biți ce trebuie transmis, M(x), la care se<br />

adaugă n biți 0, un<strong>de</strong> n este gradul polinomului generator, G(x), cu k > n. Forma<br />

extinsă a lui M(x) este împărțită la G(x) folosind aritmetică modulo 2 (în care<br />

transportul şi împrumutul sunt ignorate), iar restul împărțirii R(x), care nu are mai<br />

mult <strong>de</strong> n biți, formează cifrele CRC pentru M(x).<br />

Ca exemplu, să consi<strong>de</strong>răm că trebuie transmis cadrul:<br />

M(x) = 1101011011<br />

şi că polinomul generator este G(x) = x 4 + x + 1. Gradul lui G(x) este 4, aşa că<br />

adăugăm 4 biți zero la M(x) pentru a forma <strong>de</strong>împărțitul operației.<br />

Divizorul este 10011, ceea ce corespun<strong>de</strong> coeficienților <strong>din</strong> G(x) scris ca:<br />

G(x) = 1 x x 4 + 0 x x 3 + 0 x x 2 + 1 x x 1 + 1 x 0 .<br />

G(x) are gradul n = 4 şi există n + 1 = 5 coeficienți. Cifrele CRC sunt calculate aşa cum<br />

este prezentat în figura <strong>de</strong> mai jos:<br />

G(x), <strong>de</strong> grad<br />

n = 4<br />

SAU exclusiv pe biţi<br />

(XOR), este la fel ca<br />

şi adunarea şi<br />

scă<strong>de</strong>rea modulo-2<br />

Cadrul transmis<br />

Câtul este eliminat<br />

la calculul CRC<br />

original<br />

n = 4 zerouri<br />

R(x) este CRC<br />

pentru M(x)<br />

140


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Dacă în timpul transmisiei T(x) = M(x) + R(x) se alterează receptorul trebuie să poată<br />

<strong>de</strong>termina aceasta. Receptorul împarte cadrul primit G(x) şi toate burst errors care<br />

nu îl includ pe G(x) ca factor vor fi interceptate pentru că restul va fi diferit <strong>de</strong> zero.<br />

Atâta timp cât biții 1 <strong>din</strong> 10011 nu coincid cu pozițiile erorilor <strong>din</strong> cadrul<br />

recepționat, toate erorile vor fi interceptate. Un cod polinomial <strong>de</strong> grad n va<br />

intercepta toate burst errors <strong>de</strong> lungime mai mică sau egală cu n.<br />

Polinoame care dau rezultate bune în ceea ce priveşte <strong>de</strong>tectare erorilor sunt:<br />

CRC­16 = x 16 + x 15 + x 2 + 1<br />

CRC­CCITT = x 16 + x 12 + x 5 + 1<br />

CRC­32 = x 32 + x 26 + x 23 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1<br />

Arhitecturi <strong>de</strong> reţea: Internet<br />

La începuturile erei informatice sistemele <strong>de</strong> calcul erau centralizate şi conțineau<br />

toate resursele necesare. Datele erau transferate între sisteme <strong>de</strong> calcul diferite prin<br />

diferite medii (cartele perforate, benzi magnetice, discuri magnetice).<br />

Pe măsură ce a crescut numărul sistemelor <strong>de</strong> calcul iar costurile s‐au înclinat mai<br />

mult <strong>din</strong>spre hardware înspre servicii, a <strong>de</strong>venit rentabil <strong>din</strong> punct <strong>de</strong> ve<strong>de</strong>re<br />

economic conectarea directă a calculatoarelor astfel încât să fie posibilă partajarea<br />

resurselor. Despre asta e vorba când vorbim <strong>de</strong>spre rețele. Am prezentat <strong>de</strong>ja<br />

rețelele locale în contextul celor şapte niveluri <strong>din</strong> mo<strong>de</strong>lul OSI. În continuare vom<br />

prezenta aspecte arhitecturale ale rețelelor <strong>de</strong> calculatoare în contextul mo<strong>de</strong>lului<br />

Internet.<br />

Mo<strong>de</strong>lul Internet<br />

În sistemele <strong>de</strong> telecomunicații pot fi mai multe surse şi mai multe <strong>de</strong>stinații. Un<br />

exemplu pentru această formă <strong>de</strong> comunicație este o rețea telefonică. Pentru ca<br />

fiecare telefon să poată fi apelat <strong>de</strong> la orice alt telefon trebuie să existe o cale, un<br />

canal, între fiecare sursă şi <strong>de</strong>stinație. Dacă există un milion <strong>de</strong> telefoane în locația A<br />

şi un milion <strong>de</strong> telefoane în locația B atunci numărul <strong>de</strong> canale <strong>din</strong>tre locația A şi B<br />

trebuie să fie un milion x un milion. Din fericire nu toți cei <strong>din</strong> locația A vor să<br />

comunice cu toți cei <strong>din</strong> locația B aşa că un număr mult mai mic <strong>de</strong> canale este<br />

suficient, canale ce sunt partajate. Pe <strong>de</strong> altă parte trebuie să fie cel puțin o linie <strong>de</strong> la<br />

fiecare telefon <strong>din</strong> locația A la sediul central al companiei <strong>de</strong> telefoane şi trebuie să<br />

fie suficiente linii între sediile centrale <strong>din</strong> A şi B pentru a putea gestiona numărul<br />

maxim <strong>de</strong> conversații simultane.<br />

Un număr mic <strong>de</strong> conexiuni fizice (în funcție <strong>de</strong> tipul <strong>de</strong> mediu <strong>de</strong> transmisie – fibră<br />

optică sau fire tradiționale), este necesar pentru ca conecta locațiile A şi B <strong>de</strong>oarece<br />

nu se va întâmpla niciodată ca simultan toți cei <strong>din</strong> locația A să apeleze pe cineva <strong>din</strong><br />

locația B. Capacitatea <strong>de</strong> transfer <strong>de</strong> informație a conexiunilor (numită lăţime <strong>de</strong><br />

bandă) este partajată <strong>de</strong> toți utilizatorii astfel că se realizează o reducere<br />

141


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

substanțială a costurilor. Trebuie creat un mecanism <strong>de</strong> control care să permită<br />

partajarea lățimii <strong>de</strong> bandă într‐un mod corespunzător.<br />

Nivelurile în suita <strong>de</strong> protocoale TCP/IP<br />

Un internet (cu i mic) este o colecție <strong>de</strong> rețele interconectate. Internet (cu i mare)<br />

este probabil cel mai cunoscut internet, care foloseşte protocolul TCP/IP şi adrese<br />

IP. Cele şapte niveluri <strong>din</strong> mo<strong>de</strong>lul OSI au fost simplificate într‐o oarecare măsură<br />

pentru mo<strong>de</strong>lul Internet, mo<strong>de</strong>l care are doar patru niveluri, aşa cum se ve<strong>de</strong> în<br />

figura <strong>de</strong> mai jos.<br />

La nivelul cel mai <strong>de</strong> jos este nivelul Legătură format <strong>din</strong> subnivelurile MAC<br />

(Medium Access Control) şi PHY (Fizic). Nivelul Legătură rezolvă „disputele” pentru<br />

mediul <strong>de</strong> comunicație atunci când mai multe dispozitive încearcă să transmită,<br />

gestionează gruparea logică a biților în cadre <strong>de</strong> date şi implementează protecția<br />

împotriva erorilor.<br />

Nivelul legătură este responsabil pentru transmiterea unui cadru <strong>de</strong> biți <strong>de</strong> la o<br />

maşină la o alta maşină legată direct <strong>de</strong> ea. Aceasta funcționează bine între două<br />

procese aflate pe maşini diferite care cooperează. Pentru ca mai multe procese să<br />

partajeze acelaşi mediu <strong>de</strong> comunicație este nevoie <strong>de</strong> un protocol care să<br />

coordoneze <strong>de</strong>plasare datelor <strong>de</strong> la un proces la altul. Aceasta este responsabilitatea<br />

nivelului Reţea, care este implementat cu protocolul IP (Internet Protocol).<br />

Nivelul Reţea se ocupă cu comunicația <strong>de</strong> la un punct la altul. Nivelul Transport se<br />

ocupă cu comunicația end‐to‐end, în care pot fi mai multe puncte intermediare între<br />

transmițător şi receptor. Nivelul Transport se ocupă cu retransmisia (în cazul<br />

erorilor sau a pachetelor abandonate datorită congestionării mediului <strong>de</strong><br />

comunicație), secvențiere (pachetele pot recepționate într‐o or<strong>din</strong>e diferită <strong>de</strong> cea<br />

<strong>de</strong> la transmisie), controlul fluxului, protecție împotriva erorilor (nivelul Legătură<br />

nu face suficient în acest sens). În Internet nivelul Transport este implementat cu<br />

protocolul TCP (Transmission Control Protocol). Combinația TCP/IP la nivelul Reţea<br />

şi Transport este suita <strong>de</strong> protocoale dominante în Internet. La nivelul Legătură şi<br />

Aplicaţie pot fi folosite orice alte protocoale. Pentru nivelul Transport şi Reţea există<br />

şi alte tipuri <strong>de</strong> protocoale.<br />

142


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

La nivelul Aplicaţie, un proces poate efectua schimb <strong>de</strong> date cu orice alt proces <strong>de</strong><br />

altun<strong>de</strong>va <strong>din</strong> Internet şi să trateze conexiunea ca şi cum ar fi un fişier pe sistemul<br />

local, citind şi scriind octeți cu apeluri sistem obişnuite. De regulă aceste operații<br />

sunt implementate prin socket‐uri, care sunt căi <strong>de</strong> comunicație spre rețea prin<br />

sistemul <strong>de</strong> operare.<br />

Adrese Internet<br />

Fiecare interfață pe Internet are o adresă IP unică. Versiunea 4 a protocolului IP,<br />

numită IPv4, este folosită încă pe scară largă dar este înlocuită <strong>de</strong> IPv6, care<br />

foloseşte adrese <strong>de</strong> 4 ori mai mari <strong>de</strong>cât IPv4 şi are o serie <strong>de</strong> îmbunătățiri şi<br />

simplificări. Un exemplu <strong>de</strong> adresă IPv4 în forma cu puncte este dată mai jos:<br />

165.230.140.67<br />

Fiecare număr <strong>de</strong>limitat <strong>de</strong> caracterul punct este un număr întreg fără semn pe 8<br />

biți <strong>din</strong> intervalul 0..255. Secvența binară corespunzătoare adresei <strong>de</strong> mai sus este:<br />

10100101.11100110.10001100.01000011<br />

Bitul cel mai <strong>din</strong> stânga (cel mai semnificativ) <strong>de</strong>termină clasa <strong>de</strong> adresă. Figura <strong>de</strong><br />

mai jos prezintă cele cinci clase <strong>de</strong> adrese <strong>din</strong> IPv4.<br />

Clasa A are 7 biți pentru i<strong>de</strong>ntificare rețelei (ID) şi 24 <strong>de</strong> biți pentru ID host‐ului.<br />

Astfel pot fi cel mult 2 7 rețele <strong>de</strong> clasă A fiecare <strong>din</strong> ele cu 2 24 host‐uri. O parte <strong>din</strong><br />

aceste adrese sunt rezervate, aşa că numărul <strong>de</strong> adrese ce pot fi atribuite host‐urilor<br />

este mai mic <strong>de</strong>cât numărul total <strong>de</strong> adrese posibile.<br />

Adresele <strong>de</strong> clasă B folosesc 14 biți pentru i<strong>de</strong>ntificatorul <strong>de</strong> rețea şi 16 biți pentru<br />

i<strong>de</strong>ntificatorul host‐urilor. Adresele <strong>de</strong> clasa C folosesc 21 <strong>de</strong> biți pentru ID‐ul rețelei<br />

143


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

şi 8 biți pentru i<strong>de</strong>ntificatorul <strong>de</strong> host. Adresele <strong>de</strong> clasă D sunt folosite pentru<br />

grupuri multicast, la care un sistem care are adresă <strong>de</strong> clasă A, B sau C se poate<br />

conecta şi va primi tot traficul <strong>de</strong> rețea ce este <strong>de</strong>stinat grupului. Acesta este un<br />

mecanism eficient pentru trimiterea aceloraşi pachete la mai multe sisteme, fără a<br />

inunda rețeaua prin broadcast şi fără ca expeditorul să fie nevoit să țină evi<strong>de</strong>nța<br />

tuturor sistemelor conectate. Adresele <strong>de</strong> clasă E sunt rezervate.<br />

În momentul în care toate adresele IPv4 (adrese pe 32 <strong>de</strong> biți) disponibile vor fi<br />

atribuite Internet‐ul nu va mai putea evolua aşa că este necesară adoptarea cât mai<br />

curând a IPv6 ( acest protocol are adrese IP pe 128 <strong>de</strong> biți). În multe rețele se<br />

folosesc protocoale ce permit partajarea adreselor IP; prin liniile dial‐up adresele IP<br />

sunt atribuite <strong>din</strong>amic doar pe durata sesiunii.<br />

Porturi<br />

Un port este mijlocul prin care un proces se <strong>de</strong>schi<strong>de</strong> spre exterior. Un număr <strong>de</strong><br />

port i<strong>de</strong>ntifică procesul sursă şi un alt număr <strong>de</strong> port i<strong>de</strong>ntifică procesul <strong>de</strong>stinație.<br />

Un port i<strong>de</strong>ntifică un punct <strong>de</strong> intrare în rețea pentru un proces. Porturile <strong>de</strong> la 0 la<br />

1023 sunt porturi bine cunoscute pentru procese sever. De exemplu, portul telnet<br />

este 23. Pe un sistem Unix, comanda:<br />

%telnet fs.uora<strong>de</strong>a.ro 23<br />

va conecta utilizatorul la sistemul fs.uora<strong>de</strong>a.ro. Dacă portul 23 nu este prezent în<br />

linia <strong>de</strong> comanda se va consi<strong>de</strong>ra implicit că este portul 23. Dacă 23 este înlocuit cu<br />

alt port, <strong>de</strong> exemplu 13 (daytime), atunci se va ajunge la un alt serviciu, care are<br />

comportament diferit.<br />

Încapsulare<br />

Datele <strong>din</strong> rețea sunt încapsulate pe măsură ce trec prin nivelurile <strong>de</strong> rețea aşa cum<br />

se ve<strong>de</strong> în figura <strong>de</strong> mai jos:<br />

Datele utilizator sunt trimise în rețea folosind apeluri sistem pentru citire şi scriere<br />

similare cu cele folosite la accesarea fişierelor. Nivelul Aplicaţie trimite datele<br />

144


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

utilizator la nivelul Transport, un<strong>de</strong> sistemul <strong>de</strong> operare adaugă un antet TCP care<br />

i<strong>de</strong>ntifică porturile sursă şi <strong>de</strong>stinație, formând un segment TCP. Segmentul TCP<br />

este transmis la nivelul Reţea, un<strong>de</strong> segmentul TCP este reîmpachetat în datagrame<br />

IP, fiecare cu un antet IP care i<strong>de</strong>ntifică sistemele sursă şi <strong>de</strong>stinație. Datagramele IP<br />

sunt trimise la nivelul Legătură un<strong>de</strong> datagramele sunt încapsulate în segmente<br />

(engl. frame) Ethernet (pentru acest exemplu). La <strong>de</strong>stinație are loc procesul invers.<br />

Un segment TCP poate fi <strong>de</strong>scompus în mai multe datagrame IP, care sunt rutate<br />

in<strong>de</strong>pen<strong>de</strong>nt prin Internet. Fiecare datagramă conține adresele IP sursă şi <strong>de</strong>stinație<br />

(în antetul IP), porturile sursă şi <strong>de</strong>stinație (în hea<strong>de</strong>r‐ul TCP) şi protocolul <strong>de</strong> la<br />

următorul nivel <strong>de</strong> încapsulare (în antetul IP – TCP este doar un protocol <strong>de</strong> nivel<br />

transport folosit în Internet; mai există şi altele, <strong>de</strong> ex. UDP). Aceşti cinci parametri<br />

i<strong>de</strong>ntifică în mod unic fiecare datagramă IP în drumul ei prin Internet, ceea ce<br />

permite trimiterea datagramei la procesul <strong>de</strong>stinatar corect.<br />

DNS (Domain Name System)<br />

DNS este o bază <strong>de</strong> date distribuită care asociază nume <strong>de</strong> host şi adrese IP şi<br />

furnizează informații pentru rutarea e‐mail. De exemplu adresa simbolică<br />

www.uora<strong>de</strong>a.ro este asociată cu adresa IP 193.231.135.12. Mai multe nume pot fi<br />

asociate cu aceeaşi adresă IP. DNS este responsabil pentru interacțiunea cu<br />

programe care au nevoie <strong>de</strong> aceste asociere.<br />

Fiecare domeniu (cum ar fi uora<strong>de</strong>a.ro) are propria bază <strong>de</strong> date cu informații şi<br />

rulează un server pe care alte sisteme <strong>din</strong> Internet îl pot interoga. Accesul la DNS se<br />

face printr‐un resolver, care este integrat în rutinele <strong>de</strong> bibliotecă, rutine ce sunt<br />

link‐editate în programele ce accesează rețeaua.<br />

NIC (Network Information Center) este organizația care gestionează domeniile toplevel<br />

şi <strong>de</strong>legă autoritatea pentru domeniile <strong>din</strong> nivelul următor (nivelul 2). În cadrul<br />

unei zone, un administrator local întreține baza <strong>de</strong> date pentru serverul <strong>de</strong> nume.<br />

Trebuie să existe un server <strong>de</strong> nume primar, care îşi încarcă baza <strong>de</strong> date <strong>din</strong>tr‐un<br />

fişier şi servere <strong>de</strong> nume secundare, care îşi iau informația <strong>de</strong> la serverul primar. Se<br />

foloseşte un cache, astfel încât o interogare care provoacă contactarea altor servere<br />

nu va mai necesita contactarea ulterioară a acelor servere.<br />

World Wi<strong>de</strong> Web<br />

WWW este format <strong>din</strong> procese client (browserele Web) şi servere Web care rulează<br />

http (HyperText Transfer Protocol) la nivelul Aplicaţie al Internet. Ceea ce trebuie<br />

ştiu este că WWW != Internet. WWW este o aplicație creată pentru Internet.<br />

În 1989, Tim Berners‐Lee <strong>de</strong> la CERN (laboratorul european pentru fizica<br />

particulelor) a <strong>de</strong>zvoltat un Web bazat pe text, pentru schimbul <strong>de</strong> documente<br />

tehnice printre colegi. În februarie 1993, NCSA (National Center for Supercomputing<br />

Applications) <strong>din</strong> cadrul Universității Illinois a lansat o versiune grafică a<br />

browserului Web Mosaic precum şi un server http, ambele gratuite şi <strong>de</strong> atunci<br />

WWW a explodat şi a ajuns la ceea ce ştim astăzi.<br />

145


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Bridge, router şi switch<br />

Un hub este un punct <strong>de</strong> conexiune central pentru sisteme <strong>de</strong> calcul. Un hub se<br />

numeşte bridge atunci când un sistem <strong>de</strong> calcul este un alt hub. Un hub doar copiază<br />

pachetele <strong>de</strong> pe o interfață <strong>de</strong> rețea pe toate celelalte, aşa cum se în figura <strong>de</strong> mai jos<br />

(a):<br />

Hub‐urile şi bridge‐urile nu au multă inteligență, ele fiind capabile doar să izoleze<br />

conexiunile la o singură rețea (dacă două pachete intră în coliziune într‐o rețea, ceea<br />

ce este <strong>de</strong>stul <strong>de</strong> normal dar <strong>de</strong> nedorit, semnalul <strong>de</strong> coliziune nu este propagat şi la<br />

alte rețele), şi să limiteze trimiterea anumitor tipuri <strong>de</strong> trafic la alte interfețe.<br />

Un ruter (engl. router) conectează o rețea la alta (fig. b) şi ia <strong>de</strong>cizii în legătură cu<br />

transmiterea pachetelor <strong>din</strong>colo <strong>de</strong> limitele unei rețele. Un ruter are mai multe<br />

interfețe <strong>de</strong> rețea şi trimite pachetele <strong>de</strong> la o interfață la alta. Pe interfețe diferite<br />

protocoalele <strong>de</strong> rețea pot să difere.<br />

Un ruter trimite pachetele pe baza protocolului, pe când un switch le trimite doar pe<br />

baza adresei <strong>de</strong> <strong>de</strong>stinație. Un switch este un hub <strong>de</strong> mare viteză care nu partajează<br />

lățimea <strong>de</strong> bandă (fig. c). Un switch elimină conflictele <strong>de</strong> acces la mediul <strong>de</strong><br />

transmisie.<br />

O îmbunătățire a switch‐ului este o rețea cu auto‐rutare în care se creează automat<br />

conexiunile sursă‐<strong>de</strong>stinație, pe baza adreselor <strong>din</strong> antetele pachetelor ce<br />

traversează rețeaua. Un exemplu este un switch cu auto‐rutare cu 4 intrări şi 4 ieşiri.<br />

Aceasta se poate realiza folosind algoritmul bubble­sort, în care pachetele cu cea mai<br />

mică adresă sunt puse în partea <strong>de</strong> sus, prin interschimbarea pachetelor învecinate,<br />

pachetele cu cea mai mare adresă ajungând în partea <strong>de</strong> jos. Pentru n canale, trebuie<br />

făcute n(n­1)/2 comparații. Pentru n = 4 numărul <strong>de</strong> comparații ce trebuie făcute<br />

este 6, ceea ce înseamnă că avem nevoie <strong>de</strong> 6 circuite <strong>de</strong> comparație. Switch‐ul<br />

corespunzător este prezentat în figura <strong>de</strong> mai jos:<br />

146


<strong>Universitatea</strong> <strong>din</strong> Ora<strong>de</strong>a, Facultatea <strong>de</strong> Ştiinţe, sem I, 2009-2010<br />

Departamentul <strong>de</strong> Matematică şi Informatică<br />

Suport <strong>de</strong> curs pentru disciplina „<strong>Arhitectura</strong> sistemelor <strong>de</strong> calcul”<br />

Specializarea: Informatică anul I Lector univ. dr. Horea Oros<br />

Pachetele nesortate intră în partea stângă şi ies sortate în parte dreaptă după adresa<br />

<strong>de</strong> <strong>de</strong>setinație.<br />

Concluzii<br />

Comunicația implică transferul informației între sisteme. Ca o regulă, datele sunt<br />

transmise serial <strong>de</strong>oarece există o întot<strong>de</strong>auna o întârziere la transferul <strong>de</strong> date prin<br />

rețelele <strong>de</strong> mare viteză. Totuşi schemele <strong>de</strong> modulare permit codificarea mai multor<br />

biți într‐o singură unitate <strong>de</strong> transfer. Alegerea schemei <strong>de</strong> modulare influențează<br />

apariția erorilor la transferul <strong>de</strong> informație. Detecția şi corecția erorilor sunt<br />

posibile prin redundanță, ceea ce presupune existența mai multor secvențe <strong>de</strong> biți<br />

<strong>de</strong>cât numărul maxim <strong>de</strong> secvențe <strong>de</strong> biți vali<strong>de</strong>. Dacă o secvență <strong>de</strong> biți nu are un<br />

singur cuvânt valid cel mai apropiat, atunci <strong>de</strong>tectarea erorii este posibilă dar nu şi<br />

corectarea. Dacă fiecare secvență <strong>de</strong> biți poate fi creată <strong>din</strong>tr‐o singură secvență <strong>de</strong><br />

biți validă atunci corectarea erorii este posibilă.<br />

Rețelele LAN gestionează complexitatea folosind niveluri ce sunt bazate pe mo<strong>de</strong>lul<br />

OSI. Rețelele locale sunt conectate la rețele WAN, în principal rețeaua Internet.<br />

Rețeaua Internet se bazează pe suita <strong>de</strong> protocoale TCP/IP. Datele utilizator sunt<br />

încapsulate la nivelurile Aplicaţie, Transport, Reţea şi Legătură şi sunt trimise prin<br />

Internet şi <strong>de</strong>capsulate la <strong>de</strong>stinație. În drumul lor înspre <strong>de</strong>stinație, datele<br />

traversează o serie <strong>de</strong> medii <strong>de</strong> transmisie, care diferă în lățime <strong>de</strong> bandă şi distanța<br />

maximă la care se pot transfera datele.<br />

147

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!