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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!