|
INTRODUCERE IN STUDIUL MICROSISTEMELOR ELECTRONICE
1. Obiectul lucrarii
Lucrarea isi propune o introducere in studiul sistemelor cu microprocesoare. Sunt descrise componentele microsistemului si rolul acestora. Se introduc comenzile programului monitor, prin intermediul caruia se actioneaza in mod direct asupra microsistemelor existente in laborator. Este prezentat ansamblul de programe tip mediu de dezvoltare IAR Systems Embedded Workbench si comenzile de baza pentru depanarea si simularea programelor in limbaj de asamblare sau realizarea de programe in limbaj de nivel inalt. Lucrarea propune si o scurta recapitulare a sistemelor de numeratie binar si hexazecimal, iar la final sunt prezentati registrii de lucru pentru microprocesorul Z-80.
2. Breviar teoretic
Un microsistem de calcul se compune din urmatoarele elemente:
1. Unitatea centrala (UC), cu rol de comanda si control a intregii structuri. La microsistemele de calcul aceasta este realizata de obicei in jurul unui microprocesor. El poate forma unitatea centrala singur sau impreuna cu alte circuite.
2. Circuitele de memorie, respectiv circuitele de decodificare si selectie aferente:
- memorii ROM - nevolatile - pentru pastrarea programelor rezidente permanent inmicrosistem. Tehnologic acestea pot fi memorii ROM - OTP (one time programming) EPROM, EEPROM, FLASH, etc.
- memorii RAM pentru pastrarea programelor utilizator; la disparitia tensiunii de alimentare informatia stocata in acest tip de memorii se pierde. Memoriile RAM pot fi de tipul Static RAM (SRAM) sau Dinamic RAM (DRAM).
3. Circuitele specializate de intrare - iesire ( input - output, I / O), respectiv circuitele de decodificare si selectie aferente; prin intermediul acestor circuite (cuploare) sunt gestionate echipamentele periferice.
4. Echipamentele periferice; prin intermediul echipamentelor periferice, un microsistem de calcul se interfateaza cu mediul exterior, inclusiv cu operatorul uman.
Structura microsistemului cu microprocesor Z-80 din cadrul laboratorului de microsisteme este prezentata in schema bloc din figura 1.
Unitatea centrala este realizata in jurul microprocesorului Z-80, cuprinde circuitele aferente pentru logica de control, prezinta memorie EPROM in care este inscris programul MONITOR, memorie RAM pentru salvarea variabilelor in timpul rularii programelor. Pe macheta de laborator se mai gasesc dispozitive specializate de intrare-iesire pentru comunicatia seriala (Z-80 SIO), comunicatie paralela (Z-80 PIO), respectiv dispozitiv temporizator numarator (Z-80 CTC).
Elementele microsistemului comunica prin intermediul unor magistrale (bus-uri). Un bus este constituit dintr-un manunchi de fire pe care se vehiculeaza semnale avand aceleasi semnificatii logice. In mod uzual sunt trei categorii de magistrale (bus-uri):
- magistrala de adrese contine informatii emise de unitatea centrala in vederea adresarii locatiilor de memorie si a circuitelor de intrare - iesire. Prescurtat, acest tip de informatii se numesc adrese. In anumite situatii particulare, rolul de generare al semnalelor de adresa nu mai revine unitatii centrale. De exemplu, in cazul folosirii circuitelor DMA (direct memory access), rolul generarii adreselor revine acestor circuite.
magistrala de date contine liniile fizice pe care se vehiculeaza informatiile propriu-zise. Prescurtat, acest tip de informatii se numesc date. Magistrala de date este bidirectionala. Sensul de parcurgere al magistralei poate fi de la procesor la circuitele I/O sau memorii, atunci cand unitatea centrala efectueaza operatii de scriere, sau de la memorie sau circuitele I/O catre procesor, in situatia efectuarii operatiilor de citire de catre UC. In situatii particulare, datele pot sa circule intre circuitele de intrare - iesire si memorii, fara a se mai trece prin unitatea centrala (cazul transferurilor DMA).
magistrala de comenzi contine semnale prin care procesorul se sincronizeaza in functionare, cu elementele externe. Ea nu este o magistrala bidirectionala propriu-zisa, ci contine semnale care sunt generate de unitatea centrala si, respectiv, semnale care sunt receptionate de aceasta. Prin intermediul semnalelor din cadrul acestei magistrale se gestioneaza transferul de date intre unitatea centrala si resursele microsistemului (memorii si circuite de I /O ).
Numarul de linii din cadrul magistralei de adrese indica numarul de locatii de memorie ce pot fi adresate de catre procesor. De exemplu, daca numarul de linii este 14, numarul locatiilor adresate este 214 = 16k, unde 1k = 210 . Pentru alte numere de linii in cadrul magistralei de adrese se obtin urmatoarele capacitati de adresare:
16 linii 216 = 64k
20 linii 220= 1M
24 linii 224=16M
De remarcat faptul ca informatia de adresa se aplica atat circuitelor de memorie cat si celor de I/O. Selectia propriu-zisa a unuia din cele doua tipuri de circuite revine unor semnale din cadrul magistralei de comenzi.
Marimea magistralei de date (numarul de linii cuprinse) constituie o caracteristica a microsistemului, indicand marimea operanzilor care sunt transferati intre procesor si memorie sau circuitele I/O. De obicei, acest numar indica si dimensiunea in biti a operanzilor procesati direct de unitatea centrala, practic forta de calcul a procesorului.
Cu cat marimea magistralei de date este mai mare, cu atat forta de calcul a procesorului este mai mare. Magistrala de date este comuna tuturor resurselor sistemului. Datorita acestui lucru, circuitele conectate la magistrala trebuie sa posede etaje de iesire de tipul tristate (TS). Printr-o logica de activare si selectie trebuie luate masuri pentru ca in cazul depunerilor de informatii pe magistrala de date sa se activeze un singur circuit. Altfel, daca se activeaza simultan doua sau mai multe circuite, se pot produce scurtcircuite si datele sunt alterate. Selectia se realizeaza prin intermediul unor semnale din magistrala de control.
Memoria de tip ROM nu primeste date din cadrul magistralei de date, ea transmitand date catre microprocesor. In acest sens, proiectantul microsistemului trebuie sa prevada circuite care sa asigure protectia la eventualele incercari accidentale de scriere in memoriile ROM. La memoria de tip RAM, precum si la circuitele I/O, astfel de precautii nu trebuie luate, datele putand fi transmise pe magistrala de date, in raport cu unitatea centrala, in ambele sensuri.
3.1. Programul MONITOR
Un program monitor permite utilizatorului accesul la resursele hardware ale microsistemului printr-un set simplificat de comenzi. Comenzile descrise in continuare sunt specifice microsistemelor din cadrul laboratorului, realizate in jurul unor microprocesoare Z-80. Astfel, prin aceste comenzi se pot realiza :
- afisarea, la ecranul display-ului, a continutului unei zone de memorie, intre doua adrese;
- umplerea unei zone de memorie cu o constanta;
- mutarea unei zone (bloc) de memorie intr-o alta zona de memorie;
- compararea continutului a doua zone de memorie cu semnalizarea diferentelor;
- efectuarea de operatii simple (adunare si scadere) in hexazecimal;
- vizualizarea locatie cu locatie a continutului memoriei cu posibilitatea modificarii individuale;
- afisarea registrilor mP-ului cu posibilitatea modificarii continutului acestora;
- rularea programelor utilizatorilor .
La initializarea microsistemului, pe ecranul display-ului (la calculatorul PC) apare un mesaj prin care se indica utilizatorului faptul ca acesta este gata (ready) de lucru. De fapt, are loc in prealabil o autoverificare a integritatii hardware si daca aceasta este trecuta cu succes se afiseaza mesajul mentionat. Este afisat in continuare prompter-ul (in cazul nostru, semnul " > "), care invita utilizatorul la introducerea comenzilor. O comanda se va putea introduce doar dupa afisarea prompterului, prin tastare in dreapta acestuia. Totodata se afiseaza si cursorul (ce indica pozitia curenta pe ecranul display-ului ) printr-o liniuta de subliniere (underline) ce flash-eaza (clipeste).
OBSERVATIE. Se atrage atentia asupra faptului ca toate informatiile introduse de la tastatura si, respectiv, afisate pe display sunt in sistemul de numeratie hexazecimal.
Programul care interfateaza microsistemul din laborator cu utilizatorul, folosind calculatorul PC se numeste TERMINAL.EXE. El asigura afisarea si transmiterea caracterelor in codul ASCII pe portul serial. Dupa lansarea in executie a acestui program trebuie sa facem urmatoarele setari ale comunicatiei seriale: viteza de comunicatie de 4800biti/s, 8 biti de date, fara paritate si un bit de stop dupa cum este aratat in figura 2. Activarea comunicatiei intre microsistem si calculator se face prin apasarea butonului Conectare.
Setul de comenzi ale programului monitor
a) DISPLAY - prezentarea pe display a continutului memoriei
La prompter se tasteaza:
> Dxxxx, yyyy <CR> sau > D xxxx yyyy<ENTER>
unde
xxxx = adresa de inceput a zonei de memorie ce se vizualizeaza (in hexazecimal);
yyyy = adresa de sfarsit a aceleiasi zone (in hexazecimal); trebuie sa avem xxxx < yyyy ;
CR = carriadge return.
Ca efect al comenzii, pe ecranul display-ului apare continutul cautat. De fapt, se prezinta un tabel avand pe prima coloana informatia de adresa (patru digiti), iar pe urmatoarele 16 coloane, date, fiecare pe cate doi digiti hexa, separate prin blank.
Mai jos este dat un exemplu in care se face afisarea zonei de memorie de la adresa 100h la 120h
Observatii valabile pentru toate comenzile programului monitor:
1. O adresa se introduce printr-un grup de patru digiti in format hexazecimal. Daca digitii cei mai semnificativi ai informatiei de adresa sunt "0", ei pot fi omisi. Programul monitor ia in considerare doar ultimii patru digiti introdusi. Nu exista tasta de stergere (delete). De fapt, programul monitor nu o trateaza. In cazul unei tastari incorecte se reia tastarea pana cand ultimii patru digiti introdusi sunt corecti, fara a face nici o pauza. Existenta a patru digiti in format hexazecimal pentru adresa se explica prin marimea magistralei de adrese la microprocesorul Z-80 (16 biti).
2. Virgula este caracter separator intre diferitele campuri ale comenzii. In acelasi scop se poate folosi caracterul space (blank).
3. O data se introduce printr-un grup de doi digiti in format hexazecimal. Daca digitul cel mai semnificativ al informatiei de date este "0" el poate fi omis. Programul monitor ia in considerare doar ultimii doi digiti introdusi. Ca si pentru informatia de adresa, nu exista tasta de stergere. In cazul unei tastari incorecte se reia tastarea pana cand ultimii doi digiti introdusi sunt corecti, fara a se face nici o pauza. Existenta a doi digiti in format hexazecimal pentru data se explica prin marimea magistralei de date la microprocesorul Z-80 (8 biti).
4. Practic, orice comanda a programului monitor se termina prin tastarea caracterului terminator (CR sau Enter sau Return). Executia comenzii introduse este conditionata de aceasta tastare.
5. Comenzile se introduc doar prin folosirea majusculelor (capitals). In acest sens se recomanda apasarea tastei CAPS LOCK.
b) FILL - umplerea unei zone de memorie cu o constanta.
Comanda este posibila doar atunci cand se aplica unei zone de memorie RAM.
>Fxxxx, yyyy, zz <CR>
unde
xxxx = adresa de inceput a zonei;
yyyy = adresa de sfarsit a zonei; trebuie sa avem xxxx < yyyy ;
zz = data (constanta) cu care se umple zona respectiva.
Daca se aplica comanda unei zone de memorie ROM, mecanismele de protectie hardware existente in microsistem nu fac posibila scrierea, comanda neavand nici un efect.
Dupa o executie a comenzii se afiseaza un nou prompter, fiind necesara o comanda DISPLAY pentru a vedea efectul produs.
c) MOVE - muta o zona de memorie, cuprinsa intre doua limite, intr-o noua zona de memorie ce incepe cu o adresa specificata.
>Mxxxx, yyyy, zzzz <CR>
unde xxxx = adresa de inceput a primei zone;
yyyy = adresa de sfarsit a primei zone; trebuie sa avem xxxx < yyyy;
zzzz = adresa de inceput a noii zone de memorie; aceasta zona trebuie sa fie una de tip RAM pentru efectuarea cu succes a comenzii; nu este necesara precizarea adresei de sfarsit a acestei zone; zona in care se face mutarea poate fi asezata indiferent de pozitia in memoria microsistemului a primei zone. Dupa executie, se afiseaza un nou prompter, efectul comenzii putandu-se observa prin executia unei comenzi DISPLAY.
d) COMPARE - compara o zona de memorie, cuprinsa intre doua adrese limita, cu o alta zona de memorie careia i se precizeaza adresa de inceput, semnalizand eventualele diferente ce apar intre ele.
>Cxxxx, yyyy, zzzz <CR>
unde xxxx = adresa de inceput a primei zone ;
yyyy = adresa de sfarsit a primei zone; trebuie sa avem xxxx < yyyy;
zzzz = adresa de inceput a zonei de memorie cu care se face comparatia; nu este necesara precizarea adresei de sfarsit a acestei zone; zona cu care se face comparatia poate avea orice pozitie in raport cu plasarea in memoria microsistemului, a primei zone.
Daca zonele comparate sunt identice se afiseaza un nou prompter. Daca apar diferente se prezinta intr-un tabel, adresele din prima zona unde exista neconcordante, precum si cele doua date diferite (din prima si, respectiv, a doua zona).
e) SUBSTITUTE - permite vizualizarea si modificarea continutului memoriei, locatie cu locatie.
Modificarea este posibila doar daca zona de memorie asupra careia se aplica comanda este una de tip RAM. Vizualizarea este posibila indiferent de tipul zonei de memorie.
Tastarea acestei comenzi prezinta cateva variante, ea fiind interactiva cu operatorul. Se incepe prin tastarea literei S urmata de adresa de la care se doreste vizualizarea si eventual modificarea. Dupa adresa se apasa tasta blank ( space ). Microsistemul raspunde reafisand adresa introdusa anterior ( xxxx ), urmata fiind de semnul " : " si de continutul respectivei locatii de memorie ( yy ). Se afiseaza apoi o liniuta de despartire ( - ). Liniuta are semnificatia interogarii operatorului asupra modificarii respectivului continut. Daca acesta doreste modificarea introduce noua data ( zz ). Daca nu, are doua variante de continuare la dispozitie. In prima, poate sa apese tasta blank (space), trecandu-se astfel la adresa imediat urmatoare (xxxx + 1), cu afisarea continutului acesteia si lasand continutul locatiei anterioare nemodificat. Lucrand astfel, se va putea vizualiza si modifica continutul memoriei pas cu pas ( locatie cu locatie). In a doua varianta de continuare, poate sa apese tasta CR (enter, return), comanda luand sfarsit si afisandu-se un nou prompter.
>Sxxxx xxxx : yy - zzxxxx +1 : uu - vv .. <CR>
unde
xxxx = adresa locatiei;
yy, uu = datele memorate in locatiile indicate;
-= liniuta de dialog cu operatorul;
zz , vv = datele modificate;
Daca nu se doreste modificarea locatiei se apasa tasta blank. Cu caractere italice (aplecate) este prezentat raspunsul microsistemului .
f) EXAMINE - Afisarea si modificarea registrilor microprocesorului. Comanda are mai multe variante.
In forma urmatoare permite afisarea continutului tuturor registrilor microprocesorului :
> X <CR>
Pe linia urmatoare, la display, apare continutul tuturor registrilor microprocesorului:
Intr-o a doua forma de tastare a comenzii se poate face si modificarea continutului registrului dorit. Spre exemplu pentru modificarea continutului registrului B se tasteaza :
>XBbb - mm <CR>
unde bb = vechiul continut al registrului ,
mm = noul continut (modificat) al registrului
Ca si la comanda S(ubstitute) sunt posibile doua variante de continuare. Apasand blank (space) se trece la vizualizarea si, eventual, modificarea continutului urmatorului registru. Daca modificarea nu se doreste, se apasa blank (space) trecandu-se la registrul urmator. Intr-o a doua varianta, apasarea tastei CR (return, enter) va provoca sfarsitul comenzii si afisarea unui nou prompter.
g) GO - Comanda de rulare a programelor. Comanda se deruleaza doar daca anterior in memoria microsistemului s-a depus un program corect, prin folosirea comenzii S(ubstitute).
>Gxxxx <CR>
Este lansat in executie programul scris de utilizator de la adresa 'xxxx'
Comanda microsistemului trece in totalitate catre acest program, cu iesirea de sub controlul programului monitor.
O alta forma a acestei comenzi este :
>Gxxxx, yyyy <CR>
Aceasta comanda determina rularea programului utilizator de la adresa de inceput xxxx pana la cea de sfarsit yyyy. Pe timpul executiei programului, controlul microsistemului revine programului utilizator. Dupa sfarsitul acestei rulari controlul UC-ului revine programului monitor. Adresa de sfarsit se mai numeste adresa de breakpoint (de intrerupere), iar aceasta forma de rulare are denumirea " cu breakpoint ". Este folosita in situatii de depanare a programelor, cand acestea se ruleaza pe portiuni.
h) HEXADECIMAL - permite realizarea operatiilor de adunare si scadere intre doua numere reprezentate in sistemul de numeratie hexazecimal.
>Hxxxx, yyyy <CR>
unde xxxx = primul numar (in hexazecimal)
yyyy = al doilea numar (in hexazecimal)
La display, pe randul urmator, se afiseaza suma si, respectiv, diferenta (reprezentate in hexazecimal) celor doua numere anterioare si apoi un nou prompter.
Comanda se poate folosi pentru a efectua calcule rapide intre numere reprezentate in hexazecimal.
3.2. Mediul de dezvoltare IAR
IAR Systems Embedded Workbench este un mediu integrat flexibil pentru o varietate de aplicatii proiectate pe diferite tipuri de procesoare. Este inzestrat cu o interfata grafica ce permite dezvoltarea rapida a programelor si depanarea lor. Detine urmatoarele unelte de lucru: Embedded Workbench, C compiler, Assembler, XLINK linker, XLIB librarian, C-SPY debugger
Crearea unui proiect in IAR Systems Embedded Workbench
Pentru a crea un proiect trebuie urmati urmatorii pasi:
FILE -> NEW -> PROJECT -> OK
Dupa ce proiectul a fost creat, se deschide o fereastra de editare a programului in asamblare prin urmatoarele comenzi:
FILE -> NEW -> Source/Text -> OK
Noul fisier se salveaza cu extensia .asm si trebuie plasat in acelasi director in care a fost creat proiectul. In final, va fi adaugat la proiect prin urmatoarele comenzi:
PROJECT -> FILES.
si se va deschide o fereastra cu titlul PROJECT FILES. In aceasta fereastra se va selecta directorul in care a fost salvat fisierul cu extensia .asm, iar apoi se va da comanda ADD pentru a-l adauga la proiect si comanda DONE. Dupa aceasta se va observa ca fisierul respectiv va fi adunat la proiectul in care se lucreaza.
Spre exemplu, dupa ce s-a creat un proiect si s-a adaugat un fisier cu extensia .asm, se introduce urmatorul program:
1. ORG 1000h
2. LD A,10h
3. LD B,20h
4. LD C,30h
5. END
In liniile 1 si 5 se intalnesc directivele ORG si END ale asamblorului care indica unde va fi plasat codul masina in memorie si unde se va termina programul. Liniile 2, 3, si 4 sunt instructiuni ale microprocesorului Z80 in limbaj de asamblare.
Pentru a trece acest program in cod masina trebuie aplicata urmatoarea comanda:
PROJECT -> MAKE
sau se apasa icoana MAKE indicata in figura de mai jos:
Daca numarul de erori din fereastra Messages este 0 atunci se va activa icoana Debugger (Fig. 2) pentru a urmari functionarea programului editat anterior cu ajutorul aplicatieiC-SPY debugger (fig.3).
Icoanele utilizate pentru rularea programului sunt:
Incarca registrul PC cu adresa 00h si reinitializeaza registrii procesorului. Simuleaza resetul procesorului.
Ruleaza programul pas cu pas fara sa intre in subrutine.
Ruleaza fiecare insctructiune pas cu pas.
Prin rularea programului pas cu pas se va observa schimbarea registrilor afectati la executia fiecarei instructiuni in parte.
Prin utilizarea aplicatilor Embedded Workbench si C compiler se pot edita si programe in limbajul C. Asamblorul poate genera fisiere cu extensia .hex ce contin codul masina a programului in limbajul C sau in limbaj de asamblare. Aceste fisiere se pot descarca in memoria unui microsistem cu microprocesor Z80.
3.3. Sisteme de numeratie
3.3.1. Sistemul binar
In sistemele digitale sunt utilizate doua nivele de tensiune (uzual 0V si 5V). Prin aceste doua nivele de tensiune se materializeaza cele doua valori distincte care au fost alese prin conventie sa fie 0 si 1, corespunzatoare cifrelor utilizate in sistemul de numeratie binar.
In microsistemele electronice, unitatea cea mai mica de reprezentare a informatiei se numeste bit. Patru biti formeaza un NIBBLE, opt biti formeaza un BYTE (octet), doi octeti formeaza un cuvant adica WORD, dupa cum este aratat in figura 6.
Transformarea in sistemul zecimal se face prin insumarea produselor dintre respectivele cifre binare cu baza la puterea pozitiei cifrei. De exemplu, pentru valoarea binara 10100101 avem relatia:
Transformarea din sistemul zecimal in binar se face prin impartiri succesive la 2 (baza in care trebuie reprezentat). De fiecare data trebuie retinut rezultatul si lasat restul. Procesul se continua pana cand restul va avea valoarea 0. Resturile rezultate, in ordinea inversa a obtinerii, sunt utilizate pentru a reprezenta numarul in baza doi. De exemplu, pentru valoarea zecimala 5 vom avea relatia:
3.3.2. Sistemul hexazecimal
Formatul de numeratie hexazecimal reprezinta o forma compacta si usor de citit a sistemului binar. Conversia din sistemul binar in hexazecimal se face usor, fiecare nibble (4 biti), incepand de la bitul cel mai putin semnificativ fiind convertit intr-o cifra hexazecimala dupa cum este aratat in figura de mai jos.
Transformarea din zecimal in hexazecimal se face asemanator ca si la transformarea din zecimal in binar, cu observatia ca se schimba baza. De exemplu, pentru valoarea hexazecimala 1234h avem:
Transformarea din sistemul zecimal in sistemul hexazecimal se face prin impartiri la 16, baza in care trebuie reprezentat respectivul numar. Procedeul de calcul este la fel ca si cel de trecere din sistemul binar in sistemul zecimal. De exemplu, pentru valoarea zecimala 39 avem:
3.3.3. Reprezentarea numerelor binare cu semn
Este un sistem de codare ce permite reprezentarea numerelor binare cu semn. Poate fi pe un numar oarecare de biti (de obicei, pe un multiplu de 8 biti). Semnul numarului este dat de bitul cel mai semnificativ al reprezentarii.
La Z-80 se foloseste reprezentarea in complement fata de doi (CC2) pe 8 biti. Astfel, CC2 permite reprezentarea numerelor de la -128(10) la +127(10). In functie de bitul cel mai semnificativ, conventia de semn pentru reprezentare este:
"0" - pentru numere pozitive (inclusiv 0) ;
"1" - pentru numere negative .
Regula de transformare a unui numar binar in echivalentul sau CC2 este:
- pentru numere pozitive din gama [0, , 127], CC2 este identic cu codul binar;
- pentru numere negative din gama [-128, , -1], CC2 se obtine plecand de la codul binar al numarului, care se complementeaza (se neaga), obtinandu-se astfel Codul Complement fata de 1 (CC1) si la acest numar se aduna 1.
De exemplu, numarul binar cu semn (echivalentul sau hexazecimal) + 07h are in CC2 reprezentarea 07h (folosind tot sistemul hexazecimal). La acest numar, primul bit (cms) este "0".
Pentru numarul negativ - 05h, se obtine CC1 ca fiind 0FAh, iar in CC2, adunand un "1" rezulta 0FBh. La acest numar, bitul cms este "1", indicand un numar negativ.
3.4. Setul de registri ai microprocesorului Z-80
Microprocesorul Z-80 contine doua seturi de registri generali pe 8 biti, setul principal si, respectiv, setul secundar (notat cu '), precum si un set de registri pe 16 biti. Grafic, registrii se prezinta sub urmatoarea forma :
Registrii microprocesorului se constituie intr-o zona de memorie RAM, ce poate fi accesata foarte rapid de procesor. Continutul unui registru ramane nemodificat pana la urmatoarea scriere care se efectueaza in acesta. Registrii pe 16 biti sunt permanent accesibili utilizatorului. La un moment dat, utilizatorul are acces doar la registrii pe 8 biti aflati in setul principal (respectivul set de registri este activ). Datele stocate in setul secundar de registri sunt pastrate, dar ele sunt inaccesibile utilizatorului. Aceste informatii vor putea fi din nou accesibile, odata cu reactivarea respectivului set de registri.
Procesul de reactivare a setului secundar de registri este insotit de dezactivarea setului de registri care pana in momentul respectiv a fost set principal (acesta devenind astfel set secundar). Revalidarea se face prin doua instructiuni speciale de tip exchange care vor fi prezentate mai tarziu.
a) Registrii pe 8 biti
A = accumulator (acumulator) - la nivelul lui se efectueaza operatiile aritmetico-logice precum si cele de transfer cu circuitele I/O. De fapt, este cel mai important registru al procesorului, prin el derulandu-se majoritatea operatiilor. Se recomanda sa nu se foloseasca acest registru pentru stocarea (memorarea) de informatii, altfel putand apare blocaje la efectuarea de operatii.
F = flags (indicatori, stegulete) - registrul indicatorilor de conditii. Contine bistabili corespunzatori indicatorilor de conditii din unitatea RALU. Sunt folositi doar 6 din cei 8 bistabili ai circuitului. Acesti indicatori sunt testati de instructiuni specifice (instructiunile pentru testarea indicatorilor de conditii) ce vor fi prezentate ulterior. In general, indicatorii nu pot fi pozitionati direct de utilizator. Ei sunt pozitionati ca urmare a efectuarii operatiilor aritmetico-logice. Multe operatii efectuate de procesor lasa neafectati acesti indicatori (de exemplu, operatiile de transfer, de salt, etc).
La microprocesorul Z-80, structura registrului F este urmatoarea:
S - Sign (semn) - indicator ce prezinta semnul rezultatului operatiei aritmetico-logice; este practic bitul cel mai semnificativ al rezultatului; acest indicator are semnificatie doar daca operanzii implicati in operatie sunt exprimati in cod complement fata de 2 (CC2), adica au o reprezentare cu semn. In aceasta situatie:
S = 1 reprezinta un rezultat negativ,
S = 0 reprezinta un rezultat pozitiv sau "0".
Z - Zero (zero) - indica daca rezultatul operatiei aritmetico-logice este nul
Z = 1reprezinta rezultat nul,
Z = 0reprezinta rezultat nenul.
H - Half carry (transport la jumatate) - indica aparitia unui transport intre nybble-ul inferior si cel superior (adica intre D3 si D4 ) la un rezultat al unei operatii aritmetico-logice. Indicatorul este folosit la operatiile de conversie din binar in cod BCD (binary coded decimally).
P/V - Parity/Overflow (paritate / depasire) - indicator cu dubla semnificatie; in urma operatiilor logice indicatorul prezinta paritatea rezultatului obtinut, iar in urma operatiilor aritmetice este indicata depasirea gamei de reprezentare (pe 8 biti) de catre rezultat.
In cazul paritatii:
P = 1 , daca numarul bitilor aflati in starea logica "1" din rezultat este un numar par sau zero;
P = 0 , daca numarul bitilor aflati in starea logica " 0 " din rezultat este numar impar.
In cazul depasirii:
V = 1 , daca s-a produs depasirea gamei de reprezentare;
V = 0 , daca depasirea gamei nu s-a produs.
Indicatorul de depasire are semnificatie doar daca operanzii implicati in operatie sunt reprezentati in cod complement fata de 2 (CC2). Microprocesorul Z-80 admite o reprezentare a numerelor in CC2 pe 8 biti, adica se lucreaza cu numere cu semn in gama -128,+127.
Ecuatia logica a indicatorului V este :
V = T7 T6 unde T7 , T6 sunt cei doi biti de transport mai semnificativi ai rezultatului.
N - (negative) negativ - este un indicator al operatiilor de adunare si scadere. Astfel, daca:
N = 0 , operatia anterioara a fost de adunare,
N = 1 , operatia anterioara a fost de scadere.
Indicatorul este folosit la conversiile numerelor binare in echivalentul lor BCD.
Cy - (carry) transport - indicatorul de transport (carry) sau imprumut (borrow) pentru operatiile aritmetice. Operatiile logice lasa neafectat acest indicator. Astfel:
Cy = 0 , indica faptul ca operatia aritmetica nu a avut transport (sau imprumut) ;
Cy = 1 , indica faptul ca a aparut transport sau imprumut in urma operatiei aritmetice.
Indicatorul se pozitioneaza indiferent de modalitatea de reprezentare a operanzilor implicati in operatie. Se atrage atentia asupra diferentei ce exista intre semnificatia acestui indicator si, respectiv, a indicatorului de depasire.
Indicatorul Cy este singurul care se poate pozitiona prin instructiuni specifice direct de catre utilizator.
Indicatorii S, Z, P/V, Cy se pot testa direct prin instructiuni asa cum se va vedea mai tarziu. Ceilalti indicatori (H, N) se pot testa doar indirect prin alte proceduri.
Registrii A si F se pot concatena (uni), rezultand un registru pe 16 biti, AF, denumit si PSW (programm status word) - cuvantul de stare program. In AF (PSW), F reprezinta octetul cel mai putin semnificativ (ocmps), iar A este octetul cel mai semnificativ (ocms).
B, C, D, E, H, L - registri de uz general pe 8 biti. De obicei, acesti registri se pot folosi pentru stocari temporare de informatii.
Se pot concatena doi cate doi, registrii aflati pe aceeasi orizontala din tabelul anterior, rezultand registri extinsi (pereche, dubli) pe 16 biti : BC, DE, HL. Denumirea acestor registri nu provine din cuvinte deosebite. Exceptie fac registrii H si L care provin din cuvintele englezesti High (ridicat) si Low (coborat). De obicei, registrul dublu HL este folosit pentru adresarea locatiilor de memorie. In acest registru dublu, H reprezinta ocms-ul, iar L formeaza ocmps-ul, rezultand o explicatie a denumirii acestora.
In registrii extinsi amintiti anterior, B, D, H formeaza ocms-ul, iar C, E, L reprezinta ocmps-ul.
b) Registrii pe 16 biti
PC = programm counter (numarator de program) - in acest registru procesorul calculeaza adresa de memorie a urmatoarei instructiuni ce va fi rulata (adresa codului propriu-zis al acestei instructiuni).
La microprocesorul Z-80, o instructiune poate fi reprezentata in memoria microsistemului pe unu pana la patru octeti. Instructiunea contine intotdeauna o parte (unu sau doi octeti) ce reprezinta codul propriu-zis al instructiunii. Pe de alta parte, poate contine optional si unul sau doi operanzi. Numarul octetilor din codul propriu-zis, precum si numarul octetilor de tip operanzi sunt functie de tipul respectivei instructiuni. Octetii de tip cod propriu-zis sunt preluati din memorie (operatia fetch), adusi in automatul CROM al microprocesorului si decodificati. Functie de rezultatul decodificarii se dau comenzi pentru executia instructiunii si pentru eventuala preluare din memorie a operanzilor implicati.
Figura urmatoare exemplifica plasarea in memorie a instructiunilor cu cele doua componente ale acestora (cod propriu-zis, notat prin litera I si eventuali operanzi, simbolizati prin litera O).
La reprezentarea in memorie a unei instructiuni, intotdeauna primul octet (sau primii doi octeti) reprezinta codul propriu-zis al instructiunii (in figura urmatoare acest cod este simbolizat prin "←"), iar urmatorul octet (sau urmatorii doi octeti) reprezinta operanzii.
In registrul PC se calculeaza adresa locatiei de memorie la care se afla codurile propriu-zise ale instructiunii, in vederea extragerii lor din memorie pentru decodificare si executie.
SP = (Stack Pointer) - indicatorul varfului stivei. La microprocesorul Z-80, stiva este o parte a memoriei RAM externe. Este folosita in vederea depunerii si extragerii de informatii. Informatiile constau de obicei, din datele memorate in registrii dubli ai microprocesorului. Folosirea stivei se poate face prin instructiuni de catre utilizator (manual), dar in anumite situatii specifice stiva este folosita automat de mecanismele procesorului, fara interventia programatorului. Astfel de situatii sunt apelul subrutinelor, tratarea cererilor de intrerupere. In aceste situatii speciale, in stiva se salveaza contextul de lucru al procesorului (PC-ul actual sau locul in care programul aflat curent in rulare este suspendat). Dupa tratarea situatiei speciale ce a intervenit, tot automat, din stiva se extrage informatia depusa anterior, restabilindu-se locul in care a intervenit suspendarea, continuandu-se rularea din acest punct.
Stiva este adresata printr-un mecanism de tip LIFO (Last In First Out - ultimul intrat primul iesit). Registrul SP este folosit pentru a adresa aceasta parte de memorie, indicand de fiecare data adresa ultimei depuneri (varful stivei). Initial, trebuie fixata baza stivei prin incarcarea registrului SP. La o depunere, SP-ul isi micsoreaza valoarea prin operatii de decrementare, iar la extragerea din stiva isi mareste valoarea prin operatii de incrementare .
Deci, stiva "creste" catre inapoi, adica spre adresele de inceput ale memoriei (catre adresa 0000h).
IX, IY = (registrii Index X si Y) . Sunt registrii pe 16 biti folositi in operatii de adresare indexata. Procedura de adresare indexata va fi prezentata ulterior.
I = (Interrupt) - registrul de intreruperi. Este un registru pe 8 biti folosit in situatiile de tratare a intreruperilor mascabile, primite de procesor pe intrarea , in modul 2 de tratare a acestora. Modurile de tratare a intreruperilor mascabile vor fi prezentate ulterior. Nu poate fi folosit pentru memorarea altor informatii.
R = (Refresh) - registrul de reimprospatare. Este de fapt un registru pe 8 biti folosit pentru reimprospatarea eventualelor memorii de tip DRAM conectate la magistralele microprocesorului Z-80. Doar ultimii sapte biti ai acestui registru sunt activi, bitul cel mai semnificativ fiind intotdeauna 0. Dupa executia oricarei instructiuni, continutul acestui registru se incrementeaza. In total se pot executa 128 ( 27 ) cicli de refresh. Continutul acestui registru se transmite pe magistrala de adrese, pe octetul cel mai putin semnificativ al acesteia ( A7 , , A0 ) pe timpul efectuarii ciclului. Aceasta informatie este folosita pentru asigurarea refresh-ului la DRAM-urile conectate extern. In aceste situatii, pe octetul cel mai semnificativ al aceleiasi magistrale ( A15 , , A8 ) se transmite continutul registrului I, fara nici un fel de insemnatate practica. Aceasta dubla trimitere se constituie intr-o explicatie a considerarii registrilor I si R, ca facand parte din categoria registrilor pe 16 biti. Nu poate fi folosit pentru memorarea altor informatii.
3.5. Limbajul de asamblare
Procesorul intelege si executa instructiuni ce sunt reprezentate in memoria calculatorului in format binar (instructiuni scrise cu simbolurile binare " 0 " si " 1 "). Programele scrise in acest format se numesc limbaje masina (sau cod masina propriu-zis).
De exemplu, urmatorul numar binar (sau echivalentul in sistemul hexazecimal), reprezinta codul propriu-zis al unei instructiuni :
0011 1110(2)- 3E(H)
Daca pentru microprocesor acest tip de reprezentare este cel mai adecvat, pentru utilizatorii umani el este impropriu. Este practic imposibil sa putem asocia respectivului cod instructiunea corespunzatoare (de fapt ce realizeaza aceasta). Comunicarea intre utilizatori cu privire la ceea ce executa microprocesorul este dificila folosind aceasta reprezentare. Folosirea sistemului de numeratie hexazecimal, care reduce de patru ori numarul digitilor folositi in exprimarea informatiilor binare, nu este nici el potrivit pentru exprimarea sensului respectivelor reprezentari.
In vederea manuirii facile de catre utilizatori a instructiunilor procesorului s-a introdus limbajul de asamblare denumit si limbaj cu mnemonici. In acest limbaj se asociaza unei instructiuni o reprezentare prin litere, care de fapt exprima prescurtat intelesul acesteia.
De exemplu, pentru instructiunea anterioara, prezentata in cod binar (cod masina propriu-zis), reprezentarea in limbaj de asamblare este:
LD A, n8
Aceste litere provin din prescurtarea LOAD ACCUMULATOR with n8 (incarca imediat acumulatorul cu constanta pe 8 biti n8).
Se observa ca prescurtarile provin din limba engleza, fiind propuse de producatorul microprocesorului. Ele trebuie adoptate ca atare fiind folosite astfel in programe. Desi la prima vedere pare dificil, totusi utilizatorilor microprocesorului le este usor sa foloseasca aceasta forma pentru scrierea si intelegerea programelor.
Un program scris in limbaj de asamblare se numeste program sursa (nu poate fi "inteles" direct de microprocesor). Programul corespunzator celui de tip sursa, scris in cod masina propriu-zis, se numeste program obiect (va putea fi "inteles" direct de microprocesor). Trecerea din programul sursa in forma programului obiect se numeste asamblare .
Asamblarea poate fi realizata manual (folosind tabele de asociatii intre mnemonica si codul propriu-zis) sau automat (utilizand un program specializat denumit asamblor sau crossasamblor).
Limbajul de asamblare permite unui utilizator sa aiba in mod direct acces la toate resursele hard ale calculatorului. De asemenea, permite scrierea unor programe foarte rapide si care sa utilizeze eficient resursele microsistemului. Dimensiunea acestor programe este minima din punct de vedere al utilizarii memoriei. Din pacate, pentru utilizatori, eficienta in scriere este mica, iar intelegerea limbajului este dificila. El nu este accesibil decat unor persoane avizate care poseda cunostinte legate de arhitectura hardware a microsistemului respectiv.
Un limbaj de nivel inalt (C, Pascal) are pentru un utilizator o eficienta ridicata (doar prin cateva linii in cadrul programului se obtin efecte deosebite). Nu este nevoie de cunostinte speciale (din punct de vedere hardware) in scrierea acestor programe. De obicei, resursele microsistemului sunt utilizate neoptimal, consumul de memorie fiind mare. De asemenea, accesul la resursele sistemului este ingreunat, iar timpul de executie al programelor este marit, neexistand practic nici un control asupra acestuia.
Un program scris in limbaj de nivel inalt este "tradus" procesorului existent in microsistemul respectiv, printr-o operatie care se numeste compilare sau interpretare, functie de tipul limbajului de nivel inalt, iar programul ce efectueaza acest lucru este un compilator sau interpretor.
In aplicatiile considerate critice din punct de vedere al timpului de rulare, precum si de folosire a resurselor microsistemului se recomanda o programare care sa imbine cele doua metode (limbajul de nivel inalt si limbajul de asamblare). Partea de program care necesita eficienta crescuta din punct de vedere al scrierii si care nu implica probleme critice relative la timpul de rulare si folosirea resurselor microsistemului se scrie in limbaj de nivel inalt. Acolo unde acest lucru se impune trebuie folosit limbajul de asamblare. Orice limbaj de nivel inalt permite ca in interiorul programelor scrise astfel sa se introduca portiuni in limbaj de asamblare. Unul din obiectivele urmarite in desfasurarea lucrarilor de laborator il constituie insusirea elementelor limbajelor de asamblare pentru diversele tipuri de microprocesoare si elaborarea de programe in aceste limbaje.
4. Desfasurarea lucrarii
Se va citi si conspecta breviarul teoretic. Se atrage atentia asupra faptului ca toate cunostintele capatate in acest laborator vor fi necesare si in derularea celorlalte lucrari.
Se vor studia comenzile programului monitor. Se vor efectua operatiile indicate mai jos, respectand ordinea propusa.
OBSERVATIE. Din punct de vedere al arhitecturii hardware a microsistemelor aflate in laborator se specifica faptul ca zona de RAM (32 Kocteti), se afla cuprinsa intre adresele 8000h si 0FFFFh. Se recomanda totusi ca utilizatorul sa foloseasca zona cuprinsa intre adresele 8010h si 0FF00h. Celelalte locatii sunt folosite de programul monitor pentru plasarea de variabile. Zona de memorie ROM (in care se afla programul monitor) este cuprinsa intre adresele 0000h si 7FFFh (32 Kocteti). Aceasta zona este protejata la eventualele incercari de scriere accidentala. De la adresa 0000h la 3FFFh se afla programul monitor iar de la adresa 4000h la 7FFFh exista posibilitatea cuplarii unui emulator de memorie ROM, microsistemul dispunand de un soclu adecvat. Prin intermediul unui astfel de aparat va fi posibila punerea la punct foarte rapida a programelor. Se poate emula o memorie ROM de pana la 64Kocteti. Folosind emulatorul, programele vor putea fi scrise in limbaj de asamblare pe un calculator PC. Asamblarea se va face utilizand un program de tip crossasamblor, fisierul obiect rezultat descarcandu-se in emulator (download).
1) Se va vizualiza ( comanda Display ) continutul zonei de memorie cuprinsa intre adresele 8200h si 8300h ( h - reprezinta sistemul de numeratie hexazecimal ). Sa se identifice campurile de adresa precum si de date. Sa se specifice numarul de biti pe care este reprezentat fiecare camp in parte.
2) Se va umple ( comanda Fill ) zona de memorie cuprinsa intre adresele 8200h si 8300h cu constanta 55h apoi se va vizualiza zona de memorie ( comanda Display ) si se va face remarca modificarii continutului acestei zone fata de situatia primei citiri.
3) Se va umple ( comanda Fill ) zona de memorie cuprinsa intre adresele 0200h si 0300h cu constanta 55h apoi se va vizualiza zona de memorie ( comanda Display ) si se va explica din ce motiv nu este modificata aceasta zona de memorie.
4) Se va muta ( comanda Move ) continutul zonei de memorie cuprinsa intre adresele 8200h si 8300h, in zona cuprinsa intre adresele 8400h si 8500h.e) si se va vizualiza ( comanda Display ) continutul aceleasi zone de memorie cuprinsa intre adresele 8400h si 8500h, facandu-se remarca modificarii acestei zone fata de situatia primei citiri.
5) Se va compara zona de memorie (comanda Compare) cuprinsa intre adresele 8200h si 8300h, cu zona de memorie cuprinsa intre adresele 8400h si 8500h. Umpleti zona de memorie 8200h 8205h cu constanta 33h si repetati comanda de comparare de la inceputul enuntului. Se va stabili daca exista sau nu diferente intre acestea in cele doua cazuri.
6) Folosind comanda H se vor aduna si scadea (in hexazecimal) urmatoarele perechi de numere:
4532h cu 1234h , 0ABCDh cu 9876h , 2AC9h cu 87BFh , 0DF2Bh cu 0E19Ch .
NOTA. Un program de tip asamblor ( crossasamblor ) lucreaza cu constantele hexazecimale care incep cu o litera (A, B, C, D, E, F) doar daca in fata acestora se plaseaza un zero ( 0 ). Daca in astfel de situatii nu se introduce cifra 0, asamblorul semnalizeaza eroare de sintaxa. Pentru introducerea acestor tipuri de date in memoria microsistemului, folosind comenzile programului monitor, cifra 0 poate sa nu fie folosita.
7) Cu ajutorul mediului de dezvoltare IAR se va crea un proiect si se introduce programul urmator:
org 9000h
ld SP,9030h
ld A,41h
buclaout (0040h),A
call temp
call temp
jp bucla
org 9020h
temp ld B,04h
et2 ld C,0ffh
et1 dec C
jp NZ,et1
dec B
jp NZ,et2
ret
end
Dupa ce este compilat proiectul cu comanda MAKE nu rezulta nici o eroare rulati CSPY prin activarea butonului DEBUGGER.
- Identificati in ce zona se afla programul utilizand fereastra SOURCE. Apoi identificati unde este plasat programul in memorie utilizand fereastra MEMORY WINDOW;
- Rulati programul pas cu pas si observati modificarile registrilor din fereastra REGISTER; - Observati de cati cicli masina are nevoie fiecare instructiune in parte si cati octeti de cod masina ocupa.
8) Introduceti codul masina al programului de mai sus cu ajutorul programului monitor in memoria microsistemului cu ajutorul comenzii Substitute
- Se va verifica introducerea corecta a datelor de mai sus ( in ordinea indicata ) prin folosirea comenzii Display.
- Se va rula programul folosind comanda G9000h (startarea programului se face de la adresa 9000h), remarcandu-se efectul acestei comenzi pe ecranul display-ului.
9) In programul de la punctul 8 se modifica instructiunea ld B,04h cu instructiunea ld B,03h. Care este efectul asupra programului dupa rularea acestuia pe microsistem.
10) Care sunt datele echivalente in zecimal pentru urmatoarele numere exprimate in hexazecimal: 4F5h, 256h, ABCh, 3FF4h.
11) Care sunt datele echivalente in hexazecimal pentru urmatoarele numere exprimate in zecimal: 675(10), 438(10), 540(10), 810(10), 777(10).
12) Transformati prin metoda directa din binar in hexazecimal urmatoarele numere: 01001011(2), 11010111(2), 10101010(2), 10110011(2),, 11110000(2).
13) Efectuati urmatoarele adunari in sistemul de enumeratie hexazecimal: 399h+3A5h, 300h+F00h, ACDh+DD3h, E5Bh+25Fh, 4FCh+978h.
14) Efectuati urmatoarele scaderi in sistemul de enumeratie hexazecimal: 421h-398h, 333h-ABFh, 7CAh-2DE, 452h-655h, 1FCh-0FFh.
15) Calculati complementul fata de doi a urmatoarelor numere exprimate in sistemul de enumeratie zecimal: -34(10), -17(10), -43(10), +2(10).