Tamponul de adrese i date asigur transferul acestuor informaii
ntre magistrala intern a microprocesorului i magistralele externe, sub controlul blocului de secveniere i comand. Registrul instruciunii primete opcodul instruciunii curente i l menine pe ntrega durat de execuie a instruciunii. Decodificatorul instruciunii decodific opcodul i planific operaiile care urmeaz a fi efectuate pentru execuia instruciunii i ordinea n care acestea vor avea loc. Unitatea logic i aritmetic execut operaii logice i aritmetice cu maxim doi operanzi ntregi fr semn pe 8 bii. Unul dintre operanzi trebuie s se afle obligatoriu n registrul A, iar cellat operand, dac exist, este adus dintr-un registru intern sau din exterior (din memorie) la momentul execuiei operaiei, ntr-un registru temporar. Rezultatul operaiei este reinut tot de registrul A, motiv pentru care poart numele de acumulator. Modul de desfurare a operaiei i caracteristicile rezultatului sunt memorate ntr-un set de bistabile denumii indicatori de condiii (flags): Z zero (rezultat zero al operaiei aritmetice sau logice); S sign (semnul rezultatului, egal cu msb al acumulatorului); P parity (rezultatul are un numr par/impar de bii 1); CY carry; AC - auxiliary carry (transport/mprumut de la / spre bitul 7, respectiv bitul 3 al rezultatului ultimei operaii aritmetice). Acumulatorul, mpreun cu flagurile formeaz cuvntul de stare al procesorului (PSW processor status word): PSW = A7 A6 A5 A4 A3 A2 A1 A0 S Z AC P CY Starea acestor indicatori poate influena modul de desfurare i rezultatul unor instruciuni aritmetice i de ramificare condiionat - fig. 5. Registrele generale de lucru de 8 bii sunt n numr de 6, simbolizate prin B, C, D, E, H i L. Ele pot fi folosite pentru a memora date i rezultate intermediare ale programului. Sunt accesibile programului prin instruciuni adecvate, att ca registre simple de 8 bii, ct i n perechi, ca registre de 16 bii: - B i C = registrul pereche B; - D i E = registrul pereche D; - H i L = registrul pereche H. Registrele speciale sunt de 16 bii i ndeplinesc anumite funcii ale microprocesorului. Astfel, numrtorul de instruciuni (PC - Program Counter) conine n fiecare moment adresa instruciunii ce urmeaz a fi executat. Ele este iniializat cu 0 la resetarea microprocesorului i este implicit incrementat pentru secvene liniare de instruciuni, respectiv este modificat direct de ctre instruciunile de ramificare (fig.2). Indicatorul vrfului stivei (SP - Stack Pointer) este utilizat pentru accesul ntr-o zon de memorie RAM organizat ca stiv hardware. La 8085, stiva este o zon de memorie cu acces de tip LIFO (last in, first out). Accesul are loc pe la un singur capt al stivei, iar SP conine n orice moment adresa acestei locaii (ultima ocupat din stiv). Stiva crete n sensul descresctor al adreselor de memorie i pe stiv informaiile se depun i se extrag pe 16 bii (2 octei). Spre exemplu, n fig.3 se arat evoluia stivei dup iniializare i depunerea pe stiv a 3 valori pe 16 bii. Blocul de secveniere i comand primete semnale de iniializare i de tact i genereaz secvenele necesare ale semnalelor de control att pentru structurile interne implicate n execuie, ct i pentru sincronizarea transferului pe magistrala de date extern. Blocul de comand ntreruperi i I/E serial gestioneaz tratarea evenimentelor externe i transferul datelor la nivel de bit.
3.1. Principiul de funcionare al stivei la microprocesorul 8085 Stiva este o zon de memorie liniar (format din locaii amplasate la adrese consecutive) cu acces indirect pe la un singur capt (top of stack vrful stivei), prin intermediul registrului SP (Stack Pointer indicator al vrfului stivei). La microprocesorul 8085 stiva crete n sensul descresctor al adreselor locaiilor de memorie. ntruct funcionarea stivei implic att operaii de citire (extragere), ct i de scriere (depunere) n stiv, stiva trebuie organizat ntr-o zon de memorie de tip RAM.
Rolul stivei este acela de a furniza o cale comod pentru a stoca temporar informaii (date sau adrese) n memorie fr a reine pentru fiecare adresa exact la care sunt stocate. Ceea ce trebuie reinut este doar ordinea n care informaiile sunt stocate, deoarece ele vor fi extrase din stiv n ordinea invers celei n care au fost depuse. Deci stiva are o organizare de tip LIFO (Last In - First Out: primul element extras este ultimul element care a fost depus). Operaiile de depunere i de extragere sunt efectuate cu elemente formate din 2 octei, fie c este vorba despre date, fie c este vorba de adrese (care oricum au 2 octei). De aceea, depunerea unui element n memorie se face prin dou scrieri succesive n stiv, iar extragerea unui element implic realizarea a dou citiri succesive din memorie. De fiecare dat, adresa locaiei nscrise sau citite este furnizat de registrul SP, care se actualizeaz n mod corespunztor. SP conine n orice moment adresa ultimei locaii ocupate din stiv. De aceea, dup fiecare octet citit din stiv, SP se incrementeaz, iar nainte de scrierea unui octet n stiv SP este dectementat. Asta nseamn c dup depunerea unui element (2 octei) n stiv, SP va fi mai mic cu 2, iar dup extragerea unui element din stiv, SP va fi mai mare cu 2.
Operaiile de depunere i de extragere sunt realizate la execuia unor instruciuni specifice: - PUSH / POP pentru coninutul registrelor pereche (B, D, H) i a cuvntului de stare al programului (PSW). - CALL, RET pentru coninutul registrului PC. Informaiile din registrele pereche B, D i H pot fi: date pe 16 bii sau adrese ale unor date amplasate n memorie, PSW conine date (acumulatorul) i condiii (flaguri), iar PC conine adresa instruciunii urmtoare. Instruciunile PUSH i POP au urmtorul format general:
Stiva este o zon de memorie, care poate fi definit folosind aceleai directive de asamblare ca i n cazul altor variabile, cu o singur meniune: dac pentru variabilele obinuite se marcheaz printr-o etichet adresa de nceput a zonei de memorie rezervate (adresa cea mai mic), pentru stiv se marcheaz adresa de dup cea a ultimei locaii rezervate, care va constitui vrful stivei i va iniializa registrul SP. Motivul l constituie faptul c stiva crete n sensul descresctor al adreselor.
3.3. Instruciuni de apel i de revenire n cadrul unui program pot fi puse n eviden anumite secvene de operaii care se execut n mod repetat, de fiecare dat la fel, eventual cu alte date. Includerea n cadrul programului a aceleiai secvene de cod de fiecare dat cnd trebuie executat, conduce la programe lungi, greu de scris, de urmrit i de depanat. Este de preferat ca secvena de operaii s apar o singur dat n memorie, ncepnd cu o anumit adres (secventa), iar de fiecare dat cnd se dorete execuia ei, n programul principal s se efectueze un salt la adresa respectiv.
Dup execuia secvenei, ns, se dorete continuarea programului principal din punctul n care a fost prsit. Acest lucru nu este posibil dac programul principal a fost prsit cu o instruciune de salt, deoarece aceasta distruge vechiul coninut al registrului PC. Adresa de revenire nu poate fi cunoscut nici de secvena de instruciuni, pentru c aceasta nu este constant: revenirea trebuie s se fac de fiecare dat ntr-un alt punct, deoarece saltul din programul principal poate s apar n orice punct al su. Dac se dorete revenirea, este necesar ca programul principal s transmit secvenei la care se sare o informaie, pe care aceasta s o foloseasc pentru a relua execuia programului principal din punctul n care a fost prsit. Informaia care se transmite este adresa instruciunii de dup cea care a determinat prsirea programului principal, iar aceast informaie se transmite prin intermediul stivei. Instruciunea care realizeaz un salt la o adres dup ce n prealabil a depus pe stiv adresa instruciunii imediat urmtoare din programul principal se numete instruciune de apel i la 8085 este codificat n limbaj de asamblare cu mnemonica CALL. Instruciunea care realizeaz o revenire n programul principal, deoarece rencarc n PC adresa din vrful stivei (cea salvat de CALL) se numete instruciune de revenire i la 8085 este codificat n limbaj de asamblare cu mnemonica RET. Secvena de instruciuni care este apelat se numete subrutin. Programul principal, care apeleaz subrutina se numete program apelant. Formatul general al instruciunilor de apel i revenire este urmtorul:
Dup cum se poate observa, la fel ca i la instruciunile de salt, exist instruciuni de apel i revenire necondiionate, precum i instruciuni de apel i revenire condiionate. Condiiile condition, care apar i n numele instruciunilor, sunt codificate n limbaj de asamblare la fel ca la instruciunile de salt condiionat:
Principalele caracteristici ale subrutinelor: - O subrutin este o succesiune de instruciuni cu unul sau mai multe puncte de intrare etichetate i cu unul sau mai multe puncte de ieire; - Realizeaz o anumit funcie: operaii de I/E, conversii al formatului datelor, operaii matematice n virgul fix sau mobil etc.; - Poate fi apelat ori de cte ori este nevoie; - Pentru ea se aloc memorie numai o singur dat; - La terminare trebuie s se rentoarc n programul apelant, indiferent de locul de unde este apelat (terminare cu instruciune de revenire); - Poate primi parametri din programul apelant i i poate furniza rezultate acestuia prin registre, prin stiv sau prin locaii fixe de memorie; - Registrele modificate de subrutin trebuie s fie cunoscute programului apelant, care trebuie s ia msurile necesare pentru salvarea informaiilor care trebuie pstrate. Pentru creterea lizibilitii codului surs, fiecare subrutin trebuie documentat la definire, precizndu-i-se: - numele i funcia ndeplinit; - modul n care sunt primii parametrii de intrare; - modul n care rezultatele sunt returnate programului apelant; - registrele modificate n cadrul subrutinei.
ntreruperile microprocesorului 8085 Microprocesorul 8085A are integrat un controler de gestionare a cererilor multiple pentru cele 5 linii distincte de ntrerupere accesibile la pini.
n tabelul de mai sus se prezint numele acestor pini, adresele de tratare a solicitrilor, prioritatea lor, modul de prezentare a cererilor, tipul ntreruperilor i modul de utilizare a acestora n cadrul microsistemului EMAC Universal Trainer din laborator. Programul monitor rezident pe microsistem, fiind amplasat n memoria EPROM (care ncepe de la adresa 0000h), este primul care intercepteaz ntreruperile sosite pe primele 4 linii din tabel. Cele prezentate pe linia INTR, la care este conectat un controler de ntreruperi 8259A, pot fi amplasate oriunde n memorie, deoarece pentru a ajunge la adresa de tratare controlerul de ntreruperi folosete instruciuni de tip CALL addr.
ntreruperea nemascabil TRAP este tratat n programul monitor. n varianta actual de monitor, programul utilizatorului nu poate schimba rutina de tratare a ntreruperii nemascabile cu una proprie, deoarece aceast ntrerupere este folosit n exclusivitate de monitor pentru a opri execuia programului utilizatorului. Linia de ntrerupere TRAP este nemascabil, adic cererile sunt ntotdeauna servite de ctre microprocesor, la sfritul instruciunii curente, oricare ar fi aceasta. Celelalte 4 linii sunt mascabile, adic este posibil ca microprocesorul s ignore cererile dac liniile de ntrerupere mascabile sunt inhibate la nivel global (cu instruciunea DI Disable Interrupts) sau doar individual (numai liniile RST x.5), cu instruciunea SIM - Set Interrupt Mask. Dup resetare, sistemul de ntreruperi este inactiv. ntreruperile pot fi validate individual (cu aceeai instruciune SIM) i global (cu instruciunea EI Enable Interrupts) dac dorim s permitem tratarea lor de ctre microprocesor.
Lucrul cu masti Exemple :: Daca avem un octet de biti : B7 B6 B5 B4 B3 B2 B1 B0 si vrem sa pastram doar bitii B3 B4 B5 putem folosi AND sau OR astfel :
-folosind AND : B7 B6 B5 B4 B3 B2 B1 B0 AND o sa rezulte 0 0 1 1 1 0 0 0 ------------------------------------------------------------ 0 0 B5 B4 B3 0 0 0 ------------------------------------------------------------------------------------------------------------------------ -folosind OR : B7 B6 B5 B4 B3 B2 B1 B0 OR o sa rezulte 1 1 0 0 0 1 1 1 ------------------------------------------------------------ 1 1 B5 B4 B3 1 1 1 ------------------------------------------------------------------------------------------------------------------------ Se observa ca folosind AND bitii de care nu mai avem nevoie ii fortam la 0, iar folosid OR acei biti sunt fortati la 1. - Pentru a nega o parte din bitii unui octet trebuie sa folosim XOR. Exemplu : Pentru a nega bitii B5 B4 B3 din octetul anterior:
B7 B6 B5 B4 B3 B2 B1 B0 XOR o sa rezulte 0 0 1 1 1 0 0 0 ------------------------------------------------------------ B7 B6 B5B4B3 B2 B1 B0 Unde B5 inseamna B5 negat. Pe scurt putem spune ca XOR cu 0 lasa bitul la fel , in timp ce XOR cu 1 il neaga. IN concluzie mastile sunt siruri de biti 0 sau 1 cu ajutorul carora putem manipula un octet de biti , pastrand doar datele de care avem nevoie. De exemplu : 0 0 1 1 1 0 0 0 este o masca cu ajutorul carei putem sa negam bitii B5 B4 B3 ( folosind XOR) dar putem de asemenea sa pastram bitii B5 B4 B3 iar pe restul sa ii fortam la 0 ( folosind AND).