Programarea procesoarelor IA-32 în limbaj de asamblare

380

Click here to load reader

description

Programarea procesoarelor IA-32 în limbaj de asamblare

Transcript of Programarea procesoarelor IA-32 în limbaj de asamblare

  • Programarea procesoarelor IA-32 n limbaj de asamblare

  • tefan Gabriel origa Iulian Bdescu

    UNIVERSITATEA POLITEHNICA BUCURETI

    PROGRAMAREA PROCESOARELOR IA-32 N LIMBAJ DE ASAMBLARE

  • PREFA

    Limbajul de asamblare reprezint o metod de codificare simbolic, relativ uor de citit i de interpretat de ctre om, a instruciunilor n format binar executate de procesor. Spre deosebire de alte limbaje de programare, limbajul de asamblare nu reprezint un limbaj de sine stttor, ci, mai degrab, o categorie de limbaje. Fiecare familie de procesoare are propriul limbaj n asamblare. Din aceast relaie de cauzalitate rezult c programatorul, pe lng noiunile specifice limbajului, trebuie s dein i cunotine minime legate de structura intern a procesorului. Devine evident c programarea n limbaj de asamblare este mult mai dificil dect programarea ntr-un limbaj de nivel nalt. De fapt, limbajul de asamblare trebuie utilizat numai atunci cnd este absolut necesar.

    Deoarece asamblarea este o etap intermediar a procesului de compilare, instrumentele folosite la translatarea codului scris n limbaj de nivel nalt n limbaj main sunt capabile s gestioneze i programe hibride, n care codul limbajului de nivel nalt conine secvene scrise n limbaj de asamblare. Altfel spus, compilatorul accept introducerea de linii scrise n limbaj de asamblare direct n textul surs al limbajului de nivel nalt, iar editorul de legturi poate combina module obiect generate din surse scrise n limbaj de nivel nalt cu module obiect obinute din surse scrise n limbaj de asamblare. Aceste construcii hibride apar din cteva considerente, dintre care amintim:

    optimizri atunci cnd sunt necesare secvene critice sub aspectul timpului de execuie i consumului de memorie;

    acces la instruciuni specifice procesorului;

    n prezent, chiar i n aceste situaii, eficiena compilatoarelor a crescut pn la nivelul n care acestea concureaz cu orice programator n asamblare, cu excepia unuia foarte bun, iar evoluiile tehnologice fac ca avantajul codului main optimizat prin instruciuni n asamblare s fie minim. Pe de alt parte, odat cu rspndirea unor platforme relativ srace n resurse de procesare i memorie, cum ar fi telefoanele mobile inteligente sau microcontrolere, se preconizeaz o cretere a cererii de specialiti capabili s foloseasc ct mai eficient resursele existente. Totodat, sunt i situaii n care programarea n limbaj de asamblare nu poate fi evitat. De exemplu, anumite componente ale sistemului de operare au restricii stricte n ce privete performana i consumul de resurse. Acestea nu se pot realiza dect prin utilizarea ct mai eficient a instruciunilor i caracteristicilor procesorului. n general, programatorii de sistem au nevoie de cunotine avansate de programare n limbaj de asamblare. n cazul programatorilor de aplicaii, principalele motive pentru care se recomand experiena programrii n limbaj de asamblare const n familiarizarea cu modul de organizare a programelor n memorie, cu principiile de funcionare a diverselor componente hardware sau cu rolul sistemului de operare. Toate ajut programatorul de aplicaii s scrie programe mai eficiente. De asemenea, depanarea unui program de nivel nalt poate depi nivelul textului surs, ajungndu-se la

  • depanarea codului obiect, proces care necesit cunoaterea limbajului de asamblare. Evident, dac se dorete ca o aplicaie s profite ct mai mult de beneficiile limbajului de asamblare (cod compact i rapid, consum de resurse minim), aceasta poate fi scris complet n limbaj de asamblare. Un astfel de caz este aplicaia antivirus NOD32. Cartea de fa abordeaz limbajul de asamblare corespunztor familiei de procesoare Intel de 32 de bii, de la 80386 pn la Pentium 4. Indiferent de particularitile limbajului de asamblare specific arhitecturilor Intel, noiunile de baz i principiile generale se aplic i altor categorii de procesoare i chiar microcontrolerelor. Gradul de complexitate al informaiilor crete gradual, pe parcursul desfurrii capitolelor. Publicul int este reprezentat de studenii de anul II de la specializarea Telecomenzi i electronic n transporturi din cadrul Facultii Transporturi, dar i de studeni de la alte faculti, de exemplu, Facultatea de Automatic i Calculatoare sau Electronic i Telecomunicaii, care au n program cursuri de Arhitectura microprocesoarelor sau Calculatoare i sisteme de operare. Lucrarea este dedicat celor care iau contact pentru prima dat cu limbajul de asamblare i, chiar dac publicul int a urmat cel puin un curs introductiv de programare, nu se fac presupuneri cu privire la cunotinele acumulate anterior. Conceptele sunt prezentate simplu i concis, natura intrinsec a domeniului necesit oricum un grad ridicat de concentrare i exerciiu. Programele sunt la fel de simple, orientate ctre ilustrarea conceptelor. n final, pentru a fora cititorul s editeze programele manual, am ales ca volumul s nu fie acompaniat de un CD. Se tie c tentaia de a copia codul cu ajutorul mouse-ului e mare. Cititorul trebuie s contientizeze faptul c obiectivul su este s i nsueasc informaiile i conceptele prezente n acele programe, nu s le ruleze pur i simplu. Autorii recomand parcurgerea secvenial a crii, ntotdeauna cu calculatorul n fa. Aceast carte nu se citete, se execut. Conceptele noi sunt prezentate pe baza celor dinainte, iar capitolele sunt scrise astfel nct s conduc ct mai repede la exemple practice. Cu o atitudine adecvat, la finalul crii, n cel mai pesimist scenariu, cititorul va cunoate conceptele generale de dezvoltare a programelor n asamblare, funciile sistemului de operare i organizarea calculatorului din perspectiva unui programator. Considerm c platforma hardware i software cea mai indicat pentru nsuirea conceptelor teoretice este cea real. De aceea, toate uneltele de programare discutate n aceast carte sunt disponibile pe orice distribuie Linux. Linux ofer un excelent mediu de studiu i dezvoltare. n plus, contactul cu Linux reprezint o oportunitate n sine. Executabilele sunt generate i rulate chiar de procesorul calculatorului (cu excepia cazului n care alegei s folosii o main virtual). Cerina obligatorie este s fac parte din familia Intel de 32 sau 64 de bii. Deoarece procesoarele moderne de 64 de bii sunt compatibile napoi, toate informaiile prezentate pentru arhitecturile de 32 de bii rmn valabile.

  • Mediul de dezvoltare

    n procesul de dezvoltare a programelor, majoritatea programatorilor

    folosesc un mediu integrat de dezvoltare (IDE - Integrated Development Environment). Acesta pune la dispoziie toate uneltele necesare generrii executabilului din codul surs, dar, totodat, ascunde detaliile acestui proces. n aceast carte folosim componentele (editor de text, compilator, asamblor, editor de legturi, depanator) individual, astfel nct rolul fiecruia s poat fi observat direct. Sistemul de operare este Ubuntu, orice variant ntre 10.04 i 13.04.

    Organizarea capitolelor Primul capitol prezint sistemele de numeraie i modul de reprezentare a caracterelor alfanumerice n sistemele de calcul. Sunt oferite numai informaii strict necesare. Scopul este s ne nsuim rapid un set de cunotine minim pe baza cruia s putem asimila, prin exemple practice, conceptele ulterioare. Al doilea capitol prezint arhitectura sistemelor de calcul, cu cele dou faete ale sale, hardware i software. Subiectul este abordat din perspectiva programatorului. Ne concentrm asupra structurii interne a procesoarelor Intel de 32 de bii. Al treilea capitol prezint limbajul de asamblare n contextul interaciunii utilizator - calculator i al poziei sale n ierarhia limbajelor de programare. Capitolul poate fi privit ca o ncercare de definire a limbajului de asamblare prin gen i diferen specific, unde genul este reprezentat de clasa limbajelor de programare, iar diferena specific de proprietile caracteristice. Din acest capitol se desprinde faptul c limbajul de asamblare este o etap parcurs de compilatoare n procesul de translatare a codului surs n cod main. Aadar, fie c dorim s-l folosim sau nu, el este oricum utilizat de compilatoare n procesul de generare a codului obiect. Al patrulea capitol prezint procesul de dezvoltare a programelor n limbaj de asamblare i uneltele utilizate n etapele acestuia. Sunt prezentate numai informaii eseniale legate de limbajul de asamblare. Toate capitolele urmtoare vor face referire la acestea. Al cincilea capitol este dedicat conceptului central al programrii n orice limbaj, cu att mai mult al programrii n limbaj de asamblare: organizarea i adresarea memoriei principale. Al aselea capitol prezint formatul instruciunilor main. Pe lng aceste informaii, rolul acestui capitol este s familiarizeze cititorul cu modul de prezentare a informaiilor n documentaia oficial Intel1. Al aptelea i al optulea capitol acoper toate instruciunile dedicate

    1 The Intel 64 and IA-32 Architectures Software Developers Manual, Volumes 2A & 2B: Instruction Set Reference

  • operaiilor cu numere ntregi, respectiv cu numere reale. Ultimele trei capitole acoper noiuni mai avansate, precum definirea funciilor i interaciunea limbajului de asamblare cu sistemul de operare i limbajul de nivel nalt C.

  • Cuprins

    1.! REPREZENTAREA INFORMAIEI N SISTEMELE DE CALCUL 14!1.1.! Sisteme de numeraie ...................................................................... 14!

    1.1.1.! Sistemul zecimal ...................................................................... 15!1.1.2.! Sistemul binar .......................................................................... 15!1.1.3.! Sistemul hexazecimal .............................................................. 16!

    1.2.! Operaii de conversie ...................................................................... 16!1.2.1.! Conversia numerelor din zecimal n binar .............................. 16!1.2.2.! Conversia numerelor din zecimal n hexazecimal ................... 17!1.2.3.! Conversia numerelor din hexazecimal n binar ....................... 17!1.2.4.! Conversia numerelor din binar n hexazecimal ....................... 18!1.2.5.! Conversia numerelor reale ....................................................... 19!

    1.3.! Reprezentarea caracterelor alfanumerice ....................................... 20!1.4.! Exerciii .......................................................................................... 22!

    2.! ARHITECTURA CALCULATOARELOR .......................................... 24!2.1.! Structura unui sistem de calcul ....................................................... 24!

    2.1.1.! Arhitectura von Neumann ....................................................... 24!2.1.2.! Modelul bazat pe magistral .................................................... 26!2.1.1.! Magistrala de sistem ................................................................ 27!2.1.2.! Unitatea de intrare/ieire ......................................................... 28!2.1.3.! Memoria .................................................................................. 29!

    2.2.! Arhitectura IA-32 ........................................................................... 30!2.2.1.! Arhitectur i microarhitectur ................................................ 31!2.2.2.! Structura de principiu a procesorului ...................................... 33!2.2.3.! Funcionarea procesorului ....................................................... 37!2.2.4.! Registrele procesorului ............................................................ 38!2.2.5.! ntreruperile ............................................................................. 42!

    2.3.! Exerciii .......................................................................................... 43!

    3.! LIMBAJUL DE ASAMBLARE ........................................................... 44!3.1.! Tipuri de limbaje de programare .................................................... 46!

    3.1.1.! Limbajul main ...................................................................... 46!3.1.2.! Limbajul de asamblare ............................................................ 48!3.1.3.! Limbaje de nivel nalt .............................................................. 48!

    3.2.! Procesul de compilare ..................................................................... 51!3.2.1.! Preprocesarea ........................................................................... 53!3.2.2.! Compilarea .............................................................................. 53!

  • 3.2.3.! Asamblarea .............................................................................. 55!3.2.4.! Editarea legturilor .................................................................. 57!3.2.5.! Formatul fiierelor executabile ................................................ 57!

    3.3.! Avantajele limbajului de asamblare ............................................... 58!3.4.! Exerciii .......................................................................................... 59!

    4.! DEZVOLTAREA PROGRAMELOR N LIMBAJ DE ASAMBLARE 60!

    4.1.! Sintaxa limbajului de asamblare ..................................................... 60!4.2.! Structura programului ..................................................................... 61!4.3.! Structura procesului ........................................................................ 64!

    4.3.1.! Memoria virtual n Linux ...................................................... 65!4.4.! Tipuri de date .................................................................................. 67!

    4.4.1.! Date iniializate ........................................................................ 67!4.4.2.! Date neiniializate .................................................................... 74!

    4.5.! Procesul de dezvoltare al programelor ........................................... 75!4.5.1.! Editarea textului ...................................................................... 75!4.5.2.! Asamblarea .............................................................................. 81!4.5.3.! Editarea legturilor .................................................................. 85!4.5.4.! Automatizarea sarcinilor cu GNU Make ................................. 86!4.5.5.! Execuia programului .............................................................. 89!4.5.6.! Depanarea fiierului executabil ............................................... 90!

    4.6.! ntrebri i exerciii ....................................................................... 100!

    5.! MEMORIA .......................................................................................... 101!5.1.! Declararea datelor n bloc ............................................................. 101!5.2.! Adresarea memoriei n modul protejat ......................................... 103!

    5.2.1.! Adresare imediat i adresare la registre ............................... 104!5.3.! Optimizarea accesului la memorie ............................................... 117!

    6.! ARHITECTURA SETULUI DE INSTRUCIUNI ............................ 122!6.1.! Simboluri cheie ......................................................................... 122!6.2.! Codificarea instruciunilor ............................................................ 124!

    6.2.1.! Spaiul codurilor operaionale ............................................... 126!6.2.2.! Octetul ModR/M ................................................................... 128!6.2.3.! Spaiul codurilor 386 (0F + ...) .............................................. 129!6.2.4.! Prefix de dimensiune operand ............................................... 130!

    6.3.! Codificarea adreselor de memorie ................................................ 131!6.3.1.! Octetul SIB ............................................................................ 132!

  • 6.4.! Formatul instruciunilor ................................................................ 133!6.4.1.! Prefixele de instruciune ........................................................ 133!6.4.2.! Modurile de adresare prin octetul ModR/M .......................... 134!6.4.3.! Modurile de adresare prin octetul SIB .................................. 137!

    6.5.! Studiu de caz ................................................................................. 139!

    7.! OPERAII CU NUMERE NTREGI ................................................. 145!7.1.! Reprezentarea numerelor cu semn ................................................ 145!

    7.1.1.! Reprezentarea cu bit de semn i magnitudine ....................... 146!7.1.2.! Reprezentarea n complement fa de unu ............................. 146!7.1.3.! Reprezentarea n complement fa de doi ............................. 147!

    7.2.! Extinderea ntregilor ..................................................................... 151!7.3.! Indicatori de stare ......................................................................... 153!

    7.3.1.! Indicatorul de zero ................................................................. 153!7.3.2.! Indicatorul de transport ......................................................... 154!7.3.3.! Indicatorul de depire .......................................................... 155!7.3.4.! Indicatorul de semn ............................................................... 156!7.3.5.! Indicatorul de transport la jumtate ....................................... 156!7.3.6.! Indicatorul de paritate ............................................................ 157!

    7.4.! Instruciuni de transfer condiionat ............................................... 158!7.5.! Operaii aritmetice ........................................................................ 160!

    7.5.1.! Instruciuni de adunare .......................................................... 160!7.5.2.! Instruciuni de scdere ........................................................... 165!7.5.3.! Instruciuni de comparare ...................................................... 170!7.5.4.! Incrementare i decrementare ................................................ 170!7.5.5.! Instruciuni de nmulire ........................................................ 171!7.5.6.! Instruciuni de mprire ........................................................ 172!

    7.6.! Instruciuni de interschimbare a datelor ....................................... 173!7.7.! Instruciuni de prelucrare la nivel de bit ....................................... 178!

    7.7.1.! Instruciuni logice .................................................................. 178!7.7.2.! Instruciuni de deplasare ........................................................ 181!7.7.3.! Instruciuni de rotaie ............................................................. 185!7.7.4.! Instruciuni de testare i modificare a unui bit ...................... 185!7.7.5.! Instruciuni de scanare pe bit ................................................. 186!7.7.6.! Instruciuni de setare condiionat ......................................... 186!

    7.8.! Instruciuni de transfer al controlului ........................................... 187!7.8.1.! Instruciuni de salt necondiionat .......................................... 188!7.8.2.! Instruciuni de salt condiionat .............................................. 189!7.8.3.! Instruciuni de ciclare ............................................................ 191!

    7.9.! Procesarea irurilor ....................................................................... 193!

  • 7.9.1.! Instruciuni de transfer ........................................................... 193!7.9.2.! Instruciuni de transfer la/de la acumulator ........................... 197!7.9.3.! Instruciuni de comparare ...................................................... 200!7.9.4.! Instruciuni de parcurgere ...................................................... 201!

    7.10.! Operaii cu stiva .......................................................................... 202!7.10.1.! Introducerea i extragerea datelor ....................................... 203!7.10.2.! Introducerea i extragerea registrelor .................................. 205!7.10.3.! Exemple de lucru cu stiva ................................................... 206!

    7.11.! Exerciii ...................................................................................... 208!

    8.! OPERAII CU NUMERE N VIRGUL MOBIL ......................... 209!8.1.! Reprezentarea numerelor reale ..................................................... 209!

    8.1.1.! Formatul n virgul mobil .................................................... 209!8.1.2.! Standardul IEEE 754 ............................................................. 214!8.1.3.! Valori n virgul mobil specifice IA-32 .............................. 218!

    8.2.! Arhitectura unitii n virgul mobil ........................................... 219!8.2.1.! Registre de date ..................................................................... 219!8.2.2.! Registre de control i stare .................................................... 220!

    8.3.! Instruciuni n virgul mobil ....................................................... 224!8.3.1.! Transferul datelor n virgul mobil ...................................... 224!8.3.2.! Operaii aritmetice n virgul mobil .................................... 230!8.3.3.! Instruciuni transcedentale ..................................................... 235!8.3.4.! Instruciuni de comparare ...................................................... 236!8.3.5.! Instruciuni FPU de transfer condiionat ............................... 240!

    8.4.! Exerciii ........................................................................................ 244!

    9.! FUNCII ............................................................................................. 247!9.1.! Modularizarea programelor .......................................................... 247!9.2.! Apelarea funciilor ........................................................................ 248!9.3.! Definirea funciilor ....................................................................... 249!9.4.! Transferul controlului ................................................................... 250!9.5.! Metode de transfer al parametrilor ............................................... 251!

    9.5.1.! Prin registre ........................................................................... 251!9.5.2.! Prin variabile globale ............................................................. 253!9.5.3.! Prin stiv ................................................................................ 254!9.5.4.! Structura funciei ................................................................... 262!

    9.6.! Mecanisme de transfer al parametrilor ......................................... 266!9.6.1.! Transfer prin valoare ............................................................. 266!9.6.2.! Transfer prin referin ........................................................... 269!

  • 9.7.! Conservarea strii registrelor ........................................................ 271!9.8.! Scrierea funciilor n fiiere separate ............................................ 271!9.9.! Exerciii ........................................................................................ 275!

    10.! INTERFAA CU SISTEMUL DE OPERARE ................................ 278!10.1.! ntreruperi software .................................................................... 278!10.2.! Formatul apelurilor de sistem ..................................................... 281!

    10.2.1.! Alocarea static a bufferelor ................................................ 288!10.2.2.! Macroinstruciuni ................................................................ 289!10.2.3.! Funcii de lucru cu transferuri de intrare/ieire ................... 296!10.2.4.! Operaii cu fiiere ................................................................ 303!10.2.5.! Argumente n linia de comand ........................................... 307!

    10.3.! Operaii aritmetice n reprezentri ASCII i BCD ..................... 311!10.3.1.! Formatul BCD ..................................................................... 312!10.3.2.! Erori i corecii n ASCII ..................................................... 312!10.3.3.! Erori i corecii n BCD compactat ..................................... 320!10.3.4.! Conversia ASCII binar ........................................................ 322!10.3.5.! Conversia caracterelor ASCII n binar ................................ 324!10.3.6.! Conversia numerelor din binar n ASCII ............................ 331!

    10.4.! Biblioteci de funcii .................................................................... 335!10.4.1.! Crearea bibliotecilor statice ................................................. 335!10.4.2.! Crearea bibliotecilor partajate ............................................. 337!10.4.3.! Procesul de generare a bibliotecilor partajate ...................... 344!10.4.4.! Instalarea i utilizarea bibliotecilor partajate ....................... 346!

    10.5.! Apelul funciilor de sistem prin biblioteca standard C ............... 348!10.5.1.! Editarea legturilor cu funciile C ....................................... 352!

    11.! INTERFAA CU LIMBAJELE DE NIVEL NALT ....................... 355!11.1.! Apelarea modulelor n asamblare din C .................................... 356!

    11.1.1.! Structura funciei n asamblare ............................................ 357!11.1.2.! Cadrul de stiv ..................................................................... 359!11.1.3.! Compilarea modulelor ......................................................... 361!

    11.2.! Linii de asamblare n codul surs C ............................................ 364!11.2.1.! Sintaxa AT&T ..................................................................... 364!11.2.2.! Formatul de baz ................................................................. 368!11.2.3.! Formatul extins .................................................................... 373!

    Bibliografie ................................................................................................. 379!

  • 1. REPREZENTAREA INFORMAIEI N SISTEMELE DE CALCUL

    Oamenii comunic prin intermediul unui numr apreciabil de simboluri: cifre, litere, semne de punctuaie, operatori aritmetici, alte semne speciale. Calculatorul nu este capabil s utilizeze dect dou simboluri (0 i 1). Pentru a reui s comunice cu un calculator, omul trebuie s converteasc simbolurile i comenzile sale ntr-o form pe care calculatorul s o poat nelege.

    Capitolul ncepe cu studiul diferitelor sisteme de numeraie utilizate n interaciunea cu calculatorul. Cnd se lucreaz cu mai multe sisteme de numeraie, adeseori este nevoie s convertim un numr dintr-o reprezentare n alta. Prezentm detalii cu privire la aceste conversii. Apoi ne concentrm asupra reprezentrii caracterelor alfanumerice. n general, prin caractere alfanumerice se neleg toate caracterele care pot fi introduse de la tastatura unui calculator.

    ncheiem cu un set de exerciii destinat s mijloceasc reinerea conceptelor i procedeelor utilizate de-a lungul capitolului.

    1.1. Sisteme de numeraie

    n mare, sistemul de calcul poate fi considerat o sum de circuite electronice. ntr-un circuit electronic, prezena unui anumit voltaj poate indica 1, n timp ce lipsa acestuia, n acelai punct, poate indica 0. Raionamentul poate fi extins la prezena sau lipsa unui curent electric, a unei capaciti, etc.. Oricare ar fi suportul electronic, putem spune c sistemele de calcul stocheaz informaia sub forma unor iruri de 0 i 1. De exemplu: 0101001101101001011011010111000001101100011101010010000001100011011000010010000001000010011101010110111001100001001000000111101001101001011101010110000100101110 Sistemul de numeraie care utilizeaz numai aceste dou simboluri (digii, cifre) poart numele de sistem binar. Numrul de simboluri constituie baza sistemului de numeraie. Calculatoarele stocheaz toat informaia n baza 2 - limbajul nativ al mainilor de calcul. Pe de alt parte, pentru noi, fiine dotate cu

  • zece degete i obinuite cu sistemul zecimal, operarea n reprezentare binar este incomod.

    1.1.1. Sistemul zecimal

    Numerele n baza 10 sunt reprezentate folosind zece simboluri: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Fiecare digit al numrului zecimal are asociat o putere a lui 10, n funcie de poziia sa n irul de cifre al reprezentrii (astfel de sisteme de numeraie se mai numesc i poziionale). Poziia cifrei n numr este evaluat de la dreapta la stnga, ncepnd cu zero. 369!" = 3 10! + 6 10! + 9 10!

    1.1.2. Sistemul binar

    Numerele n baza 2 sunt compuse din doi digii: 0 i 1. Fiecare digit al unui numr, n funcie de poziia sa, are asociat o putere a lui 2. 11010! = 1 2! + 1 2! + 0 2! + 1 2! + 0 2!= 16 + 8 + 2= 26!!

    Exemplul ilustreaz i conversia unui numr din binar n zecimal. Un singur digit binar se numete bit (binary digit) i se prescurteaz cu litera b. Pentru a lucra mai uor cu numerele binare, putem grupa mai muli bii mpreun:

    un ir de 4 bii formeaz un nibble, un ir de 8 bii un byte sau octet, un ir de 16 bii formeaz un word sau un cuvnt, 32 de bii un double word sau un dublu cuvnt, 64 de bii un quad word (cuvnd cvadruplu), 80 de bii un ten byte.

    irul binar de la nceputul capitolului are un numr de 20 de octei. Dac l

    mprim n octei i convertim fiecare octet n zecimal obinem irul: 83 105 109 112 108 117 32 99 9 32 66 117 110 97 32 122 105 117 97 46 Acelai ir de bii, structurat n grupuri de cuvinte (16 bii) reprezentate zecimal, devine:

  • 21329 28016 27765 8291 24864 17013 28257 8314 26997 24878 n grupuri de dublu cuvinte: 1399418224 1819615331 1629504117 1851859066 1769300270 Cu ct irurile de bii devin mai lungi, cu att ne este mai greu s le convertim n zecimal. De aceea, folosim ca intermediar sistemul hexazecimal.

    1.1.3. Sistemul hexazecimal

    n sistemul de numeraie hexazecimal se utilizeaz 16 simboluri: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Semnificaia zecimal a simbolurilor A, B, C, D, E, F este, n ordine, 10, 11, 12, 13, 14, 15.

    Similar celorlalte sisteme de numeraie, fiecare digit al numrului hexazecimal are asociat o putere a lui 16, n funcie de poziie:

    3AE!" = 3 16! + A 16! + E 16!!!!!!!!!!!!!!= 768 + 10 16 + 14 1!!!!!!!!!= 768 + 160 + 14= 942!"

    Exemplul ilustreaz i conversia unui numr din hexazecimal n zecimal. Este acelai algoritm de conversie folosit anterior la trecerea din binar n zecimal. S-a schimbat numai baza.

    1.2. Operaii de conversie

    Am vzut cum putem transforma un numr din baza 2 n baza 10 sau din baza 16 n baza 10. n continuare vom demonstra alte conversii utile.

    1.2.1. Conversia numerelor din zecimal n binar

    Pentru a converti un numr zecimal n binar, nu trebuie dect s-l mprim succesiv la 2 pn obinem ctul 0, iar grupul resturilor obinute, scrise de la stnga la dreapta, ncepnd cu ultimul, formeaz reprezentarea acestuia n baza 2. Exemplu:

  • 135 : 2 = 67 rest 1 => d!= 1 67 : 2 = 33 rest 1 => d!= 1 33 : 2 = 16 rest 1 => d!= 1 16 : 2 = 8 rest 0 => d!= 0 8 : 2 = 4 rest 0 => d!= 0 4 : 2 = 2 rest 0 => d!= 0 2 : 2 = 1 rest 0 => d!= 0 1 : 2 = 0 rest 1 => d!= 1

    Grupnd resturile n ordinea invers obinerii lor, rezult: 135!" = d!d!d!d!d!d!d!d! = 10000111!. Verificm: 10000111! = 1 2! + 1 2! + 1 2! + 1 = 128 + 4 + 2 + 1 = 135!"

    1.2.2. Conversia numerelor din zecimal n hexazecimal

    Transformm numrul zecimal 1345 n hexazecimal. Algoritmul de trecere din zecimal n hexazecimal este identic cu cel folosit la conversia din zecimal n binar, dar mprim la noua baz, 16.

    1345 : 16 = 84 rest 1 => d!= 1 84 : 16 = 5 rest 4 => d!= 4 5 : 16 = 0 rest 5 => d!= 5

    n concluzie, 1345!" = d!d!d! = 541!" Verificm: 541!" = 5 16! + 4 16 + 1 = 5 256 + 64 + 1 = 1280 + 65 = 1345!"

    1.2.3. Conversia numerelor din hexazecimal n binar

    Reprezentarea hexazecimal este folosit de obicei ca notaie prescurtat pentru anumite grupuri de bii. Tabelul 1.1 ne ajut s nelegem mecanismul prin care se convertete un numr hexazecimal n binar.

  • Tabelul 1.1 Reprezentarea numerelor n diferite sisteme de numeraie

    Zecimal Binar Hexazecimal 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9

    10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F

    Deoarece sistemul hexazecimal are 16 digii, fiecare cifr hexazecimal

    poate specifica un grup unic de patru bii. Din calculele precedente a reieit c 135!" este 87 n hexazecimal i

    10000111 n binar. Aadar, putem deduce c reprezentarea binar a numrului 87!" este 10000111. Din tabel observm c reprezentarea binar a lui 8!" este 1000, iar reprezentarea binar a lui 7!" este 0111. Cu alte cuvinte, 10000111 reprezint alturarea echivalentului binar al cifrelor hexazecimale 8 i 7. n concluzie, pentru a converti orice numr hexazecimal n binar, nu trebuie dect s identificm reprezentarea binar a numerelor hexazecimale. De exemplu, 1A3B!":

    1!" = 0001!A!" = 1010!3!" = 0011!B!" = 1011!

    rezult 1A3B!" = 0001101000111011!

    1.2.4. Conversia numerelor din binar n hexazecimal

    Pentru a converti un numr din binar n hexazecimal trebuie numai s inversm procesul. Grupm biii numrului binar cte patru, de la dreapta la stnga, dac este nevoie completm cu 0 biii ultimului grup, i identificm echivalentul n hexazecimal pentru fiecare nibble. De exemplu, numrul binar 10010001011010 poate fi grupat de la dreapta

  • la stnga astfel: 10 0100 0101 1010.

    Completm la stnga cu doi de zero,

    0010 0100 0101 1010,

    i identificm pentru fiecare nibble echivalentul n hexazecimal. Rezultatul este 245A!". Aplicm aceast regul pe irul de bii dat la nceputul capitolului. mprit n octei, obinem: 53 69 6d 70 6c 75 20 63 61 20 42 75 6e 61 20 7a 69 75 61 2e mprit n cuvinte (unirea doi cte doi a octeilor de mai sus): 5369 6d70 6c75 2063 6120 4275 6e61 207a 6975 612e mprit n dublu cuvinte (unirea dou cte dou a cuvintelor de mai sus): 53696d70 6c752063 61204275 6e61207a 6975612e Din ultimele conversii deducem avantajul conversiei din binar n hexazecimal fa de conversia din binar n zecimal. Reprezentarea n hexazecimal este mult mai uor de obinut. n plus, reprezentarea hexazecimal a grupurilor de numere binare este transparent: putem forma cuvinte prin alturarea octeilor, dublu cuvinte prin alturarea cuvintelor, .a.m.d.. Aceste avantaje poziioneaz sistemul hexazecimal ca excelent intermediar ntre sistemul binar, utilizat de calculator, i sistemul zecimal, nativ utilizatorului uman. De aici reiese un concept foarte important sistemul hexazecimal este modalitatea cea mai convenabil prin care omul poate reprezenta iruri de bii. Un numr nu este intrinsec binar, zecimal sau hexazecimal. O valoare poate fi exprimat la fel de precis n toate cele trei sisteme de numeraie. Din acest punct de vedere, ea poate fi exprimat la fel de precis n orice sistem de numeraie.

    1.2.5. Conversia numerelor reale

    Conversia unui numr cu parte ntreag i parte fracionar se face prin conversia separat a celor dou pri. Conversia numrului subunitar (partea fracionar a unui numr) din baza 10 ntr-o baz oarecare se face prin nmulirea succesiv a prilor fracionare cu baza respectiv, pn cnd se ajunge la zero, la

  • perioad, sau se depete capacitatea de reprezentare (se obin cifre suficiente dei algoritmul nu s-a finalizat). Cifrele care depesc partea fracionar la fiecare nmulire formeaz numrul n baza ctre care se face conversia.

    Exemplul care urmeaz convertete numrul 0.57 n binar i hexazecimal. Cum partea ntreag este deja 0, convertim numai partea fracionar.

    0,57 * 2 = 1.14 => d!= 1 0,14 * 2 = 0.28 => d!= 0 0,28 * 2 = 0.56 => d!= 0 0,56 * 2 = 1.12 => d!= 1 0,12 * 2 = 0.24 => d!= 0 0,24 * 2 = 0.48 => d!= 0 0,48 * 2 = 0.96 => d!= 0 0,96 * 2 = 1.92 => d!= 1 0,92 * 2 = 1.84 => d!= 1 0,84 * 2 = 1.68 => d!= 1 0,68 * 2 = 1.36 => d!"= 1 0,36 * 2 = 0.72 => d!!= 0

    Aadar, 0,57!"= 0, d!d!d!d!d!d!d!d!d!d!d!"d!!= 0,100100011110!= 0,91E!"

    1.3. Reprezentarea caracterelor alfanumerice

    Deoarece calculatorul poate reprezenta informaia numai sub form de iruri de 0 i 1, toate simbolurile alfanumerice (literele mari i mici ale alfabetului, cifrele de la 0 la 9, semnele de punctuaie, operatori aritmetici i de relaie, alte caractere speciale) trebuie traduse n format binar. Reprezentarea informaiei conform unui anumit format se numete codificare. Rezultatul codificrii este un cod - un set de simboluri elementare mpreun cu o serie de reguli care specific modul de formare al acestor simboluri. Un astfel de cod, bazat pe alfabetul englez, este ASCII (American Standard Code for Information Interchange). ASCII este definit de Institutul American de Standarde i recomandat de ISO (International Standard Organization) ca standard actual de codificare alfanumeric. Codul ISO pentru ASCII este ISO 8859. Iniial, caracterele ASCII au fost codificate pe 7 bii, ceea ce nsemna un numr maxim de 128 (2!) de simboluri. Ulterior, a fost extins de IBM la 8 bii, rezultnd 256 de simboluri (codul fiecrui simbol este reprezentarea n binar a numrului su de ordine). Chiar extins la 8 bii, multe limbi conin simboluri care nu pot fi condensate n 256 de caractere. De aceea, au fost create variante care conin caractere i simboluri regionale. De exemplu, tabela ASCII cunoscut sub numele

  • de ISO 8859-1 cuprinde caractere pentru limbile indo-europene apusene (America de Nord, Europa Occidental, Australia i Africa). Pentru limba romn se utilizeaz tabela ISO 8859-2, destinat limbilor indo-europene rsritene, sau ISO 8859-16, zona est-european.

    Tabelul 1.2 Codul ASCII

    Dec Hex Char Dec Hex Char Dec Hex Char Dec Hex Char 0 0 NULL (null) 32 20 Space 64 40 @ 96 60 ` 1 1 SOH (start of heading) 33 21 ! 65 41 A 97 61 a 2 2 STX (start of text) 34 22 66 42 B 98 62 b 3 3 ETX (end of text) 35 23 # 67 43 C 99 63 c 4 4 EOT (end of transmission) 36 24 $ 68 44 D 100 64 d 5 5 ENQ (enquiry) 37 25 % 69 45 E 101 65 e 6 6 ACK (acknowledge) 38 26 & 70 46 F 102 66 f 7 7 BEL (bell) 39 27 ' 71 47 G 103 67 g 8 8 BS (backspace) 40 28 ( 72 48 H 104 68 h 9 9 TAB (horizontal tab) 41 29 ) 73 49 I 105 69 i 10 A LF (NL line feed, new line) 42 2A * 74 4A J 106 6A j 11 B VT (vertical tab) 43 2B + 75 4B K 107 6B k 12 C FF (NP form feed, new page) 44 2C 76 4C L 108 6C l 13 D CR (carriage return) 45 2D - 77 4D M 109 6D m 14 E SO (shift out) 46 2E . 78 4E N 110 6E n 15 F SI (shift in) 47 2F / 79 4F O 111 6F o 16 10 DLE (data link escape) 48 30 0 80 50 P 112 70 p 17 11 DC1 (device control 1) 49 31 1 81 51 Q 113 71 q 18 12 DC2 (device control 2) 50 32 2 82 52 R 114 72 r 19 13 DC3 (device control 3) 51 33 3 83 53 S 115 73 s 20 14 DC4 (device control 4) 52 34 4 84 54 T 116 74 t 21 15 NAK (negative acknowledge) 53 35 5 85 55 U 117 75 u 22 16 SYN (synchronous idle) 54 36 6 86 56 V 118 76 v 23 17 ETB (end of trans. block) 55 37 7 87 57 W 119 77 w 24 18 CAN (cancel) 56 38 8 88 58 X 120 78 x 25 19 EM (end of medium) 57 39 9 89 59 Y 121 79 y 26 1A SUB (substitute) 58 3A : 90 5A Z 122 7A z 27 1B ESC (escape) 59 3B ; 91 5B [ 123 7B { 28 1C FS (file separator) 60 3C < 92 5C \ 124 7C | 29 1D GS (group separator) 61 3D = 93 5D ] 125 7D } 30 1E RS (record separator) 62 3E > 94 5E ^ 126 7E ~ 31 1F US (unit separator) 63 3F ? 95 5F _ 127 7F DEL Primele 32 de caractere ASCII sunt coduri de control. Printre ele se regsete un grup de caractere albe (whitespace). Caracterele albe dicteaz structura fiierelor text prin mprirea acestora n linii (caracterul de linie nou - newline) sau introduc spaii albe ntre cuvinte (caracterul tabulator orizontal TAB, i caracterul de spaiu - Space). Fiierele text conin litere mici, mari, digii numerici, semne de punctuaie. n total sunt 94 de caractere vizibile. Nu trebuie s reinei Tabelul 1.2. Totui, este indicat s v familiarizai cu unele din

  • caracteristicile sale generale. n special, observai cum caracterele numerice, 0 9, apar ntr-o secven contigu de coduri, 30!" 39!". Acelai lucru este valabil i pentru majuscule, AZ, i litere mici, a z. De asemenea, observai c literele mici au valoare numeric mai mare, iar diferena ntre codurile celor dou reprezentri pentru un anumit caracter alfabetic este 20!". Pe lng caracterele prezente n codul ASCII trebuie s reprezentm simboluri matematice, caractere cu indicatori de accent, litere greceti, etc.. Acest lucru a dus la apariia unui cod nou, care n prezent se bucur de rspndire foarte mare i este predominant n industria productoare de programe de calculator: UTF-8, bazat pe standardul UNICODE. n segmentul dezvoltatorilor de aplicaii web i servicii Internet a devenit practic noul standard. UTF-8 codific fiecare din cele 1.112.069 simboluri din setul de caractere UNICODE folosind unul pn la patru octei. Organizaia non-profit care coordoneaz dezvoltarea UNICODE i propune s defineasc un cod standard pentru simbolurile alfanumerice utilizate n toate rile lumii: litere, semne de punctuaie, semne monetare specifice tuturor limbilor de pe planet. Avantajul major const n compatibilitatea cu ASCII. Primele 128 de caractere ale setului UTF-8 sunt reprezentate pe un singur octet i echivalente unu la unu cu cele ASCII. Astfel, orice text scris anterior cu ASCII devine compatibil cu UTF-8. nainte s trecei la seciunea urmtoare traducei cu ajutorul tabelului ASCII de mai sus semnificaia irului dat la nceputul capitolului. Pentru a v uura misiunea, putei folosi reprezentarea hexazecimal sau zecimal dedus n paragrafele anterioare.

    1.4. Exerciii

    1.1. Convertii n hexazecimal urmtoarele iruri de bii:

    a) 0100 0001 1110 1100 c) 1010 0101 0100 0010 b) 1011 1111 0011 1001 d) 0000 1101 0111 0110

    1.2. Convertii n binar urmtoarele numere hexazecimale:

    a) 78CF c) AAAA e) 5591 b) 3A7B d) FFFF f) 66DD

    1.3. Convertii n zecimal urmtoarele valori hexazecimale:

    a) A1 e) 0C i) A000 b) 12 f) 10 j) FFFF c) FF g) 64 k) ABCD d) 80 h) 4E l) 1234

  • 1.4. Convertii n reprezentri hexazecimale de 8 bii urmtoarele numere zecimale:

    a) 100 e) 32 i) 1024 b) 128 f) 64 j) 513 c) 255 g) 16 k) 32767 d) 85 h) 8 l) 2011

    1.5. Convertii n binar urmtoarele numere reale:

    a) 32.45 e) 15.32 b) 147.83 f) 7.8 c) 3.0125 g) 63.25 d) 255.255 h) 18.5

    1.6. Convertii n caractere ASCII urmtorul text:

    Telurile sunt prea marete, Eu sunt mic, uitat, nebagat in seama

    1.7. Convertii n text urmtorul ir de bii reprezentat n hexazecimal: 45 72 61 6D 20 73 74 75 64 65 6E 74 2C 20 65 72 61 20 73 74 75 64 65 6E 74 61 20 0D 0A 65 72 61 6D 20 65 6D 69 6E 65 6E 74 2C 20 65 72 61 20 69 6D 69 6E 65 6E 74 61 20 0D 0A 73 69 20 65 72 61 75 20 73 74 65 6C 75 74 65 20 EE 6E 20 67 65 6E 65 6C 65 20 65 69 2E Secvena 0D 0A denot trecerea la rnd nou (valabil pentru textul scris n Windows; n Linux, rndul nou este anunat numai de 0A, caracterul standard \n). 1.8. Scriei urmtoarele numere sub form de caractere ASCII:

    a) 123 d) 1094 b) 430 e) 1452 c) 15 f) 9966

    1.9. Efectuai operaiile date mai jos folosind coduri ASCII hexazecimale. Exprimai rezultatul tot ca reprezentare ASCII.

    a) F + 20!" e) q Q b) F - 20!" f) g F c) o - 20!" g) h a + 30!" d) m - 20!" 4D h) 4 + 6

  • 2. ARHITECTURA CALCULATOARELOR

    Capitolul de fa prezint arhitectura calculatorului, vzut ca platform de dezvoltare a programelor. Capitolul ncepe cu descrierea structurii hardware a sistemelor de calcul. Se pune accent pe arhitectura Intel de 32 de bii. Funcionalitatea i organizarea intern a componentelor hardware sunt prezentate din perspectiva procesului de dezvoltare a programelor.

    2.1. Structura unui sistem de calcul

    n capitolul precedent am subliniat faptul c sistemele de calcul lucreaz numai cu iruri de cifre binare 0 sau 1 i am artat cum pot acestea reprezenta numere sau caractere. Acest tip de informaie poart numele de date. Pe de alt parte, sistemele de calcul nu sunt simple dispozitive de stocare a datelor. De exemplu, pot fi comandate s execute toate operaiile realizate de noi: conversia dintr-o baz n alta, interpretarea unui ir binar n ASCII, etc.. Fiecare operaie de prelucrare a datelor este codificat tot sub form de ir binar. Dar pentru c nu codific o valoare, ci o comand, aceste iruri binare se numesc instruciuni. Instruciunile specific operaiile care trebuie efectuate de procesor. Dar atenie, procesorul recunoate i execut numai instruciunile pentru care a fost construit. Ansamblul instruciunilor recunoscute formeaz setul de instruciuni caracteristic acelui tip de procesor. Un ir de instruciuni i/sau date organizate logic dup un algoritm formeaz un program. Prin intermediul programului, utilizatorul transmite procesorului o anumit sarcin; de exemplu, s citeasc date de la tastatur i s le afieze la monitor.

    2.1.1. Arhitectura von Neumann

    La acest nivel, programul const dintr-o secven de coduri instruciune stocate n memorie. Dac programele conin i date (majoritatea programelor includ unele date constante), ele sunt de asemenea stocate n memorie. Cnd sistemul de operare lanseaz n execuie un program, codurile instruciune sunt copiate (ncrcate) de pe disc n memorie. Rularea unui program nseamn c procesorul extrage fiecare instruciune din memorie i execut operaia codificat de aceasta. Dac operaia implic prelucrare de date, acestea sunt extrase de asemenea din memorie. Arhitectura unui sistem de calcul care stocheaz datele i instruciunile mpreun ntr-o unitate de memorie separat de unitatea de procesare

  • se numete arhitectur von Neumann. Arhitectura poart numele celui care a descris-o abstract ntr-un studiu din 1945, matematicianul John von Neumann (dei conceptul a fost menionat i de ali pionieri din domeniul calculatoarelor). La momentul respectiv, acest model de lucru n care datele de prelucrat i rezultatele calculelor intermediare sunt stocate alturi de instruciuni ntr-o memorie comun, era diferit de cel al calculatoarelor cu funcionalitate predeterminat, unde programele erau stocate pe medii externe, precum cartele sau benzi perforate. n plus, von Neumann a artat c sistemul de calcul trebuie s aib o structur fizic fix, simpl, i s fie capabil de a executa orice fel de calcule pe baza unui control programat, fr a fi necesar modificarea unitilor fizice. De atunci, aceste idei, numite de obicei tehnica programelor stocate, au devenit eseniale i au fost acceptate universal. ntr-un calculator cu arhitectur von Neumann, programul poate fi interpretat i manipulat ca date. Acest lucru a dat natere la compilatoare i sisteme de operare i face posibil versatilitatea calculatoarelor moderne. Tot de aici pleac i principalul dezavantaj: un program poate fi scris astfel nct s se poat interpreta pe sine ca date, dnd posibilitatea s se modifice pe el nsui. Sistemele de operare moderne, precum GNU/Linux, interzic aplicaiilor s se automodifice. Modelul von Neumann const din cinci componente majore, ilustrate n Figura 2.1.

    Unitatea de memorie

    Unitatea Aritmetic i

    Logic

    Unitatea de intrare

    Unitatea de ieire

    Unitatea de control

    Figura 2.1 Arhitectura von Newmann. Sgeile ngroate reprezint ci de date. Sgeile

    subiri reprezint trasee de control.

    Unitatea de intrare reprezint poarta de intrare a instruciunilor i datelor n sistem. Acestea sunt stocate n unitatea de memorie i prelucrate de unitatea aritmetic i logic (ALU Arithmetic and Logic Unit) sub coordonarea unitii de control. Rezultatele sunt trimise la unitatea de ieire. Structura calculatoarelor poate fi descompus n aceste cinci uniti fundamentale chiar i n prezent.

  • 2.1.2. Modelul bazat pe magistral

    n modelul von Neumann comunicaia ntre componentele sistemului se realizeaz prin legturi dedicate ntre perechi de componente. Aceast abordare este relativ rigid, limitnd n mare msur scalabilitatea sistemului. Adugarea de noi componente este dificil i implic modificarea componentelor deja existente. De asemenea, proiectarea unei componente noi presupune cunoaterea n amnunime a funcionrii celorlalte componente. Soluionarea acestei probleme a venit din partea firmei Digital Equipment Corporation (DEC), care, la sfritul anilor 60, a lansat pe pia primul calculator (PDP 11) construit n jurul unei magistrale de sistem.

    CPU (ALU, Registre i

    Control)Memorie Intrare i Ieire (I/O)

    Mag

    istra

    la d

    e si

    stem

    Magistrala de date

    Magistrala de adrese

    Magistrala de control

    Figura 2.2 Modelul bazat pe magistral al unui calculator

    Aceast rafinare a modelului von Neumann combin ALU i unitatea de control ntr-o singur unitate funcional, numit unitate central de prelucrare (CPU Central Processing Unit). Totodat, unitile de intrare i ieire sunt de asemenea combinate ntr-o singur unitate de intrare i ieire. Aadar, principalele componente hardware2 ale unui sistem de calcul sunt:

    procesor sau unitate central de prelucrare; memorie sau unitate de memorare (memoria RAM Random Access

    Memory3); unitate de intrare/ieire (unitate I/O). La aceast interfa sunt conectate

    dispozitivele de intrare/ieire. Elementul definitoriu al acestui model const n faptul c toate componentele sistemului comunic ntre ele prin intermediul unei magistrale de

    2Componentele fizice ale unui sistem (structuri mecanice, cabluri, cutii, circuite, etc.). 3Random se refer la faptul c timpul de acces la orice unitate de memorie este constant

    i independent de locaia fizic a acesteia sau de secvenele accesurilor anterioare.

  • sistem. Din punct de vedere conceptual, magistrala este un mediu comun de comunicaie ntre componentele unui sistem de calcul; fizic, este alctuit dintr-un set de semnale care faciliteaz transferul de date i instruciuni, precum i sincronizarea ntre componentele sistemului.

    2.1.1. Magistrala de sistem

    Transferul de informaii pe magistral se face pe baza unui set de reguli (un protocol) care stabilete cine, cnd i cum se comunic pe magistral. Aadar, magistralele sunt ansambluri de conexiuni fizice (fire) prin care circul informaie n conformitate cu un set de reguli, avnd ca suport semnale electrice. Prin termenul de magistral se mai nelege de regul i ansamblul de circuite electronice care amplific puterea semnalelor electrice sau aduc nivelul acestora (de ex., tensiunea) la valoarea standard. n funcie de informaie, semnalele electrice sunt de trei tipuri: de date (reprezint informaia propriu zis), de adrese (semnale care identific locaia la care este transmis informaia) i de control (descriu aspecte legate de modul i maniera n care este transmis informaia). Nu este obligatoriu ca o magistral s implementeze ci fizice separate pentru fiecare din aceste trei tipuri de semnale. De exemplu, standardul PCI folosete acelai suport fizic att pentru date ct i pentru adrese, dar la momente diferite. Tipul informaiilor (sau direcia lor) aflate pe magistral la un moment dat este indicat prin semnale de control. Din acest punct de vedere putem clasifica magistralele n unidirecionale i bidirecionale. Magistralele unidirecionale pot transmite informaiile ntr-un singur sens, cele bidirecionale n ambele sensuri. Magistrala de adrese este unidirecional (de la procesor spre sistem) iar magistralele de date i control sunt bidirecionale. Un program const dintr-o secven de instruciuni stocat n memorie. Atunci cnd procesorul este pregtit s execute urmtoarea instruciune, plaseaz adresa locaiei de memorie care conine acea instruciune pe magistrala de adrese. Totodat, procesorul plaseaz un semnal de citire pe magistrala de control. Unitatea de memorie rspunde prin plasarea instruciunii pe magistrala de date, de unde poate fi citit4 de procesor. Dac procesorul trebuie s citeasc date din memorie, are loc aceeai secven de evenimente. Atunci cnd procesorul trebuie s scrie5 date n memorie, acesta plaseaz datele pe magistrala de date, adresa locaiei de memorie (la care trebuie acestea stocate) pe magistrala de adrese, i un semnal de scriere pe magistrala de control. Unitatea de memorie rspunde prin copierea pe magistrala de date a datelor prezente la locaia specificat. Dac o instruciune solicit un transfer de date din/ctre memorie, urmtoarea instruciune nu mai poate fi citit din memorie pe aceeai magistral

    4 Operaia de citire se traduce prin extragerea unei date stocate anterior. 5 Operaia de scriere se traduce prin stocarea unei date n memorie.

  • dect dup finalizarea acestuia. Acest conflict a dat natere la o alt arhitectur bazat pe tehnica programelor stocate, arhitectura Harvard. n arhitectura Harvard, programul i datele sunt stocate n memorii diferite, fiecare conectat la procesor prin propria magistral. Acest lucru permite procesorului s acceseze simultan att instruciunile ct i datele programului. n calculatoarele moderne, magistrala care conecteaz procesorul de modulele externe de memorie nu poate ine pasul cu viteza de execuie a procesorului. ncetinirea vitezei de transfer pe magistral poart numele de trangulare von Neumann (von Neumann bottleneck). Interaciunea procesorului cu dispozitivele de intrare/ieire se face prin acelai mecanism ntlnit la interaciunea procesorului cu memoria. Dac procesorul trebuie s citeasc date de la un dispozitiv de intrare, plaseaz adresa acestuia pe magistrala de adrese i un semnal de citire pe magistrala de control. Dispozitivul rspunde prin ncrcarea datelor pe magistrala de date. Cnd procesorul trebuie s trimit date la un dispozitiv de ieire, plaseaz datele pe magistrala de date, specific adresa dispozitivului pe magistrala de adrese i activeaz semnalului de scriere pe magistrala de control. Deoarece viteza de rspuns a diferitelor dispozitive I/O variaz drastic fa de viteza procesorului sau memoriei, programatorul trebuie s utilizeze tehnici speciale de programare. O alt caracteristic de baz a magistralelor este dimensiunea acestora, adic numrul liniilor de conectare; avem magistrale de 8 bii (8 linii de conectare), 16 bii (16 linii de conectare), etc.. Dimensiunea fiecrei magistrale este determinat de tipul de procesor (de 8, 16, 32, 64 de bii) i determin la rndul su numrul de locaii de memorie ce pot fi adresate (capacitatea memoriei) i structura porturilor din dispozitivele de intrare/ieire. De exemplu, o magistral de 32 de bii poate adresa o memorie RAM de 2!" = 2!" 2! = 4!GB.

    2.1.2. Unitatea de intrare/ieire

    Majoritatea programelor trebuie s comunice cu dispozitive I/O. Tipul dispozitivelor I/O variaz foarte mult. Unele sunt menite s interacioneze cu utilizatorul (de exemplu, tastatura, monitorul, mouse-ul), altele s permit programelor interaciunea cu uniti hardware (de exemplu, stocarea un fiier pe disc sau citirea unui fiier din reea). Toate aceste dispozitive se comport diferit i cerinele lor de sincronizare difer drastic de la unul la altul. Din moment ce programarea dispozitivelor I/O este dificil, dar aproape toate programele au nevoie de acestea, software-ul care gestioneaz dispozitivele I/O este inclus n sistemul de operare. Sistemele Linux includ un set bogat de funcii care permit programatorilor de aplicaii s efectueze operaii de intrare/ieire. ntr-un capitol viitor vom apela i noi la serviciile puse la dispoziie de sistemul de operare pentru ndeplinirea unor operaii de intrare/ieire.

    Aadar, pe lng componentele hardware, un sistem de calcul dispune i de

  • o component software6 fundamental: sistemul de operare. De fapt, termenul arhitectura calculatoarelor definete grania dintre hardware i software, i putem afirma, fr s fim acuzai de partizanat, c arhitectura calculatorului reprezint sistemul de calcul vzut de un programator n limbaj de asamblare.

    2.1.3. Memoria

    Memoria sistemului, numit i memorie principal, este folosit la stocarea informaiilor (instruciuni i date) n format binar i reprezint sursa sau destinaia tuturor informaiilor. Toate informaiile iniiale i rezultatele prelucrrilor sunt ncrcate, generate sau stocate temporar n memorie. Memoria este organizat ca o colecie de locaii de memorare, numerotate consecutiv, ncepnd cu zero. Unitatea de baz a memoriei este octetul. Ne putem imagina memoria ca ir liniar de octei suprapui, asemenea unui dulap cu sertare numerotate, fiecare sertar avnd capacitatea de 8 bii (Figura 2.3). Numrul fiecrui sertar este ceea ce numim n general adres fizic, iar sertarul, n programare, se numete locaie de memorie. Adresele permit identificarea fiecrui octet din memorie. Mulimea total a adreselor fizice constituie spaiul adreselor fizice, iar numrul de bii dintr-o locaie de memorie reprezint dimensiunea locaiei sau formatul memoriei. n cazul nostru, considerm dimensiunea locaiei ca fiind de 8 bii.

    Figura 2.3 prezint o memorie adresat printr-o magistral de 20 de bii. Dimensiunea magistralei, adic numrul liniilor de conectare, determin numrul de locaii de memorie ce pot fi adresate. n acest caz, adresa fizic a primului octet, de jos n sus, este reprezentat prin 20 de bii de 0.

    FFFFFH

    . . .

    00003H 00002H 1 0 0 0 1 0 0 1 00001H 00000H 0 7

    Figura 2.3 Reprezentarea memoriei principale

    n programare ntotdeauna numrm ncepnd cu zero. Urmtorul octet are adresa 1, .a.m.d, pn la adresa ultimului octet ce poate fi adresat cu 20 de bii, adresa cu toi biii de 1. n Figura 2.3 adresele sunt reprezentate n hexazecimal. Numrul total de octei de memorie este 2!" = 1048576. n binar, prefixul kilo este asociat 6Componentele imateriale (programe de sistem i aplicaii).

  • cu 1024 = 2!", prefixul Mega i Giga cu 1048576 = 2!", respectiv 1073741824 = 2!". n concluzie, Figura 2.3 ilustratreaz o memorie RAM cu capacitatea de 1 MB. Pe viitor va fi foarte important s stpnii la perfecie puterile lui 2 prezentate n Tabelul 2.1. V vor ajuta s evaluai rapid capacitatea de memorie adresabil cu o magistral de 16 sau 32 de bii. Memoria se msoar n uniti de ordinul kilobytes (kB), megabytes (MB), gigabytes (GB).

    Tabelul 2.1 Puteri ale lui 2 n binar i zecimal

    Binar Puteri ale lui 2 Zecimal 1 2! 1

    10 2! 2 100 2! 4

    1000 2! 8 10000 2! 16

    100000 2! 32 1000000 2! 64

    10000000 2! 128 100000000 2! 256

    1000000000 2! 512 10000000000 2!" 1024

    100000000000 2!! 2048 1000000000000 2!" 4096

    10000000000000 2!" 8192 100000000000000 2!" 16384

    1000000000000000 2!" 32768 10000000000000000 2!" 65536

    100000000000000000 2!" 131072 1000000000000000000 2!" 262144

    10000000000000000000 2!" 524288 100000000000000000000 2!" 1048576

    2.2. Arhitectura IA-32

    n aceast carte studiem arhitectura procesoarele Intel de 32 de bii sau compatibile. Numrul acestora este impresionant. Intel a produs microprocesoare nc din 1969. Primul lor microprocesor a fost 4004. Era un procesor de 4 bii (capacitatea de memorare a registrelor specific tipul de procesor). A fost urmat de 8080 i 8085. Dezvoltarea acestor microprocesoare a dus la apariia arhitecturii

  • Intel (IA Intel Architecture).

    2.2.1. Arhitectur i microarhitectur

    Primul procesor al arhitecturii Intel este 8086, aprut n 1978. Avea o magistral de adrese de 20 de bii i o magistral de date de 16 bii. Deoarece registrele interne i magistrala de date erau de 16 bii, 8086 a fost considerat primul procesor de 16 bii. Magistrala de adrese de 20 de bii i permitea s adreseze 1 MB de memorie.

    8088 a fost versiunea mai ieftin a lui 8086. Reducerea preului s-a obinut prin folosirea unei magistrale de date de 8 bii. Cu excepia acestei deosebiri, 8088 este identic cu 8086.

    80186 a fost varianta mai rapid a lui 8086. Dispunea de aceleai magistrale, dar un set mbuntit de instruciuni. ns 80186 nu a fost niciodat foarte ndrgit de productorii de calculatoare.

    Adevratul succesor al lui 8086 a fost 80286, introdus n 1982. Magistrala de adrese de 24 de bii i permitea s adreseze o memorie de 16 MB i includea cteva posibiliti de protecie a memoriei. Primul procesor de 32 de bii, 80386, apare n 1986. Are o magistral de adrese de 32 de bii i o magistral de date tot de 32 de bii. Spaiul de memorie adresabil a crescut la 4 GB i a fost introdus mecanismul paginrii (vom prezenta detalii cu privire la acest aspect ceva mai trziu). Paginarea a permis un model liniar de memorie - spaiu liniar, continuu de adrese7 (modelul de memorie prezentat de noi n seciunea precedent) i prin el, posibilitatea portrii sistemelor de operare din familia Unix pe arhitecturi Intel.

    Intel 80486 apare n 1989 ca variant mbuntit a lui 80386. Pentru prima dat un procesor Intel ncorpora unitatea de calcul aritmetic n virgul mobil (d posibilitatea efecturii operaiilor cu numere reale). Pn atunci, unitatea de calcul n virgul mobil era prezent sub forma unui coprocesor extern. 80486 dispune i de alte mbuntiri tehnologice: unitile de decodificare i execuie a instruciunilor cu capacitate de lucru n paralel, 8 kB L1 cache, prezena unui cache L2. Versiunile ulterioare includ tehnologii de economisire a consumului de energie (power saving), utile n special laptop-urilor.

    Pentium/Pentium Pro aduc foarte puine elemente noi. n principal mresc viteza de execuie.

    Pentium MMX aduce suport MMX (MultiMedia eXtensions) - instruciuni ce mresc viteza operaiilor grafice.

    Pentium II este un Pentium Pro cu suport MMX. Pentium III, n esen un Pentium II mai rapid, introduce arhitectura SIMD (Single Instruction Multiple Data) pentru execuia concurent a mai multor operaii n virgul mobil.

    7Adresele pornesc de la zero i se succed, ntr-un mod liniar, fr goluri sau ntreruperi,

    pn la limita superioar impus de numrul total de bii dintr-o adres logic.

  • Pentium 4 mbuntete aceste caracteristici. Tot de la Pentium 4 apar primele modele de 64 de bii (arhitectur botezat iniial EMT64T). Pentium 4 a fost urmat de Pentium Xeon, Pentium II Xeon, Pentium Core, Celeron, Core Duo, Core 2 Duo, Core i3, Core i5, Core i7 i multe altele. Toate acestea au fost fabricate numai de Intel. Alte companii, n special AMD, au fabricat propriile procesoare compatibile cu cele produse de Intel.

    Arhitectura n capitolele precedente am afirmat c programarea n asamblare necesit

    cunotine legate de procesor. Legate de se refer la ce face un procesor, spre deosebire de cum face un procesor. Perspectiva programatorului include, printre altele, numrul i tipul de registre, setul de coduri instruciune recunoscut, modul de adresare a memoriei, prezena sau lipsa unor uniti de uz special precum coprocesorul matematic (cu propriile instruciuni i registre). Toate aceste lucruri sunt definite de productor, iar definiiile, luate mpreun, formeaz arhitectura procesorului.

    The architecture, as I see it, is the high-level specs of the processor. This consists of the instructions set, memory structure, memory segmentation, register structure, I/O space, interrupt mechanism, instruction operands, memory addressing modes, and so on.

    Stephen Morse8 Cu timpul, arhitectura este mbogit cu noi instruciuni, registre sau alte

    caracteristici. De obicei, noile caracteristici nu modific modul de lucru anterior, ci adaug noi opiuni. Acest lucru asigur compatibilitatea noilor platforme cu programele scrise anterior (backward compatibility). Anterior nseamn c programe scrise pentru 8086 pot rula i astzi pe un Core i7. Cteodat, pe lng adugarea periodic de noi instruciuni, arhitecturile sufer schimbri mai importante. Am vzut c, n 1986, o dat cu apariia procesorului 80386, pe lng introducerea unor noi instruciuni i moduri de operare, Intel dubleaz capacitatea registrelor. Se fcea astfel trecerea la arhitectura de 32 de bii. Aceast arhitectur poart numele de IA-32 (i386, x86-32). Este arhitectura studiat de noi n aceast carte. n 2003, arhitectura x86 se extinde iari, de data aceasta la 64 de bii; noi instruciuni, noi moduri de operare, registre de capacitate dubl. Printele acesteia este principalul competitor Intel, AMD, care o numete AMD64. La acea dat, Intel lansase deja propria arhitectur de 64 de bii, numit IA-64 (Itanium), dar incompatibil cu precedentele procesoare x86 (set de instruciuni diferit de x86). Pentru c nu se bucur de foarte mult succes, compania Intel este nevoit s produc o familie de procesoare compatibil cu arhitectura i specificaiile AMD. Termenul generic pentru noua arhitectur de 64 de bii, compatibil cu x86, este x86-64.

    8 Printele arhitecturii microprocesorului Intel 8086.

  • Arhitectura x86-64 include arhitectura IA-32, care la rndul su include vechea arhitectur x86 de 16 bii. Totui, la proiectarea unei aplicaii, programatorul trebuie s tie care sunt procesoare compatibile cu instruciunile folosite. Aplicaia nu va rula pe procesoarele dinaintea apariiei instruciunilor respective.

    Microarhitectura Problemele ridicate de pstrarea compatibilitii cu programele dezvoltate anterior limiteaz creterea performanelor prin mijloacele arhitecturii. Dou din cele mai importante criterii de performan constau n numrul total de instruciuni pe care un procesor este capabil s l execute ntr-un anumit interval de timp (throughput) i consumul de energie. Numrul de instrucini pe unitate de timp trebuie s fie ct mai mare (vitez de procesare mai mare), iar consumul de energie ct mai mic. n cazul celui din urm, motivul este mai subtil. O bun parte din energia utilizat de procesor se pierde sub form de cldur; aceste pierderi, dac nu sunt minimizate, pot leza procesorul i componentele din vecintate. Proiectanii caut ntotdeauna soluii care s permit efectuarea acelorai sarcini cu consum mai mic de energie. Unele din acestea permit procesorului s intre n starea de repaus (stand-by) n momentele n care nu este folosit.

    Puterea de procesare a crescut prin dezvoltarea unor mecanisme precum citirea anticipat a instruciunilor (prefetching), execuie n benzi de prelucrare (pipelining), execuia paralel (hyper threading), predicia salturilor (branch prediction), execuia speculativ, memorii intermediare L1 i L2 (cache), i multe altele. Unele tehnici reduc sau elimin blocajele din interiorul procesorului, astfel nct acesta s lucreze permanent (aici, un rol important l are mecanismul de lucru cu memoria), altele permit procesorului s execute mai multe instruciuni n acelai timp. mpreun, aceste mecanisme fizice prin care procesorul ndeplinete operaiile codificate n instruciuni, formeaz microarhitectura procesorului. n vederea creterii performanelor, Intel i AMD reproiecteaz constant microarhitecturile procesoarelor. n acest context se nscriu i eforturile de mbuntire a tehnicilor de fabricaie a pastilelor de siliciu, tehnici ce permit creterea numrului de tranzistoare plasate pe un singur cip. Toate numele exotice, NetBurst, Core, Nehalem, Sandy Bridge, Ivy Bridge, indic modificri aprute n microarhitectur.

    2.2.2. Structura de principiu a procesorului

    n aceast seciune detaliem modul n care programatorul vede structura procesorului i modul n care procesorul interacioneaz cu memoria principal. Figura 2.4 prezint schema bloc general a unui procesor. Unitile sunt conectate prin magistrale interne. Reinei c aceasta este o diagram extrem de simplificat. Procesoarele reale sunt mult mai complexe, dar conceptele generale discutate n acest capitol se aplic tuturor.

  • Indicatorul de instruciune

    Registrul de instruciune

    Unitatea de control

    Registrul indicatorilor de stare

    Memorie L1 Cache

    Registre

    Interfaa cu magistralele

    Unitatea Aritmetic i

    Logic

    ctre magistralele de adrese, date i control

    Figura 2.4 Structura general a unui procesor

    n continuare descriem pe scurt fiecare unitate n parte. Componentele de interes special pentru programator sunt prezentate pe larg puin mai trziu.

    Unitatea de interfa cu magistrala Unitatea de interfa cu magistrala de sistem este mijlocul prin care procesorul comunic cu restul componentelor din sistem memorie i dispozitive de intrare/ieire. Unitatea conine circuite ce permit plasarea adreselor pe magistrala de adrese, plasarea semnalelor de citire i scriere pe magistrala de control, citirea i scrierea datelor pe magistrala de date. De obicei, unitatea de interfa cu magistrala este conectat la uniti externe de control al magistralelor, care, la rndul lor, sunt conectate la memorie sau la diferite dispozitive I/O (de ex., SATA, PCI-E, etc.). Pentru programator, aceste unitile externe de control sunt invizibile.

    Unitatea de management a memoriei ncepnd cu procesoarele de 16 bii apare noiunea de adres logic.

    Adresele generate de sistemul de operare sunt considerate adrese logice i totalitatea acestora formeaz spaiul de adrese logice. Aceste noiuni constrasteaz cu cele de adres fizic (aflat pe magistrala de adrese) i spaiu de adrese fizice discutate n seciunea dedicat memoriei principale. Din punct de vedere al

  • numrului de adrese, cele dou spaii, al adreselor fizice i logice, pot fi egale sau inegale. Ca urmare, procesorul trebuie s dispun de un mecanism de conversie a adreselor (un mecanism de translatare a adreselor logice n adrese fizice). La procesoarele Intel x86 mecanismul de translatare este inclus pe acelai substrat de siliciu cu microprocesorul. Datorit mecanismului de translatare a adreselor, modul de organizare al memoriei poate fi definit prin software, de ctre sistemul de operare. Dac procesorul permite adresarea liniar a ntregului spaiu de adrese fizice (adresele fizice ncep de la 0 i avanseaz liniar), atunci i sistemul de operare poate organiza memoria ca structur liniar (adresele logice ncep de la 0 i avanseaz liniar). Pe de alt parte, atunci cnd procesorul poate adresa liniar numai anumite segmente de memorie, segmente cu lungimi mai mici dect capacitatea total a memoriei, vorbim de organizare segmentat. n acest caz, spaiul de adrese logice este mprit n mai multe spaii cu adresare liniar, fiecare de lungime diferit, i o adres logic este calculat ca sum ntre adresa de nceput a unui segment (adresa de nceput a unui bloc de memorie) i un deplasament n cadrul acestuia.

    Memorii intermediare Cnd procesorul are nevoie de informaii aflate n memoria principal trimite ctre unitatea de management a memoriei o cerere de citire memorie. Unitatea de management a memoriei trimite cererea respectiv la memorie i, atunci cnd informaia se afl pe magistrala de date, anun procesorul. Lungimea ntregului ciclu procesor, controler de memorie, memorie, (napoi la) procesor -, variaz n funcie de viteza memoriei i a magistralei de date. Aadar, o memorie cu timp de acces mai mic contribuie semnificativ la performana sistemului.

    Performana memoriei este cuantificat prin intermediul a doi parametrii: timpul de acces - perioada de timp necesar memoriei s extrag datele din locaia adresat, i timpul unui ciclu la memorie - timpul minim ntre dou operaii succesive de acces la memorie. Totui, viteza de lucru a memoriei i eforturile de cretere a acesteia reprezint numai o faet a problemei. Timpul necesar datelor i intruciunilor s parcurg traseul dintre memorie i procesor este mult mai mare dect timpul consumat de procesor pentru prelucrarea acestora (acest fenomen se numete trangulare von Neumann). De aceea, ntre procesor i memoria principal a fost introdus o memorie intermediar, numit cache. Memoria cache este o memorie foarte rapid, de mici dimensiuni (tipic, mai puin de 1MB), plasat foarte aproape de procesor. Este proiectat s pstreze datele i instruciunile solicitate frecvent de procesor. Pentru c preluarea datelor din cache are loc numai ntr-o fraciune din timpul necesar accesrii memoriei principale, prezena memoriei cache salveaz foarte mult timp. Principiul pe care se bazeaz mecanismul cache este regula 80/20, care spune c, din toate programele, informaiile i datele din calculator, aproximativ 20% sunt utilizate 80% din timp. n consecin, este foarte probabil ca datele i

  • instruciunile folosite de procesor la un moment dat s fie necesare din nou, la puin timp dup. Memoria cache este ca o list fierbinte (hot list) de instruciuni necesare procesorului. Unitatea de management a memoriei salveaz n cache fiecare instruciune solicitat de procesor; la o nou cerere similar, procesorul primete instruciunea din cache (cache hit). Totodat, acea instruciune avanseaz ctre partea superioar a listei. Atunci cnd memoria cache este plin i procesorul solicit o nou instruciune, sistemul suprascrie instruciunile care nu au fost utilizate de cea mai lung perioad de timp. Acest mecanism este valabil i pentru date. n acest fel, informaiile cu prioritate ridicat, folosite des, rmn n cache, n timp ce informaiile mai puin utilizate sunt eliminate. n prezent, memoriile cache sunt ncorporate chiar n cipul procesorului. Cum majoritatea procesoarelor conin mai multe nuclee de procesare, numite core-uri, n funcie de proximitatea sa fa de acestea, memoria cache are atribuit un nivel. Memoria cache cea mai aproape de un nucleu se numete cache de nivel 1 (L1), urmtorul nivel de cache este notat L2, apoi L3, .a.m.d.. De exemplu, un procesor Core i7 Quad dispune de 64 kB cache L1 (32 kB pentru instruciuni, 32 kB pentru date), 1 MB cache L2, ambele per nucleu, i de 8 MB cache L3, partajat ntre nuclee. Toate pe pastila procesorului. Totodat, majoritatea procesoarelor moderne folosesc dou memorii cache L1, una pentru date i una pentru instruciuni, n configuraie arhitectural tip Harvard. Conceptul de cache se aplic nu numai memoriei principale, ci i mediului de stocare. De exemplu, sistemul de operare poate folosi memoria principal ca memorie intermediar pentru disc. n acest caz, memoria principal nregistreaz cele mai recente date citite de procesor de pe disc sau stocheaz date ce vor fi scrise de procesor pe disc la un moment viitor. Reinem aadar c termenul cache se poate referi att la memorie ct i la alte tehnologii de stocare.

    Registre Unele instruciuni au nevoie ca datele prelucrate de acestea s fie memorate chiar n interiorul procesorului. Acest lucru se realizeaz prin intermediul unor locaii de memorie numite registre. Registrele sunt locaii de memorie volatil9 aflate n interiorul procesorului. Procesorul acceseaz mult mai rapid datele stocate n registre dect pe cele aflate n memoria principal sau cache. Pe de alt parte, numrul de registre este limitat. Dimensiunea registrelor, n bii, determin i arhitectura procesoarelor - procesoare de 16, 32 sau 64 de bii. n aceast carte ne referim la arhitectura procesoarelor Intel de 32 de bii - registrele interne au capacitatea de 4 octei.

    Indicatorul de instruciune Indicatorul de instruciune este registrul care memoreaz adresa urmtoarei

    9n lipsa unei surse de energie, informaiile sunt pierdute. Memoria RAM este tot o

    memorie volatil.

  • instruciuni din secvena de cod executat.

    Registrul de instruciune Instruciunile sunt simple abloane (pattern) de bii. Acest registru conine

    instruciunea executat n acel moment. Modelul su de bii determin unitatea de execuie s comande celorlalte uniti din procesor o anumit operaie. Odat ce aciunea a fost finalizat, biii instruciunii (biii prin care aceasta a fost codificat) din registrul de instruciune pot fi nlocuii i procesorul va efectua operaia specificat de biii noii instruciuni.

    Unitatea de execuie Biii din registrul de instruciune sunt decodificai de unitatea de execuie.

    Aceasta genereaz semnalele care comand celorlalte uniti din procesor efectuarea aciunilor specificate de instruciune. De obicei este implementat sub forma unei maini cu stri finite care conine decodoare, multiplexoare i alte circuite logice.

    Unitatea aritmetic i logic (ALU) ALU denot circuitele electronice care efectueaz operaii aritmetice i

    logice pe grupuri de bii de date.

    Registrul indicatorilor de stare Registrul indicatorilor de stare semnaleaz anumite evenimente aprute n

    cadrul operaiilor aritmetice i logice. De exemplu, operaia de adunare poate produce un transport. Un anumit bit din registrul indicatorilor de stare va fi setat n zero (nu exist transport) sau unu (exist transport) de fiecare dat cnd ALU a finalizat o astfel de operaie.

    2.2.3. Funcionarea procesorului

    Setul de instruciuni n idiom binar care poate fi executat de un procesor formeaz limbajul main al acelui tip de procesor. Instruciunile main sunt iruri de numere binare pe care procesorul le decodific i execut foarte rapid. Fiecare tip de procesor are propriul limbaj main. Din aceast cauz, programele scrise pentru procesoarele Intel x86 nu pot rula pe alte tipuri de procesoare (POWER, SPARC, Intel Itanium, ARM).

    Procesorul poate fi privit ca dispozitiv ce execut la nesfrit urmtorul proces:

    Extragere instruciune din memorie (fetch); Decodificare instruciune (decode); Execuie instruciune.

  • Acest proces este numit ciclu de extragere-decodificare-execuie sau, simplu, ciclu de execuie.

    Ciclu de execuie

    Extrage Decodific Execut Extrage Decodific Execut

    timp

    La primele procesoare, de exemplu 8080, etapele ciclului de execuie se

    realizau secvenial. ncepnd cu 80286, acestea sunt efectuate n paralel. n plus, fiecare microarhitectur nou adug diferite tehnici de eficientizare. Totui, din perspectiva programatorului, mecanismul prezentat aici este tot ce intereseaz. Extragerea unei instruciuni din memorie presupune plasarea adresei sale pe magistrala de adrese i activarea semnalului de citire pe magistrala de control (lucru care indic intenia de citire a locaiei respective). Dup iniierea cererii de citire procesorul ateapt apariia instruciunii pe magistrala de date. Decodificarea presupune identificarea instruciunii extrase. Pentru facilitarea acestui proces, instruciunile main folosesc o schem particular de codificare (un cod de operaie). Execuia instruciunii nseamn prelucrarea operaiei aritmetice sau logice. Execuia instruciunilor este sincronizat cu ajutorul unui generator de tact, numit ceas10. Generatorul de tact pulseaz la o frecven fix cunoscut sub numele de frecvena ceasului (dei se utilizeaz uzual i termenul de frecvena procesorului). Ceasul nu contorizeaz minute sau secunde, doar cicleaz la o frecven constant. Circuitele electronice din procesor folosesc aceast frecven pentru a executa operaiile corect, aa cum un dirijor dicteaz ritmul unei piese. Frecvena impulsurilor de tact determin viteza de execuie a instruciunilor. Fiecare ciclu de execuie a unei instruciuni poate fi descompus ntr-o serie de operaii elementare efectuate n paralel, pe durata unui singur impuls de tact (ciclu de tact). O asemenea operaie elementar (o singur prelucrare numeric a informaiei sau un transfer de date ntre procesor i memorie) se numete micro-operaie. Numrul de cicli de tact necesari execuiei unei instruciuni depinde att de instruciune ct i de modelul i generaia procesorului. O frecven mai mare nu nseamn neaprat i numr de operaii pe secund mai mare, depinde de arhitectura procesorului.

    2.2.4. Registrele procesorului

    Arhitectura IA-32 pune la dispoziia programatorului zece registre de 32 de bii i ase registre de 16 bii. Aceste registre sunt grupate n urmtoarele categorii: registre de uz general, registre de control i registre de segment. Registrele de uz general sunt la rndul lor mprite n registre de date, registre indicator i registre 10Generator electronic pilotat de un cristal de cuar, care asigur stabilitatea frecvenei la

    variaia tensiunii de alimentare i a temperaturii.

  • index.

    Registre de date

    32 de bii

    31 16

    15 8

    7 0

    16 bii

    EAX AH AL AX EBX BH BL BX ECX CH CL CX EDX DH DL DX

    Figura 2.5 Registre de date

    Arhitectura IA-32 pune la dispoziie patru registre de date de 32 de bii fiecare destinate operaiilor aritmetice i logice, dar nu numai. Aceste patru registre pot fi folosite dup cum urmeaz:

    4 registre de 32 de bii: EAX, EBX, ECX, EDX; sau 4 registre de 16 bii: AX, BX, CX, DX; sau 8 registre de 8 bii: AH, AL, BH, BL, CH, CL, DH, DL (H = High, L =

    Low).

    Registrele de date pot fi folosite fr constrngere n majoritatea instruciunilor aritmetice i logice. Totui, cnd sunt executate anumite instruciuni, unele registre din acest grup au funcii speciale. De exemplu, registrele EAX (AX), denumit acumulator, i EDX (DX), au rol prestabilit n instruciunile de nmulire, mprire i de transfer I/O. ECX (CX) este utilizat drept numrtor pentru operaiile de deplasare, rotaie, bucle, repetiii de instruciuni.

    Registre index i indicator

    31 16 15 0 ESI SI Source Index EDI DI Destination Index

    Figura 2.6 Registre index

    31 16 15 0

    ESP SP Stack Pointer EBP BP Base Pointer

    Figura 2.7 Registre indicator

    Arhitectura IA-32 nglobeaz dou registre index i dou registre indicator. Acestea pot fi folosite ca registre de 16 sau 32 de bii. Registrele index au rol principal n prelucrarea instruciunilor, dar pot fi folosite i ca registre de date. Registrele indicator sunt folosite n special pentru lucrul cu stiva.

  • Stiva este o zon din memoria principal organizat dup principiul LIFO (Last In First Out), folosit ca mijloc de depozitare a datelor temporare. Stivele sunt strict necesare n lucrul cu subprograme (proceduri i funcii), cnd registrele interne trebuie eliberate n vederea execuiei unei funcii care va suprascrie registrele cu propriile sale date. Eliberarea registrelor se face prin salvarea lor n stiv, ntr-o anumit ordine, i refacerea lor din stiv la revenirea n programul apelant.

    Registre de control

    31 16 15 0 EIP IP Instruction Pointer

    Figura 2.8 Indicatorul de instruciune

    Acest grup de registre const din dou registre de 32 de bii: registrul indicator de instruciune i registrul indicatorilor de stare. Procesorul folosete registrul indicator de instruciune ca s memoreze adresa urmtoarei instruciuni ce va intra n ciclul de execuie. Cteodat, acest registru este denumit registru contor de program. Registrul indicator de instruciune poate fi folosit ca registru de 16 (IP) sau 32 de bii (EIP), n funcie de mrimea adreselor. Cnd o instruciune este extras din memorie, registrul indicator de instruciune este reiniializat automat cu adresa urmtoarei instruciuni. Registrul poate fi modificat i de o instruciune care transfer controlul execuiei la alt locaie n program.

  • 31 16 15 0 0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF

    Valorile de de 0 i 1 n gri sunte rezervate Intel.

    Indicatori de stare Indicatori de control Indicatori de sistem

    CF = Carry Flag PF = Parity Flag AF = Auxiliary Carry Flag ZF = Zero Flag SF = Sign Flag OF = Overflow Flag

    DF = Direction Flag TF = Trap Flag IF = Interrupt Flag IOPL = I/O Privilege Level NT = Nested Task RF = Resume Flag VM = Virtual 8086 Mode AC = Alignment Check VIF = Virtual Interrupt Flag VIP = Virtual Interrrupt Pending ID = ID flag

  • Registrul indicatorilor de stare poate fi considerat ca fiind de 16 (FLAGS) sau 32 de bii (EFLAGS). Registrul FLAGS este folosit atunci cnd se execut cod compatibil 8086. Registrul EFLAGS conine 6 indicatori de stare, 1 indicator de control i 10 indicatori de sistem. Biii acestui registru pot fi setai (1 logic) sau nu (0 logic). Setul de instruciuni IA-32 conine instruciuni capabile s seteze sau s tearg valoarea unora dintre indicatori. De exemplu, instruciunea clc terge valoarea indicatorului de transport (Carry Flag), iar instruciunea stc o seteaz. Cei 6 indicatori de stare semnalizeaz un eveniment specific aprut n urma execuiei ultimei instruciuni aritmetice sau logice. De exemplu, dac o instruciune de scdere produce rezultat zero, procesorul seteaz automat indicatorul de zero, ZF (Zero Flag ia valoarea 1). Vom discuta n detaliu indicatorii de stare atunci cnd vom prezenta instruciunile aritmetice i logice. Aici mai amintim faptul c indicatorul de direcie (DF) se difereniaz de ceilali indicatori prezeni n registrul EFLAGS. Prin intermediul lui, programatorul poate specifica procesorului cum trebuie s judece anumite instruciuni; aadar, programatorul semnalizeaz ceva procesorului i nu invers. Rolul acestui indicator va fi discutat n detaliu n seciunea dedicat instruciunilor de operare pe iruri. Cei zece indicatori de sistem controleaz modul n care opereaz procesorul. De exemplu, setarea indicatorului de mod virtual, VM, foreaz procesorul s emuleze un 8086, iar posibilitatea setrii i tergerii indicatorului ID indic faptul c procesorul poate furniza programelor informaie cu privire la productorul procesorului, familia din care face parte, modelul, etc., prin intermediul instruciunii CPUID.

    2.2.5. ntreruperile

    Dispozitivele de intrare/ieire pun la dispoziia sistemelor de calcul mijloacele prin care acestea pot interaciona cu exteriorul. Un dispozitiv poate fi un dispozitiv de intrare (de ex., tastatura, mouse-ul), un dispozitv de ieire (de ex., imprimanta, monitorul), sau un dispozitiv de intrare i ieire (de ex., discul). Calculatoarele folosesc dispozitive de intrare/ieire, numite i periferice, din dou motive principale: s comunice cu exteriorul i s stocheze date. Dispozitive ca imprimanta, tastatura, modemurile, plcile de reea sunt folosite n comunicaia cu exteriorul, iar discul la stocarea informaiei. Dei scopurile sunt diferite, sistemul comunic cu aceste dispozitive prin intermediul aceleiai magistrale de sistem. Dispozitivele de intrare/ieire nu sunt conectate direct la magistrala de sistem; comunicaia dintre sistem i periferic este gestionat de un controler de intrare/ieire. Procesoarele acceseaz registrele interne ale controlerului de intrare/ieire prin porturile de intrare/ieire. Un port I/O reprezint adresa unui registru din

  • controlerul I/O. Procesoarele pot mapa porturile I/O la adrese de memorie, mecanism numit memory-mapped I/O, sau pot folosi un spaiu de adrese I/O separat de spaiul adreselor de memorie, tehnic numit isolated I/O.n primul caz, scrierea la un port I/O este similar cu scrierea ntr-o locaie de memorie. n al doilea caz, spaiul de adrese I/O este accesat cu ajutorul unor instruciuni speciale, numite instruciuni de intrare/ieire. Setul de instruciuni IA-32 furnizeaz dou astfel de instruciuni: IN i OUT. Instruciunea IN este folosit pentru citirea portului I/O, iar instruciunea OUT pentru scrierea portului I/O.

    Procesoarele pot folosi simultan ambele strategii. De exemplu, imprimanta i tastatura sunt mapate n spaiul de adrese I/O folosind strategia isolated I/O, iar monitorul este mapat la un set de adrese de memorie folosind strategia memory-mapped I/O. Arhitectura IA-32 pune la dispoziie un spaiu de adrese I/O de 64 kB. Acest spaiu de adrese poate fi folosit pentru porturi I/O de 8, 16 i 32 de bii. Totui, combinaia nu poate depi 64 kB. Sistemele de operare pun la dispoziia aplicaiilor i utilizatorilor rutine (secvene de instruciuni) de acces la dispozitivele I/O. Sistemele Linux i Windows implementeaz un set astfel de rutine. Pe lng acestea, se pot folosi i rutine prezente n BIOS. BIOS-ul este un soft rezident ntr-o memorie ROM aflat pe placa de baz i const dintr-o colecie de rutine care controleaz dispozitivele I/O.

    2.3. Exerciii

    2.1. Care este diferena ntre microarhitectura i arhitectura procesorului? 2.2. Descriei ciclul de execuie. 2.3. Ce rol are memoria princi