Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Arhitecturi de calculatoare
Curs
Structura de baza a computerelor
Un computer este o masina de calcul electronica rapida care accepta informatie digitala ca si intrari (input) pe care o proceseaza cu ajutorul unui program ce se afla stocat in memorie si produce o informatie rezultat de iesire (output).
1.1 Unitatile functionale ale unui computer.
Cuvantul computer cuprinde o larga varietate de masini, mult diferite in dimensiune, viteza, si pret. Se obisnuieste sa se foloseasca unele denumiri specifice pentru a desemna unele subclase de computere. Masinile mai mici sunt de obicei numite minicomputere, ceea ce este o reflectie a pretului lor scazut, a dimensiunilor mici, cat si a puterii lor de calcul reduse. Exemple de minicalculatoare : PDP11, Independent, etc. La inceputul anilor 70 a aparut un nou termen, acela de microcalculatoare, care se referea la un computer foarte mic, ieftin, si care continea doar cateva capsule de circuite integrate pe scara larga (VLSI). Exemple de microcomputere : Spectrum, Tim-S, IBM-PC, etc.
Computerele mari, numite si mainframes, sunt foarte diferite de cele din familiile de minicomputere si microcomputere atat ca dimensiune , ca putere de calcul, pret cat si ca complexitate si proiectare. Exemplu de mainframe : IBM S370/3031.
Cu toate aceste diferente care exista intre diversele categorii de computere, conceptele de baza sunt in esenta aceleasi pentru toate tipurile de computere, deoarece toate se bazeaza pe cateva idei bine definite si care sunt exemplificate in continuare.
In cea mai simpla forma a sa, un computer consta din cinci parti principale independente functional : intrare, memoria, aritmetica si logica, iesirea si unitatile de control, asa cum se arata in figura 1.1. Unitatea de intrare accepta informatia codificata de la operatorii umani, de la dispozitive electromagnetice, sau de la alte computere conectate la ea prin linii de comunicatie digitale. Informatia este stocata in memorie pentru a fi referita ulterior sau este tratata imediat de catre unitatea aritmetica si logica realizand operatia dorita. Pasii de procesare sunt determinati de un program ce se afla stocat in memorie. In final rezultatele sunt trimise inapoi in lumea exterioara cu ajutorul unitatii de iesire. Toate aceste actiuni sunt coordonate de catre unitatea de control. Diagrama din figura 1.1 nu contine si legaturile dintre diversele unitati functionale.
Aceste conexiuni exista, dar ele se pot realiza in mai multe moduri care se vor prezenta de-a lungul acestui curs. De asemenea se vor face referiri la un singur computer cand se vor prezenta principiile de baza, desi multe din sistemele moderne de calcul existente presupun un anumit numar de computere interconectate printr-o retea de comunicatie. Termenul folosit pentru un astfel de sistem este cel de calcul distribuit.
In mod traditional vom denumi unitatea de aritmetica si logica impreuna cu circuitele de control ca unitatea centrala de procesare (central processing unit CPU), sau simplu procesor. Cuvantul centrala este folosit pentru a indica faptul ca majoritatea functiilor dintr-un computer sunt centralizate intr-o singura unitate. Sistemele moderne contin mai multe procesoare, fiecare dintre ele avand sarcina realizarii unei functii particulare. Echipamentul de intrare si iesire este de obicei combinat sub numele de unitatea de intare/iesire (I/O). Aceasta a rezultat in urma faptului ca exista anumite echipamente care realizeaza ambele functii, numite terminale si care constau dintr-un monitor ca si iesire si o tastatura ca intrare, legatura cu computerul realizandu-se printr-un singur cablu. Trebuie sa subliniat faptul ca functiile de intrare/iesire sunt separate in interiorul terminalului, in asa fel incat computerul vede doua dispozitive distincte, chiar daca utilizatorul uman le vede ca facand parte din aceeasi cutie constructiva.
Informatia introdusa intr-un computer este impartita de obicei in doua tipuri : date si instructiuni. Instructiunile sunt comenzi explicite care :
guverneaza transferul de informatie intr-un computer, cat si transferul dintre computer si dispozitivele de intrare/iesire.
specifica operatiile aritmetice si logice care trebuie realizate.
Un set de instructiuni care realizeaza un anumit scop se numeste program. Principalul mod de rulare a unui program este stocarea acestuia (sau a mai multor programe ) in memorie, dupa care procesorul citeste instructiunile din cadrul programului din memorie si executa operatiile adecvate fiecarei instructiuni. Instructiunile se executa in mod secvential in ordinea in care sunt stocate in memorie, desi pot sa existe deviatii de la aceasta ordine. In acest mod, comportamentul unui computer este sub controlul complet al programului memorat, cu exceptia posibilitatii unei intreruperi de catre utilizator cu ajutorul dispozitivelor digitale conectate la computer.
Datele sunt numere si caractere codificate care sunt folosite ca si operanzi de catre instructiuni. Notiunea de data se foloseste pentru a simboliza orice informatie digitala, de exemplu un intreg program ( adica un set de instructiuni ) poate fi considerat ca si date pentru a fi procesate de catre un alt program. Un astfel de exemplu este procedura de compilare cand unui program numit compilator i se furnizeaza ca si date sursele scrise in limbaj de nivel inalt ale unui alt program pentru a le converti in date si limbaj masina.
Informatiile pe care un computer poate sa le trateze trebuie sa fie codificate intr-un anumit format. Datorita limitarilor tehnologice, hardware-ul existent fiind realizat cu circuite electronice digitale ce pot avea doar doua stari ,0 si 1, se foloseste codificarea binara. Astfel, fiecare numar, caracter, text, sau instructiune este codificat intr-un sir de numere binare numiti biti, fiecare bit avand una din cele doua valori posibile :0 sau 1. Numerele sunt de obicei reprezentate de corespondentul lor binar, dar pot fi codificate intr-o reprezentare numita zecimal codificat binar (BCD) unde fiecare cifra zecimala este codificata pe 4 biti. Caracterele alfanumerice pot fi exprimate in mai multe coduri binare. Doua dintre cele mai utilizate astfel de coduri binare sunt ASCII (American Standard Code for Information Interchange) unde fiecare caracter este reprezentat pe un cod de 7 biti, respectiv EBCDIC (Extended Binary-Coded Decimal Interchange Code) in care se folosesc 8 biti pentru a reprezenta un caracter.
Unitatea de intrare. Computerele accepta informatii codificate prin intermediul unitatilor de intrare, care constau din dispozitive capabile de a citi astfel de date. Cel mai simplu astfel de dispozitiv este tastatura. O tastatura este astfel conceputa incat in momentul in care o tasta este eliberata, litera sau cifra corespunzatoare este automat tradusa in codul adecvat, care dupa aceea va fi trimis direct ori memoriei ori procesorului. Exista o gama larga de alte dispozitive de intrare cum ar fi : creioane optice, joystic-uri, mouse-uri, sau trackball-uri. Acestea sunt de obicei dispozitive de intrare grafice in timp ce tastaturile sunt dispozitive de intrare text.
Unitatea de memorie. Unica functie a memoriei este de a stoca programe si date. Aceasta functie de memorare poate fi realizata de o larga varietate de dispozitive. De obicei memoria se imparte in doua mari clase ce contin memoria principala si cea secundara.
Memoria principala, este o memorie rapida capabila sa opereze la viteze electronice, in care programele si datele sunt stocate pe timpul executiei lor. Memoria principala contine un mare numar de celule semiconductoare de stocare, fiecare capabila sa memoreze un singur bit de informatie. Aceste celule sunt rareori scrise sau citite ca si celule individuale. Ele sunt de obicei organizate in grupuri de dimensiune fixa numite cuvinte (words). Memoria principala este astfel organizata incat continutul unui cuvant, ce contine n biti, poate fi citit sau scris printr-o singura operatie de baza. Pentru a permite un acces usor catre oricare din cuvintele din memoria principala, este necesar sa se asocieze un nume distinct fiecarei locatii de cuvant din memorie. Aceste nume sunt numere care identifica locatii succesive, si care sunt cunoscute sub numele de adrese. Un anumit cuvant este accesat specificandu-i adresa si generand comanda necesara care sa inceapa citirea sau scrierea lui.
Numarul de biti din fiecare cuvant reprezinta lungimea cuvantului unui computer dat. Calculatoarele mari au cuvinte de 64 sau mai multi biti, in timp ce microcomputerele sau minicomputerele au cuvinte intre 8 si 64 de biti. Datele sunt de obicei manipulate in cuvinte, multiplii de cuvinte sau submultipli de cuvinte. Un acces tipic la memorie consta in citirea unei date de lungimea unui cuvant sau din scrierea ei. Instructiunile si datele pot fi scrise si citite din memorie sub controlul procesorului. Este foarte important sa se poata accesa orice locatie de cuvant din memorie cat mai repede posibil. Memoriile in care orice locatie poate fi accesata prin specificarea unei adrese sunt numite memorii cu acces aleator sau RAM (random access memories). Timpul necesar pentru accesarea unui cuvant este numit timp de acces. Acesta este un timp fix, de obicei are valoarea intre 60-70 ns pentru majoritatea computerelor moderne. Desi memoria principala este esentiala, ea este insa volatila si scumpa, astfel ca pentru stocari mari de informatii permanente sau temporare se folosesc memorii secundare. Din aceasta categorie fac parte discurile magnetice, benzile magnetice, discurile optice etc.
Unitatea aritmetica si logica. Executia majoritatii operatiilor dintr-un computer are loc in cadrul unitatii aritmetice si logice (ALU). Sa consideram un exemplu tipic de adunare a doua numere ce se afla in memoria principala. Aceste numere sunt aduse in unitatea aritmetica unde adunarea va avea fizic loc dupa care suma poate fi stocata in memorie.
In mod similar, oricare alta operatie aritmetica sau logica (de exemplu inmultirea, impartirea sau compararea numerelor) este realizata prin aducerea operanzilor necesari in ALU, unde operatia necesara va avea loc. Trebuie subliniat faptul ca nu toti operanzii necesari unei operatii se afla obligatoriu in memoria principala, deoarece procesoarele contin in mod normal un anumit numar de elemente de memorare ultra rapide numite registri, care pot fi folositi pentru stocare temporara a operanzilor folositi foarte des. Fiecare astfel de registru poate stoca un singur cuvant de date. Timpul de acces la registri este de obicei de 5-10 ori mai mare decat cel la memoria principala.
Unitatile aritmetice si logice sunt mult mai rapide decat alte dispozitive conectate la sistem. Ca urmare este posibil sa se proiecteze structuri relativ complicate de computere care sa contina un numar de dispozitive externe controlate de un singur procesor. Aceste dispozitive pot fi placi grafice, discuri magnetice, senzori, tastaturi, monitoare, placi multimedia etc.
Unitatea de iesire. Aceasta unitate este inversul unitatii de intrare. Functia ei este de a returna rezultatele in lumea exterioara. Cele mai utilizate dispozitive de iesire sunt monitoarele, imprimantele si plotterele.
Unitatea de control. Unitatile descrise pana acum asigura functiile necesare pentru stocarea si procesarea informatiei. Operatiile realizate de acestea trebuie coordonate intr-un mod organizat, iar acest coordonator este unitatea de control.
O imprimanta va tiparii un anumit caracter doar daca i se comanda special acest lucru. Aceasta este de obicei rezultatul unei instructiuni Out executata de catre procesor. Procesarea acestei instructiuni consta in trimiterea de semnale de sincronizare catre si de la imprimanta, functie pe care o indeplineste unitatea de control.
Se poate spune, in general, ca transferurile de tip I/O sunt controlate de instructiuni software care identifica dispozitivele implicate si tipul transferului. Cu toate acestea, semnalele de sincronizare care guverneaza transferul pe timpul executiei sunt generate de circuitele de control. Transferurile de date intre procesor si memorie sunt controlate intr-o maniera similara de catre unitatea de control.
In mod teoretic ne vom imagina unitatea de control ca pe o unitate distincta din punct de vedere fizic care interactioneaza intr-un anume fel cu restul sistemul. In practica insa majoritatea circuitelor de control sunt fizic distribuite peste tot in sistem. Exista un numar foarte mare de linii (trasee) care transmit semnale utilizate in sincronizarea diferitelor evenimente din cadrul tuturor unitatilor.
Ca si concluzie, operatiile pe care le efectueaza un computer pot fi rezumate la urmatoarele:
Primeste informatiile (programe sau date) printr-o unitate de intrare si le transfera in memorie.
Informatia stocata in memorie este procesata, sub controlul unui program, intr-un procesor.
Informatia procesata paraseste computerul prin unitatea de iesire.
Toate activitatile din interiorul computerului sunt dirijate de catre unitatea de control.
1.2 Concepte operationale de baza.
In subcapitolul precedent s-a subliniat faptul ca activitatea din cadrul unui computer este guvernata cu ajutorul instructiunilor. Pentru a realiza o anumita sarcina, un program ce consta dintr-un set de instructiuni, special conceput in acest scop, este stocat in memorie. Instructiunile sunt aduse una cate una din memorie in procesor, care le executa. Impreuna cu instructiunile este necesar sa se foloseasca date si operanzi, care sunt de asemenea stocate in memorie. O instructiune tipica poate sa fie de forma
Add LOC,R0
care aduna operandul de la locatia de memorie LOC cu operandul aflat in registrul de procesor R0, si pune suma rezultata in registrul R0. Aceasta instructiune necesita mai multi pasi pentru a fi executata. In primul rand instructiunea este transferata din memorie in procesor. Dupa aceea, operandul de la adresa LOC trebuie incarcat si el in procesor. Acest operand este adunat la continutul lui R0 si in final, suma rezultata este stocata in registrul R0.
Transferul dintre memorie si procesor incepe prin trimiterea adresei locatiei de memorie ce va trebui accesata unitatii de memorie si transmiterea semnalelor de control adecvate. Dupa aceasta datele se transfera din sau catre memorie. Figura 1.2 prezinta cum pot fi realizate conexiunile dintre procesor si memorie. Pe langa aceste legaturi se mai prezinta in figura cateva detalii ale procesorului care nu au fost discutate inca, dar care sunt esentiale din punct de vedere al operatiei. Interconectarile dintre acestea nu sunt prezentate explicit pentru ca in acest punct nu ne intereseaza decat caracteristicile lor functionale.
Procesorul contine circuitele aritmetice si logice ca si circuitele principale de procesare. Pe langa acestea el mai contine si un anumit numar de registri folositi pentru stocarea temporara a unor date. Doua dintre registre sunt de interes pentru noi in acest punct: registrul instructiunii (IR) care contine instructiunea care se executa si contorul programului (PC) care tine minte pozitia curenta in cadrul executiei programului. Iesirea primului este la dispozitia circuitelor de control, care decodifica instructiunea si genereaza semnalele de sincronizare pentru controlul circuitelor necesare executarii ei. Cel de-al doilea contine adresa de memorie a instructiuni curente care se executa. In timpul executiei instructiunii curente, continutul PC-ului este modificat in asa fel incat el sa corespunda adresei instructiunii urmatoare.
Pe langa IR si PC mai exista un numar de alti registri, numiti registri de uz general. Mai exista inca doi registri care faciliteaza lucrul cu memoria principala. Acestia sunt registri MAR si MDR. Primul contine adresa locatiei de memorie cu care va avea loc transferul de date, iar cel de-al doilea va contine data care s-a citit sau care se va scrie la acea adresa.
Se vor considera in continuare cativa pasi de operare tipici. Programele se afla in memoria principala si au ajuns acolo prin unitatea de intrare. Executia unui program incepe stocand in registrul PC adresa primei instructiuni a programului. Continutul PC-ului este transferat in registrul MAR si un semnal de control de citire este trimis memoriei. Dupa un anumit timp specific accesului la memorie, cuvantul adresat (in acest caz prima instructiune a programului nostru) este citit din memorie si incarcat in MDR. Dupa aceasta operatie continutul lui MDR este transferat in IR, moment in care instructiunea este gata pentru a fi decodata si executata.
Daca mai departe instructiunea implica o operatie care sa fie executata de catre ALU, va fi necesar sa se obtina si operanzii necesari. Daca un operand se afla in memorie (el poate fi si intr-un registru general al procesorului), el va trebui adus din memorie trimitandu-i adresa in MAR si initiind un ciclu de citire. Dupa ce operandul este citit din memorie in MDR, el poate fi transferat din MDR in ALU. Citind cativa astfel de operanzi din memorie, ALU poate executa operatia dorita. Daca rezultatul acestei operatii trebuie stocat in memorie, el trebuie trimis in MDR. Adresa locatiei de memorie unde trebuie stocat rezultatul este trimisa in MAR si este initiat un ciclu de scriere. Intre timp, continutul lui PC este incrementat ca sa indice spre instructiunea urmatoare care trebuie executata. Astfel, in momentul in care executia instructiunii curente este terminata, o noua citire de instructiune poate fi comandata. Pe langa transferurile de date intre memorie si procesor, mai este necesar ca un procesor sa poata accepta date de la dispozitive de intrare cat si sa poata trimite date catre dispozitive de iesire. Astfel, trebuie sa existe anumite instructiuni care sa permita acest transfer cu dispozitivele I/O.
Executia normala a unui program poate fi intrerupta uneori. Aceasta se intampla de obicei in momentul in care anumite dispozitive necesita tratarea lor urgenta. De exemplu, daca un dispozitiv de monitorizare din cadrul unui proces industrial controlat de un computer a detectat o conditie de lucru periculoasa. Pentru a putea trata astfel de cazuri suficient de repede, desfasurarea normala a programului care se executa in momentul respectiv de catre procesor trebuie intrerupta. Pentru a realiza acest lucru dispozitivul va activa un semnal de intrerupere. O intrerupere este o cerere din partea unui dispozitiv I/O pentru a se executa o anumita rutina de tratare a intreruperii de catre procesor. Deoarece astfel de diversiuni modifica starea interna a procesorului, este necesar ca starea lui interna sa fie salvata in memoria principala inainte ca tratarea intreruperii sa aiba loc. Aceasta presupune de obicei salvarea continutului PC-ului, a registrilor generali, si a unor informatii de control. Dupa terminare rutinei de tratare a intreruperii , starea procesorului este restaurata, astfel incat, executia programului intrerupt poate fi reluata.
1.3 Structuri de magistrale.
Pana acum s-au discutat doar caracteristicile functionale ale partilor individuale care constituie un computer. Pentru a forma un sistem operational aceste parti trebuie conectate impreuna intr-un ansamblu bine organizat. Exista nenumarate astfel de moduri de conectare dintre care se vor prezenta in continuare trei dintre cele mai des folosite.
Pentru ca un computer sa obtina o viteza de operare rezonabila, el trebuie organizat in mod paralel. Aceasta inseamna ca toate unitatile pot trata un cuvant intreg de date la un anumit timp si faptul ca transferurile de date dintre unitati sunt realizate in mod paralel, ceea ce inseamna ca un numar foarte mare de linii sunt necesare pentru a realiza conexiunile necesare. O grupare de astfel de linii, care au ceva in comun, este numita magistrala. Pe langa liniile care transporta date, este esential sa existe si cateva linii pentru adresare si control.
In figura 1.3 este prezentata cea mai simpla forma de computer structurat pe doua magistrale. Procesorul interactioneaza cu memoria prin magistrala de memorie. Functiile de I/O sunt tratate prin magistrala de I/O astfel ca datele trec prin procesor pentru a ajunge la memorie. In astfel de configuratii transferurile I/O se desfasoara sub directul control al procesorului, care initiaza transferul si monitorizeaza intreaga desfasurare.
O versiune putin modificata a unei structuri cu doua magistrale este prezentata in figura 1.4. Pozitiile relative ale procesorului si memoriei sunt schimbate. Si de aceasta data exista o magistrala de memorie intre cele doua.
La aceasta noua structura transferurile de I/O sunt efectuate direct in sau din memorie (DMA). Deoarece memoria nu are circuitele necesare pentru a controla un astfel de transfer va trebui sa se realizeze un alt mecanism de control. O tehnica standard este aceea de-a introduce canale de I/O ca parte componenta a echipamentului de I/O. Un astfel de canal de I/O este capabil sa controleze un astfel de transfer. De fapt el este un procesor specializat numit si procesor periferic. O procedura tipica de transfer pe astfel de structuri este initiata de catre procesor care transfera informatia necesara canalului de I/O, care va prelua apoi controlul pentru efectuarea transferului.
S-a mentionat deja faptul ca o magistrala consta dintr-o grupare de linii, care servesc mai multor scopuri. Exista trei seturi mari de linii: date, adrese si control. Liniile de date transporta asa cum le spune si numele date, si in consecinta numarul lor este egal cu numarul de biti dintr-un cuvant. Pentru a accesa date din memorie liniile de adresa indica locatia acelei date. Liniile de control sunt utilizate pentru a indica directia transferului de date si pentru a coordona sincronizarea evenimentelor in timpul transferului.
Majoritatea calculatoare au cateva magistrale distincte, putand fi numite sisteme multi-magistrala, totusi, si functionarea acestora este similara cu una dintre cele doua structuri cu doua magistrale prezentate, deoarece magistralele introduse in plus au rol doar pentru cresterea vitezei datorata unui paralelism mai evoluat.
O structura mult diferita de cele prezentate pana acum este aceea cu o singura magistrala, prezentata in figura 1.5.
Toate unitatile fiind conectate la aceasta magistrala, si deoarece nu se poate realiza decat un transfer la un moment dat, rezulta ca doar doua unitati pot sa foloseasca magistrala simultan. Liniile de control ale magistralei sunt folosite pentru arbitrarea cererilor de utilizare a magistralei. Marile avantaje ale structurii cu o singura magistrala sunt pretul de cost redus si flexibilitatea in atasarea dispozitivelor periferice iar dezavantajul este viteza de lucru redusa.
Diferentele de tip de structura de magistrale au efect pronuntat asupra performantelor computerelor dar, totusi, din punct de vedere conceptual (cel putin la acest nivel de detaliu) aceste diferente nu sunt esentiale in descrierea functionarii calculatorului.
Transferul informatiei pe magistrala nu poate fi realizat, in general, la o viteza comparabila cu a tuturor dispozitivelor conectate la o magistrala, deoarece unele dispozitive electromagnetice sunt relativ lente, de exemplu imprimantele, altele sunt mai rapide, cum ar fi discurile magnetice, dar nici acestea nu se compara cu viteza memoriei si a procesoarelor care sunt cele mai rapide componente ale unui computer. Deoarece toate aceste dispozitive trebuie sa comunice intre ele prin magistrala, este necesar sa se asigure un mecanism eficient de transfer care sa nu fie constrans de dispozitivele lente si care sa elimine aceste diferente.
O abordare curenta a acestei probleme este introducerea de bufere in dispozitive pentru a memora informatia pe timpul transferului. Pentru a exemplifica aceasta tehnica, se considera transferul unui caracter codificat de la procesor la o imprimanta pentru a fi tiparit. Procesorul realizeaza transferul trimitand caracterul pe magistrala catre buferul imprimantei. Deoarece buferul este un registru electronic, acest transfer necesita foarte putin timp. Odata ce buferul a fost incarcat, imprimanta poate sa tipareasca caracterul fara interventia ulterioara a procesorului. In acest timp magistrala si procesorul sunt libere si pot fi utilizate pentru alte aplicatii. Imprimanta, atata timp cat tipareste caracterul nu este disponibila pentru un alt transfer. Ca si concluzie, rezulta ca buferele previn blocarea procesoarelor rapide pe timpul transferurilor de date de tip I/O, permitandu-le acestora sa gestioneze si alte dispozitive si procese in acest timp.
Moduri de adresare si secventa programului masina.
Acest capitol va trata modul in care sunt executate programele intr-un computer. Se vor prezenta modurile in care secventele de instructiuni sunt aduse si executate din memorie in procesor pentru a realiza un anumit scop. Majoritatea instructiunilor specifica operatii care trebuie executate asupra datelor localizate fie in memorie, fie in registri generali ai procesorului. Ne vom referii la astfel de date, fie ca sunt de tip numeric sau caracter, ca si operanzi ai acestor instructiuni.
Tehnicile care se folosesc in mod normal pentru adresarea memoriei principale si a registrilor procesorului se vor discuta in general, folosind insa adresarea ce este implementata in calculatoarele IBM-PC. Acest computer este folosit si pentru a ilustra formatul instructiunilor, rularea programului, intrarile si iesirile din subrutine, ca si manipularea stivei. Se vor descrie mai multe programe la nivel de limbaj de asamblare pentru a ilustra principiile de baza exemplificate.
2.1 Locatii de memorie, adrese, si codificarea informatiei.
Memoria principala consta dintr-un numar foarte mare de celule de memorare, fiecare celula putand stoca un singur bit ce poate avea valoarea 0 sau 1. Deoarece 1 bit reprezinta o cantitate foarte mica de informatie, bitii sunt tratati foarte rar in mod individual.
Cea mai folosita metoda este cea in care biti sunt tratati in grupuri de dimensiune fixa. In acest scop memoria este organizata in asa fel incat un grup de n biti pot fi scrisi sau cititi printr-o singura operatie de baza. Fiecare grup de n biti este referit ca un cuvant de informatie, iar n este numit lungimea cuvantului.
Pentru a accesa memoria in scopul citirii sau scrierii unui singur cuvant de informatie, este necesar sa existe nume distincte (adrese) pentru fiecare locatie de cuvant. Se obisnuieste sa se foloseasca numere de la 0 la M-1 ca si adrese ale locatiilor succesive dintr-o memorie ce contine M cuvinte, asa cum este prezentat in figura 2.1.
Continutul locatiilor de memorie reprezinta fie instructiuni fie operanzi. Acestia din urma pot fi numere sau caractere. Figura 2.2a ilustreaza cel mai direct mod in care un numar intreg de 16 biti poate fi reprezentat intr-o locatie de memorie.
Bitul cel mai din stanga, b15, este numit bit de semn. El este 0 pentru numere pozitive si 1 pentru numere negative. Magnitudinea numarului este determinata de bitii b14 pana la b0 cu ajutorul formulei:
magnitudinea = b14 * 214+ . +b1*21+b0*20
Cea mai mare magnitudine in acest mod de reprezentare este 215-1=32767.
Aceasta reprezentare poarta numele de reprezentarea cu semn si magnitudine. Mai exista si alte doua reprezentari binare ale numerelor care se utilizeaza frecvent. Acestea sunt reprezentarea in complement fata de 1 si in complement fata de 2. In amandoua din aceste moduri, reprezentarea numerele pozitive este aceeasi cu cea prezentata anterior. Diferenta dintre cele trei metode este in modul in care sunt reprezentate numerele negative. Cu toate acestea, in toate cele trei scheme, bitul cel mai din stanga, in cazul de fata b15, este bitul de semn, si interpretarea lui este aceeasi: 0 pentru numerele pozitive si 1 pentru cele negative.
Alegerea modului de reprezentare are o influenta directa asupra facilitatii implementarii operatiilor aritmetice de catre circuitele logice din interiorul procesorului. Ca si observatie, complementul fata de 2 este implementarea cea mai apropiata de facilitatile hardware.
In acest capitol, se va folosi reprezentarea zecimala cu semn si magnitudine pentru exemplele numerice. Desigur ca, in calculator aceste valori sunt reprezentate in modele binare bazate pe una dintre cele trei scheme prezentate mai sus. Singurul detaliu tehnic legat de reprezentarea binara de care este nevoie in acest capitol este faptul ca bitul de semn este intotdeauna cel mai din stanga bit. Acest lucru este valabil pentru orice lungime a cuvantului calculatorului.
In paralel cu numere, computerele mai trebuie sa se poata descurca si cu caractere. Caracterele sunt folosite pentru a reprezenta literele alfabetului, digiti zecimali, semne de punctuatie, etc. Ele sunt reprezentate prin coduri lungi de 6 pana la 8 biti. Figura 2.2b indica cum pot fi stocate doua caractere ASCII sau EBCDIC intr-un cuvant de 16 biti.
Un cuvant de memorie poate sa contina si codul unei instructiuni. In acest caz o parte a cuvantului specifica operatia care trebuie realizata, iar alta parte specifica adresa operandului. Se obisnuieste sa se foloseasca numele de camp pentru aceste parti. Un exemplu al unui format al unei instructiuni pe 16 biti este prezentat in figura 2.2c. Campul operatiei fiind pe 4 biti poate sa codifice 24=16 instructiuni distincte, iar campul de adresa de 12 biti poate codifica adrese de la 0 pana la 212-1=4095.
In general nu se poate determina daca o locatie de memorie contine o instructiune sau un operand doar prin simpla examinare a continutului ei, deoarece o anume configuratie de biti poate fi interpretata ca oricare din cele trei configuratii prezentate in figura 2.2. Informatia aditionala necesara se afla in interiorul procesorului. Interpretarea unui anumit cuvant depinde de starea sau modul operatiei procesorului la momentul accesarii cuvantului din memorie. S-a mentionat in capitolul 1 existenta unui registru numit PC in interiorul procesorului. Toate cuvintele din memorie care sunt indicate de catre PC sunt interpretate ca si instructiuni. Cuvintele de memorie a caror adresa este specificata de catre instructiuni sunt interpretate ca si operanzi. Faptul ca un operand este caracter sau numar este determinat de catre campul operatiei din cadrul unei instructiuni.
Operatii in memoria principala.
Pentru a executa o instructiune, este necesar ca circuitele de control din procesor sa genereze transferul instructiunii din memorie in procesor. Mai este de asemenea necesar, sa se faca schimbul de operanzi si rezultate intre memorie si procesor. Astfel, in concluzie sunt necesare doua operatii de baza in lucrul cu memoria: Citirea (Read) si Scrierea (Write). Operatia de citire transfera continutul unei locatii specifice de memorie in procesor. Continutul locatiei de memorie ramane neschimbat in urma unei astfel de operatii. Pentru a initia o operatie de citire, procesorul trebuie sa trimita adresa locatiei dorite catre memorie.
Operatia de scriere transfera un cuvant de informatie de la procesor intr-o locatie de memorie. La fel ca si la operatia de citire, procesorul trebuie sa trimita adresa locatiei dorite catre memorie.
2.3 Formatul instructiunilor si secventa lor.
Un program tipic implica un anumit numar de pasi diferiti din punct de vedere functional ce trebuie parcursi. Este evident faptul ca trebuie sa existe diferite clase de instructiuni disponibile. O prima clasificare grosiera a instructiunilor este urmatoarea:
Transfer de date intre memorie si registri procesorului
Operatii aritmetice si logice asupra datelor
Secventa si controlul programului
Transfere de tip I/O
Se va incepe prezentarea posibilelor formate pentru instructiunile din primele doua clase. Operatia de adunarea doua numere este una din operatiile fundamentale ale oricarui calculator. Se va folosi o instructiune Add pentru a se ilustra unele variante de formate de instructiune. Din punctul de vedere al programatorului, cea mai simpla forma de adunare este C A + B, unde A, B si C sunt numele a trei variabile. Se va presupune ca aceste trei variabile se afla in locatii diferite de memorie. Se va asocia numele variabilelor A, B, C cu adresele acestor locatii. Expresia anterioara va primi acum urmatoarea semnificatie: operanzii din locatiile de memorie A si B sunt cititi din memorie si transferati in registri procesorului unde vor fi adunati de catre ALU, dupa care rezultatul sumei va fi memorat in locatia C.
Daca intregul proces trebuie specificat de catre o singura instructiune, va fi nevoie de trei campuri de adrese, care sa specifice pe A, B, C, impreuna cu campul operatiei care sa indice faptul ca avem de-a face cu o adunare. Aceasta instructiune cu trei adrese se poate reprezenta in mod simbolic in felul urmator:
Add C,B,A
Problema care apare in cazul acestei reprezentari este faptul ca necesita includerea a trei campuri de adresa in cadrul instructiunii ceea ce inseamna un numar foarte mare de biti pe cuvant. Daca A, B, C sunt adrese arbitrare in spatiul de memorie de la 0 la 2m-1, atunci sunt necesari m biti pentru a specifica fiecare adresa. Astfel, instructiunea trebuie sa contina 3m biti in scopuri de adresare, in plus fata de bitii necesari pentru a specifica tipul operatiei ce trebuie executata.
O alta metoda de a realiza calculul este folosirea unui camp de adresa implicit. Pentru aceasta se folosesc doar doua adrese. Daca ele se folosesc intr-o instructiune Add pentru a specifica doi operanzi A si B, va trebui sa existe o adresa implicita la care sa se puna rezultatul sumei. Multe calculatoare au instructiuni Add cu doua adrese care intorc rezultatul la adresa unuia dintre cei doi operanzi., astfel ca acel operand va fi distrus. Instructiunea:
Add B,A
realizeaza urmatoarea operatie B A + B. O singura instructiune Add cu doua adrese nu poate sa rezolve problema pusa , adica aceea de a aduna continutul locatiilor A si B si de a pune rezultatul in locatia C. Totusi, problema poate fi rezolvata cu folosind o alta instructiune cu doua adrese care sa mute continutul unei locatii de memorie in alta. Aceasta instructiune este:
Move C,B
si realizeaza operatia C B. Astfel, operatia C A + B poate fi efectuata prin executia urmatoarelor doua instructiuni:
Move C,B
Add C,A
Urmatoarea posibilitate ce se poate lua in considerare este folosirea unei instructiuni cu o singura adresa. Desigur ca, datorita faptului ca operatia de adunare implica doi operanzi, trebuie sa se faca o presupunere implicita asupra locului unde se afla unul dintre operanzi cat si asupra locului unde se va pune rezultatul. Un registru general al procesorului, numit de obicei acumulator, poate fi folosit in acest scop. Instructiunea:
Add A
semnifica adunarea locatiei de memorie A cu continutul acumulatorului si depunerea rezultatului in acumulator. Se mai introduc urmatoarele doua instructiuni cu o singura adresa:
Load A
Store A
Executia instructiunii Load copiaza continutul locatiei de memorie A in acumulator, iar executia instructiunii Store copiaza continutul acumulatorului in locatia de memorie A. Operatia C A + B poate fi realizata prin executia urmatoarei secvente de instructiuni:
Load A
Add B
Store C
Majoritatea calculatoarelor au un anumit numar de registri generali, fiecare putand fi folosit ca si acumulator. Daca exista 8 sau 16 registri, atunci 3 respectiv 4 biti vor fi necesari intr-un camp al unei instructiuni pentru a adresa registrul care sa faca parte din operatie. Acest numar de biti este considerabil mai mic decat cel necesar pentru a memora o adresa a unei locatii de memorie. Fie Ri un registru general al procesorului. Atunci instructiunile:
Load Ri,A
Store A,Ri
Add Ri,A
reprezinta generalizarea instructiunilor Load, Store si Add anterioare ale cazului cu un singur registru acumulator. In particular, executia instructiunii
Load Ri,A
copiaza continutul locatiei A in registrul Ri. Executia instructiunii:
Store A,Ri
copiaza continutul registrului Ri in locatia de memorie A, iar instructiunea:
Add Ri,A
aduna continutul locatiei de memorie A la continutul registrului Ri si pune rezultatul in Ri. Acest tip de instructiune, in care o adresa se refera la o locatie de memorie, iar cealalta mai scurta se refera intotdeauna la un registru al procesorului, are un format intermediar intre cel al instructiunilor cu o singura adresa si cel al instructiunilor cu doua adrese, fiind deseori numit format cu o adresa si jumatate. Calculatoarele care au mai multi registri de procesor, permit de asemenea si operatii intre registri. Astfel:
Add Ri,Rj
aduna continutul lui Rj cu continutul lui Ri iar rezultatul este depus in Ri.
Si calculatoarele care folosesc instructiuni cu doua campuri de adrese contin un anumit numar de registri generali. De obicei, registri imbunatatesc eficienta programului reducand numarul de accese la memorie necesare in cazul particular in care un operand este folosit in mod repetat intr-un calcul. In computerele care au formatul instructiunilor cu doua campuri de adresa, exista de obicei un mod in care se poate specifica un registru in loc de o locatie de memorie in oricare din cele doua campuri de adresa. Astfel instructiunile:
Move Ri,A
Move A,Ri
realizeaza acelasi rezultat ca si instructiunile:
Load Ri,A
Store A,Ri
realizate in formatul cu un camp si jumatate discutat mai inainte.
S-a discutat pana acum despre instructiuni cu unul sau cu doua campuri de adresa. Este posibil sa se foloseasca instructiuni unde locatiile tuturor operanzilor sunt definite implicit. Ele depind de metoda folosita pentru stocarea operanzilor in ceea ce se numeste stiva. Astfel de instructiuni sunt uneori numite instructiuni cu zero adrese.
2.3.1 Executia unei instructiuni si secvente liniare de instructiuni.
In subcapitolul precedent s-a discutat formatul instructiunilor, exemplificandu-le pe adunarea C A + B. Un program posibil care sa realizeze aceasta functie, asa cum apare el in memoria unui calculator cu instructiuni in format cu doua adrese si care contine si un anumit numar de registri generali este prezentat in figura 2.3. Cele patru instructiuni ale programului se afla in locatii succesive de memorie, pornind de la locatia i in ordinea in care vor fi executate.
In continuare se va urmari modul de executie al acestui program. Procesorul contine registrul numit PC care va memoreaza adresa instructiunii care va fi executata. Pentru a incepe executia programului, adresa primei lui instructiuni ( i in cazul acesta ) trebuie incarcata in PC. Circuitele de control ale procesorului automat incep sa citeasca instructiunile si sa le execute, una cate una, si in ordinea crescatoare a adreselor. Pe masura ce fiecare instructiune este executata, PC-ul este actualizat sa indice urmatoarea instructiune. Acesta este numita secventa liniara de cod. Executia instructiunii Halt va opri citirea automata de instructiuni.
Executia unei anumite instructiuni consta dintr-o procedura cu doua faze. In prima faza, numita faza citirii instructiunii, instructiunea este adusa din memorie de la adresa care se afla in PC. Aceasta instructiune este plasata in registrul instructiunii IR aflat in procesor. La inceputul fazei a doua, numita faza executarii instructiunii, campul operatie al instructiunii din IR este decodificat pentru a se determina tipul operatiei ce trebuie executata, dupa care operatia specificata este executata de catre procesor. Acest lucru poate sa presupuna citirea de operanzi din memorie in procesor, efectuarea de operatii aritmetice si logice, si stocarea rezultatului in memorie. Undeva de-a lungul acestei proceduri in doua faze continutul PC-ului este actualizat pentru a indica instructiunea urmatoare ce va trebui executata. In cazul de mai sus continutul PC-ului este incrementat cu 1, astfel ca in momentul in care faza executarii unei instructiuni este terminata, PC-ul va contine adresa instructiunii urmatoare, si va urma o noua faza de citire a instructiunii.
2.3.2 Ramificatii.
Se va considera in continuare un program care sa adune o lista de n numere. Generalizand programul din figura 2.3 se va ajunge la programul din figura 2.4a .
Adresele locatiilor de memorie ce contin cele n numere sunt simbolic notate cu NUM1, NUM2, . , NUMn, iar suma rezultata este plasata in locatia de memorie notata cu SUM. In loc sa se utilizeze o lista lunga de instructiuni Add, este posibil sa se plaseze o singura instructiune Add intr-o bucla de program care sa se execute de un numar de ori dorit. Acest lucru este ilustrat in figura 2.4b.
Ideea fundamentala din buclele de program este executarea unei secvente liniare de program in mod repetat. Numarul de repetitii, care in mod evident depinde de natura problemei, trebuie controlat cu ajutorul unor instructiuni suplimentare. In exemplul de mai sus, registrul R1 este folosit ca si numarator. El este incarcat initial cu valoarea n din locatia de memorie N. Instructiunea
Decrement R1
decrementeaza continutul lui R1 cu o unitate de fiecare data cand se parcurge bucla.
Se introduce conceptul unei instructiuni de ramificare pentru a realiza un salt la prima instructiune a buclei:
Branch>0 LOOPSTART
Efectul unei astfel de instructiuni este urmatorul: ramificarea are loc catre locatia indicata de instructiune (in cazul acesta LOOPSTART) daca conditia specificata este indeplinita; altfel, se continua secventa liniara de instructiuni. Daca se determina faptul ca va avea loc o ramificare, PC-ul este incarcat cu adresa indicata de catre instructiune; altfel PC-ul este incrementat in modul obisnuit.
Conditiile de ramificare sunt de obicei legate de rezultatul unei operatii aritmetice sau logice. In exemplul prezentat, conditia dorita este faptul ca rezultatul celei mai recente operatii aritmetice executate este mai mare ca zero. Deoarece instructiunea de decrementare precede instructiunea de salt conditionat, aceasta inseamna ca un salt la adresa LOOPSTART va avea loc atata timp cat continutul lui R1 ramane mai mare decat zero. Dupa ce bucla a fost executata de n ori, R1 va fi decrement la zero, iar saltul la LOOPSTART nu va mai avea loc; in schimb, instructiunea urmatoare va copia rezultatul final continut in R0 in locatia de memorie SUM si executia programului se va opri datorita instructiunii Halt.
Capacitatea de a testa conditii, si de a alege in urma lor dintr-un set de alternative pentru a continua calculul, are mult mai multe aplicatii decat doar controlul unei bucle. Aceasta capacitate este reflectata in seturile de instructiuni ale tuturor calculatoarelor si reprezinta unul din conceptele fundamentale ale programarii.
Pana acum s-au luat in considerare doar instructiuni in care adresele operanzilor sunt date explicit in cadrul instructiunii. Acest mecanism simplu de adresare presupune ca campul de adresa al instructiunii Add sa fie modificat in cadrul blocului nespecificat din figura 2.4b. Este posibil sa se adune 1 la campul de adresa al instructiunii Add. Aceasta este necesar daca o singura instructiune Add trebuie sa faca referire la intrari succesive dintr-o lista de numere. Aceasta modificare directa a campului de adrese al instructiunii nu este o practica prea fericita in programare. Ea va genera dificultati in depanarea si initializarea programelor. Problema se rezolva prin introducerea de diferite scheme pentru specificarea adreselor operanzilor. Aceste scheme se numesc moduri de adresare. Aceste moduri de adresare au rolul de a flexibiliza modul de specificare a adresei operanzilor. Cu ajutorul lor este posibil ca o anumita instructiune sa se refere la operanzi diferiti cand este executata de un numar repetat de ori; instructiunea in sine ne fiind modificata.
Moduri de adresare.
In subcapitolul precedent s-a folosit doar un singur mod de adresare a operanzilor, numit modul absolut. Se va definii acest mod in felul urmator:
Modul absolut reprezinta modul in care adresa locatiei operandului este parte explicita a instructiunii.
S-au folosit doua versiuni ale acestui mod in exemplele prezentate. Acestea sunt modul absolut de memorie, in care operanzii se afla in memorie, si modul registru, in care operandul este unul din registri procesorului. Pe langa termenul de absolut se mai foloseste si termenul direct pentru acest mod de adresare.
In continuare se vor indica si alte moduri de adresare importante, si se va specifica modul lor de folosire in programul din figura 2.4b.
Move R0,200(imediat)
incarca registrul R0 cu valoarea 200.
In acest subcapitol se vor afisa modurile de adresare diferite de cel absolut ca indici pentru o mai buna exemplificare a lor. Modul absolut va fi scris in continuare prin specificarea adresei operandului. Desigur ca, la nivelul codificarii instructiunii, informatia referitoare la modul de adresare va trebui specificata prin cateva pozitii de biti din cadrul instructiunii.
In definitia urmatoarelor doua moduri cat si in discutiile aferente se va face referire la adresa locatiei de memorie care contine operandul ca adresa efectiva.
Modul indirect presupune faptul ca adresa efectiva a operandului se afla in registrul sau in locatia de memorie a carei adresa apare in cadrul instructiunii. Figura 2.5 exemplifica adresarea indirecta.
Executia instructiunii Add din figura 2.5a incepe prin citirea continutului locatiei A din memorie. Aceasta valoare, B, este adresa efectiva, care este utilizata ulterior pentru citirea operandului dorit din memorie.
In final, operandul este adunat la continutul registrului R0. In mod similar, in figura 2.5b operandul este accesat indirect prin registrul Rj.
Modul de adresare indirect poate fi folosit in accesarea succesiva a numerelor dintr-o lista, care sunt folosite ca si operanzi intr-o operatie de adunare, asa cum se arata in figura 2.5c. Registrul R2 este folosit ca si pointer (indicator) la numerele din lista, adica operanzii vor fi accesati indirect prin R2. Primele doua instructiuni din bucla implementeaza blocul nespecificat din figura 2.4b. Faza de initializare a programului reseteaza continutul lui R0 la 0, copiaza valoare numaratorului n in R1, si plaseaza valoarea adresei NUM1 in R2, folosind modul de adresare imediat. La prima trecere prin bucla, instructiunea Add citeste operandul de la locatia NUM1 si il aduna la R0. Instructiunea de incrementare aduna 1 la continutul pointerului din R2, care astfel va contine adresa NUM2 in momentul in care instructiunea Add se va executa in cel de-al doilea pas prin bucla.
Urmatorul mod de adresare asigura si el o metoda de adresare flexibila ce poate fi folosita in exemplul cu adunarea numerelor.
Modul indexat obtine adresa efectiva a operandului prin adunarea unei valori index la adresa data in instructiune. Valoarea de indexare, sau simplu indexul, se afla de obicei intr-un registru al procesorului. In anumite calculatoare exista un registru dedicat acestui scop, el numindu-se registrul index si este parte implicita la toate operatiile ce presupun indexarea. La procesoarele din familia Intel exista doi astfel de registri numiti SI si DI. Figura 2.6a prezinta generarea adresei efective folosind modul indexat. In majoritatea calculatoarelor oricare din registri generali poate contine indexul. Intr-un astfel de caz, registrul trebuie specificat explicit in cadrul instructiunii. In cadrul procesului de generare al adresei efective, nici registrul index si nici adresa din instructiune nu se vor modifica.
Figura 2.6b ilustreaza utilizarea adresarii indexate in bucla de adunare folosita anterior. Registrul R2 este folosit ca index, si este initializat cu valoarea 0. El va fi incrementat cu 1 dupa fiecare instructiune Add de fiecare data cand se parcurge bucla. Astfel, la prima parcurgere, adresa efectiva generata de instructiunea Add va fi NUM1. Pe parcursul pasilor urmatori, adresa efectiva va fi NUM1+1, NUM1+2, . , etc, deoarece R2 este incrementat cu 1 la fiecare executie a buclei. Marele avantaj al adresarii indexate este faptul ca indexul poate fi modificat arbitrar nu doar incrementat cu 1.
Modurile de adresare definite in acest capitol au fost exemplificate prin exemple simple, putand astfel introduce conceptele de baza fara a fi necesara intrarea in detalii specifice unui configuratii hardware anume.
Unitatea de procesare.
In capitolele precedente, s-a prezentat o imagine generala a calculatorului din punctul de vedere al programatorului. Capitolele urmatoare vor ilustra organizarea si functionarea partilor componente care alcatuiesc un computer.
Registrul index B B=A+X (a) Exemplu de adresare indexata Fig. 2.6 Adresarea indirecta
In forma s-a cea mai simpla, un calculator are o singura unitate care executa instructiunile programului. Aceasta unitate comunica cu, si adeseori controleaza functionarea altor subsisteme din cadrul computerului. Din cauza rolului central pe care il joaca o astfel de unitate este cunoscuta sub numele de unitate centrala de procesare, sau procesor. In majoritatea calculatoarelor, un subsistem din cadrul lor, asa cum ar fi o unitate de intrare sau un disc magnetic, poate incorpora o unitate de procesare proprie. O astfel de unitate de procesare, este centrala pentru subsistemul respectiv, dar in mod evident nu este centrala pentru intreg sistemul de calcul. Cu toate acestea, principiile incluse la proiectarea si functionarea ei sunt independente de pozitia in sistem. In acest capitol se va prezenta organizarea hardware care permite procesorului sa execute functia lui principala: sa citeasca si sa execute instructiuni.
Algoritmul pentru rezolvarea oricarei probleme consta dintr-un anumit numar de pasi care trebuie executati intr-o anumita ordine. Pentru a implementa un astfel de algoritm pe un calculator, acesti pasi sunt impartiti in pasi mai mici, in care fiecare dintre acestia reprezinta o instructiune masina. Secventa de instructiuni rezultata reprezinta programul in limbaj masina care defineste algoritmul specificat. Aceeasi abordare generala se poate folosi pentru a executa de catre procesor functiile specificate de catre instructiunile individuale. Cu alte cuvinte, fiecare dintre aceste instructiuni este executata cu ajutorul unor secvente de operatii rudimentare. Aceste operatii, cat si felul in care sunt generate, va reprezenta principalul scop al acestui capitol.
3.1 Concepte fundamentale.
Instructiunile care alcatuiesc un program ce trebuie executat de catre computer sunt incarcate in locatii de memorie succesive. Pentru a executa acest program, procesorul citeste rand pe rand aceste instructiuni si realizeaza functiile specificate de ele. Instructiunile sunt citite din adrese succesive de memorie pana in momentul in care se ajunge la o instructiune de ramificare. Asa cum s-a prezentat in capitolele anterioare, procesorul tine minte adresa locatiei de memorie la care se afla instructiunea urmatoare intr-un registru special dedicat numit contorul programului (PC). Dupa citirea unei instructiuni PC-ul este setat pentru a indica spre instructiunea urmatoare din secventa.
Se va presupune in continuare, pentru simplitate, ca fiecare instructiune ocupa un singur cuvant de memorie. Astfel, executia unei instructiuni presupune executarea urmatorilor trei pasi de catre procesor:
Citirea continutului locatiei de memorie indicata de catre PC. Continutul acestei locatii este interpretat ca o instructiune ce trebuie executata si este incarcat in registrul instructiunii IR. Acest lucru se poate scrie in urmatorul mod:
IR [[PC]]
Se incrementeaza continutul lui PC cu 1.
PC [PC]+1
Se executa operatia specificata de catre instructiunea stocata in IR.
In cazul in care instructiunea ocupa mai mult de un cuvant de memorie pasi 1 si 2 pot fi repetati de atatea ori de cate ori este necesar pentru a citi instructiunea completa. Acesti doi pasi sunt numiti faza de citire iar a treilea pas este numit faza de executie.
Majoritatea blocurilor functionale ale procesorului au fost prezentate in figura 1.2. Aceste blocuri pot fi organizate si interconectate in multe variante. Una dintre acestea este prezentata in figura 3.1. In acest caz unitatea aritmetica si logica (ALU) si toti registri interni sunt conectati printr-o singura magistrala. Aceasta magistrala este interna procesorului si nu trebuie confundata cu magistralele externe ce leaga procesorul de memorie si de dispozitivele de I/O. Magistrala externa de memorie este prezentata in figura 3.1 prin conexiunile ei la registri MDR si MAR ai procesorului. Numarul si functiile registrilor R0 - Rn-1 variaza considerabil de la un procesor la altul. Ei pot fi pusi la dispozitia programatorului ca si registri generali, sau unii dintre ei pot fi dedicati anumitor scopuri specifice, asa cum ar fi registri de index sau pointeri de stiva.
Doi registri din figura 3.1 , Y respectiv Z, nu au fost prezentati pana acum, si ei sunt invizibili pentru programator, acesta ne avand acces la ei deoarece ei nu pot fi referiti cu ajutorul unei instructiuni. Acesti registri sunt folositi doar ca bufere temporare de catre procesor in timpul executiei unor anumite instructiuni. Semnificatia acestor registri cat si a celorlalte componente din figura 3.1, impreuna cu rolul lor in executarea unei instructiuni va fi scos in evidenta in urmatoarele subcapitole.
Cu cateva exceptii, majoritatea operatiilor efectuate in pasii 1, 2 si 3 mentionati mai inainte pot fi realizate prin executia uneia sau mai multora dintre urmatoarele functii intr-o anumita secventa prestabilita:
Citirea continutului unei locatii date si incarcarea acestuia intr-un registru al procesorului.
Scrierea continutului unui registru al procesorului intr-o locatie de memorie data.
Transferarea unui cuvant de date dintr-un registru al procesorului in altul sau in ALU.
Realizarea unei operatii aritmetice sau logice si stocarea rezultatului intr-un registru al procesorului.
3.1.1 Citirea unui cuvant din memorie.
Intr-o memorie RAM, informatiile sunt stocate in locatii identificate prin adrese. Pentru a citi un cuvant de informatie din memorie, procesorul trebuie sa specifice adresa locatiei de memorie in care este memorata acea informatie si sa ceara o operatie de citire. Acest lucru este valabil indiferent de faptul ca cuvantul reprezinta o instructiune sau un operand specificat de o instructiune. Astfel, pentru operatia de citire, procesorul transfera adresa informatiei necesare in registrul MAR. Asa cum se arata in figura 3.1, registrul MAR este conectat la liniile de adresa ale magistralei de memorie, si astfel adresa cuvantului necesar este trimisa memoriei.
In acelasi timp procesorul foloseste liniile de control ale magistralei de memorie pentru a indica faptul ca este ceruta o operatie de citire. In mod normal dupa efectuarea cererii procesorul asteapta pana primeste un raspuns de la memorie, prin care sa fie informat despre terminarea operatiei. Acest lucru este realizat cu ajutorul unui semnal de control al magistralei de memorie, care va fi numit functie de memorie terminata (MFC) (Memory-Function-Completed). Memoria seteaza acest semnal la 1 logic, pentru a indica faptul ca continutul locatiei specificate de memorie a fost citit si se afla pe liniile de date ale magistralei de memorie. Imediat ce semnalul MFC este pe 1, informatia de pe liniile de date este incarcata in MDR, si astfel este la dispozitia procesorului. Acest lucru incheie operatia de citire. Ca un exemplu, se presupune ca adresa locatiei de memorie ce trebuie accesata se afla in registrul R1 si datele din memorie trebuie incarcate in registrul R2. Acesta se realizeaza cu ajutorul urmatoarei secvente de operatii:
MAR [R1]
Read
Wait MFC
R2 [MDR]
Durata pasului 3 depinde de viteza memoriei utilizate. In mod normal timpul necesar citirii unui cuvant din memorie este mai lung decat cel in care se efectueaza o singura operatie in interiorul procesorului. Astfel, timpul total de executie al unei instructiuni poate fi micsorat daca secventa operatiilor este organizata in asa fel incat o operatie necesara, sa fie executata in interiorul procesorului pe durata asteptarii raspunsului de la memorie. Evident, doar functii ce nu necesita utilizarea registrilor MDR si MAR pot fi executate in aceasta perioada. O astfel de situatie apare in timpul operatiei de citire, deoarece PC-ul poate fi incrementat in timpul asteptarii terminarii operatiei Read.
In discutia anterioara s-a prezentat un exemplu despre modul in care transferul de date poate avea loc intre doua dispozitive, in acest caz procesorul si memoria. Mecanismul de transfer in care unul dintre dispozitive initiaza transferul (cerere de citire) si asteapta pana primeste raspuns (MFC) de la celalalt este numit transfer asincron. Se poate observa foarte usor faptul ca acest mecanism permite transferul de date intre doua dispozitive care au viteze diferite de operare. O schema alternativa, ce poate fi gasita in anumite calculatoare foloseste transferul sincron. In acest caz, una din liniile de control ale magistralei contine impulsuri generate de un tact de o frecventa constanta. Aceste impulsuri asigura semnale de sincronizare identice atat pentru procesor cat si pentru memorie. O operatie de memorie este realizata pe parcursul unei singure perioade a impulsului de tact. Mai mult decat atat, momentele in care adresele sunt plasate pe liniile de adresa si datele sunt incarcate in MDR sunt fixe in raport cu aceste impulsuri de tact. Schema cu magistrala sincrona genereaza de obicei o implementare mai simpla, dar nu poate sa realizeze o conlucrare eficienta intre dispozitive cu viteza mult diferita, decat reducand viteza celor mai rapide la viteza celui mai lent. In discutiile urmatoare despre procesor se va presupune utilizarea unei magistrale asincrone.
3.1.2 Scrierea unui cuvant in memorie.
Procedura de scriere a unui cuvant in memorie este foarte similara cu procedura de citire. Singura exceptie este faptul ca cuvantul ce trebuie scris este incarcat in MDR inainte de generarea comenzii Write. Daca cuvantul de scris este in registrul R2 iar adresa de memorie se afla in R1, operatia Write necesita urmatorii pasi:
MAR [R1]
MDR [R2]
Write
Wait MFC
Pasii 1 si 2 sunt independenti si deci se pot executa in orice ordine. De fapt acesti doi pasi se pot executa simultan daca arhitectura o permite, adica daca cele doua transferuri nu folosesc aceleasi cai pentru date. Desigur ca acest lucru nu este posibil intr-o structura cu o singura magistrala ca cea din figura 3.1.
Transferul intre registri.
Pentru a permite transferul de date intre diferitele blocuri conectate la magistrala comuna din figura 3.1, este necesara introducerea de porti de I/O. Acest lucru este reprezentat simbolic in figura 3.2.
Portile de I/O ale registrului Ri sunt controlate de semnalele si . Astfel, cand este setat la 1, datele disponibile pe magistrala comuna sunt incarcate in Ri. In mod similar cand este 1, continutul registrului Ri este pus pe magistrala. Atata timp cat este egal cu 0, magistrala poate fi utilizata pentru transferul de date din alti registri.
Se va considera in continuare transferul de date din registrul R1 in registrul R4:
Se activeaza poarta de iesire a registrului R1 prin setarea semnalului la 1. Acest lucru plaseaza continutul lui R1 pe magistrala procesorului.
Se activeaza poarta de intrare a registrului R4 prin setarea semnalului la 1. Acest lucru incarca datele de pe magistrala procesorului in registrul R4.
Acest transfer de date poate fi reprezentat simbolic prin:
Executarea unei operatii aritmetice sau logice.
Pentru a realiza o operatie aritmetica sau logica trebuie sa se tina cont de faptul ca ALU este un circuit combinational care nu are circuite interne de memorare. Astfel, pentru a realiza o adunare, cele doua numere de adunat trebuie sa fie disponibile la cele doua intrari ale ALU simultan. In acest scop s-a prevazut registrul Y in figura 3.1, el fiind folosit pentru stocarea unuia din cei doi operanzi in timp ce celalalt se introduce pe magistrala. Rezultatul operatiei este memorat temporar in registrul Z. In concluzie, secventa de operatii necesara pentru adunarea continutului registrului R1 la continutul registrului R2 si stocarea rezultatului in R3 trebuie sa fie urmatoarea:
In pasul 2 al acestei secvente continutul registrului R2 este pus pe magistrala astfel fiind conectat prin poarta de iesire la intrarea B a ALU. Continutul registrului Y este intotdeauna disponibil la intrare A. Functia pe care trebuie sa o execute ALU depinde de semnalele aplicate la liniile de control ale ei. In acest caz linia de control Add este setata la 1, generand rezultatul ca si suma celor doua numere A si B. Aceasta suma este incarcata in registrul Z, deoarece poarta lui de intrare este deschisa. In pasul 3, continutul lui Z este transferat in registrul destinatie R3. Acest lucru nu se putea realiza in pasul 2 deoarece nu poate sa existe decat o iesire de registru conectata la magistrala iar in pasul 2 era deja conectata iesirea lui R2.
Portile registrilor si momentele de timp ale transferului de date.
Se va considera in continuare cazul in care fiecare bit al registrilor din figurile 3.1 si 3.2 consta fizic dintr-un singur bistabil asa cum se arata in figura 3.3. Elementul de memorare prezentat se presupune a fi unul dintre bitii registrului Z.
Atata timp cat intrarea de control Zin este egala cu 1, starea bistabilului se schimba in functie de datele de pe magistrala. In urma unei tranzitii din 1 in 0 a acestui semnal, bistabilul ramane blocat pe ultima valoare memorata pana apare din nou valoarea 1 la intrarea de control. Astfel, cele doua porti de la intrarea bistabilului implementeaza functia intrerupatorului intrarii de control din figura 3.2.
O prima observatie asupra intrerupatoarelor portilor de iesire din figura 3.2, conduce la necesitatea unor intrerupatoare ON/OFF in aceste puncte. Cand un anume intrerupator este in starea ON, el transfera continutul registrului corespunzator pe magistrala, iar daca este in starea OFF el este din punct de vedere electric deconectat de la magistrala, adica el nu seteaza nici o stare anume pe ea, permitand astfel altui registru sa poata plasa date pe magistrala. Astfel, iesirea registrului trebuie sa permita trei stari distincte: 1, 0, si circuit deschis.
In urma acestei necesitati este evident ca intrerupatoarele electromecanice (relee) sunt incompatibile din punct de vedere al vitezei de operare si al gabaritului cu tehnologia microelectronica folosita intr-un procesor. In locul lor, se proiecteaza poarta de iesire a registrului in asa fel incat sa se comporte in mod similar cu un intrerupator mecanic, adica sa fie capabila sa se deconecteze din punct de vedere electric de la magistrala, cat si sa poata sa plaseze atat o valoare 1 logic cat si o valoare 0 logic pe ea. Deoarece suporta aceste trei posibilitati o astfel de poarta se numeste o poarta cu trei stari (three state). O intrare separata de control este necesara pentru activarea portii sau pentru punerea ei intr-o stare de impedanta ridicata (deconectare electrica) care sa corespunda cu circuitul deschis al unui intrerupator mecanic.
Nici circuitele TTL si nici cel CMOS obisnuite nu au aceasta facilitate de conectare direct la magistrala. Conectarea iesirilor a doua astfel de circuite in paralel provoaca un scurtcircuit. Aceste circuite pot fi modificate pentru a opera in trei stari prin introducerea unui semnal de intrare de control care sa opreasca toti tranzistorii din partea finala.
O alta solutie pentru aceasta problema, care nu necesita utilizarea acestor intrerupatoare de iesire prezentate este folosirea de porti cu colectorul in gol pentru TTL, sau cu drena in gol pentru CMOS. Iesirea acestor porti este echivalenta cu o legatura la masa. Intrerupatorul este deschis cand poarta de iesire este in starea 1 si inchis cand poarta este in starea 0. Structura unei magistrale cu colector in gol este prezentata in figura 3.4.
In starea normala, magistrala se afla la 1 logic datorita rezistentei de sarcina care este legata la sursa de alimentare. Astfel, atata timp cat intrerupatoarele portilor sunt deschise, adica toate iesirile se afla in starea 1, magistrala ramane in starea 1. Daca oricare din iesirile portilor trece in 0, intrerupatorul corespunzator va fi inchis si magistrala va trece in stare 0. Cu alt cuvinte magistrala realizeaza o functie SI intre toate portile conectate la ea. Aceasta conexiune mai poarta numele de conexiune SI cablata. Daca se foloseste aceasta metoda atunci poarta cu trei stari din figura 3.3 trebuie inlocuita cu un circuit SI-NU cu colector in gol ca in figura 3.3. Cand Zout este 1, bitul stocat in bistabil este pus pe magistrala. Cand Zout este 0, magistrala ramane pe 1, permitand ca datele de la alt registru sa fie transferate pe ea.
In general metoda cu 3 stari permite un transfer mai rapid de informatie in comparatie cu colectorul in gol. Din acest motiv, este cea mai folosita dintre cele doua.
Se vor discuta in continuare cateva aspecte legate de momentele de timp in care au loc transferurile de date in interiorul procesorului. Se considera cazul operatiei de adunare in pasul 2 din subcapitolul 3.1.4. Din momentul in care semnalul este pus pe 1, o intarziere finita este necesara pentru ca poarta sa se deschida dupa care urmeaza o alta necesara ca datele sa traverseze magistrala pana la intrarea in ALU. O noua intarziere este introdusa de circuitele de adunare ale ALU. Pentru ca rezultatul sa se memoreze corect in registrul Z, datele trebuie mentinute pe magistrala o perioada suplimentara de timp egala cu timpii necesari setarii si mentinerii acestui registru. Aceasta situatie este prezentata in diagrama din figura 3.5. Suma celor cinci intarzieri reprezinta durata minima de timp in care semnalul trebuie sa fie activ.
Structuri cu magistrale multiple.
Organizarea cu o singura magistrala din figura 3.1 reprezinta una din posibilitatile de interconectare a diferitelor blocuri ce alcatuiesc un procesor. O structura alternativa este cea cu doua magistrale prezentata in figura 3.6.
Toate iesirile de registri sunt conectate la magistrala A, iar toate intrarile sunt conectate la magistrala B. Cele doua magistrale sunt conectate prin legatura G, care daca este activata transfera datele de pe magistrala A pe B. Cand G este dezactivata, cele doua magistrale sunt izolate din punct de vedere electric. Se observa faptul ca registrul de stocare temporara Z din figura 3.1 nu mai este necesar in aceasta organizare deoarece , daca legatura intre magistrale este inactiva, iesirea ALU poate fi transferata direct catre registrul destinatie. Ca si exemplu, se considera operatia de adunare discutata anterior poate fi realizata in urmatorul mod:
Este important de remarcat faptul ca, in ipoteza ca registri sunt bistabili simpli ca si in figura registrul destinatie din secventa de mai sus trebuie sa fie diferit de R2, deoarece cele doua operatii si nu pot fi executate simultan. Acest lucru se datoreaza faptului ca ALU este un circuit combinational lipsit de circuite de memorare. Operatia R2 [R1] + [R2] poate fi totusi realizata, schimband semnalele si intre ele si inlocuind semnalul cu in pasul 2. Restrictia ca semnalele si sa nu poata sa apara simultan poate fi eliminata daca se folosesc bistabile trigherabile pe front.
Se va considera in continuare inca un mod de organizare a procesorului, de data aceasta pe trei magistrale asa cum se prezinta in figura 3.7. Fiecare magistrala este conectata la o singura iesire si la mai multe intrari. Prin eliminarea conectarii mai multor iesiri la aceeasi magistrala se obtine un castig de viteza si un control mai simplu al magistralelor. Un multiplexor este prevazut la intrare in fiecare din cei doi registri A si B, care sa permita incarcarea lor fie de pe magistrala de date de intrare fie de pe magistrala registrilor.
Registrii de ordin general ai procesorului din figura 3.7, sunt prezentati ca un singur bloc. Se presupune ca sunt implementati utilizand o unitate de memorie RAM. Termenul de RAM folosit aici se refera la tipul de hardware folosit pentru implementarea registrilor si nu trebuie confundat cu memoria RAM principala a calculatorului care este conectata la magistrala externa.
Executia completa a unei instructiuni.
Se va prezenta in continuare punerea cap la cap a secventelor de operatii elementare necesare pentru executarea unei instructiuni. Ca exemplu se va considera instructiunea de adunare a continutului locatiei de memorie NUM la registrul R1. Se va presupune, pentru simplicitate ca adresa NUM este data explicit in campul de adrese al instructiunii, adica se utilizeaza modul de adresare direct. Executia acestei instructiuni necesita urmatoarele etape:
Citirea instructiunii.
Citirea primului operand (continutul locatiei de memorie indicata de campul de adresa al instructiunii).
Realizarea adunarii.
Incarcarea rezultatului in registrul R1.
Figura 3.8 prezinta secventa semnalelor de control necesare pentru implementarea operatiilor de mai sus intr-o arhitectura cu o singura magistrala ca cea din figura 3.1.
PCout, MARin, Read, Clear Y, Set carry-in la ALU, Add, Zin
Zout, PCin, Wait MFC
MDRout, IRin
Campul de adresa al lui IRout, MARin, Read
Secventa de control pentru executarea
unei instructiuni de adunare a continutului unei locatii de
memorie adresata direct la registrul R1
, in, Wait MFC
Fig. 3.8
MDRout, Add, Zin
Zout,
End
In pasul 1, este pornita operatia de citire a instructiunii prin incarcarea continutului PC-ului in registrul MAR si trimiterea semnalului Read pentru cererea de citire din memorie. Acest lucru se realizeaza prin setarea uneia dintre intrarile in ALU (registrul Y) la 0 si setarea celeilalte intrari (magistrala interna a procesorului) la valoarea curenta din PC. In acelasi timp semnalul caryy-in de la ALU este setat la 1 si se realizeaza o operatie Add. Valoarea astfel modificata este incarcata din registrul Z inapoi in registrul PC pe parcursul pasului 2. Trebuie remarcat faptul ca pasul 2 este pornit imediat dupa activarea cererii de citire din memorie fara a mai astepta terminarea functiei de memorie. Pasul 3 in schimb, trebuie sa astepte aparitia semnalului MFC. In pasul 3, cuvantul citit din memorie este incarcat in registrul IR. Pasii de la 1 la 3 constituie faza de citire a instructiunii. Aceasta portiune este identica pentru toate instructiunile.
Imediat ce registrul Ir a fost incarcat, circuitele de decodificare a instructiunii interpreteaza continutul acesteia. Acest lucru permite circuitelor de control sa genereze semnalele adecvate pentru restul secventei de comenzi din pasii 4 pana la 8, care reprezinta faza de executia e a instructiunii. in pasul 4, campul de adresa al lui IR, care contine, adresa NUM, este incarcat in MAR, si se initiaza o operatie de citire din memorie. Dupa acest lucru continutul lui R1 este transferat in registrul Y. Cand operatia Read a fost terminata, operandul din memorie este disponibil in MDR. Operatia de adunare se realizeaza in pasul 6, iar rezultatul este transferat in registrul R1 in pasul 7. Semnalul End din pasul 8, indica terminarea executiei instructiunii curente si initiaza un nou ciclu de citire de instructiune repornind de la pasul 1.
3.2.1 Ramificari.
Asa cum s-a prezentat in capitolul 2, ramificarea este realizata prin inlocuirea continutului curent al PC-ului cu adresa de salt, adica adresa instructiunii la care sa se realizeze ramificarea. Adresa de salt se obtine de obicei prin adunarea unui ofset X, care este dat in campul de adresa al instructiunii de salt, la valoarea curenta din PC. Figura 3.9 prezinta secventa semnalelor de control care permite executia unui salt neconditionat folosind o structura cu o singura magistrala ca cea din figura 3.1.
PCout, MARin, Read, Clear Y, Set carry-in la ALU, Add, Zin
Zout, PCin, Wait MFC
MDRout, IRin
PCout, Yin
Campul de adresa al lui IRout, Add, Zin
Secventa de control pentru executarea
unei instructiuni de salt neconditionat
Zout, PCin
Fig. 3.9
End
Executia porneste ca la o instructiune oarecare cu faza de citire, faza care se termina prin incarcarea instructiunii in IR in pasul 3. Pentru a executa instructiunea de salt, continutul PC-ului este transferat in registrul Y in pasul 4. Dupa aceasta operatie, ofsetul X este introdus pe magistrala, si operatia de adunarea are loc. Rezultatul acestei operatii, care reprezinta adresa de salt, este incarcat in PC in pasul 6.
Este important de remarcat faptul ca in acest exemplu PC-ul este incrementat pe timpul fazei de citire indiferent de tipul instructiunii ce se executa. Astfel, in momentul in care ofsetul X este adunat la continutul PC-ului (pasii 4 si 5) din figura 3.9, acest continut este deja modificat pentru a indica instructiunea urmatoare instructiunii de salt din cadrul programului. Astfel, ofsetul X trebuie sa fie diferenta, dintre adresa de salt si adresa imediat urmatoare instructiunii de salt. De exemplu, daca instructiunea de salt se afla la locatia 1000, si este necesar un salt la locatia 1050, valoarea lui X trebuie sa fie 49.
Se va considera in continuare cazul unei instructiuni de salt conditionat. Singura diferenta in acest caz fata de figura 3.9 este necesitatea verificarii conditiei de salt in pasii 3 si 4. De exemplu, daca instructiunea decodificata este salt in caz de valoare negativa , unitatea de control procedeaza in felul urmator. In primul rand registrul care contine conditia este verificat. Daca bitul N (negativ) este egal cu 1, unitate de control va urma pasii 4 pana la 7 din figura 3.9. Daca, pe de alta parte N este egal cu 0, se va genera semnalul End. Acest semnal termina executia instructiunii de salt si genereaza citirea urmatoarei instructiunii de dupa instructiunea de salt. Pasul 4 modificat pentru o astfel de instructiune de salt conditionat arata in felul urmator:
4. Daca atunci End
Daca N atunci PCout, Yin
Secventierea semnalelor de control.
Pentru a executa o instructiune, procesorul trebuie sa aiba facilitatea de a genera semnalele de control discutate mai sus intr-o secventa adecvata. Exista o gama foarte larga de tehnici de rezolvare a acestei probleme. Majoritatea dintre aceste tehnici apartin unei din urmatoarele doua mari categorii:
Control cablat
Control microprogramat
4. Organizarea unitatii de Intrare/Iesire(I/O).
Una din caracteristicile de baza ale unui calculator este aceea de a transmite si receptiona date la si de la alte dispozitive. Aceasta capacitate de comunicare permite utilizatorului uman sa introduca de exemplu un program si datele asociate acestuia cu ajutorul tastaturii si a unui monitor si sa obtina rezultatele afisate pe monitor. Exista o gama foarte larga de echipamente cu care un calculator trebuie sa poata comunica. Printre acestea sunt monitoare, imprimante, plottere, modemuri, discuri magnetice, etc. Pe langa aceste echipamente standard de I/O un calculator mai poate fi conectat si la late tipuri de dispozitive cum ar fi cele pentru controlul aplicatiilor industriale, unde intrarile in calculator pot fi iesiri digitale ale unui voltmetru, ale unui senzor de temperatura, sau a unei alarme de incendiu. In mod similar, iesirea calculatorului poate fi o comanda digitala codificata pentru a controla viteza unui motor, deschiderea unei valve sau sa determine un voltmetru digital sa treaca la urmatoarea citire. Pe scurt, un calculator in general trebuie sa poata comunica cu o mare varietate de dispozitive in diferite medii de lucru.
Principalele functii pe care un calculator este necesar sa le poata realiza pentru a trata operatiile de I/O sunt:
Adresarea sau selectarea uni dispozitiv de I/O pentru a realiza o operatie de transfer.
Transferarea datelor de la si catre dispozitivul selectat.
O alta cerinta deriva din faptul ca operatiile dispozitivelor externe, in general, sunt independente de procesorul calculatorului. Astfel, este necesara o a treia functionalitate pe care un calculator trebuie sa o realizeze:
Sincronizarea si coordonarea timpilor la care operatiile de intrare si iesire sa aiba loc.
In acest capitol se vor discuta diferitele metode prin care aceste functii se pot implementa.
4.1. Adresarea dispozitivelor de Intrare/Iesire.
Deoarece in mod obisnuit, mai multe dispozitive sunt conectate la un calculator, trebuie sa existe anumite procedee prin care sa poata fi selectat unul din aceste dispozitive pentru a participa la o operatie de I/O. Acest lucru se poate realiza prin utilizarea unei organizari in stil magistrala asa cum este prezentat in figura 4.1. Aceasta magistrala, la care sunt conectate toate dispozitivele de I/O, consta din trei seturi de linii utilizate pentru transmiterea adreselor, datelor si semnalelor de control. Astfel, daca fiecarui dispozitiv ii este atasat un cod de identificare, sau adresa, unitatea centrala de procesare poate selecta un dispozitiv prin plasarea adresei acestuia pe liniile de adresa. Doar dispozitivul care isi recunoaste adresa va raspunde comenzilor CPU initiate pe liniile de control.
In cazul masinilor cu o singura magistrala, aceeasi magistrala serveste atat ca magistrala de memorie cat si ca magistrala de I/O. Astfel, dispozitivele de I/O pot fi identificate prin asocierea unui cod unic in spatiul de adrese al memoriei acelui calculator. Utilizand aceasta structura, este posibila accesarea dispozitivelor de I/O in acelasi mod in care se acceseaza o locatie de memorie, asigurand o mare flexibilitate in tratarea operatiilor de I/O. Aceasta procedura se numeste maparea in memorie a intrarilor si iesirilor (memory mapped I/O) Trebuie subliniat inca o data faptul ca este necesara asocierea unei adrese unice pentru fiecare dispozitiv. Este obisnuit uzual, desi nu este necesar, sa se foloseasca un bloc continuu de adrese pentru dispozitivele I/O, si acest lucru este realizat de obicei si in practica. LA calculatoarele PDP-11 adresele pentru dispozitivele periferice se intind de la 765008 pana la 777570. Sistemul de operare al acestor calculatoare livrat de producator, aloca adrese specifice celor mai utilizate dispozitive. DE exemplu, o teletypewriter conectat la magistrala unui PDP-11are patru registri de stare si date. Adresele acestor registri sunt urmatoarele:
Registrul de stare al tastaturii (KBSTATUS) 777560
Buferul de date al tastaturii (TTYIN) 777562
Registrul de stare al imprimantei (PRSTATUS) 777564
Buferul de date al imprimantei (TTYOUT) 777566
Transferul de date.
In subcapitolul anterior s-a prezentat modul in care procesorul poate selecta un anumit dispozitiv pentru a participa la o operatie de I/O. In acest capitol se va discuta modalitatea in care datele se pot transfera intre buferele dispozitivului si memoria principala sau registrii procesorului. De obicei, acest lucru se realizeaza prin executarea unor instructiuni speciale numite IN si OUT. In calculatoarele in care registrii de date ai dispozitivelor externe sunt tratati ca si locatii de memorie, o instructiune Move poate fi utilizata pentru a realiza operatia de I/O.
Figura 4.2. demonstreaza organizarea necesara pentru a conecta orice dispozitiv pe magistrala de I/O a calculatorului.
Decoderul de adrese permite dispozitivului sa-si recunoasca adresa cand aceasta este plasata pe magistrala de adrese a procesorului. Registrul de date este utilizat pentru stocarea datelor ce vor trebui transferate catre procesor la dispozitiv de intrare sau pentru stocarea datelor receptionate de la procesor pentru un dispozitiv de iesire. La unele calculatoare registrele de stare sunt conectate de asemenea la magistrala de date. Decoderul de adrese, registrele de date si de stare cat si circuitele de control necesare coordonarii transferelor de I/O constituie interfata dispozitivului.
Metoda prezentata mai sus de realizarea a transferurilor I/O este cunoscuta sub numele de I/O controlat prin program (program-contrloed I/O). Folosind aceasta metoda, executia unei instructiuni I/O cauzeaza transferul unui singur cuvant de date. In cazul dispozitivelor de I/O care pot sa trateze doar un singur caracter o data, cum ar fi o tastatura, doar un singur caracter va fi transferat de catre o instructiune de I/O.
Cand insa sunt necesare transferuri de blocuri mari de date la viteze ridicate de la sau inspre un dispozitiv periferic, se foloseste o alta metoda de transfer. Se poate realiza un circuit de control special care sa permita transferul de blocuri de date direct intre dispozitiv si memoria principala. Circuitele de control transfera datele, cuvant cu cuvant la o viteza adecvata cu caracteristicile dispozitivului extern. Aceasta metoda este cunoscuta sub numele de DMA (Direct Memory Access).
Accesul direct la memorie (DMA).
Se va considera cazul unui dispozitiv periferic de viteza mare care trebuie sa transfere blocuri mari de date din si catre memorie. Utilizarea programarii I/O controlate cu un astfel de dispozitiv este in cel mai bun caz ineficienta daca nu imposibila. Urmatoarele doua motive sustin aceasta afirmatie:
In programarea I/O controlata, este necesara o intreaga gama de instructiuni care trebuie sa fie executate pentru fiecare cuvant de date transferat intre dispozitivul extern si memoria principala.
Majoritatea dispozitivelor periferice de viteza mare au un mod de operare sincron, adica transferul de date este controlat de frecvente de ceas fixe, independente de procesor.
Necesarul de instructiuni suplimentare in programare I/O controlata este exemplificat prin programul din figura 4.3.
Cicluri de memorie
MOV LOC,R0 2
MOV 80,R1 2
WAIT: TSTB @LPRSTATUS 3
BP WAIT 1
MOVB (R0),@LPROUT 4
INC R1 1
BNE WAIT 1
HALT 1
Acest program transfera 80 de caractere din memorie incepand cu locatia LOC catre o imprimanta. Registrul R0 este folosit ca si pointer la carcaterele din memorie, iar registrul R1 tine cont de cate caractere mai trebuie transferate. Registri de stare si de date ai imprimantei sunt reprezentati prin numele LPRSTATUS si LPROUT. In coloana cicluri de memorie sunt reprezintati numarul de cicluri necesare executiei fiecarei instructiuni. De exemplu instructiunea
TSTB @LPRSTATUS
Necesita trei cicluri de memorie. Doua dintre ele sunt necesare pentru citirea instructiunii si adresei operandului. Al treilea ciclu de memorie este necesar pentru citirea operandului, adica a continutului registrului de stare, in scopul de executa testul necesar.
Urmarind aceasta bucla de transfer pentru un singur caracter se observa ca sunt necesare cel putin cinci instructiuni ce necesita zece cicluri de memorie pentru fiecare caracter transferat catre imprimanta. Aceasta inseamna o supraincarcare de 9 la 1.
Necesitatea unui transfer sincron de date este, in majoritatea cazurilor, dictata de caracteristicile fizice ale dispozitivului periferic. De exemplu, o unitate de hard disc de viteza mare nu poate fi oprita dupa fiecare caracter. Transferul de date la o astfel de unitate poate ajunge la 10MB/s. Combinatia intre viteza mare de transfer si sincronizare fac ca operatiile cu aceste dispozitive sa fie incompatibile cu controlul programat al transferurilor de date.
Problema intalnita mai sus poate fi depasita prin incorporarea tuturor functiilor pe care trebuie sa le execute un program intr-un controler hard. Acest controler permite transferul direct de date intre dispozitiv si memoria principala fara a implica procesorul. Urmarind codul din figura 4.3. se poate observa ca un astfel de controler DMA poate fi realizat cu ajutorul a doi registrii, unul care sa genereze adresele de memorie si altul care sa numere caracterele transferate. Al treilea registru este necesar pentru a memora comanda procesorului specificand functia ce trebuie executata, iar un al patrulea registru este utilizat in mod normal ca tampon de date intre memoria principala si dispozitivul extern. In cazul dispozitivelor mai complexe asa cum ar fi unitatile de disc mai sunt necesari si alti registri. Registrii controlerului pot fi accesati de catre procesor pentru initializare folosind controlul programat. Astfel, controlerul DMA trebuie sa fie conectat la magistrala in varianta clasica a oricarei interfete de dispozitiv de I/O.
Sincronizarea.
Un calculator trebuie sa aiba o metoda de coordonare a activitatii lui interne cu cea a dispozitivelor externe conectate la el. De exemplu cand asteapta caractere de la o tastatura, trebuie sa stie cand un nou caracter a fost introdus de catre aceasta si este gata de a fi transferat. In mod similar, pe timpul unei operatii de tiparire la imprimanta, calculatorul nu poate trimite un caracter pana cand tiparirea celui precedent nu s-a terminat.
In general exista doua tehnici de sincronizare utilizate: prin polling sau verificarea starii, sau prin intreruperi.
Polling-ul sau verificarea starii.
Exemplul din figura 4.3. este un exemplu de polling. Starea curenta a fiecarui dispozitiv de intrare sau iesire conectat la un calculator este indicata prin unul sau mai multi biti de informatie. Cel mai important dintre acesti biti este bitul de Ready, care este setat de fiecare data cand un dispozitiv este gata pentru a participa la un nou transfer de caracter. Pentru a realiza o operatie de I/O cu un dispozitiv dat, programul trebuie mai intai sa sondeze dispozitivul testandu-i bitii de stare. Daca bitul Ready este setat, atunci se poate executa o instructiune de I/O pentru a executa transferul necesar. Acest lucru va sterge imediat bitul de Ready, care va ramane zero pana cand dispozitivul este gata pentru un alt transfer. In dispozitivele simple, asa cum ar fi o tastatura bitul Ready este singurul necesar. In dispozitive mai complexe, asa cum ar fi imprimantele de viteza mare, se utilizeaza mai multi biti de stare pentru a indica diverse conditii asa cum ar fi faptul ca nu mai exista hartie sau ca hartia s-a blocat.
Modalitatea in care starea unui dispozitiv este reprezentata intr-un calculator variaza de la masina la masina. In unele calculatoare, bitii de stare sunt grupati in registri de stare asociati fiecarui dispozitiv. Continutul registrilor de stare poate fi accesat de catre procesor de pe liniile de date. Astfel, ei pot fi testati ca niste date obisnuite. La alte calculatoare bitul de Ready este conectat la una din liniile de control. Exista instructiuni speciale care testeaza starea acestei linii pentru a determina faptul ca un dispozitiv este gata pentru transferul de date.
Intreruperi.
O metoda alternativa pentru coordonarea activitatii procesorului cu cea a dispozitivelor periferice este utilizarea intreruperilor. In loc sa execute bucla de asteptare, procesorul poate sa execute alte instructiuni sau programe sau poate sa nu execute nimic. Procesorul sta in aceasta stare pana cand un dispozitiv extern este gata pentru transferul de date. In acest moment, dispozitivul avertizeaza procesorul prin activarea uneia dintre liniile de control numite linii pentru cereri de intreruperi (INTR). Acest lucru determina procesorul sa inceapa executia instructiunii de transfer de date sau a rutinei de tratare a intreruperii. Deci utilizand , intreruperile, perioadele de asteptare sunt eliminate.
Exemplu: Se va considera o aplicatie care necesita anumite calcule care sa fie realizate iar rezultatele sa fie tiparite la o imprimanta linie. Dupa acest lucru se fac alte calcule care si ele vor trebui sa fie tiparite si asa mai departe. Programul va consta din doua proceduri, COMPUTE si PRINT. Se presupune ca COMPUTE genereaza n linii pentru functia PRINT care le va tipari. Acest program poate fi executat prin apeluri repetate ale functiei COMPUTE urmate de apeluri ale functiei PRINT. Imprimanta accepta doar cate o linie de text o data. Astfel, rutina de PRINT trebuie sa trimita o linie de text, sa astepte ca ea sa fie tiparita, dupa care sa trimita urmatoarea linie , pana cand toate rezultatele au fost tiparite. Dezavantajul acestei abordari este acela ca procesorul pierde o cantitate foarte mare de timp asteptand ca imprimanta sa devina Ready. Este posibila suprapunerea timpilor de tiparire si calcul, astfel ca, se poate executa procedura COMPUTE in timp ce imprimare are loc, rezultand in marirea vitezei generale de executie. Acest lucru se poate realiza in felul urmator: In primul rand, se executa rutina COMPUTE pentru a produce primele n linii de text. Dupa aceea se executa rutina PRINT pentru a trimite prima linie catre imprimanta. In acest punct, in loc sa se astepte tiparirea acestei linii, rutina PRINT se suspenda temporar. Acest lucru face posibila continuarea executiei rutinei COMPUTE. De fiecare data cand imprimanta devine ready, ea avertizeaza procesorul prin trimiterea unui semnal de intrerupere. Acest lucru determina procesorul sa intrerupa rutina COMPUTE si transfera controlul rutinei PRINT care trimite a doua linie spre imprimanta. Dupa aceasta, controlul revine rutinei COMPUTE, care isi continua executia din punctul in care a fost intrerupta. Acest proces continua pana cand toate cele n linii au fost tiparite.
Rutina de PRINT va fi repornita de fiecare data cand urmatorul se de n linii este disponibil pentru tiparire. Daca COMPUTE calculeaza cele n linii cam in tot atata timp cand dureaza tiparirea celor n linii atunci noile linii vor fi gata imediat dupa tiparirea primelor n.
Exemplu de mai sus a fost prezentat pentru a introduce conceptul de intreruperi. Rutina care este executata ca raspuns la o intrerupere se numeste rutina de tratare a intreruperii. In cazul de mai sus aceasta este rutina PRINT. Rutinele de tratare a intreruperilor seamana foarte mult cu apelurile de subrutine.
Copyright © 2024 - Toate drepturile rezervate