Arhitectura Sistemelor de Calcul - Universitatea din Oradea
Arhitectura Sistemelor de Calcul - Universitatea din Oradea
Arhitectura Sistemelor de Calcul - Universitatea din Oradea
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. 20092010]<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 (b1) <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 s1 <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 m1. 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 (1b 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 m1 =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 ms = 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 Ms = 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 />
Flipflop<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 />
ab = 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(n1)+1 = 2n1 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ă bigendian, sau cel mai puțin semnificativ octet la adresa cea mai mică,<br />
adică littleendian.<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 />
littleendian sau bigendian.<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 extragereexecuţ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 />
Pseudooperaţ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 />
Linkeditarea 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 />
Intrareieş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 linkeditarea, 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 ifelse 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 dowhile 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 />
Linkeditare ş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 />
Linkeditare<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 />
CRC16 = x 16 + x 15 + x 2 + 1<br />
CRCCCITT = x 16 + x 12 + x 5 + 1<br />
CRC32 = 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 bubblesort, î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(n1)/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