Manual 1 Final

184
1 SISTEMUL CU MICROPROCESOR PE 32 DE BIŢI (modul Z3/EV) Volumul 1/4 Teorie şi exerciţii

Transcript of Manual 1 Final

Page 1: Manual 1 Final

1

SISTEMUL CU MICROPROCESOR PE 32 DE

BIŢI (modul Z3/EV)

Volumul 1/4 Teorie şi exerciţii

Page 2: Manual 1 Final

INDEXINDEX................................................................................................................................................................2

LECŢIA 1: MICROCOMPUTERUL ŞI MICROPROCESORUL...................................................................................3

LECŢIA 2: INTRODUCERE ÎN PROGRAMARE....................................................................................................17

LECŢIA 3: PROGRAMARE ÎN COD MAŞINĂ....................................................................................................25

LECŢIA 4: PROGRAMARE ÎN LIMBAJ DE ASAMBLARE......................................................................................32

LECŢIA 5: MICROPROCESORUL DE 32 DE BIŢI 80386.....................................................................................49

LECŢIA 6: MICROPROCESORUL 80368EX .................................................................................................61

LECŢIA 7: MODULUL DE LABORATOR MOD Z3/EV..........................................................................................76

LECŢIA 8: PROGRAMARE AVANSATĂ..............................................................................................................90

LECŢIA 9: MANAGEMENTUL ÎNTRERUPERILOR...............................................................................................98

LECŢIA 10: MEMORIA EPROM ŞI INTERFAŢAREA CU MICROCONTROLERUL................................................104

LECŢIA 11: MEMORIA RAM ŞI INTERFAŢAREA CU MICROCONTROLERUL.....................................................111

LECŢIA 12: INTERFAŢA PARALELĂ.................................................................................................................120

2

Page 3: Manual 1 Final

3

Page 4: Manual 1 Final

LECŢIA 1: MICROCOMPUTERUL ŞI MICROPROCESORUL

OBIECTIVE

Tipuri de calculatoare: mainframe, minicomputer, personal computer, microcomputer Analiza structurii microcomputerului Dezvoltarea şi tipul microprocesoarelor Familia Intel x86 Arhitectura internă a microprocesorului 8086

MATERIALE

Unitatea de bază pentru sistemele IPES (sursa mod.PS1-PSU/EV, suport pentru modul mod.MU/EV, unitate de management individual mod. SIS1/SIS2/SI3)

Modul experimental mod. Z3/EV

TIPURI de COMPUTERE

Computerele sunt disponibile astăzi într-o varietate de dimensiuni şi performanţe.Ele pot fi clasificate în următorul mod: Mainframeuri Minicomputere Calculatoare personale Microcomputere

MainFrameurile

Acestea sunt cele mai mari şi cele mai puternice computere; ele pot avea dimensiunea unei camere. De obicei folosesc mai multe procesoare în paralel şi au memorii de dimensiuni uriaşe.Exemple de acest timp sunt IBM 4381, Cray Y-MP/832.

Minicomputerele

Acestea sunt mai puţin puternice şi de dimensiuni mai mici decât mainframurile.De obicei sunt încadrate într-un singur rack.Au cuvinte de dată de 64 biţi şi memorie mai puţină decât mainframurile.Sunt utilizate atât pentru managementul datelor cât şi ca staţii de prelucrare grafică.Exemple de acest tip: VAX of Digital

Calculatoare personale

Aceste calculatoare sunt folosite cel mai des. Ele folosesc procesoare cu dimensiunea cuvântului de date de 64 de biţi (Pentium), unitate centrală de prelucrare de ordinul a zeci de MB şi memorie externă de câţiva GB.

Microcomputerele

Acestea sunt cele mai mici computere, în general sunt folosite pentru aplicaţii industriale.Structura lor conţine pe un singur soclu microprocesorul, memoria EPROM şi RAM şi componentele de I/O.Folosesc cuvinte de date de 8, 16, 32 biţi lungime şi memorii de zeci KB.EV/Z3 este un exemplu de microcomputer.

4

Page 5: Manual 1 Final

STRUCTURA UNUI MICROCOMPUTER

Structura unui microcomputer este prezentata in figura 1:

Figură 1

Se poate observa: Unitatea centrală de prelucrare Memoriile (RAM şi EPROM) Porturile de intrare/ieşire Magistrale (de date, adrese, control)

Mulţimea conexiunilor (liniilor electrice) care interconectează UCP cu sistemul de memorie si cu sistemul I/O se numeste magistrală sistem. Aceasta are rolul de a permite schimbul de informaţii (date) între UCP si restul sistemului precum si de a transmite comenzile UCP către celelalte componente ale sistemului. Există trei componente ale magistralei sistem: magistrala de adrese, magistrala de date şimagistrala de comenzi.

Figură 2

Magistrala de adrese permite transmiterea adresei generate de UCP către sistemul de memorie sau către sistemul I/O în ciclurile de transfer de informaţii de la sau către UCP. Numărul de linii ale magistralei de adrese este chiar numărul de biţi din care este formată o adresă, ce indică spaţiul maxim adresabil al UCP. Dacă avem adrese pe 16 biţi, de exemplu, spaţiul maxim adresabil este de 216 adică 64K.

5

Page 6: Manual 1 Final

Atenţie, nu 64KB si nici 64Kb; spaţiul de adrese nu indică cantitatea maximă de memorie ci doar o plajă de numere sau adrese, cantitatea maximă de memorie depinde de lungimea cuvântului de date! Dacă vorbim de maşini cu lungimea cuvântului de date de 8 biţi, de exemplu, atunci putem spune că sistemul suportă maxim 64KB de memorie.Există cazuri când între magistrala de adrese internă (aflată în interiorul UCP) şi magistrala de adrese externă (numărul de pini ai circuitului în care se află UCP alocaţi pentru magistrala de adrese) apar unele diferenţe. Este posibil ca magistrala externă să conţină mai puţine linii decât cea internă. De exemplu,magistrala externă să fie pe jumătate magistrala internă, adresele generându-se în doi timpi, mai întâi partea LOW (prima jumătate de adrese) şi apoi partea HIGH (cea de a doua jumătate). În acest caz este necesară existenţa unor latchuri externe de stocare a primei jumătate a adresei pentru formarea completă a acesteia.

Poate exista si cazul în care numărul de linii de adresă externe să fie mai mare decât numărul de linii interne. Acest caz presupune mărirea artificială a spaţiului de adrese de către arhitectul sistemului prin alocarea suplimentară a unor linii de uz general pentru magistrala de adrese. UCP nu-şi va mări spaţiul maxim adresabil dar prin utilizarea liniilor suplimentare putem comuta software între mai multe zone de memorie aflate la aceleasi adrese (tehnică denumită bank switching).

Magistrala de date permite efectiv transferul de date între UCP si restul componentelor din sistem (memorie, porturi I/O). Numărul de linii al magistralei de date indică dimensiunea externă a cuvântului de date (8 biţi, 16 biţi). Această dimensiune poate fi mai mică decât dimensiunea internă a cuvântului de date. Cu alte cuvinte, o UCP care are o arhitectură bazată pe un cuvânt de date de 16 biţi poate avea magistrala externă de date formată doar din 8 linii. În acest caz, la fel ca şi în cazul magistralei de adrese, transferul de informaţii se face în doi paşi.

Unul dintre parametrii importanţi ai magistralei de date este rata de transfer (bus bandwidth) care indică cantitatea de informaţie transferată pe unitatea de timp (de obicei bytes per second). Aceasta se calculează în funcţie de dimensiunea magistralei şi durata transferului unui cuvânt. Dacă magistrala suportă transferul unui cuvânt într-o microsecundă şi avem o dimensiune a magistralei de 8 biţi, de exemplu, putem spune că magistrala are o rată de transfer de 1MB pe secundă.

Magistrala de comenzi este formată dintr-o colecţie de linii electrice care permit generarea unor semnale de control utilizate în cazul diverselor cicluri magistrală.Prin ciclu magistrală înţelegem o operaţie elementară iniţiată de UCP pentru transferul de informaţii în sistem. O astfel de operaţie presupune sincronizarea tuturor semnalelor implicate (magistrală de adrese, magistrală de date,magistrală de comenzi).

6

Page 7: Manual 1 Final

Implementarea semnalelor ce alcătuite magistrala de comenzi se face prin existenţa unor pini individuali la nivelul circuitului electric în care se găseste UCP. Exemple de linii din magistrala de comenzi: /RD – DataRead, utilizată în ciclurile de citire; /WR – Data Write, utilizată în ciclurile de scriere; prin intermediul acestor două semnale se face diferenţierea între ciclurile magistrală de scriere si citire;ALE – Address Latch Enable, comandă de stocarea adresei în latch-urile intermediare în cazul în care magistralele de date şi de adrese sunt multiplexate; /PSEN – Program Store Enable, comandă care solicit aducerea de informaţii din memoria program externă (în cazul sistemelor cu memorie program separată de memoria de date); /M/IO – Memory/InputOutput,semnal care face diferenţierea între un ciclul de lucru cu memoria şi un ciclu de lucru cu porturile I/O. Toate aceste exemple sunt orientative, în funcţie de fiecare circuit în parte aceste semnale pot exista sau nu, de asemenea pot exista alte tipuri de semnale de comandă în funcţie de complexitatea fiecărui circuit în parte.

UNITATEA CENTRALA DE PRELUCRARE(UCP)

UCP controlează operaţiile microcomputerului şi e parte componentă a microprocesorului.Preia instrucţiunile în format binar de la memorii şi le transformă într-o serie de acţiuni ce se succed secvenţial.

Memoria (RAM şi EPROM)

Memoria este alcătuită în general din o colecţie de memorii RAM şi EPROM (sau ROM).Memoria EPROM conţine codul binar al secvenţei de instrucţiuni ce trebuie procesată de către microprocesor.Memoria RAM conţine date care sunt elaborate în timpul executării programului (această memorie poate fi atât citită cât şi scrisă).

Porturile de Intrare/Ieşire(I/O)

Porturile de intrare / ieşire permit calculatorului să ia date de la componentele din exterior şi să trimită date către componentele din exterior.Dispozitivele folosite de computer pentru a se conecta la dispozitive externe se numesc porturi.Un port de intrare permite citirea datelor de la tastatură sau de la un convertor analogic-numeric.Un port de ieşire permite trimiterea de date la un terminal, printr-un convertor numeric-analogic.

Magistrala (de adrese, date, control)

Magistrala este formată din linii de semnal dispuse paralel în număr de 8, 16, 20, 32 care permit comunicarea între microprocesor şi toate celelalte elemente din interiorul microcomputerului.

Magistrala de adreseEste folosită de UCP pentru a indica adresa de locaţie de memorie care urmează a fi citită sau scrisă.Numărul de locaţii de memorie pe care UCP-ul este capabil de a le localiza depinde de numărul de linii de adresă. De exemplu:

Linii de adresă Locaţii de memorie16 64KB

7

Page 8: Manual 1 Final

20 1MB24 16MB

Magistrala de adrese este unidirecţională: iese din microprocesorşi merge spre dispozitivele de memorie şi porturi I / O.

Magistrala de dateEste folosită de UCP pentru a citi şi scrie date din memorie şi de la porturile I / O.Este formată din 8, 16, 32 de linii în paralel.Toate dispozitivele de memorie şi I / O au ieşirile conectate la magistrala de date, dar numai unul dintre ele poate avea ieşirea activată la un anumit moment de timp.Dispozitivele care au ieşirea activată trebuie să fie în stare de tri-state.

Magistrala de controlConstă într-un număr de 4 şi 12 linii prin care să permită microprocesorului să trimită către memorie şi periferice operaţiile curente.Semnalele tipice de control sunt: citeşte din memorie, scrie în memorie, citeşte de la porturile I/O, scrie catre porturile I/O.

EVOLUŢIA ŞI TIPURILE DE MICROPROCESOARE

Am văzut până acum cum microprocesorul integrează UCP a unui microcalculator.Există mai multe microprocesoare disponibile în prezent, cu diferite caracteristici. Acestea au evoluat în timp, având o creştere progresivă a performanţelor.Următorul tabel arată unele dintre aceste microprocesoare cu principalele salecaracteristici:

Microprocessorul

Caracteristici

4004 Acesta a fost primul microprocesor disponibil pe piaţă în 1971. A fost un microprocesor de 4 biţi de la Intel.

8008 Evoluţia pe 8 biţi a microprocesorului anterior.(1972)8080 Microprocesor Intel pe 8 biţi (1974). Acesta a fost începutul de microprocesoare din a

doua generaţie.6800 Microprocesor Motorola pe 8 biţi.6502 Microprocesor pe 8 biţi utilizat în primul calculator Apple.Z80 Microprocesor Zilog pe 8 biţi.6809 Microprocesor Motorola pe 8 biţi cu instrucţiuni de 16 biţi.8088 Microprocesor Intel având magistrala internă pe 16 biţi şi magistrala externă pe 8 biţi

( în primul PC de la IBM)8086 Microprocesor Intel pe 16 biţi.80286 Microprocesor Intel pe 16 biţi cu capacitate avansată de adresare şi sistem de gestiune a

memoriei.80386 Microprocesor Intel pe 32 biţi68020 Microprocesor Motorola pe 32 biţi32032 Microprocesor National pe 32 biţi80486 Microprocesor Intel pe 32 biţi cu performanţe îmbunătăţite (coprocesor matematic).

Pentium Microprocesor Intel pe 64 biţi

Familia Intel x86

8

Page 9: Manual 1 Final

În tabelul de mai sus au fost prezentate câteva microprocesoare Intel al cărui nume se termină cu numărul 86. Acestea fac parte din familia de microprocesoare numite x86.În continuare, vom descrie în detaliu componentele familiei cu principalele lor caracteristici.

8086Este un microprocesor pe 16 biţi. Unitatea aritmetică logică, registrele şi instrucţiunile sunt realizate să opereze cu cuvinte de 16 biţi.Acest procesor are o magistrală de date externă de 16 biţi.De asemenea are o magistrală de adrese de 20 biţi, capabilă să adreseze 1.048.576 locaţii de memorie (1 MB).

8088Este la fel ca procesorul precedent, cu singura diferenţă că are magistrala de dateexternă de 8 biţi.

80186Este o versiune mai puternică a microprocesorului 8086.Acesta are integrat unele periferice care sunt în mod normal externe. Setul de instrucţiuni este un superset al procesorului 8086 cu scopul de a menţine compatibilitatea software cu acest procesor.

80286Este un microprocesor pe 16 biţi proiectat pentru a fi utilizat pentru sisteme multi-utilizator şi aplicaţii multitasking.Atunci când funcţionează în modul adresă reală se comportă ca un 8086, dar este mai rapid.Atunci când funcţionează în modul adresă virtuală permite păstrarea mai multor programe în memorie, separate şi protejate între ele.

80386Este un microprocesor pe 32 de biţi, care se poate adresa direct până la 32 GB de memorie.Este compus din 32 de linii de date şi de 32 de linii de adresă.Permite operarea în modul adresă reală, comportându-se ca un 8086, dar maiputernic.

80486Este o îmbunătăţire a versiunii 386 care păstrează toate caracteristicile acestei versiuni, dar la care a fost adăugat un coprocesor matematic şi o memorie cache integrată.

80386EXEste o versiune particulară a procesorului 386 care utilizează aceleaşi nuclee interne, având adăugate unele periferice integrate.Această versiune se numeşte Embedded şi este în special folosită în mediul industrial.

Microprocesoarele 8086, 80286, 80386, 80486 nu mai sunt utilizate pentru PC-uri (acestea au fost înlocuite de Pentium) şi, astfel, nu mai sunt disponibile pe piaţă.Ele continuă să fie disponibile în versiunile lor industriale, cum ar fi 386EX.

Arhitectura internă a microprocesorului 8086

Microprocesrul 8086 este procesul de bază al familiei x86. Este important să îi cunoaştem structura internă deoarece reprezintă un model simplificat cu o structură similară celorlalte microprocesoare.Structura internă este reprezentată în figura 3.Se poate observa cum este împărţită diagrama bloc în două părţi funcţionale independente.

9

Page 10: Manual 1 Final

Unitatea de comandă a magistralei (BIU - Bus Interface Unit)

Comandă adresele externe, preia instrucţiunile de la memorie, scrie şi citeşte date în memorie sau de la dispozitivele de intrare/ieşire.

Unitatea de execuţie (EU - Execution Unit)

Transformă instrucţiunile preluate de la unitatea de comandă a magistralei într-oserie de acţiuni.

Figură 3

Unitatea de execuţieConţine următoarele dispozitive:

Controlul de sistem

Se ocupă de controlul şi execuţia tuturor operaţiilor interne.

Unitatea aritmetică logică

Realizează operaţii de tip: sumă, scădere, ŞI, SAU, SAU EXCLUSIV, incrementare, decrementare.

Regiştrii indicatori de condiţii

Conţine indicatorii de condiţii modificaţi prin execuţia instrucţiunilor şi controlul anumitor operaţii de către unitatea de execuţie.Este un registru de 16 biţi având 9 indicatoare de condiţii active (Figura 4) 6 dintre ei (CF, PF, AF, ZF, SF, OF) sunt folosiţi pentru a indica rezultatele instrucţiunilor care efectuează operaţii.Ceilalţi 3 indicatori (TF, IF, DF) sunt folosiţi pentru controlul şi determinarea operaţiilor la nivel de procesor.

10

Page 11: Manual 1 Final

Figură 4

Regiştrii de uz general

Unitatea de execuţie conţine 8 regiştrii de uz general, care pot fi împărţiţi ca în Figura 5:

Figură 5

Primii 4 regiştrii de uz general de câte 16 biţi fiecare sunt:AX = Acumulator principalBX = Acumulator şi registru de bazăCX = Acumulator şi numărătorDX = Acumulator şi registru de adrese intrare/ieşire

Fiecare registru poate fi privit în mod alternativ ca o grupare de 2 regiştrii de 8 biţi fiecare (1 octet). Octetul cel mai din stânga (cel mai semnificativ) al grupării poartă denumirea de MSB(Most Significant Byte), iar cel mai din dreapta (cel mai puţin semnificativ) LSB(Least Significant Byte).Registrul AX poate la rândul lui fi împărţit în 2 regiştrii : AH ca MSB şi AL ca LSB.Registrul BX se împarte în BH si BL, etc.

Există doi regiştrii index folosiţi pentru şiruri de caractere, fiecare având dimensiuneade 16 biţi. Aceştia sunt SI(source index – indexul sursei) şi DI (destination index – registrul destinaţie) şi sunt des utilizaţi pentru a localiza şiruri de caractere în memorie.

Aceştia pot fi utilizaţi şi ca regiştrii de uz general pe 16 biţi.

11

Page 12: Manual 1 Final

Registrul SP(stack pointer – pointer de stivă) este utilizat pentru implementarea stivei în memorie (descrierea stivei va fi analizată mai târziu).

Poate fi substituit prin registrul BP(base pointer – pointer de bază) care de asemeneapoate fi utilizat ca registru general pe 16 biţi.

Unitatea de comandă a magistralei (BIU – Bus Interface Unit)

Conţine următoarele componente:

Coada

În timp ce unitatea de execuţie urmăreşte o instrucţiune, nu este nevoie de utilizarea magistralei, BIU preia din memorie până la 6 octeţi de instrucţiune, pentru următoarele instrucţiuni.BIU memorează aceşti octeţi într-un registru FIFO numit coadă. Atunci când unitatea de execuţie este pregătită pentru a prelua o nouă instrucţiune, preia octetul instrucţiunii direct din coadă.Acest proces, numit pipelining, permite urmărirea instrucţiunilor într-un mod rapid.

Regiştrii de segment

Cei patru regiştrii de segment(CS, DS, SS, ES) sunt regiştrii speciali conectaţi la adresele de date ale memoriei externe.În general, microprocesoarele preiau achiziţiile de date din memorie, utilizând un cuvânt de adresă de 16 biţi. Deoarece adresa are 16 biţi lungime, numărul maxim de adrese este 65536, sau 64K.Microprocesorul 8086 permite adresarea a 1024KB (1MB) de memorie. Utilizează un cuvânt de adrese de 16 biţi, dar permite adresarea unui MB prin segmentarea adresei de memorie (memory address segmentation).

Figură 6

Pentru a adresa 1MB este nevoie să se reprezinte numerele între 0 (00000H) şi 1048576 (FFFFFH). Această operaţie are nevoie de 20 biţi.Setul complet de 1048576 adrese diferite este un spaţiu de adrese dat de 1MB.Din punct de vedere al utilizatorului memoria este adresată în blocuri numite segmente.Fiecare segment poate conţine până la 64 KB de date, astfel se permite utilizarea adresării pe 16 biţi în cadrul unui segment.

12

Page 13: Manual 1 Final

Figură 7

Un segment poate fi iniţiat la fiecare bloc de 16 octeţi (numit PARAGRAF) în cadrul spaţiului de adresă de 1MB.

Acest lucru se poate observa în figura din stânga.

Este de notat faptul că sunt câte 64KB adrese de început pentru segmente diferite, fiecare dintre ele având cei mai puţini 4 semnificativi biţi 0.

Este de reţinut faptul ca segmentele nu au ne-apărat 64KB de date (acesta este maximul posibil).

Un segment poate conţine unul, o sută sau o mie de octeţi.

În plus, segmentele pot fi suprapuse; un octet de date putând fi accesibil de la mai mult de o adresă a începutului de segment.

Diagrama de segmentare este folosită de către microprocesor pentru calcularea adresei efective ca în figura 7:

Figură 8

De fiecare dată când procesorul accesează memoria, selectează unul din cei 4 regiştrii de segmente utilizaţi prin adresa de început de segment.Această valoare este shiftată cu 4 biţi la stânga şi adăugată la adresa relativă(offset) pentru a forma cei 20 de biţi ai adresei fizice.În figura 8 este reprezentat fiecare dintre cei 4 regiştrii de segmente, arătând pentru fiecare când poate fi selectat de procesor pentru calcularea adresei.

13

Page 14: Manual 1 Final

Figură 9

Registrul CS(Code Segment – segmentul de cod) defineşte întotdeauna segmentul de coadă curent, ce conţine instrucţiunile ce trebuiesc urmărite de către procesor (program). Registrul IP de 16 biţi indică instrucţiunea ce trebuie prelucrată.De fapt, când procesorul detectează instrucţiunile, combină adresa din registrul IP cu capătul de segment localizat în registrul CS.

Registrul DS (Data Segment – registrul de date) defineşte începutul segmentului de date ce poate fi utilizat pentru memorarea de date de uz general, ca de exemplu datele obţinute în urma instrucţiunilor ce operează pe stringuri.

Registrul SS (Stack Segment – segmentul de stivă) defineşte începutul segmentului de stivă utilizat pentru toate operaţiile ce implică stiva.

Registrul ES (Extra Segment – segmentul adiţional) defineşte segmentul adiţional ce poate fi utilizat ca alternativă pentru datele de uz general.Segmentul adiţional este de asemenea utilizat ca registru destinaţie pentru operaţiile pe stringuri.

Regiştrii de segmente permit programatorului să acceseze simultan până la 4 adrese de memorie diferite, fiecare putând ajunge până la 64K octeţi de date (vezi Figura 9).

Figură 10

In partea A a figurii, regiştrii de segment au fost programaţi să permită accesul simultan la capacitatea maximă de memorie.

14

Page 15: Manual 1 Final

Această configuraţie permite utilizarea a 64 KB pentru instrucţiuni, 64 KB alocaţi pentru stivă şi două blocuri de 64KB pentru date.

In partea B a figurii este prezentată o situaţie mai realistă.În acest caz avem un program de 8K(2000H) încărcat în segmentul de stivă, ce face referinţă la 2K(800H) în segmentul de date şi poate utiliza 256 octeţi de stivă.

Deoarece cerinţele pentru memorarea de date sunt minime, un segment adiţional independent nu-şi are rostul. Registrul ES este astfel programat încât permite segmentului adiţional să se suprapună peste segmentul de date.

IP (Instruction Pointer – pointerul de instrucţiune)Pointerul de instrucţiune (IP) conţine o adresă de 16 biţi sau o adresă relativă a următorului octet din segmentul de cod curent.Modul în care adresa efectivă de 20 de biţi este obţinută a fost prezentat mai sus.Un mod obişnuit de a reprezenta o adresă fizică pe 20 de biţi este următorul:

Segment: OffsetExemplu:

CS:IP348A:4367

15

Page 16: Manual 1 Final

QUIZ

Q1 Cum sunt numite sistemele de microprocesoare utilizate în mod uzual în aplicaţiile industriale?

SETA B1 4 Mainframe-uri2 1 Minicomputere3 3 PC-uri4 2 Microcomputere

Q2 Unde sunt reţinute datele pe care le generează microprocesorul în timpul funcţionării?

SETA B1 2 Memorie EPROM2 1 Memorie RAM3 4 Porturile de intrare/ieşire4 3 Magistrala

Q3 Care este diferenţa fundamentală între microprocesorul 8088 şi microprocesorul 8086?

SETA B1 2 Regiştrii microprocesorului 8088 sunt pe 8 biţi, iar cei ai

microprocesorului 8086 sunt pe 16 biţi2 4 8086 adresează o cantitate de memorie superioară microprocesorului

8088.3 1 8088 are magistrala externă de date de 8 biţi, 8086 are de 16 biţi4 3 8086 are un număr mai mare de regiştrii decât 8088

Q4 Care din următorii regiştrii nu fac parte din regiştrii utilizaţi de unitatea de execuţie a microprocesorului 8086 ?

SETA B1 3 Registrul IP2 1 Registrul SP3 4 Registrul AX4 5 Registrul SI5 2 Registrul BP

Q5 Câti biţi din cei ai adresei fizice utilizează procesorul 8086 pentru accesul la memorie?

SETA B1 2 8 biţi2 1 16 biţi3 5 20 biţi4 3 24 biţi5 4 32 biţi

16

Page 17: Manual 1 Final

Q6 Într-o adresă de memorie specificată astfel 4AC2:6768, valoarea 4AC2 reprezintă ?

SETA B1 5 Offset-ul2 4 Registrul AX3 2 Registrul de segment4 3 Registrul acumulator5 1 Adresa fizică

Q7 Numele AL reprezintă?

SETA B1 3 Registrul acumulator2 4 Cei mai semnificativi 8 biţi ai registrului acumulator3 1 Cei mai puţin semnificativi 8 biţi ai registrului acumulator4 2 Registrul de segment asociat acumulatorului

Q8 Care dintre următoarele adrese fizice nu poate fi adresa de început a unui segment?

SETA B1 2 0000H2 5 0001H3 1 0010H4 2 0100H5 3 1000H

17

Page 18: Manual 1 Final

LECŢIA 2: INTRODUCERE ÎN PROGRAMARE

OBIECTIVE:

Limbaje de programare Moduri de adresare Adresare imediată Adresare prin registru Adresare directă Instrucţiunile microprocesorului

MATERIALE:

unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/EV, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3

modul experimental mod.Z3/EV

LIMBAJE DE PROGRAMARE

După ce am analizat procesorul 8086 vom analiza în această lecţie modul în care îl putem programa.Există 3 nivele de programare, care pot fi utilizate: Cod maşină Limbaj de asamblare Limbaj de nivel înalt

Cod maşină

Programele pot fi scrise în mod simplu prin scrierea codurilor binare ale instrucţiunilor care trebuiesc prelucrate de către microprocesor.De exemplu (operaţiile efectuate de către microprocesor sunt indicate între paranteze, numerele sunt scrise in format hexazecimal):

B0 24 (încarcă numărul 24 în registrul AL)E6 2F (pune conţinutul regstrului AL pe portul de adrese 2F)

Acest mod de operare nu este foarte eficient deoarece programatorul trebuie să cunoască miile de coduri de instrucţiuni ale microprocesorului 8086.

Limbajul de asamblare

Pentru a putea programa mai uşor, programatorii utilizează limbajul de asamblare, pe care apoi îl transformă în cod maşină pentru a-l încărca în memorie şi a-l executa. Limbajul de asamblare utilizează două, trei sau patru litere mnemonice pentru a reprezenta fiecare literă a instrucţiunii.Fiecare instrucţiune simplă este scrisă într-o formă standard ce conţine pânăla patru câmpuri ca în figură.

Câmpul de titlu

Codul de operaţie

Câmpul de parametrii ai operaţiei

Câmpul de comentarii

PRG: MOV AL,2FH ;încarcă 2FH în AL

Cele două instrucţiuni precedente pot fi scrise:

18

Page 19: Manual 1 Final

PRG: MOV AL,24H ;încarcă în AL numărul 24HOUT 2FH,AL ;trimite conţinul din AL portului cu numărul 2FH

Limbaje de nivel înalt

O altă modalitate de scriere a programelor pentru microprocesor este prin folosirea limbajelor de nivel înalt precum Pascal, COBOL sau C.Acest tip de programare este deobicei folosit de către PC-uri.Limbajul C, foarte apropiat de limbajul de asamblare, este adeseori folosit şi pentru microcomputere.Cu ajutorul unui compilator codul scris în limbajul C este transformat în cod maşină, pentru a fi putea fi citit de către microprocesor.

MODURILE DE ADRESARE

Înainte de a începe programarea propriu-zisă a microprocesorului este necesar să se analizeze modul în care microprocesorul poate accesa datele pe care trebuie să le prelucreze.

Modurile în care se pot accesa datele sunt diferite şi poartă numele de moduri de adresare.Dacă considerăm, de exemplu, instrucţiunea MOV, aceasta va avea următorul format:

MOV destinaţie, sursă

Atunci când este executată, copiază un word(16 biţi) sau un octet(8 biţi) de la sursă la destinaţie.Sursa poate fi un număr, un registru sau o adresă de memorie specificată prin utilizarea unuia din cele 24 de moduri de adresare.Destinaţia poate fi un registru sau o adresă de memorie specificată prin unul din cele 24 de moduri de adresare.

ADRESARE IMEDIATĂ

Adresarea imediată se foloseşte atunci când datele ce doresc a fi prelucrate reprezintă un număr n specificat direct în instrucţiune. Exemplu:

MOV AX,043FH ;încarcă numărul 043F în AX

Numărul 043F ce urmează a fi încărcat în registru este reţinut în două locaţii de memorie, după care se execută codul instrucţiunii MOV.

MODUL DE ADRESARE PRIN REGISTRU

Modul de adresare prin registru este modul în care se utilizează un registru al microprocesorului ca sursă pentru instrucţiune.

Exemplu:

MOV AX, BX; copiază conţinutul registrului BX în registrul AX

Instrucţiunea copiază conţinutul registrului BX în registrul AX. Registrul BX rămâne neschimbat.

19

Page 20: Manual 1 Final

Instrucţiunea conţine codul pentru identificarea registrului sursă BX şi registrul destinaţie AX.

ADRESAREA DIRECTĂ A MEMORIE

Există mai multe moduri de adresare a memoriei. În cele ce vor urma vom prezenta cel mai simplu dintre ele. Celelalte moduri de adresare vor fi prezentate ulterior.

Adresarea directă a memoriei se face prin indicarea adresei efective sub forma unui număr de 16 biţi direct în instrucţiune.

Exemplu:

MOV AX,[0421H] ;încarcă în AX datele de la adresa 0421

Parantezele pătrate indică: „conţinutul adresei de memorie este shiftat faţă registrul de bază cu 0421H octeţi”.

Atunci când este executată instrucţiunea, microprocesorul execută următoarele operaţii: preia valoarea din registrul DS (Segmentul de date), ex:1234 shiftează cei 4 biţi la stânga cu o poziţie: 12340 adaugă valoarea adresei efective: 0421 rezultatul sumei: 12761 aceasta este adresa fizică de memorie de 20 de biţi preia datele de la adresa 12761 şi le salvează în registrul AL preia datele de la adresa 12762 şi le salvează în registrul AH

În instrucţiunea precedentă adresa directă specifică sursa instrucţiunii.În mod similar, destinaţia poate fi specificată astfel:

MOV [0421H],AX ;încarcă registrul AX la adresa 0421

Observaţii: la toate modurile de adresare se poate utiliza un registru de segment explicit, în felul următor:mov bx, ds:[bp+7] ; adresare bazatămov ax, cs:[si][bx+3] ; adresare bazată şi indexată

mov ax, ss:[bx] ; adresare indirectă

INSTRUCŢIUNILE MICROPROCESORULUI

După ce au fost introduse modurile în care microprocesorul identifică datele pe care urmează să le prelucreze, vom vedea care sunt operaţiile pe care microprocesorul este capabil să le execute.Putem spune că operaţiile microprocesorului corespund instrucţiunilor lui.

Vor fi prezentate în continuare un tabel cu instrucţiunile microprocesorului 8086.Multe dintre ele vor fi utilizate şi analizate în următoarele lecţii.Este important să vă faceţi o idee asupra lor pentru a putea înţelege puterea microprocesorului.

20

Page 21: Manual 1 Final

INSTRUCŢIUNI DE TRANSFER DE DATE

MOV Copiază un octet sau un word din sursă în destinaţie

PUSH Copiază pe stivă un word specificat

POP Copiază un word din stivă la adresa specificată

PUSHA Copiază toţi regiştrii pe stivă (80186,..)

POPA Reconstruieşte regiştrii cu datele din stivă (80186, ..)

XCHG Interschimbă octeţi sau date de tip word

XLAT Transformă un octet în AL utilizând o tabelă în memorie

IN Copiază un octet/word de la porturile I/O la registrul acumulator

OUT Copiază un octet/word de la registrul acumulator la porturile de I/O

LEA Încarcă adresa efectivă a operaţiei în registrul specificat

LDS Încarcă din memorie registrul DS şi ceilalţi regiştrii specificaţi

LES Încarcă din memorie registrul ES şi ceilalţi regiştrii specificaţi

LAHF Încarcă AH cu cel mai semnificativ octet al registrului de indicatori de condiţii

SAHF Memorează AH în cel mai semnificativ octet al registrului de indicatori de condiţii

PUSHF Copiază registrul de indicatori de condiţii pe stivă

POPF Copiază un word din stivă în registrul de indicatori

INSTRUCŢIUNI ARITMETICE

ADD Adună octetul/wordul specificat în alt octet/word

ADC Adună ţinând cont şi de valoarea indicatorului de transport

INC Incrementează octetul/wordul specificat cu valoarea 1

AAA Ajustarea codului ASCII după efectuarea adunării

DAA Ajustare decimală după efectuarea adunării

SUB Scade un octet/word din alt octet/word

SBB Scade ţinând cont şi de valoarea indicatorului de transport

DEC Decrementează octetul/wordul cu valoarea 1

NEG Calculează complementului faţă de 2 a octetului/wordului

CMP Compară doi octeţi/două worduri

AAS Ajustarea codului ASCII după efectuarea scăderii

DAS Ajustare decimală după efectuarea scăderii

MUL Înmulţeşte octeţi/worduri fără semn

IMUL Înmulţeşte octeţi/worduri cu semn

AAM Ajustează la codul ASCII după efectuarea înmulţirii

DIV Împarte un word fără semn cu un octet sau un word dublu fără semn cu un word

IDIV Împarte un word cu semn cu un octet sau un word dublu cu semn cu un word

21

Page 22: Manual 1 Final

AAD Ajustare la codul ASCII înainte de împărţire

CBW Umple octetul superior al unui word cu copia bitului de semn al octetului inferior

CWD Umple wordul superior al unui double word cu copia bitului de semn al wordului inferior

INSTRUCŢIUNI LA NIVEL DE BIT

NOT Neagă fiecare bit al unui octet sau word

AND Realizează operaţia ŞI dintre fiecare bit al unui octet sau al unui word cu bitul corespondent al unui alt octet/word

OR Realizează operaţia SAU dintre fiecare bit al unui octet sau al unui word cu bitul corespondent al unui alt octet/word

XOR Realizează operaţia SAU EXCLUSIV dintre fiecare bit al unui octet/ word cu bitul corespondent al altui octet/word

TEST Urmăreşte aceleaşi operaţii ca şi în cazul instrucţiunii AND dar nu modifică valoarea operanzilor

SHL/SAL Shiftează la stânga biţii unui octet/word şi pune 0 în MSB(bitul cel mai semnificativ)

SHR Shiftează la dreapta biţii unui octet/word şi pune 0 în MSB(bitul cel mai semnificativ)

SAR Shiftează la dreapta biţii unui octet/word şi pune vechiulMSB (bitul cel mai semnificativ)în locul celui nou

ROL Roteşte la stânga biţii unui octet/word şi pune MSB în locul LSF(cel mai puţin semnificativ bit) şi CF

ROR Roteşte la dreapta biţii unui octet/word şi pune MSB în locul LSF(cel mai puţin semnificativ bit) şi CF

RCL Roteşte la stânga biţii unui octet/word şi pune MSB în locul CF şi CF în locul LSB

RCR Roteşte la dreapta biţii unui octet/word şi pune MSB în locul CF şi CF în locul LSB

INSTRUCŢIUNI PE STRINGUTI(ŞIURI DE CARACTERE)

Un string este un grup de octeţi/worduri aflat în locaţii succesive ale memoriei.În mod normal este format din caractere ASCII.REP Prefixul instrucţiunii. Repetă instrucţiunea indicată până când CX=0

REPEREPZ

Prefixul instrucţiunii. Repetă instrucţiunea până când CX = 0 sau indicatorul de condiţii zero(ZF) este≠1

REPNEREPNZ

Prefixul instrucţiunii. Repetă instrucţiunea până când CX = 0 sau indicatorul de condiţii zero(ZF) este≠1

MOVSMOVSBMOVSW

Mută un octet sau un word de la un string la altul

COMPS Compară două stringuri de un octet sau două stringuri de un word.

22

Page 23: Manual 1 Final

COMPSBCOMPSW

INSINSBINSW

Preia datele de la un port dat printr-un string de un octet sau un word (80186, ..)

OUTSOUTSBOUTSW

Trimitele datele către un port dat printr-un string de un octet sau word (80186, ..)

SCASSCASBSCASW

Scanează un string.Compară un string de un octet cu octetul din AL sau un string de worduri cu un word din AX

LODSLODSBLODSW

Încarcă un octet al unui string în AL sau un word al unui string în AX

STOSSTOSBSTOSW

Memorează un octet din AL sau un word din AX într-un string

INSTRUCŢIUNI DE SALT şi CALL

CALL Apelează un subprogram, salvează adresa pe stivă

RET Revine dintr-un subprogram la programul apelat

JMP Sare toate adresele specificate pentru a executa instrucţiunea

JA/JNBE Sare dacă e mai mare/Sare dacă nu e mai mic sau egal

JAE/JNB Sare dacă e mai mare sau egal/ Sare dacă nu e mai mic

JBE/JNA Sare dacă e mai mic sau egal/ Sare dacă nu e mai mic

JC Sare dacă indicatorul de carry(Carry Flag) CF=1

JE/JZ Sare dacă e egal/Sare dacă indicatorul de zero ZF=1

JG/JNLE Sare dacă e mai mare/Sare dacă e mai mic sau egal

JGE/JNL Sare dacă e mai mare sau egal/Sare dacă nu e mai mic

JL/JNGE Sare dacă e mai mic/Sare dacă nu e mai mare sau egal

JLE/JNG Sare dacă e mai mic sau egal/Sare dacă nu e mai mare

JNC Sare dacă indicatorul de transport(Carry Flag) CF=0

JNE/JNZ Sare dacă nu este egal/Sare dacă nu e zero (ZF ≠1)

JNO Sare dacă nu există depaşire (overflow flag OF=0)

JNP/JPO Sare dacă există imparitate/Sare dacă e impar(PF=0)

JNS Sare dacă nu există semn (flag of sign SF=0)

JO Sare dacă există depăşire OF=1

JP/JPE Sare dacă există paritate (PF = 1)

JS Sare dacă există semn (SF=1)

23

Page 24: Manual 1 Final

LOOP Urmăreşte o secvenţă de instrucţiuni până când CX=0

LOOPELOOPZ

Urmăreşte o secvenţă de instrucţiuni atâta timp cât ZF=1 şi CX≠0

LOOPNELOOPNZ

Urmăreşte o secvenţă de instrucţiuni atâta timp cât ZF=0 şi CX≠0

JCXZ Sare la adresa specificată dacă CX=0

INT Întrerupe execuţia programului şi cheamă o procedură de serviciu

INTO Întrerupe execuţia programului dacă OF = 1

IRET Revine dintr-o procedură de serviciu

INSTRUCŢIUNI DE CONTROL ale PROCESORULUI

STC Setează bitul de carry (CF = 1)

CLC Resetează bitul de carry (CF = 0)

CMC Complementează starea indicatorului de carry

STD Setează bitul de direcţie (direction flag DF = 1)

CLD Resetează bitul de direcţie(direction flag DF = 0)

STI Setează indicatorul de condiţie de activare a întreruperilor

CLI Resetează indicatorul de condiţie de activare a întreruperilor

HLT Opreşte procesorul până la apariţia unei întreruperi

WAIT Aşteaptă până când semnalul pe pinul TEST devine LOW

ESC Revine de la coprocesorul extern (8087 or 8089)

LOCK Instrucţiune prefix. Blochează posibilele procesoare externe

NOP Nicio operaţie

24

Page 25: Manual 1 Final

QUIZ

Q1 Instrucţiunea: MOV AL,33H este o instrucţiune a microprocesorului scrisă în?

SET

A B

1 3 Cod maşină

2 1 Limbaj de asamblare

3 2 Limbaj de nivel înalt

Q2 Indicaţi care din următoarele nu corespunde unei posibile destinaţii pentru instrucţiunea MOV?

SET

A B

1 2 Un număr

2 3 Un registru

3 1 O adresă de memorie

Q3 Care din următoarele este sursa de date în modul de adresare imediată?

SET

A B

1 2 Un număr

2 3 Un registru

3 1 O adresă de memorie

Q4 Ce rezultat are expresia [1024H] în modul de adresare directă la memorie (instrucţiunea MOV AL,[1024H] )?

SET

A B

1 4 Adresa efectivă a locaţiei de unde să fie extrase datele

2 3 Adresa absolută a locaţiei de unde să fie extrase datele

3 1 Conţinutul locaţiei către adresa efectivă 1024H

4 2 Schimbare în ceea ce priveşte segmentul de date DS

25

Page 26: Manual 1 Final

Q5 Din care adresă fizică a memoriei sunt preluate datele după executarea instrucţiunii MOV AL,0410H, ţinând cont de conţinutul registrului DS ca fiind 1200?

SET

A B

1 2 1610H

2 3 0530H

3 4 0410H

4 1 12410H

Q6 Care din următoarele nu este definită ca o instrucţiune pentru Microprocesorul 8086?

SET

A B

1 6 Instrucţiuni de transfer de date

2 4 Instrucţiuni aritmetice

3 5 Instrucţiuni la nivel de bit

4 3 Instrucţiuni de cercetare

5 2 Instrucţiuni de salt şi CALL

6 1 Instrucţiuni de control ale procesorului

26

Page 27: Manual 1 Final

LECŢIA 3: PROGRAMARE ÎN COD MAŞINĂ

OBIECTIVE:

Modelele de instrucţiuni Codificarea unei instrcţiuni simple Exemple de codificare a mai multor instrucţiuni MOV Codificarea unui program întreg

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV

În această lecţie vi se va prezenta modalitatea de a construi codurile binare pentru instrucţiunile microprocesorului.

Un program de asamblare se ocupă în mod normal de codificarea operaţiilor, totuşi, este important să înţelegeţi principiile pentru a fi în stare să realizaţi într-un mod cât mai rapid programe pentru modulul Z3.

MODELELE de INSTRUCŢIUNI

Pentru un microprocesor capabil de efectuarea unui număr mic de instrucţiuni, codificarea în cod maşină se realizează utilizând un tabel în care sunt trecute toate instrucţiunile, cu diferite moduri de adresare şi codificarea corespunzătoare.

În cazul microprocesorului Intel x86 numărul de instrucţiuni împreună cu multitudinea de moduri de adresare ajunge la câteva mii, ceea ce face imposibilă încadrarea lor într-un tabel.

Din această cauză, sunt utilizate modele pentru fiecare instrucţiune de bază şi există biţi speciali care sunt utilizaţi pentru a indica modul de adresare, tipurile de date, etc.

Setul de instrucţiuni pentru microprocesorul 386 împreună cu modelele folosite pentru fiecare instrucţiune de bază pot fi găsite in appendix B.

CODIFICAREA unei INSTRUCŢIUNI SIMPLE

Considerăm o instrucţiune simplă de încărcare a unui registru prin adresare imediată:

MOV AL,0F2H

Modelul instrucţiunii aşa cum o putem vedea în Appendix B arată astfel:

1 0 1 1 w reg

Date imediate

Considerăm doar regiştrii de 16 biţi:

27

Page 28: Manual 1 Final

W = 0 pentru octetW = 1 pentru word

Regiştrii de 8 biţi(Octet)(W=0)

Regiştrii de 16 biţi(Word)(W=1)

Cod

AL AX 000BL BX 011CL CX 001DL DX 010AH SP 100BH DI 111CH BP 101DH SI 110

Regiştrii de segment

CS 01DS 11ES 00SS 10

Aplicând modelul pentru instrucţiunea MOV AL,0F2H rezultă:

1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0

cod w Reg AL Numărul 2

Se poate seta W=0 deoarece dimensiunea datelor este de un octet, iar reg=000 ceea ce se identifică cu registrul AL.

Considerăm apoi codul instrucţiunii ca fiind de 2 octeţi.

EXEMPLE de CODIFICARE a DIFERITELOR INTRUCŢIUNI MOV

Modelul instrucţiunii MOV este prezentat în figura 10.

După acest model, toate instrucţiunile care mută date de la un registru la alt registru sunt codificate, de la un registru la o adresă de memorie sau de la o adresă de memorie la un registru.

Puteţi observa că sunt utilizaţi cel puţin doi octeţi pentru această instrucţiune.

Figură 3

28

Page 29: Manual 1 Final

Primii 6 biţi din primul octet ai acestui tip de instrucţiune reprezintă codul operaţiei, care identifică tipul instrucţiunii: 100010 .

Bitul D din primul octet al instrucţiunii identifică dacă datele sunt mutate în registrul identificat de câmpul REG (D=0) sau de registrul însuşi (D=1) (D = direcţia de deplasare a datelor).

Bitul W din primul octet identifică tipul de transfer (dacă se transferă un octet atunci W=0, dacă se transferă un word W=1).

Cei trei biţi ai celui de-al doilea octet (REG) identifică registrul folosit ca prim operant în instrucţiune.

Figură 4

Cei doi biţi (MOD) şi cei trei biţi (R/M) în al doilea octet al instrucţiunii sunt folosiţi pentru a specifica MODUL DE ADRESARE a celei de-a doua operaţie a instrucţiunii.În figura 11 este prezentat un tabel cu combinaţiile de MOD şi R/M pentru fiecare din cele 32 de posibile moduri de adresare.

Se poate observa că: Dacă celălalt operand a instrucţiunii este de asemenea un registru, atunci este de

ajuns a seta biţii de MOD 11 şi codul registrului de 3 biţi în R/M. Dacă celălalt operand al instrucţiunii este o adresă de memorie, există 24 de moduri

pentru a specifica adresa efectivă a operaţiei din memorie. Biţii câmpului MOD sunt utilizaţi pentru a indica dacă adresa conţine deplasament

sau nu, iar câmpul R/M reţine registrul ce conţine adresa efectivă. Se utilizează MOD=00 dacă adresa nu conţine vreun deplasament. De exemplu

pentru instrucţiunea MOV AX,[SI] este necesar să se seteze MOD=00 şi R/M=100. În acest caz de adresare directă MOVAX,[124FH] este necesar să se seteze MOD=00, R/M=110, bitul cel mai puţin semnificativ al adresei din al treilea octet al instrucţiunii şi bitul cel mai semnificativ al adresei din al patrulea octet al instrucţiunii.

Se utilizează MOD=01 dacă adresa instrucţiunii conţine un deplasament mai mic decât 256. De exemplu, în cazul instrucţiunii MOV AX, 12H[BX] e necesar să se seteze MOD=01, R/M=111 şi deplasamentul 12H este adăugat in al treilea octet al instrucţiunii.

Se utilizează MOD=10 daca adresa instrucţiunii conţine un deplasament mai mare decât 256. De exemplu, în cazul instrucţiunii MOV AX,2A12H[BX] e necesar să se seteze MOD=10, R/M=111 şi deplasamentul 2A12H este adăugat în al treilea şi al patrulea octet al instrucţiunii (12H în al treilea şi 2AH în al patrulea).

29

Page 30: Manual 1 Final

Exemple de codificare ale instrucţiunii MOV:

MOV SP, BX

Această instrucţiune copiază un word din registrul AX în registrul SP. Codul operaţiei de 6 biţi este: 100010. Bitul W=1 deoarece este un word. Bitul D=1 i câmpul REG=100 atâta timp cât identifică registrul destinaţie SP. Câmpul MOD=11 pentru a reprezenta modul de ADRESARE PRIN REGISTRU. Câmpul R/M=011 pentru a reprezenta celălalt registru BX.

Rezultatul este prezentat în figura 12.

Figură 5

MOV CL,[BX]

Instrucţiunea copiază un octet din memorie, la adresa efectivă data de registrul BX, în registrul CL.Codul operţiei pe 6 biţi este: 100010.Bitul W=0 pentru că e un octet.Bitul D=1 pentru direcţia de transport a datelor se face către registrul CL.Câmpul REG=001 pentru a identifica regiatrul destinaţie CL.Câmpul MOD=00 pentru a reprezenta modul de ADRESARE FĂRĂ DEPLASAMENT.Câmpul R/M=111 pentru a desemna folosirea registrului BX ca şi registru ce conţine adresa de memorie.Rezultatul este reprezentat în figura 13 .

Figură 6

MOV CX,[1240H]

Această instrucţiune copiază un word în registrul CX pe care îl preia din memorie de la adresele 1240H şi 1241H.Codul opeaţiei de 6 biţi este: 100010.Bitul W=0 deoarece este un octet.Bitul D=1 deoarece datele au fost mutate către registrul CX.Câmpul REG=001 pentru a desemna registrul destinaţie ca fiind registrul CX.Câmpul MOD=00 pentru a reprezenta modul de ADRESARE DIRECTĂ.

30

Page 31: Manual 1 Final

Câmpul R/M=110 pentru a indica folosirea adresei directe în instrucţiune pentru a identifica adresa de memorie.Bitul cel mai puţin semnificativ al adresei (40H) este introdus în al treilea octet al instrucţiunii, în timp ce bitul cel mai semnificativ (12H) este introdus in al patrulea octet.

Rezultatul este reprezentat în figura 14 .

Figură 7

MOV CS:[BX],DL

Această instrucţiune copiază un octet din registrul DL într-o adresă de memorie.Adresa efectivă a locaţiei de memorie este conţinută in registrul BX.În mod normal adresa efectivă este adaugată la registrul DS pentru a forma adresa fizică a memoriei. În acest caz notaţia CS:[BX] indică faptul ca registrul CS este folosit în locul registrului DS.CS reprezintă prefixul de suprascriere a segmentului.Atunci când o instrucţiune conţine un prefix de suprascriere a segmentului este necesar de a adăuga un cod de 8 biţi înaintea instrucţiunii. Acest cod trebuie să aibă formatul 001XX110 unde XX reprezintă codul registrului segment utilizat.În cazul de faţa CS=01 şi prefixul de suprascriere a segmentului devine 00101110.Ceilalţi biţi respectă procedura folosită până acum.

Rezultatul este reprezentat în figura 15.

Figură 8

31

Page 32: Manual 1 Final

QUIZ

Dorim să codificăm în cod maşină următorul program:

Program PRG_1

Label Instrucţiune Comentariu

START:

MOV DX,0310H Încărcare imediată a adresei unei instrucţiuni de 16 biţi.Încarcă în registrul DX adresa portului A a interfeţei paralel

MOV AL,55H Încărcare imediată a adresei unei instrucţiuni de 8 biţi.Încarcă în registrul AL datele ce urmează a fi trimise către port

OUT DX,AL Instrucţiune de trimitere a datelor printr-un port de intrare ieşire.Trimite datele pe portul de ieşire

INT 07H Întrerupere software.Cheamă întreruperea 07H care redă controlul monitorului sistemului

Acest program poate fi utilizat direct pe Modulul Z3/EV.

Trimite pe portul A a interfeţei paralel a modulului (conectorul J1) numărul 55H (01010101B).Primul pas este de a transforma instrucţiunile în cod maşină.

Se vor folosi tabelele de la appendix.

Q1 Care din următoarele expresii codifică în mod corect instrucţiunea MOV DX,0310H (Tabelul E-1, Sheet 1)?

SET

A B

1 4 10111010

2 3 10111010 00010000 00000011

3 5 10111110 00010000 00000011

4 2 10111110 00000011 00010000

5 1 10111010 00000011 00010000

Q2 Care din următoarele expresii codifică corect instrucţiunea

32

Page 33: Manual 1 Final

MOV AL,55H (Tabel E-1, Sheet 1)?

SET

A B

1 4 10110000 01010101

2 3 10111000 01010101

3 2 01010101

4 1 10110000 00000000 01010101

Q3 Care din următoarele expresii codifică corect instrucţiunea OUT DX,AL (Tabel E-1, Sheet 2) ?

SET

A B

1 3 11100110 00010000 00000011

2 4 11101111

3 2 11101110

4 1 11101110 0110000

Q4 Care din următoarele expresii codifică corect instrucţiunea INT 07H (Tabel E-1, Sheet 14) ?

SET

A B

1 2 11001101 00000111

2 4 11001100

3 1 11001101

4 3 00000111 11001101

33

Page 34: Manual 1 Final

LECŢIA 4: PROGRAMARE ÎN LIMBAJ DE ASAMBLARE

OBIECTIVE

Formatul programelor în limbaj de asamblare Tipuri de numere folosite Instrucţiunile limbajului de asamblare Fazele de lucru: asamblare, linker Realizarea unor programe simple

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV

În această lecţie veţi învăţa să realizaţi programe pentru microprocesorul pe 32 de biţi utilizând limbajul de asamblare. Folosind acest limbaj se elimină necesitatea trasformării instrucţiunilor în cod maşină, aşa cum a fost prezentat în cadrul lecţiei anterioare.

Există mai multe limbaje de asamblare existente pe piaţă. Toate exemplele ce apar în acest manual se vor referi la limbajul de asamblare MASM de la Microsoft Corp.

FORMATUL UNUI PROGRAM ÎN LIMBAJ DE ASAMBLARE

Penrtru a ilustra formatul instrucţiunilor în limbaj de asamblare să ne referim la exemplul PRG_05 prezentat mai jos.Acest program realizează suma a două numere prezente în două locaţii de memorie, iar rezultatul este pus în a treia locaţie de memorie.

Următoarele caracteristici pot fi uşor deduse: Caracterele ce sunt precedate de semnul ‘;’ sunt considerate comentarii (adăugarea

comentariilor în interiorul programului este o modalitate bună pentru a îmbunătaţi eligibilitatea codului).

Instrucţiunile respectă sintaxa instrucţiunilor microprocesorului Intel din seria x86 prezentat în lecţiile precedente.

În afară de aceste instrucţiuni, există alte şiruri de caractere ce nu au legătură cu instrucţiunile microprocesorului, ci servesc asamblorului; acestea poartă numele de directive.

Numerele din interiorul programului pot fi exprimate în diferite forme: zecimal (2, 45, ..), hexazecimal (12H,..), etc.

Toate aceste caracteristici vor fi analizate în cadrul acestei lecţii.

34

Page 35: Manual 1 Final

;----------------------------- PRG_05 -------------------------;acest program face suma a doi octeţi prezenţi în două locaţii de memorie diferite şi;pune rezultatul în cel de-al treilea;adresa de memorie de un octet (presupunem ca rezultatul nu;depăşeşte numărul 255)

IMONITOR EQU 07H;---------------------------------------- CODE;programul este încărcat la adresa 0200:0000HPROG SEGMENTASSUME CS:PROG, DS:PROGSTART: MOV AX,0200H ;încarcă registru de segment DS

MOV DS,AX MOV AL,DATA_1 ;încarcă în AL primul octet MOV BL,DATA_2 ; încarcă în BL al doilea octet ADD AL,BL ;realizează suma MOV ADDITION,AL INT IMONITOR ;revine la Monitor ;------------------------- date

DATA_1 DB 04H ;primul octe (04H)DATA_2 DB 12H ;al doilea octet (12H)ADDITION DB 00000000B ;rezultat

PROG ENDS END START

TIPURILE DE NUMERE UTILIZATE

În acest program sunt utilizate mai multe moduri de a reprezenta datele. Modurile posibile sunt următoarele:

BINAR

Adăugând un B la şirul de 1 şi 0 indică faptul că numărul e scris în formă binară. Exemplu:

01010101B111111110000000B

ZECIMAL

Numerele zecimale sunt indicate fără niciun semn suplimentar.Exemplu:

MOV AL,15MOV AH,110

Dacă numărul este negativ, atunci asamblorul transformă acest număr în numărul corespunzător complementului faţă de 2.

35

Page 36: Manual 1 Final

HEXAZECIMAL

Numerele zecimale sunt indicate prin adăugarea literei H la valoarea hexazecimală.Exemplu:

24H0A2H

În cazul în care numărul hexazecimal începe cu o literă trebuie adăugată cifra 0 înaintea numărului.

ŞIRURI DE CARACTERE ASCII

Este posibil să se declare o secvenţă de caractere ASCII (string)Examplu:

DB ‘MOZ-Z3’

Această instrucţiune rezervă 6 locaţii de memorie. În prima dintre ele este adăugat codul ASCII al literei M, în a doua codul ASCII al literei O, şamd.

DIRECTIVELE LIMBAJULUI ASAMBLER

Directivele sunt utilizate pentru a indica asamblorului informaţii despre cum să efectueze transformările instrucţiunilor în cod maşină.Pentru a vedea mai în detaliu ce tipuri de directive există consultaţi manualul asamblorului.În ceea ce urmează vor fi prezentate cele mai importante dintre ele.

Directivele SEGMENT şi ENDS

Aceste directive sunt utilizate pentru identificarea unui grup de date sau unui grup de instrucţiuni pe care dorim să la grupăm în cadrul aceluiaşi segment.În acest program este utilizat un segment numit PROG care conţine fie programul fie datele. Directivele sunt:

PROG SEGMENT……………..PROG ENDS

Directivele EQU, DB,DW,DD

În cadrul unui program există în mod normal 3 categorii de date: constante, variabile şi adrese.Este permisă asocierea unor nume variabilelor, constantelor şi adreselor pentru a putea face referinţa la ele prin intermediul unui nume, în loc de a folosi un număr.(acest lucru face programul să fie mai eligibil).

Directiva EQU este utilizată pentru asignarea de nume constantelor unui program.Exemplu: IMONITOR EQU 07H

36

Page 37: Manual 1 Final

În timpul asamblării, numele IMONITOR va fi înlocuit în program de constanta cu numele 07H.Instrucţiunea de revenire la monitor (INT 07H) a fost scrisă ca INT IMONITOR.

Directivele DB, DW, DD sunt folosite pentru a asigna nume variabilelor din program. Exemplu: DATA_1 DB 04H

Utilizând această sintaxă se declară o variabilă de tip octet (DB), căreia i se asignează numele DATA_1 şi este iniţializată cu valoarea 04H.

Să analizăm apoi instrucţiunea:

MOV AL,DATA_1

Valoarea variabilei cu numele DATA_1 este încărcată în registrul AL.DATA_1 nu este nici mai mult nici mai puţin decât o locaţie de memorie unde este memorat octetul. Asamblorul calculează această adresă în funcţie de segmentul unde a fost declarată.Directivele DW şi DD sunt asemănătoare cu directiva DB, doar că ele definesc variabile de tip Word, respectiv Double Word.

DIRECTIVA ASSUME

Directiva ASSUME informează asamblorul asupra segmentului logic ce trebuie folosit pentru fiecare segment fizic al microprocesorului (segment de cod, segment de date, segment de stivă, segment extra).

În exemplul de mai jos:

ASSUME CS:PROG, DS:PROG

informează asamblorul că segmentul logic PROG va trebui folosit ca şi segment de cod şi segment de date.Toate adresele aferente codului şi datelor vor fi calculate relativ la acest segment.Directiva ASSUME serveşte doar ca referinţă a asamblorului, ci nu schimbă valoarea regiştrilor de segment. Modificarea valorilor regiştrilor de segment cu valorile dorite intră în atribuţiile programatorului.Programul de mai jos încarcă segmentul de date DS cu valoarea 0200H, prin intermediul celor două instrucţiuni.

START: MOV AX,0200H ;încarcă registrul DS MOV DS,AX

Fără a se utiliza aceste instrucţiuni, registrul DS nu ar putea fi modificat şi datele vor fi preluate din locaţii de memorie greşite.Registrul CS este încărcat la începutul rulării programului.

Directiva END

Directiva END informează asamblorul că programul s-a încheiat.

Există mai multe directive ale asamblorului, care în mod normal nu sunt generale, ci specifice asamblorului folosit.Aceste directive vor fi prezentate în lecţiile ce urmează, unde va fi necesar folosirea lor.

37

Page 38: Manual 1 Final

FAZA DE LUCRU pentru REALIZAREA PROGRAMELOR în LIMBAJ DE ASAMBLARE

Pentru realizarea programelor în limbajul de asamblare pentru utilizarea într-un sistem precum Mod. Z3/EV este nevoie de mai multe faze de lucru.Aceste faze de lucru, ce rămân identice pentru orice sistem, sunt ilustrate mai jos, precum şi instrumentele ce vor fi folosite în fiecare dintre ele.

Scrierea programelor (Editor)

Un editor este un program care permite crearea unui fişier ce conţine instrucţiunile scrise în limbajul de asamblare corespunzătoare programului.Pot fi utilizate programe precum NotePad-ul din Windows.Pentru programarea sistemului Module Z3/EV se va utiliza editorul integrat din MODZ3/EV.

Asamblarea programelor (Asamblare)

Programul de asamblare este utilizat pentru transformarea instrucţiunilor ,în limbaj de asamblare, corespunzător codului maşină.Asamblorul citeşte codul sursă (format .ASM) ce conţine programul şi generează două fişiere:

(.OBJ) conţine codurile binare ale instrucţiunilor şi informaţiile referitoare la adresele instrucţiunilor.

(.LST) conţine lista completă a instrucţiunilor şi a codurilor generate.

Linker

Este un program utilizat pentru gruparea mai multor fisiere OBJ într-un singur fişier.Fişierul generat de către linker are extensia .EXE şi poate fi utilizat în mod direct de sub sistemul de operare MS-DOS.

În cazul folosirii în cadrul sistemului Module Z3/EV, programul trebuie modificat şi transformat în cod binar.

Transformarea în cod binar pur (EXE2BIN)

Sistemul de operare MS-DOS conţine un program ce transformă un fişier .EXE într-un fişier cu cod binar pur ce conţine numai codurile operaţiilor.Acest program se numeşte EXE2BIN.Este utilizat pentru transformarea fişierului .EXE într-un fişier .BIN ce conţine doar codurile binare.

Încărcarea programului în sistemul Module Z3/EV (MODZ3)

Programul MODZ3, ataşat modulului Z3/EV, realizează copierea programului din fişierul .BIN în memoria RAM a modulului Z3. Acest transfer se poate realiza fie prin intermediul interfeţei seriale sau interfeţei paralele.

Verificarea funcţionării programului (Debugging)

Verificarea funcţionării programului se realizează în mod direct în modulul Z3/EV.

38

Page 39: Manual 1 Final

În timpul acestei etape se execută întregul program cap-coadă sau linie cu linie sau se poate opri la anumită linie prin utilizarea breakpoint-urilor. La fiecare pas sunt prezentate conţinutul registrelor şi a memoriei sistemului Z3/EV.

Toate aceste etape vor fi revizuite în lecţiile următoare.

Forma simplificată de definire a segmentelor

Această modalitate de definire a segmentelor respectă acelaşi format ca şi la programele dezvoltate în limbaje de nivel înalt.

.MODEL tip_modelPrin această directivă se specifică dimensiunea şi modul de dispunere a segmentelor în memorie. Modelul de memorie poate fi:- tiny - toate segmentele (date, cod, stivă) formează un singur segment de cel mult 64KB. Apelurile de procedură şi salturile sunt de tip NEAR şi se folosesc adrese efective (offset) pentru accesarea datelor;- small - datele şi stiva formează un segment şi codul un alt segment. Fiecare din acestea va avea dimensiunea maxima de 64KB. Apelurile de procedură şi salturile sunt de tip NEAR şi se folosesc adrese efective (offset) pentru accesarea datelor;- medium - datele şi stiva sunt grupate într-un singur segment (cel mult egal cu 64KB), dar codul poate fi în mai multe segmente, deci poate depăşi 64KB. Apelurile de procedură şi salturile sunt implicit de tip FAR şi se folosesc adrese efective (offset) pentru accesarea datelor;- compact - codul generat ocupă cel mult 64KB, dar datele şi stiva pot fi în mai multe segmente (pot depăşi 64KB). Apelurile de procedură şi salturile sunt de tip NEAR şi se folosesc adrese complete (segment şi offset) pentru accesarea datelor aflate în alte segmente;- large - atât datele cât şi codul generat pot depăşi 64KB. Apelurile de procedură şi salturile sunt implicit de tip FAR şi se folosesc adrese complete (segment şi offset) pentru accesarea datelor aflate în alte segmente;- huge - este asemănător modelului large, dar structurile de date pot depăşi 64KB.

La modelele compact şi large, o structură compactă de date (de tip tablou) nu poate depăşi limitele unui segment fizic (64KB); la modelul huge, această restricţie dispare.

.STACK [dimensiune]Această directivă alocă o zonă de memorie de dimensiune specificată pentru segmentul de stivă. Dacă nu se specifică parametrul dimensiune, aceasta va fi implicit de 1KB.

.CODE [nume]Această directivă precede segmentul de cod. Încărcarea adresei acestui segment în registrul CS se face automat de către sistemul de operare, la încărcarea segmentului pentru execuţie. Opţional se pot asocial nume (maxim 6 caractere) pentru segmentele de cod.

.DATAAceastă directivă precede segmentul de date. Utilizatorul trebuie să iniţializeze, în mod explicit, registrul de segment DS, cu adresa segmentului de date. Simbolul @data primeşte adresa segmentului de date după linkeditare.

Etichete

39

Page 40: Manual 1 Final

Etichetele identifică cod executabil, formând operanzi pentru CALL, JMP sau salturi condiţionate. O etichetă poate fi definită:• prin numele etichetei urmat de caracterul : - se defineşte astfel o etichetă de tip near

nume_etichetă:Ex.: eticheta: mov ax, bx

• prin directiva LABEL, cu forma generalănume label tipDacă ceea ce urmează reprezintă instrucţiuni (cod), tipul etichetei va fi NEAR sau FAR şi eticheta va fi folosită ca punct ţintă în instrucţiuni de tip JMP/CALL. Daca ceea ce urmează reprezintă definiţii de date, tipul etichetei va fi BYTE, WORD, DWORD, etc.

De exemplu, în urma definiţiei:alfab label bytealfaw dw 1234H

o instrucţiune de forma mov al, alfab va pune în AL octetul mai puţin semnificativ al cuvântului (34H).

• prin directiva PROC, numele procedurii fiind interpretat ca o etichetă cu tipul derivat din tipul procedurii (NEAR sau FAR). Forma generală a unei proceduri este:

nume_proc proc tip…

nume_proc endp

Instrucţiuni de apel de procedură şi de salt

Forma generală pentru definirea unei proceduri este:nume_proc PROC [FAR | NEAR]……RETnume_proc ENDP

unde nume_proc este numele procedurii, iar parametrii opţionali FAR sau NEAR indică tipul procedurii.

Procedurile sunt de două tipuri: FAR şi NEAR. O procedură FAR poate fi apelată şi din alte segmente de cod decât cel în care este definită, pe când o procedură NEAR poate fi apelată numai din segmentul de cod în care este definită. Dacă se omit parametrii FAR sau NEAR, tipul procedurii este dedus din directivele simplificate de definire a segmentelor (modelul de memorie folosit).

De exemplu , modelul LARGE presupune că toate procedurile sunt implicit de tip FAR.În mod corespunzător, există apeluri de tip FAR, respectiv NEAR, precum şi instrucţiuni derevenire de tip FAR, respectiv NEAR. Instrucţiunea RET (Return) provoacă revenirea în programul apelant; tipul instrucţiunii este dedus din tipul procedurii (NEAR sau FAR). Putem folosi o instrucţiune de revenire explicită: RETN (Return Near) sau RETF (Return Far).

Apelul procedurilor şi revenirea din proceduri

Instrucţiunea CALL (Apel de procedură)

40

Page 41: Manual 1 Final

CALL nume_procCALL FAR PTR nume_procCALL NEAR PTR nume_procÎn primul caz, tipul apelului este dedus din tipul procedurii, iarîn celelalte este specificat explicit (FAR sau NEAR). Tipul apelului trebuie să coincidă cu tipul procedurii şi cu tipul instrucţiunilor Return din interiorul procedurii, altfel se ajunge la funcţionări defectuoase ale programului. În cazul unui apel de procedură de tip NEAR, se salvează în stivă conţinutul registrului IP, care reprezintă adresa de revenire, iar apoi în IP se încarcă adresa primei instrucţiuni din procedură. În cazul unui apel de tip FAR, se salvează în stivă CS:IP,adresa completă de revenire (pe 32 de biţi), iar apoi în CS:IP se încarcă adresa primei instrucţiuni din procedură.

Instrucţiunea RET (Return - Revenire din procedură)

RETRETFRETN

În primul caz, tipul tipul instrucţiunii este dedus din tipul procedurii. În cazul unei reveniri de tip NEAR, se reface registrul IP din stivă, astfel se transferă controlul la instrucţiunea care urmează instrucţiunii CALL care a provocat apelul procedurii. În cazul unei reveniri de tip FAR, se reface din stivă perechea de register CS:IP.

Instrucţiunea JMP (Jump - Salt)

JMP tintaJMP SHORT PTR tintaJMP NEAR PTR tintaJMP FAR PTR tinta

În primul caz, tipul saltului este dedus din atributele expresiei care precizează ţinta. Ţinta specifică adresa de salt şi poate fi o etichetă sau o expresie. Există trei tipuri de instrucţiuni de salt:

• SHORT - adresa ţintă se află la o adresă în domeniul [-127, +127] faţă de adresa instrucţiunii de salt;• NEAR - adresa ţintă este în acelaşi segment de cod cu instrucţiunea de salt;• FAR - adresa ţintă poate fi în alt segment de cod faţă de instrucţiunea de salt.

Tipuri de salt/apel

JMP/CALL direct

Operandul care se află în formatul instrucţiunii este o etichetă care identifică adresa ţintă. Poate fi de două tipuri:

• salt/apel direct intrasegment (NEAR) - eticheta este în acelaşi segment de cod cu instrucţiunea JMP/CALL;• salt/apel direct intersegment (FAR) - eticheta poate fi definită şi în alt segment de cod decât cel care conţine instrucţiunea JMP/CALL.

JMP/CALL indirect

41

Page 42: Manual 1 Final

Operandul care apare în formatul instrucţiunii reprezintă o adresă de memorie. Poate fi de două tipuri:

• salt/apel indirect intrasegment (NEAR), cu forma general JMP/CALL exprîn care expr precizează adresa efectivă a ţintei şi poate fi un registru, o variabilă de tip WORD, sau un cuvânt din memorie;• salt/apel indirect intersegment (FAR), cu forma general JMP/CALL exprîn care expr precizează adresa completă a ţintei şi poate fi o variabilă de tip DWORD, sau un dublucuvânt din memorie.

Exemple de programe

;----------------------------- PRGR_EXEMPLU -------------------------; acest exempliu verifica daca un string este un palindrom

#make_COM#

ORG 100h;deplasament de memorie; programul este incarcat la adresa CS:0100h

jmp start

s DB 'aaabbbaaa's_size DW 9

start:

LEA DI, sMOV SI, DIADD SI, s_sizeDEC SI ; indica catre locatia de memorie a ultimului caracter

MOV CX, s_sizeSHR CX, 1 ; divide cu 2!

next_char:MOV AL, [DI]MOV BL, [SI]CMP AL, BLJNE not_PalindromeINC DIDEC SI

LOOP next_char

is_Palindrome: ; Set AX to 0FFFFh – stringul este "Palindrom!" MOV AX, 0FFFFhJMP stop

42

Page 43: Manual 1 Final

not_Palindrome: ; Set AX to 0ABCDh - stringul nu este palindrom!" MOV AX, 0ABCDh stop:

RET

;----------------------------- PROGR_EXEMPLU -------------------------;; acest exemplu arata folosirea unei intreruperi de temporizare; (INT 15h / 86h); prin afisarea unor caractere cu delayul de o secunda

#make_COM#

ORG 100h

; setarea registrilor de segment; MOV AX, CSMOV DS, AX

next_char:

CMP count, 0JZ stop

; afisare caracterMOV AL, c1MOV AH, 0EhINT 10h

; urmatorul caracterINC c1DEC count

; intervalul (1 million; de microsecunde - 1 secunda):MOV CX, 0FhMOV DX, 4240hMOV AH, 86hINT 15h

; oprire la orice eroareJC stop

JMP next_char

stop:RET

43

Page 44: Manual 1 Final

count DB 10c1 DB 'A'

END

;----------------------------- PRG_EXEMPLU -------------------------;Program pentru determinarea cmmdc a doua numere;numerele apartin intervalului (0,255]

data segment ; add your data here! a db 3 dup(?);vector de cifre primul nr a_nr db ? ;valoare primul numar b db 3 dup(?);vector de cifre al doilea nr b_nr db ? ;valoare al doilea numar mesaj1 db "a=",'$' mesaj2 db 13,10,"b=",'$' mesaj3 db 13,10,"cmmdc(",'$' mesaj4 db ",",'$' mesaj5 db ")=",'$' cmmdc db 3 dup(?),'$';vector de cifre cmmdc pkey db 13,10,"press any key...$"ends

stack segment dw 128 dup(0)ends

code segmentstart:; registrii de segment: mov ax, data mov ds, ax mov es, ax ;citeste cifrele primului numar--maxim 3 lea dx,mesaj1 mov ah,09h int 21h mov ah,01h mov bx,0; va retine numarul de cifre citite mov cx,3;nr maxim de cifre lea si,a citire1: int 21h cmp al,'0';secventa de comparatie cu domeniul cifrelor jl gata11 cmp al,'9' ja gata11

44

Page 45: Manual 1 Final

mov [si],al inc si inc bx loop citire1 gata11: cmp cx,3 ;daca nu s-a introdus nicio cifra--STOP jz sfarsit ;punere in memorie a valorii primului numar dec bx mov cx,bx lea si,a mov bl,10 mov al,[si] sub al,48 cmp cx,0 jz gata12 calcul1: mul bl inc si add al,[si] sub al,48 loop calcul1 gata12: mov a_nr,al ;citeste al doilea numar lea dx,mesaj2 mov ah,09h int 21h mov ah,01h mov cx,3 mov bx,0 lea si,b citire2: int 21h cmp al,'0' jl gata21 cmp al,'9' ja gata21 mov [si],al inc si inc bx loop citire2 gata21: cmp cx,3 jz sfarsit ;pune in memorie al doilea numar dec bx mov cx,bx lea si,b mov bl,10 mov al,[si]

45

Page 46: Manual 1 Final

sub al,48 cmp cx,0 jz gata22 calcul2: mul bl inc si add al,[si] sub al,48 loop calcul2 gata22: mov b_nr,al ;determina cmmdc mov al,a_nr ;al-primul numar mov bl,b_nr ;bl-al doilea nr bucla: cmp al,bl ja et1 ;al>bl-->al=al-bl jz afisare0;al=bl-->cmmdc=bl sub bl,al ;al<bl-->bl=bl-al jmp et2 et1:sub al,bl et2:cmp al,bl jnz bucla ;afiseaza mesaj3 afisare0: lea dx, mesaj3 mov ah, 09h int 21h ;afiseaza primul numar mov ah,02h lea si,a mov cx,4 afisare1: cmp [si],'0' jl gataaf1 cmp [si],'9' jg gataaf1 mov dl,[si] int 21h inc si loop afisare1 gataaf1: ;afiseaza mesaj4 lea dx, mesaj4 mov ah, 09h int 21h ;afiseaza al doilea numar

46

Page 47: Manual 1 Final

mov ah,02h lea si,b mov cx,4 afisare2: cmp [si],'0' jl gataaf2 cmp [si],'9' jg gataaf2 mov dl,[si] int 21h inc si loop afisare2 gataaf2: ;afiseaza mesaj5 lea dx, mesaj5 mov ah, 09h int 21h ;pune cmmdc in memorie ;acesta se afla in bl ;este descompus in cifre din baza 10 mov al,bl mov bl,10 mov ah,0 lea si,cmmdc dec si mov dx,0 bucla1: inc si mov ah,0 div bl add ah,48 mov [si],ah cmp al,bl jae reia1 cmp al,0 jz gata3 inc si add al,48 mov [si],al jmp gata3 reia1:jmp bucla1 gata3: ;afisare valoare cmmdc mov dl,[si] mov ah,02h int 21h dec si cmp [si],'0' jl gata4

47

Page 48: Manual 1 Final

cmp [si],'9' ja gata4 jmp gata3 gata4: sfarsit: lea dx, pkey mov ah, 9 int 21h ; asteapta o tasta... mov ah, 1 int 21h mov ax, 4c00h ; iesire la SO. int 21h ends

end start ;

QUIZ

Dorim să realizăm un program, similar cu cel prezentat în partea de teorie, care: să utilizeze două tipuri de segmente pentru cod şi pentru date realizează suma a două word-uri de valori 0120H respectiv 0241H pune rezultatul în memorie într-un al treilea word

O variantă incompletă a programului este prezentată mai jos.Întrebările ce vor urma se vor referi la instrucţiunile şi directivele ce lipsesc din program.

;----------------------------- PRG_07 -------------------------;acest program realizează suma a două worduri prezente în memorie;având valorile 0120H şi 0241H şi pune rezultatul în al treilea;word în memorie (se presupune că rezultatul nu va depăşi 16 biţi

IMONITOR EQU 07HDS_SEG 0080H;---------------------------------------- DATADATA xxxxxxxxxxxxDATA_1 xxxxxxxxxxxxDATA_2 xxxxxxxxxxxxxxxxxxxx ENDS;---------------------------------------- CODE;the program is charged to the address 0200:0000HPROG SEGMENTASSUME xxxxxxxxxxxxxxxxxxxSTART: MOV AX,xxxxx ; încarcă DS cu segemneul de date

MOV DS,AX MOV xx,DATA_1 ; încarcă prima voloare

48

Page 49: Manual 1 Final

MOV BX,DATA_2 ; încarcă a doua valoare ADD AX,BX ;însumează cele două valori MOV SUMS,AX INT IMONITOR ;revenire la monitor

PROG ENDS END START

Q1 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: DATA xxxxxxxxxx ?

SET

A B

1 2 ASSUME

2 5 SEGMENT

3 4 ENDS

4 1 0120H

5 2 0241H

Q2 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: DATA 1 xxxxxxxxxx ?

SET

A B

1 5 ASSUME

2 1 DD 0120H

3 4 DB 0120H

4 2 DW

5 3 0120H

Q3 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: DATA 2 xxxxxxxxxx ?

SET

A B

1 4 ASSUME

2 1 DW 0120H

3 5 DW 0241H

4 3 DD 0120H

5 2 DD 0241H

49

Page 50: Manual 1 Final

Q4 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: xxxxxxxx ENDS ?

SET

A B

1 2 ASSUME

2 5 SEGMENT

3 4 ENDS

4 3 DATA

5 1 0241H

Q5 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: ASSUME xxxxxxxxxxxxxxxxxxxxxxx ?

SET

A B

1 4 CS:PROG, DS:PROG

2 5 DS:PROG, CS:PROG

3 1 CS:PROG, DS:DATA

4 2 CS:PROG

5 3 DS:DATA

Q6 Cu care din următoarele expresii trebuie substituit xxxxxxxxxx din linia: MOV AX,xxxxx ?

SET

A B

1 4 0120H

2 5 0000H

3 1 PROG

4 3 DS:DATA

5 2 DS_SEG

Q7 Cu care din următoarele expresii trebuie substituit xx din linia: MOV xx,DATA_1 ?

SET

A B

1 3 AL

2 1 AH

3 4 AX

50

Page 51: Manual 1 Final

4 5 DX

5 2 DS

51

Page 52: Manual 1 Final

LECŢIA 5: MICROPROCESORUL DE 32 DE BIŢI 80386

OBIECTIVE:

Evoluţie de la 8086 la 80386 Structura internă a microprocesorului 80386 Regiştrii Lista de instrucţiuni Modurile de funcţionare

MATERIALE:

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV

În această lecţie va fi descris microprocesorul 80386.Până acum s-a folosit doar microprocesorul 8086 deoarece este cel mai simplu microprocesor din familia Intel, şi deci e cel mai bun pentru început.Microprocesorul 80386 este compatibil cu 8086, dar are potenţial mai mare datorită structurii pe 32 de biţi.

EVOLUŢIA de la 8086 la 386

Următorul microprocesor dupa 8086, lăsând la o parte 186 este 80286.Aceasta este un upgrade la 16 biţi a microprocesorului 8086, având în plus şi un sistem de management a memoriei virtuale, circuite de protecţie, şi posibilitatea adresării a 16 MB de memorie.Este primul microprocesor al familiei ce a fost proiectat pentru utilizare în sisteme multi-user sau multi-tasking.Microprocesorul 80386 este un microprocesor pe 32 de biţi cu magistrala de adrese de 32 de biţi.

UAL de 32 de biţi permite microprocesorului 386 să prelucreze datele într-un mod rapid, iar adresarea pe 32 de biţi permite adresarea a până la 4GB de memorie.

Este în mod special utilizat în cadrul sistemelor multi-tasking, având un management al memoriei şi un circuit de protecţie îmbunătaţit.În plus, microprocesorul 386 este compatibil cu mai multe sisteme de operare actuale.

Structura internă

Diagrama bloc a microprocesorului 80386 este prezentată mai jos în figura 16.

52

Page 53: Manual 1 Final

Figură 9

80386 este format din: unitatea centrală de prelucrare unitate de management a memoriei magistrală de date

Unitatea centrală de prelucrare (UCP) este formată din unitatea de execuţie şi unitatea de instrucţiuni.Unitatea de execuţie conţine 8 regiştrii de uz general de 32 de biţi împreună cu UAL.Unitatea de instrucţiuni decodifică codurile operaţiilor intrucţiunilor şi le salvează într-o coadă pentru a fi preluate de unitatea de execuţie.

Unitatea de management a memoriei(UMM) este formată dintr-o unitate de segmentare şi una de editare. Memoria este organizată în unul sau mai multe segmente, fiecare dintre ele putând avea până la 4GB. Unitatea de segmentare are 4 nivele de protecţie pentru a izola şi proteja aplicaţiile între ele.

Unitatea de interfaţare se ocupă de conexiunile între semnalele microprocesorului şi periferice: memorie, device-uri, dispozitive de I/O, etc.

80386 are două moduri de funcţionare: Mod real: 386 lucrează ca un 8086 mai rapid, cu extensiile de 32 de biţi Mod protected: 386 beneficiază de un sistem de management al memoriei sofisticat

ce permite multi-tasking.

În cadrul modulului de laborator se utilizează modul real.Aşadar modulul protected nu va fi prezentat în detaliu.

Regiştrii

80386 are 32 de regiştrii ce se împart în mai multe categorii: Regiştrii de uz general Regiştrii de selecţie a segmentelor

53

Page 54: Manual 1 Final

Regiştrii indicatori de stivă şi regiştrii indicatori de condiţii Regiştrii de control Regiştrii de sistem Regiştrii de debugging Regiştrii de test

Aceşti regiştrii sunt un superset al regiştrilor microprocesorului 8086, astfel încât toţi regiştrii microprocesorului 8086 sunt incluşi in 386.

În figura 17 este prezentată arhitectura de bază a regiştrilor lui 386, împărţită în: Regiştrii generali de date şi de adrese Regiştrii de selecţie a segmentelor Regiştrii indicatori de stivă şi regiştrii indicatori de condiţii

Figură 10

Regiştrii de uz general

Cei 8 regiştrii de uz general de 32 de biţi pot memora date sau adrese.Aceşti regiştrii, figura 18, suportă operatori de 1, 8, 16, 32 sau 64 de biţi, şi câmpuri de date de la 1 la 32 de biţi. De asemenea suportă adrese de 16 sau 32 de biţi.Regiştrii: EAX, EBX, ECX, ESI, EDI, EBP şi ESP.

54

Page 55: Manual 1 Final

Figură 11

Se pot accesa doar cei mai puţin semnificativi 16 biţi ai registrului.Acest lucru se poate face folosind notaţiile: AX, BX, CX, DX, SI, DI, BP şi SP.Accesând doar cei mai puţin semnificativi16 biţi ai registrului, ceilalţi biţi rămân nefolosiţi şi nemodificaţi.Operaţiile pe 8 biţi accesează doar cel mai puţin semnificativ octet (biţii 0-7) şi cel mai semnificativ octet (biţii 8-15) ai regiştrilor AX, BX, CX şi DX. Cel mai puţin semnificativ octet se notează astfel: AL, BL, CL sau DL, în timp ce octetul cel mai semnificativ se notează cu AH, BH, CH sau DH.

Indicatorul de stivă

Indicatorul de stivă este un registru pe 32 de biţi numit EIP. Acesta conţine deplasamentul instrucţiunii ce urmează a fi prelucrată. Acest deplasement se referă întotdeauna la registrul de segment (CS).Biţii 0-15 ai registrului EIP sunt biţii registrului IP (instruction pointer – indicator de stivă), ce se utilizează în modul de adresare pe 16 biţi.

Regiştrul indicatori de condiţii

Acest registru este un registru pe 32 de biţi ce poartă numele de EFLAGS. Semnificaţia biţilor este prezentată în figura 19 .Biţii 0-15 ai registrului EFLAGS sunt biţii registrului FLAGS utilizat pentru compatibilitatea cu instrucţiunile lui 8086.

Figură 12

Se poate observa faptul că cei mai puţin semnificativi 12 biţi(0-11) sunt aceeaşi cu ai microprocesorului 8086.

55

Page 56: Manual 1 Final

Ceilalţi biţi au următoarea semnificaţie:VM: Virtual Mode(mod virtual). Setează funcţionalitatea în modul virtual al microprocesorului 8086 în cadrul modului protected.RF: Resume Flag(indicator de revenire). Se foloseşte împreună cu regiştrii de întrerupere.NT: Nested Task(task-uri imbricate). Se foloseşte în modul protected şi indică dacă taskul în execuţie este inclus în interiorul altor taskuri.IOPL: Input/Output Privilege Level (bits 12-13) (Nivelul de privilegiu al I/O). Se foloseşte în modul protected şi indică nivelul de privilegiu al operaţiilor de I/O.

Regiştrii de segment

Cei 6 regiştrii de segment de câte 16 biţi fiecare conţin valorile segmentelor ce corespund:- Codului: registrul CS- Stivei: registrul SS- Datelor: regiştrii DS, ES, FS, GS.

În modul protected, fiecare segment îşi poate modifica dimensiunea de la un octet la întregul spaţiu de memorie, 4GB(2^32 octeţi).În modul real, dimensiunea maximă a unui segment este de 64KB(2^16 octeţi).

Regiştrii descriptori de segment

Aceşti regiştrii nu sunt vizibili programatorului.Ei sunt asociaţi fiecărui registru de segment şi conţin o adresă de bază de 32 de biţi şi o limită de segment tot de 32 de biţi.Tocmai din acest lucru este posibilă o dimensionare a segmentelor până la 4GB, utilizând regiştrii de segment de câte 16 biţi.

Regiştrii de control

80386 dispune de 3 regiştrii de control de câte 32 de biţi fiecare: CR0, CR1 şi CR2, ce conţin informaţii despre starea microprocesorului. Aceşti regiştrii se folosesc în modul protected, aşa că nu vor fi analizaţi aici.

Regiştrii adreselor de sistem

Pentru managementul tabelelor/segmentelor din modul protected se utilizează 4 regiştrii specifici:GDT: Global Descriptor Table (Tabelul de descriptori globali)IDT: Interrupt Descriptor Table (Tabelul de descriptori de întrerupere)LDT: Local Descriptor Table (Tabelul de descriptori locali)TSS: Task State Segment (Segmentul de stare al task-ului)

Aceşti regiştrii sunt specifici modului protected, aşa că nu vor fi analizaţi.

Regiştrii de test şi de debug

80386 foloseşte 6 regiştrii de debug şi 3 regiştrii de test pentru operaţii specifice de test/debug, care de asemenea nu vor fi analizate.

Setul de instrucţiuni

Setul complet de instrucţiuni al microprocesorului 80386 este împărţiţ în 9 categorii: Instrucţiuni de transfer de date Instrucţiuni aritmetice Instrucţiuni de shiftare/rotaţie

56

Page 57: Manual 1 Final

Instrucţiuni de manipulare a şirurilor de caractere Instrucţiuni de manipulare la nivel de bit Instrucţiuni de control Instrucţiuni de suport pentru limbaje de nivel înalt Instrucţiuni de suport pentru sisteme de operare Instrucţiuni de control al procesorului

Toate instrucţiunile au 0,1,2 sau 3 operanzi fiecare dintre ei poate fi găsit fie într-un registru, direct în instrucţiune sau în memorie.Operanzii pot avea dimensiunea de 8, 16 sau 32 de octeţi. Ca regulă generală, la scrierea codului pentru 80386(cod pe 32 de biţi) operanzii sunt fie de 8, fie de 32 de de biţi.Atunci când se urmăreşte compatibilitatea cu 8086 (cod de 32 de biţi), atunci operanzii pot avea 8 sau 16 biţi.Pentru a modifica dimensiunile standard pot fi adăugate prefixuri pentru toate instrucţiunile.Valoarea medie a dimensiunii instrucţiunilor este de 3.2 octeţi. Deoarece 80386 are o coadă de instrucţiuni de 16 octeţi, acest lucru permite reţinerea în coadă de până la 5 instrucţiuni gata decodificate.

În continuare vor fi prezentate toate instrucţiunile microprocesorului 80386.Puteţi compara acest tabel cu instrucţiunile microprocesorului 8086 din lecţia 2.

Instrucţiuni de transfer de date

De uz general

MOV Mută un operand

PUSH Copiază un operand pe stivă

POP Preia un operand de pe stivă

PUSHA Copiază toţi regiştrii pe stivă

POPA Preia toţi regiştrii de pe stivă

XCHG Interschimbă operanzi, regiştrii

XLAT Transformă operandul

De conversie

MOVZX Mută un octet, word, Dword cu extensia 0

MOVSX Mută un octet, word, Dword cu extensie de semn

CBW Transformă un octet într-un word sau un word în Dword

CWD Transformă un word în Dword (folosind regiştrii DX:AX)

CWDE Transformă un word în Dword (folosind registrul EAX)

CDQ Transformă un Dword în Qword

Intrare/Ieşire

IN Preia operandul de la I/O

OUT Trimire operandul către I/O

De adresă

LEA Încarcă adresa efectivă

57

Page 58: Manual 1 Final

LDS Încarcă un pointer în registrul DS

LES Încarcă un pointer în registrul ES

LFS Încarcă un pointer în registrul FS

LGS Încarcă un pointer în registrul GS

LSS Încarcă un pointer în registrul de segment al stivei

Manipulare a indicatorilor de condiţii

LAHS Preia din stivă registrul A

SAHS Reţine în stivă registrul A

PUSHF Copiază registrul FLAGS pe stivă

POPF Preia din stivă registrul FLAGS

PUSHFD

Copiază registrul EFLAGS pe stivă

POPFD Preia din stivă registrul EFLAGS

CLC Resetează bitul de carry

CLD Resetează bitul de direcţie

CMC Scrie bitul de carry

STC Setează indicatorul de carry

STD Setează indicatorul de direcţie

Instrucţiuni aritmetice

AdunareADD Adună operanziiADC Adună cu transportINC Incrementează cu 1 operandulAAA Ajustare ASCII pentru adunareDAA Ajustare zecimală pentru adunare

ScădereSUB Scaderea operanziiSBB Scadere ţinând cont şi de transportDEC Decrementează cu 1 operandulNEG Negarea biţilor operanduluiCMP Compară operanziiAAS Ajustare ASCII după scădereDAS Ajustare zecimală după scădere

ÎnmulţireMUL Înmulţire cu precizie simplă/dublăIMUL ÎnmulţireAAM Ajustare ASCII după înmulţire

ÎmpărţireDIV Împărţire fără semnIDIV ÎmpărţireAAD Ajustare ASCII înainte de împărţire

58

Page 59: Manual 1 Final

Instrucţiuni pe şiruri de caractere

MOVS Mută stringuri de octeţi, word sau DwordINS Preia un string de la un port I/O

OUTS Trimite un string către un port I/OCOMPS Compară două şiruri de caractere de un octet, Word sau DwordSCAS Scanează un string de un octet, Word sau DwordLODS Încarcă un string de un octet, Word sau DwordSTOS Memorează un string de un octet, Word sau DwordREP Repetiţie

REPEREPZ

Repetă o intrucţiune până când CX=0 sau ZF ≠1

REPNEREPNZ

Repetă o intrucţiune până când CX=0 sau ZF =1

Instrucţiuni logice

LogiceNOT ’NOT’ pe operanziAND ’ŞI’ pe operanziOR ’SAU’ pe operanzi

XOR ’SAU EXCLUSIV’ pe operanziTEST Testează operanzii

De shiftareSHL/SHR Shiftare logică la stânga/dreaptaSAL/SAR Shiftare aritmetică la stânga/dreapta

SHLD/SHRD Shiftare dublă la stânga/dreaptaDe rotaţie

ROL/ROR Roteşte la stânga/dreaptaRCL/RCR Roteşte la stânga/dreapta cu carry

Instrucţiuni de manipulare la nivel de bit

Instrucţiuni de un singur bitBT Testează un bit

BTS Testează şi setează un bitBTR Testează şi resetează un bitBTC Testează şi complementeză un bitBSF Scanare directă a unui bitBSR Scanare inversă a unui bit

Instrucţiuni de control al programului

Transfer condiţionatSETCC Setează un octet egal cu codul condiţiei

JA/JNBE Sare dacă e mai mare/ Sare dacă nu e mai mic sau egalJAE/JNB Sare dacă e mai mare sau egal/ Sare dacă nu e mai micJB/JNAE Sare dacă e mai mic/ Sare dacă nu e nici mai mare şi nici egalJBE/JNA Sare dacă e mai mic sau egal/ Sare dacă nu e mai mare

JC Sare dacă CF=1

59

Page 60: Manual 1 Final

JE/JZ Sare dacă e egal/ Sare dacă ZF=1JG/JNLE Sare dacă e mai mare/ Sare dacă nu e mai mic sau egalJGE/JNL Sare dacă e mai mare sau egal/ Sare dacă nu e mai micJL/JNGE Sare dacă e mai mic/ Sare dacă nu e 0 (ZF≠1)JLE/JNG Sare dacă e mai mic sau egal/ Sare dacă nu e mai mare decât

JNC Sare dacă CF=0JNE/JNZ Sare dacă nu e egal/ Sare dacă nu e 0 (ZF≠0)

JNO Sare dacă nu e depăşire (OF=0)JNP/JPO Sare dacă nu e paritate/ Sare dacă e imparitate (PF=0)

JNS Sare dacă nu există semn (SF=0)JO Sare dacă este depăşire OF=1

JP/JPE Sare dacă e paritate (PF=1)JS Sare dacă există semn (SF=1)

Transfer necondiţionatCALL Apelare de procedură sau taskRET Revenire din procedurăJMP Salt

Control al interacţiuniiLOOP Urmează o secvenţă de instrucţiuni până când CX≠0

LOOPELOOPZ

Urmează o secvenţă de instrucţiuni până când ZF=0 şi CX≠0

LOOPNELOOPNZ

Urmează o secvenţă de instrucţiuni până când ZF=1 şi CX≠0

JCXZ Sare la adresa specificată dacă CX=0Întreruperi

INT ÎntrerupereINTO Întrerupe execuţia programului dacă OF=1IRET Revine dintr-o întrerupereCLI Dezactivează o întrerupereSTI Activeză o întrerupere

Instrucţiuni de nivel înalt

BOUND Verifică limitele unui vectorENTER Setează paramatrii unei proceduriLEAVE Iese dintr-o procedură

Înstrucţiuni din modul protected

SGDT Memorează tabela de descriptori globaliSIDT Memorează tabela de descriptori de întrerupereSTR Memorează registrul de taskuri

SLDT Memorează tabela de descriptori localiLGDT Încarcă tabela de descriptori globaliLIDT Încarcă tabela de descriptori de întrerupereLTR Încarcă registrul de taskuri

LLDT Încarcă tabela de descriptori localiARPL Nivelul de privilegiu Aggiusta RethesedLAR Încarcă drepturile de accesLSL Încarcă limita de segment

VERR/VERW Verifică segmentul pentru scriere sau citireLMSW Încarcă wordul ce conţine starea maşinii

60

Page 61: Manual 1 Final

SMSW Memorează wordul ce conţine starea maşinii

Instrucţiuni de control al procesorului

HLT HaltWAIT Aşteaptă până când BUSY# este refuzatESC EscapeLOCK Blocarea magistralei

Adresarea pe 16 şi 32 de biţi

Pentru a păstra compatibilitatea cu 8086, microprocesorul 80386 poate prelucra instrucţiuni de 16 biţi în modul real sau protected.Microprocesorul determină mărimea instrucţiunii care este aflată prin examinarea bitului D al descriptorului de segment CS.Dacă D este 0, atunci adresările sunt considerate a fi pe 16 biţi, altfel, dacă bitul este 1, adresările sunt considerate a fi pe 32 de biţi.În modul real se consideră implicit adresarea pe 16 biţi.Independent de mărimea operanzilor adreselor, 80386 este capabil să prelucreze instrucţiunile de 16 sau 32 de biţi. Acest lucru se poate realiza prin adăugarea unui prefix în cadrul instrucţiunii.Se pot folosi două tipuri de prefixe, unul care indică dimensiunea operandului şi altul care indică dimensiunea adresei.Prefixele sunt introduse automat în codul programului de asamblare.

Funcţionalitatea în modul real

Atunci când 8086 este pornit sau resetat este iniţializat implicit modul real.Modul real are aceeaşi funcţionalitate de bază a microprocesorului 8086, dar permite accesul la regiştrii de 32 de biţi ai lui 80386.Modul de adresare, dimensiunea memoriei, managementul întreruperilor sunt identice cu cele ale microprocesorului 8086.Exceptând instrucţiunile din modul protected, toate instrucţiunile sunt disponibile.Dimensiunea implicită a operanzilor este de 16 biţi.Pentru a putea folosi regiştrii şi instrucţiunile pe 16 biţi trebuiesc utilizate prefixe.Dimensiunea maximă a unui segment este de 64 KB.

Dimensiunea maximă a memoriei este de 1MB, fiind active liniile A2-A19.Există două zone fixe de memorie rezervate în modul real:

Locaţiile de la 00000H la 003FFH sunt utilizate pentru vectorii de întrerupere. Locaţiile de la FFFFFFFF0H la FFFFFFFFFH sunt rezervate pentru iniţializare.

Funcţionare în modul protected

Microprocesorul 80386 lucrează la capacitate maximă doar când este în modul protected.În acest mod este disponibilă o dimensiune a memoriei până la 4 GB (32 biţi) şi permite execuţia de programe virtuale de orice dimensiune.Se pot executa şi programe pentru 8086, având un sistem de management al memoriei sofisticat.Modul protected permite instrucţiuni suplimentare, care sunt particularizate pentru operaţii multi-tasking la nivel de sistem de operare.

61

Page 62: Manual 1 Final

Modul protected nu va fi analizat aici, datorită resurselor limitate disponibile de placa de achiziţie Module Z3/EV.

62

Page 63: Manual 1 Final

QUIZ

Q1 Care dintre următoarele afirmaţii, referitoare la microprocesorul 80386, nu este adevarată?

SET

A B

1 2 Magistrala de adrese este de 32 de biţi

2 1 Magistrala de date este de 32 de biţi

3 5 Regiştrii interni au o dimensiune de 32 de biţi

4 3 Adresează până la 2GB de memorie

5 4 Poate fi folosit în sisteme multi-user.

Q2 Care dintre următoarele afirmaţii, referitoare la microprocesorul 80386, nu este adevarată?

SET

A B

1 5 Registrul EAX este pe 32 de biţi

2 4 Registrul CS este pe 32 de biţi

3 2 Registrul AX este pe 16 de biţi

4 3 Registrul AL este pe 8 de biţi

5 1 Registrul DS este pe 16 de biţi

Q3 Regiştrii de segment ai microprocesorului 80386 sunt pe 16 biţi.Totuşi, acest microprocesor este capabil să adreseze segmente de până la 4GB. Cum este posibil acest lucru?

SET

A B

1 4 Utilizând regiştrii descriptori de segment

2 3 Utilizând regiştrii adreselor de sistem

3 1 Utilizând multiplicarea liniilor de adrese

4 2 Prin segmentarea dublă a memoriei

63

Page 64: Manual 1 Final

Q4 Instrucţiunile specifice microprocesorului 80386 utilizează operanzi de:

SET

A B

1 5 8, 16, 32 de biţi

2 4 8, 16 biţi

3 2 16, 32 de biţi

4 3 8, 32 de biţi

5 1 32 de biţi

Q5 În ce mod se pot rula programe scrise pentru 8086 de către microprocesorul 80386?

SET

A B

1 3 Mod real

2 1 Mod protected

3 2 În ambele moduri

64

Page 65: Manual 1 Final

LECŢIA 6: MICROPROCESORUL 80368EX

OBIECTIVE

Microprocesorul 80386EX Schema bloc a arhitecturii interne Perifericele integrate Unitatea de interfaţă a magistralei Descrierea semnalelor de magistrală Ciclurile de scriere şi de citire

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3) modul experimental mod.Z3/EV

În această lecţie va fi ilustrat microprocesorul 80386EX.Acest microprocesor de 32 de biţi este folosit în interiorul modului experimental (MOD Z3/EV).Este o versiune particulară a microprocesorului 80386, folosită în mod particular fie pentru aplicaţiile industriale sau ca o platformă pentru PC-uri ”low sash”.Microprocesorul 80386 nu mai este utilizat ca şi PC, fiind înlocuit de Pentium, aşadar nu mai poate fi găsit pe piaţă.

Microprocesorul 80386EX

Microprocesorul cunoscut ca şi 80386EX este un microprocesor de 32 de biţi, realizat cu scopul de a integra cât mai multe periferice.Este compus dintr-o magistrală externă de date de 16 biţi, o magistrală externă de adrese de 26 de biţi, un nucleu intern perfect compatibil cu microprocesorul 80386 şi un număr mare de periferice integrate.

Caracteristicile principale ale acestui microprocesor sunt prezentate mai jos: Nucleul de bază al microprocesorului Intel 386:

- Consum redus- Alimantare la o sursă de 5V- Frecvenţa maximă de 25 Mhz

Sistemul de management al sursei de alimentare- Moduri de alimentare programabile- Oprirea ceasului în orice moment de timp

Arhitectură internă pe 32 de biţi- Tipuri de date de 8, 16, 32 de biţi- 8 regiştrii generali de 32 de biţi

Magistrală de date performantă pe 16 biţi- Cicluri de magistrală cu 2 semnale de ceas- Aplicarea conceptului de pipeling asupra adreselor

Unitate de management a memoriei integrate- Suportă memorie virtuală- 4 nivele de protecţie

Spaţiu de adresare mare

65

Page 66: Manual 1 Final

- 64 MB fizic- 64 TB virtual- Maxim 1GB per segment

Periferice integrate- Unitate de clock şi unitate de management a tensiunii de alimentare- Unitate de selecţie I/O- Unitate de control a întreruperilor- Unitate de control al timingului- Unitate de watchdog- Unitate serială asincronă I/O- Unitate serială sincronă I/O- Unitate paralel I/O- Unitate DMA- Unitate de control al refacerii memoriei RAM- Unitate de testare JTAG.

Schema bloc a arhitecturii interne

Schema bloc a arhitecturii interne a microprocesorului 80386EX este indicată in figura de mai jos.Se pot observa următoarele caracteristici de bază:

Nucleul de bază corespunde cu cel al microprocesorului 386CX Magistrala externă de date este de 16 biţi, la fel ca şi a procesorului 80386SX Magistrala externă de adrese este de 26 de biţi, putându-se aloca în total 64MB

de locaţii de memorie. Câteva periferice au fost integrate în interiorul microprocesorului, deoarece sunt

folosite de microprocesor atât în cazul PC-urilor, cât şi în sistemele industriale.Descrierea detaliată a perifericelor integrate este prezentată în figura de mai jos.

66

Page 67: Manual 1 Final

Perifericele integrate

Perifericele integrate în interiorul microprocesoului 80386EX vor fi prezentate în ceea ce urmează.Aşadar, unele periferice se folosesc atât în PC-uri cât şi în sistemele industriale.

ICUUnitatea de control a întreruperilor

Este formată din două controllere cu întreruperi programabile 82C59A configurate ca master/slave

TCUUnitatea de control a timerului

Conţine 3 countere independente pe 16 biţi. Funcţionalitatea lor este echivalentă cu cele 3 countere ale lui 82C54

SIOUnitatea serială asincronă de I/O

Conţine 2 unităţi UART asincrone, ce funcţionează ca şi NS16450. Fiecare canal conţine un generator, un receptor şi un transmiţător al ratei baud(baud-rate) şi o unitate de control al modemului.

DMAControler de acces direct al memoriei

Transferă datele interne sau externe între orice tip de memorie sau unităte I/O printr-un spaţiu de adresare de 26 de biţi. Este compatibil cu controllerul 8237A.

SMMModul de management de sistem

Oferă un mecanism pentru managementul de sistem prin intermediul unei arhitecturi software combinată cu o arhitectură hardware. De asemenea controlează o linie externă SMI# ce poate genera întreruperi transparente către sistemul de operare.

Ceasul şi unitatea de management a sursei de alimentare

O sursă externă trebuie să se ocupe cu sincronizarea semnalelor de ceas ale microprocesorului, care apoi sunt trimise catre nucleul de bază şi către perifericele integrate. Unitatea de management a sursei de alimentare oferă posibilitatea de a opri microprocesorul pentru a reduce consumul de curent.

SSIOUnitatea serială sincronă I/O

Oferă un canal I/O bidirecţional, sincron şi de mare viteză. Conţine un canal de transmisie, unul pentru recepţie şi un generator al ratei de baud.

CSUUnitatea de selecţie a chipului

Această unitate programabilă pe 8 canale oferă acces direct către 8 unităţi externe. Fiecare canal poate opera pe 8 sau 16 biţi şi poate genera până la 31 de stări de aşteptare.

RCUUnitate de control al regenerării memoriei

Oferă posibilitatea regenerării periodice a adreselor de memorie. Este utilizată în sisteme cu memorie dinamică RAM.

Porturile paralel de I/O

Oferă 3 porturi programabile de I/O. Pinii de ieşire ai porturilor de I/O sunt multiplexaţi împreună cu alte funcţii.

WDTUnitatea de watchdog

Atunci când e activată, această unitate funcţionează ca un timer de uz general pe 32 de biţi.

JTAGUnitatea de testare logică

Prin intermediul acestei unităţi se uşurează testarea componentelor. Rezultatele sunt în conformitate cu standardul IEEE.

Unitatea de interfaţare a magistralei

Microprocesorul comunică cu memoria, componentele I/O şi celelalte periferice prin intermediul magistralei.Adresele, datele, stările şi controlul informaţiilor definesc un ciclu de magistrală.Unitatea de interfaţare a magistralei (BIU) suportă cicluri de citire şi de scriere a datelor către şi de la memoria externă şi componentele I/O, dar conţine şi semnale, care permit unui microprocesor extern să preia controlul magistralei.Semnalele controlate de BIU sunt următoarele (mai multe detalii în datasheetul microprocesorului din cadrul appendixului):

67

Page 68: Manual 1 Final

Semnal DescriereA25:1 Magistrala de adrese: selectează componente de memorie sau componente I/O.

Aceste semnale sunt valide doar când ADS# este activ şi rămâne activ până la următorul T1, T2P sau Ti

ADS# Pin de stare: indică dacă procesorul a generat un ciclu de magistrală valid. Procesorul comandă următorii pini: W/R#, D/C#, M/IO#, WR#, RD#, UCS#, CS6:0#,LOCK#, REFRESH#, A25:1, BHE# şi BLE#.

BHE#BLE#

Pin de activare a octetului: indică care octet al magistralei de adrese este transferat.BHE# BLE# Ieşire 0 0 Transfer de word 0 1 Transferă octetul superior (D15:8) 1 0 Transferă octetul inferior (D7:0) 1 1 Ciclu de refresh

BS8# Amplitudinea magistralei: indică dacă unitatea adresată în momentul respectiv este pe 8 biţi.

D15:0 Magistrală de date: pentru scrierea şi citirea operaţiilor din memorie sau din unităţile I/O

LBA Acces local al magistralei: indică dacă microprocesorul furnizează semnalul READY# pentru a încheia o tranzacţie pe magistrală.

LOCK Blocarea magistralei: împiedică alte microprocesoare să preia controlul magistralei.M/IO#D/C#W/R#

REFRESH#

Semnale pentru definirea ciclurilor de magistrală. Definesc tipul curent de ciclu.Puteţi vedea următorul tabel.

NA# Următoarea adresă: utilizat în pipeliningRD# Activare citire: indică un ciclu de citire pe magistrală

READY# Realizarea încheierea ciclului de magistralăWR# Activare scriere: indică un ciclu de scriere pe magistrală

Microprocesorul poate genera 8 tipuri de operaţii pe magistrală. Ele sunt identificate citind starea liniilor M/IO#, D/C#, W/R# şi REFRESH# conform următorului tabel.

Operaţii pe magistrală

M/IO# D/C#

W/R# REFRESH# Operaţie

0 0 0 1 Identificarea unei întreruperi0 0 1 1 Nu se întâmplă niciodată0 1 0 1 Ciclu de citire I/O0 1 1 1 Ciclu de scriere I/O1 0 0 1 Citirea codului din memorie1 0 1 1 Întreruperea sau oprirea unui ciclu1 1 0 0 Ciclu de refresh1 1 0 1 Ciclu de citire din memorie1 1 1 1 Ciclu de scriere în memorie

Ciclu de citire

Ciclurile de citire pot fi de două tipuri: Într-un ciclu pipeline, adresa şi semnalele de stare sunt incluse în ciclul precedent de

ceas, pentru a facilita accesul mai îndelungat la memorie. Într-un ciclu non-pipeline, adresa şi semnalele de stare devin active în cadrul

primului ciclu de stare-T (T1).

Vom lua în consideraţie numai cazul ciclurilor non-pipeline.

68

Page 69: Manual 1 Final

În figura de mai jos este reprezentată temporizarea a două cicluri nonpipeline de citire (unul cu stare de aşteptare, iar celălalt fără stare de aşteptare).Secvenţa de semnale într-n ciclu nonpipeline de citire este următoarea:

1. Procesorul iniţiază ciclul activând semnalele de stare, magistrala de adrese şi pinul ADS#. Tipul de ciclu este determinat de starea magistralei de adrese (A25:1), activarea pinului octetului (BLE# sau BHE#) şi semnalele de stare ale magistralei(W/R#, M/IO#, D/C#, REFRESH#, sau LOCK#). Datorită latenţei ieşirilor, aceste semnale trebuiesc activate pe frontul crescător al CLK2, ce coincide cu frontul descrescător al PH2, atunci când ADS# este activ în mod permanent.Pentru un ciclu de citire, pinii de stare sunt:

W/R# inactiv M/IO# activ pentru citirea din memorie, inactiv pentru citirea de la I/O D/C# activ pentru citirea datelor din memorie şi inactiv pentru citirea de

instrucţiuni REFRESH# este inactiv LOCK în mod normal nu este activat

Adresele de magistrală, pinii de activare ai octetului, şi pinul de stare (cu excepţia ADS#) rămân activi până la sfârşitul ciclui de citire.

69

Page 70: Manual 1 Final

2. La începutul celei de-a doua faze a lui T1, RD# devine activ de îndată ce procesorul pregăteşte datele pentru intrare. Acest lucru semnifică faptul că procesorul este gata să accepte datele.

3. Atunci când un semnal de selecţie a chipului este activat pentru ciclul de citire, dar semnalul READY# este dezactivat, iar CSU este programat să introducă stări de aşteptare, semnalul READY# este ignorat de către procesor până când numărul de stări de aşteptare programate au fost introduse în ciclu.

4. Pe frontul descrescător al semnalului PH2, indiferent de starea lui T2 (după stările de aşteptare), se ia în considerare semnalul READY#. Atunci când este activ procesorul citeşte datele şi dezactivează semnalul RD#.

5. Dacă semnalul READY# este activ, sunt adăugate stări de aşteptare (stări adiţionae T2) până când semnalul READY# devine din nou inactiv. READY# este verificat la fiecare final de stare T2 (pe frontul descrescător al semnalului PH2).

6. Odată ce READY# devine inactiv, procesorul citeşte datele, dezactivează RD# şi încheie ciclul de citire.

Ciclul de scriere

Ciclu de scriere poate fi împărţit în două categorii: Ciclul pipeline Ciclu nonpipeline

Vom lua în considerare doar cazul de ciclu nonpipeline.În figura de mai jos este reprezentată temporizarea a 2 cicluri de scriere nonpipeline (unul cu stare de aşteptare şi unul fără stare de aşteptare).Secvenţa de semnale într-un ciclu de scriere nonpipeline este următoarea:

1. Procesorul iniţiază ciclul activând semnalele de stare, magistrala de adrese şi pinul ADS#. Tipul de ciclu este determinat de starea magistralei de adrese (A25:1), activarea pinului octetului (BLE# sau BHE#) şi semnalele de stare ale magistralei(W/R#, M/IO#, D/C#, REFRESH#, sau LOCK#). Datorită latenţei ieşirilor, aceste semnale trebuiesc activate pe frontul crescător al CLK2, ce coincide cu frontul descrescător al PH2, atunci când ADS# este activ în mod permanent.Pentru un ciclu de citire, pinii de stare sunt:

W/R# inactiv M/IO# activ pentru citirea din memorie, inactiv pentru citirea de la I/O D/C# activ pentru citirea datelor din memorie şi inactiv pentru citirea de

instrucţiuni REFRESH# este inactiv LOCK în mod normal nu este activat

Adresele de magistrală, pinii de activare ai octetului, şi pinul de stare (cu excepţia ADS#) rămân activi până la sfârşitul ciclui de citire.

2. La începutul celei de-a doua faze a lui T1, WR# devine activ şi procesorul iniţializează controlul magistralei de date. Datele rămân valide până la începutul fazei a doua în starea-T (state-T) după terminarea ciclului de magistrală curent.

3. Atunci când este selectat unul din chipuri pentru ciclul de citire actual, dar semnalul READY# este dezactivat, iar CSU este programat să introducă stări de aşteptare, semnalul READY# este ignorat de către procesor până când numărul de stări de aşteptare programate au fost introduse în ciclu.

4. Semnalul WR# poate fi dezactivat în două moduri:Early Ready: WR# este dezactivat pe frontul crescător al CLK2 în mijlocul stării T2, după terminarea stărilor de aşteptare.

70

Page 71: Manual 1 Final

Pe frontul crescător al semnalului PH2, se verifică READY#. Dacă este activ, WR# este dezactivat în mod sincron în mijlocul lui T2, ghidat de frontul crescător al clockului PH2. Ciclul de scriere este terminat la sfârşitul stării T2.Late Ready: Atunci când READY# devine inactiv după frontul crescător al semnalului PH2 al stării 2(după stările de aşteptare programate), WR# este dezactivat în mod sincron de îndată ce READY# este activat (după o scurtă latenţă cauzată de circuitele logice). Ciclul de scriere este încheiat la sfârşitul stării T2.

Semnalul WR# operează în acest mod pentru a asigura un timp suficient pentru adrese şi pentru a activa semnalul componentei externe.

7. Dacă semnalul READY# este activ, sunt adăugate stări de aşteptare (stări adiţionae T2) până când semnalul READY# devine din nou inactiv. READY# este verificat la fiecare stare T2 (pe frontul crescător al semnalului PH2) pentru a dezactiva semnalul WR# în modul dorit.

8. De îndată ce READY# este dezactivat, se încheie ciclul de scriere.

Pipeline

71

Page 72: Manual 1 Final

Tehnica pipeline este unul dintre modelele utilizate frecvent în cele mai variate domenii de productie. Acest model este aplicabil daca activitatea care trebuie realizata se poate descompune în faze distincte care trebuie executate succesiv. Fiecare faza preia, pentru un anumit obiect de prelucrat, rezultatul aplicarii fazei precedente. La randul ei, faza curenta transmite rezultatul prelucrarii obiectului catre faza urmatoare. Abordarea paralela a activitatii este relevanta numai daca ea trebuie aplicata unui numar mare de obiecte care trebuie prelucrate.

Pentru derularea normală a unui pipeline, trebuie ca fiecare pereche de faze care-şi transmit una alteia obiecte să-şi sincronizeze începutul după sfârşitul fazei precedente. Implicit, între orice două faze succesive trebiue să existe o zonă tampon, o coadă intermediară care să păstreze obiectul între faze.

Orice întrerupere, fie ea şi temporară a execuţiei unei faze poate perturba / încetini derularea întregului proces. De aceea, proiectanţii unor astfel de activităţi trebuie să fie extrem de atenţi la aceste aspecte.

Dacă activitatea se descompune în n faze, atunci pipeline este eficient numai dacă activitatea se aplică la un număr de obiecte care depăşeşte cu mult numărul n. Aste deoarece pentru primele n-1 obiecte (ca şi pentru ultimele n-1), paralelismul este doar parţial: se execută prima fază pentru primul obiect, apoi în paralel prima fază pentru al doilea obiect şi a doua fază pentru primul obiect ş.a.m.d. Abia după intrarea în lucru al celui de-al n-lea obiect paralelismul este complet, adică sunt în funcţiune toate cele n faze.

72

Page 73: Manual 1 Final

Fiecare instrucţiune este tratată în două unităţi consecutive:

1. Faza (fazele) fetch, în care instrucţiunea se aduce din memoria RAM, se depune într-un buffer de 6 octeţi şi se efectuează calculul de adresă. Prelucrarea este asigurată de către componenta BIU (Basic Input Unit).

2. Execuţia propriu-zisă, cu toate fazele ei, este realizată de către componenta EU (Executive Unit).

Pentru a se asigura un pipeline eficient, este bine ca toate instrucţiunile maşină să aibă acelaşi număr de faze. Câştigul obţinut prin pipeline compensează faptul că procesorul execută “paşi în gol” pentru unele instrucţiuni, mai ales dacă acestea au o frecvenţă mai mică de utilizare.

In [Hennesi&Patteson96] se defineşte un procesor ipotetic DLX, care sintetizează elementele esenţiale ale procesoarelor actuale: Athlon (AMD), Pentium (Intel), Alpha (DEC), MIPS (NEC), R12000 (SGI), SPARC (Sun). Instrucţiunile acestuia sunt proiectate să fie executate în cinci faze:

Faza 1 : Aduce instrucţiunea din memoria RAM, de la adresa indicată de registrul PC (Program Counter) şi o depune în registrul IR (Instruction Register).

Faza 2: Decodifică instrucţiunea din IR şi încarcă în regiştri datele referite.

Faza 3: Unitatea aritmetică (ALU) execută operaţia specifică şi depune rezultatul într-un registru propriu.

Faza 4: Accesează memoria RAM pentru depunerea rezultatului.

Faza 5: Rescrie rezultatul într-unul dintre regiştrii interni spre eventuala folosire ulterioară.

Timpul între instructiuni pipeline = Timpul între instructiuni fara pipeline / nr. de faze

Dacă notăm cu F1, F2, F3, F4 şi F5 fazele de execuţia ale procesorui DLX, ilustrăm modul în care se execută 7 instrucţiuni succesive în 11 cicluri maşină.

Ciclu 1 2 3 4 5 6 7 8 9 10

11

i F1

F2

F3

F4

F5

i+1 F1

F2

F3

F4

F5

i+2 F1

F2

F3

F4

F5

i+3 F1

F2

F3

F4

F5

i+4 F F F F F

73

Page 74: Manual 1 Final

1 2 3 4 5

i+5 F1

F2

F3

F4

F5

i+6 F1

F2

F3

F4

F5

Pipeline-ul îmbunatateşte performanta prin creşterea productivitatii instructiunilor, nu prin micşorarea timpului de executie al unei instructiuni individuale.

Observatii:

Daca instructiunile au aceeaşi lungime, atunci extragerea instructiunilor şi decodificarea lor se poate face în doar doua faze de pipe.

Daca capurile registrelor sursa sunt localizate în acelaşi loc în cadrul instructiunii, atunci în faza 2 putem începe citirea fişierului de registre în acelaşi timp în care hardware-ul determina instructiunea ce a fost extrasa.

Daca operanzii din memorie apar numai în instructiunile de încarcare şi memorare, atunci putem utiliza faza de executie pentru calcularea adresei de memorie, iar accesul la memorie se efectueaza în faza urmatoare.

Operanzii trebuie sa fie aliniati în memorie, astfel incat data poate fi transferata între procesor şi memorie într-o singura faza pipeline.

74

Page 75: Manual 1 Final

Hazarduri Pipeline

Evenimentul în urma caruia instructiunea urmatoare nu poate fi executata în urmatorul ciclu de ceas se numeşte hazard.

Există situaţii în care o instrucţiune aflată într-o fază de execuţie, trebuie să decidă sau nu anularea fazelor executate deja pentru instrucţiunea următoare.

Situaţiile de hazard sunt clasificate în trei categorii:

1. Hazard structural, dacă apare un conflict de resurse private solicitate simultan de către mai multe instrucţiuni simultan. Hardware-ul nu poate suporta combinatia de instructiuni pe care dorim sa le executam in acelasi ciclu de ceas. De exemplu, una dintre instrucţiuni doreşte într-o fază să consulte un registru intern al procesorului, în timp ce altă instrucţiune, în altă fază, doreşte să scrie în acelaşi registru.

2. Hazard de date care apare atunci când o fază a unei instrucţiuni nu poate fi executată deoarece o altă fază a unei instrucţiuni precedente nu i-a pregătit datele necesare. De exemplu, dacă avem două instrucţiuni consecutive: una încarcă registrul de index, dar numai în faza a 4-a, în timp ce instrucţiunea următoare foloseşte adresarea indexată în faza a doua. Se pierde astfel un ciclu maşină.

3. Hazard de control. Apare din necesitatea de a lua o decizie pe baza rezultatelor unei instructiuni, in timp ce altele sunt in executie. Să presupunem că în cod avem instrucţiunile succesive S1;S2. Presupunem că S1 este o instrucţiune de salt condiţionat şi că abia în faza a treia se detectează dacă saltul se va face sau nu. In acest timp, din S2 s-a executat prima fază şi este în curs faza a doua. Dacă S1 trebuie să efectueze saltul, atunci pipe-ul trebuie temporar suspendat, se va anula execuţia celor două faze din S2 şi se vor executa primele două faze ale instrucţiunii la care se face saltul. Abia după aceea se continuă execuţia pipeline a instrucţiunilor.

Solutii de rezolvare eficienta a situatiilor de hazard:

1. Stationarea – primul ciclu se va executa secvential şi apoi se va trece la executia pipeline – solutie viabila în practica dar prea lenta în cazul pipe-urilor lungi

2. Predictia – se presupune ca ramificatiile nu vor reuşi. Rezulta ca doar în cazul reuşitelor pipe-ul va stationa.

75

Page 76: Manual 1 Final

Pipeline-ul creşte numarul instructiunilor executate simultan şi viteza cu care instructiunile sunt începute şi terminate.

Executia pipeline nu reduce timpul necesar derularii unei instructiuni individuale.

Doar până la o limită creşterea numărului de faze pipe (numărul de instrucţiuni executate simultan) conduce la creşterea performanţei. Existenţa unui număr prea mare de faze va determina scăderea performanţei.

Odată cu mărirea numărului de faze creşte şansa de hazard si creşte frecvenţa opririi fazelor pentru realizarea sincronizărilor.

In grafic este redata relaţia dintre largimea liniei pipe şi performanţă. Pe orizontală se indică numărul de faze pipeline, iar pe verticală factorul de creştere a randamentului.

76

Page 77: Manual 1 Final

Prin procesarea pipeline fazele aferente instructiunilor dintr-un program masină sunt suprapuse în timp. Rezultă imediat că într-un procesor pipeline, durata unei faze a procesării este determinată de nivelul cel mai lent din structura pipeline, de unde si necesitatea balansării acestor nivele. În ipoteza unei balansări perfecte precum si a absentei hazardurilor pe durata procesării, o structură pipeline atinge o rată de executie de o instructiune/ciclu masină. Evident că acesta este un rezultat global, timpul de executie pentru o instructiune dată fiind acelasi cu cel necesar de a fi consumat de un procesor clasic (von Neumann).

77

Page 78: Manual 1 Final

QUIZ

Q1 Care din următoarele expresii referitoare la microprocesorul 80386EX nu este adevărată?

SET

A B

1 5 Magistrala de adrese este pe 32 de biţi

2 4 Magistrala de date este pe 16 biţi

3 2 Regiştrii interni sunt de 32 de biţi

4 3 Adresează până la 64MB de memorie

5 1 Poate fi utilizat în sisteme multi-user

Q2 Care este funcţia perifericului integrat SIO?

SET

A B

1 4 Furnizează interfaţa serială asincronă N.2

2 3 Furnizează o interfaţă sincronă

3 1 Furnizează porturi I/O

4 5 Furnizează activarea componentelor I/O

5 2 Furnizează un timer programabil

Q3 Care dintre următoarele semnale ale microprocesorului 80386EX indică cine transmite cel mai semnificativ octet într-o operaţie externă pe 16 biţi?

SET

A B

1 4 BLE#

2 5 BHE#

3 1 BS8#

4 2 ADS#

5 3 D/C#

78

Page 79: Manual 1 Final

Q4 Care dintre următoarele semnale ale microprocesorului 80386EX indică faptul că un ciclu de magistrală valid?

SET

A B

1 4 BLE#

2 5 M/IO#

3 3 BS8#

4 1 ADS#

5 2 M/IO#

Q5 Ce indică semnalul READY# într-un ciclu de citire?

SET

A B

1 3 Faptul că ciclul a fost iniţiat

2 1 Faptul că procesorul este gata să citească datele

3 2 Faptul că perifericul este gata să furnizeze datele

79

Page 80: Manual 1 Final

LECŢIA 7: MODULUL DE LABORATOR MOD Z3/EV

OBIECTIVE

Descriere generală a modulului Z3/EV Unităţile componente Comenzile de monitor

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

În această lecţie va fi descris modulul de laborator MOD Z3/EV.Este important de ştiut că începând cu următoarea lecţie vor fi prezentate programe ce folosesc acest sistem.

Descriere generală

Modulul de laborator EV/Z3 este un sistem dedicat, având la bază un microprocesor Intel 386, ce permite rezolvarea tuturor problemelor legate de învăţarea şi utilizarea sistemelor cu microprocesoare.Acest sistem are integrate toate componentele necesare pentru studierea acestor tipuri de sisteme: microprocesor, memorii RAM şi EPROM, tastatură şi display cu cristale lichide, interfaţă paralelă şi serială, intrări şi ieşiri analogice. Conţine de asemenea şi un conector folosit la detectarea conexiunilor greşite ale sistemului IPES.Principalele caracteristici ale sistemului sunt:

Microprocesorul 386EX la frecvenţa de 2.21Mhz 32KB EPROM pentru sistem, 32KB EPROM pentru utilizator, 32KB

RAM static Tastatura hexazecimală, display LCD cu o linie de 16 caractere Interfaţă paralelă (8+8+4 linii I/O), interfaţă serială RS-232 Intrări şi ieşiri analogice Convertor 0-8V pe 8 biţi Ieşiri de probă Sursă de tensiune simplă de 5V Monitor de EPROM ce permite:

o Vizualizarea şi modificarea memoriei şi regiştriloro Execuţie continuă, pas cu pas, cu întreruperi de programo Încărcarea programelor de la PC

Unităţile componente

Modulul experimental MOD Z3/EV este o placă pe care sunt integrate toate componentele.

80

Page 81: Manual 1 Final

În ceea ce urmează vor fi descrise unităţile componente.

Microprocesorul pe 32 de biţi

Această componentă e formată din: Microprocesorul Intel 386EX Un generator de quartz la frecvenţa de 4.43 Mhz (acest semnal este

trimis direct microprocesorului, care îl divide în două, obţinându-se o frecvenţă efectivă de lucru de 2.215 Mhz.)

Decodificatorul de adrese pentru activarea memoriei şi a componentelor I/O (se utilizează linii de decodificare interne ale microprocesorului pentru componentele de memorie (CHIP SELECT); un decodificator extern pentru componentele I/O (I/O SELECT)).

Magistrala de date (DATA BUS): este o magistrală pe 16 biţi; deoarece 386EX are 32 de linii externe şi 16 linii interne, liniile de test D16-D31 repetă aceleaşi semnale ca şi liniile D0-D15.

Magistrala de adrese (ADDRESS BUS) cu 26 de linii (sistemul utilizează modul real al microprocesoarelor cu 20 de linii de adresă efectivă, aşadar liniile A20-A31 nu vor fi folosite)

Semnale de stare (STATE SIGNALS)

Pinii de selecţie a componentei (CHIP SELECT), împreună cu specificaţiile lor, sunt prezentaţi în tabelul de mai jos:

CS Componentă MEM I/O

Adresa de început

Adresa de final

Dimensiune Ready Stări de aşteptare

UCS EPROM S MEM F8000 FFFFF 8 biţi Intern 8CS0 EPROM U MEM F0000 F7FFF 8 biţi Intern 16CS1 RAM2 MEM 04000 07FFF 16 biţi Intern 2CS2 Componente

I/OI/O 00300 0037F 8 biţi Intern 31

CS3 LiberCS4 RAM1 MEM 00000 03FFF 16 biţi Intern 2CS5 LiberCS6 Liber

Pinii de selecţie I/O (I/O SELECT) utilizaţi pentru selecţia componentelor I/O, împreună cu specificaţiile lor, sunt descrişi în următorul tabel:

Adrese Componente300 – 30F Convertor digital/analogic310 – 31F Interfaţă paralelă320 – 32F Tastatură330 – 33F Interfaţă serială340 – 34F Convertor analogic/digital350 – 35F Display cu cristale lichide360 – 36F Liber370 – 37F Liber

Unitatea de memorie

81

Page 82: Manual 1 Final

Unitatea de memorie conţine următoarele componente, cu adresele corespunzătoare din interiorul sistemului:

Memorie Componentă Adresă iniţială Adresă finalăEEPROM sistem 32KB IC5 F8000 FFFFFEPROM utilizator 32KB IC6 F0000 F7FFF

RAM 32KB IC7-8-9-10 00000 07FFF

Memoriile EPROM sunt setate în aşa fel, astfel încât să poată fi compatibile cu microprocesorul 80386EX capabil de un transfer de date pe 8 biţi.Memoriile RAM sunt setate să opereze pe 16 biţi, aşadar sunt mereu utilizate câte 2 memorii în pereche pentru octetul cel mai puţin semnificativ (IC7, IC9) şi 2 memorii pentru cel mai semnificativ octet (IC8, IC10).

Atunci când modulul este pornit, memoria EPROM a sistemului este activată, iar microprocesorul urmează instrucţiunile de la adresa FFFF8, unde începe programul monitor.

Memoria EPROM a sistemului este rezervată pentru memorarea programelor realizate de utilizator, programe ce trebuiesc setate ca fiind disponibile în sistem.

Memoria RAM conţine: O zonă rezervată vectorilor de întrerupere O zonă rezervată sistemului O zonă a utilizatorului

Zona memoriei RAM destinată utilizatorului începe la adresa 00800 (0080:0000), iar programele utilizatorului pot fi încărcate doar începând cu această adresă.

Unitatea de afişare

Această componentă conţine afişajul pentru vizualizarea datelor şi mesajelor în timpul utilizării sistemului.Este un afişaj LCD compus dintr-o linie de 16 caractere controlate de un controler intern LSI.

82

Page 83: Manual 1 Final

Primeşte comenzile şi datele direct de la magistrala de date şi utilizează următoarele linii de adresă:

Adresă hexazecimală Funcţie350 Scrierea de coduri351 Scrierea de date352 Citirea stării353 Citirea datelor

Pentru a putea folosi afişajul în programe trebuie să studiaţi lista de vectori de întrerupere, unde sunt descrise rutinele ce pot fi folosite în cadrul programului monitor.

Tastatura

Este compusă din 20 de butoane împărţite în 5 linii şi 4 coloane.Butonul de RESET activează direct pinul de RESET al microprocesorului. Butoane sunt accesate sub forma unei matrici:

COL1(32E)

COL2

(32D)

COL3(32B)

COL4(327)

Riga 1

(D0)

ButonN.17

ButonN.18

ButonN.19

ButonRESET

Riga 2

(D1)

ButonN.13

ButonN.14

ButonN.15

ButonN.16

Riga 3

(D2)

ButonN.9

ButonN.10

ButonN.11

ButonN.12

Riga 4

(D3)

ButonN.5

ButonN.6

ButonN.7

ButonN.8

Riga 5

(D4)

ButonN.1

ButonN.2

ButonN.3

ButonN.4

Coloanele corespund unor linii diferite de adresă I/O (32E, 32D, 32B, 327), în timp ce liniile corespund unor biţi diferiţi ai magistralei de date (D0, D1, D2, D3, D4).Pentru a putea folosi tastatura în programe trebuie să studiaţi lista de vectori de întrerupere, unde sunt descrise rutinele ce pot fi folosite în cadrul programului monitor.

Unitatea paralelă de I/O

Această componentă conţine un controler al interfeţei paralele de tipul 8255, ce face disponibil utilizarea a 3 porturi paralel de I/O.Modulul Z3 utilizează 2 porturi de 8 biţi (Portul A şi portul B) şi 4 linii de I/O ale portului C (PC0 – PC3).O linie a portului C (PC4) este utilizată pentru a comanda buzzerul.Puteţi vedea schema electrică din appendix pentru a studia pinii de ieşire.

Unitatea serială de I/O

83

Page 84: Manual 1 Final

Această componentă conţine un controler al interfeţei seriale asincrone de tipul 8250.Primeşte un semnal de ceas la frecvenţa de 1.8423 Mhz de la un oscilator extern şi comandă toate liniile interfeţei RS-232: TXD, RXD, CTS, RTS, DCD, DSR şi DTR.Circuitele integrate IC14 (1488) şi IC15 (1489) se folosesc pentru transferul semnalelor TTL (0 – 5V) ce vin de la 8250 în semnale de nivel (-12V – 12V) utilizate în cadrul standardului RS-232.Conectorul de ieşire J2 are un pin de ieşire identic cu conectorii calculatoarelor IBM.Puteţi vedea schema electrică din appendix pentru a studia pinii de ieşire.

Unitatea analogică I/O

Această unitate conţine un convertor analog/digital şi un convertor digital/analogic pe 8 biţi.Prelucrează semnale de intrare şi de ieşire pe 8 biţi.Conversia A/D se face folosind IC17 (ADC0804), care este conectat direct la biţii de adresă ai microprocesorului (D0 – D7).Conversia D/A se face utilizând IC18 (74374) ca buffer pentru datele furnizate prin biţii D0 – D7 ai magistralei şi IC19(DAC0800) pentru conversia D/A.

Sursa de alimentare

Este setată să funcţioneze la o singură tensiune de +5V.Tensiunile de -12V şi +12V, utilizate de unitatea serială de I/O şi de unitatea analogică de I/O sunt generate intern prin utilizarea unor convertoare DC-DC.

Ieşirile de probă

Această unitate conţine ieşirile de probă împreună cu vizualizarea pe led-uri a stărilor ieşirilor.În mod particular există:

8 ieşiri logice TTL (0 – 5V), denumite D0 – D7 cu LED-urile de semnalizare aferente, ce pot fi conectate prin intermediul unui cablu adecvat la 8 pini simultan.

1 ieşire logică TTL, denumită DH, controlată printr-o rezistentă de pull-up, împreună cu semnalul corespunzător LED DH.

1 ieşire logică TTL, denumită DL, controlată printr-o rezistentă de pull-up, împreună cu semnalul corespunzător LED DL.

1 ieşire logică TTL, denumită DS, ce acţionează asupra semnalelor tranzitorii, împreună cu semnalul corespunzător LED DS şi butonul de reser RES-DS.

Unitatea de eroare

Această unitate conţine conectorul pentru conexiunea cu IPES Mod. SIS1, SIS2 şi SIS3, ce controlează apariţia erorilor.Erorile pot fi de asemenea controlate în mod manual prin utilizarea dipswitch-urilor DP1 şi DP2.În condiţii normale, în absenţa erorilor, DP2 trebuie deschis, în timp ce DP1 trebuie închis.

84

Page 85: Manual 1 Final

Comenzile de monitor

Monitorul este un program inclus în interiorul EPROM-ului de sistem, ce se ocupă cu controlul sistemului şi permite utilizatorului să-l folosească. Funcţiile de bază sunt:

Vizualizarea şi modificarea conţinutului memoriei şi regiştrilor. Execuţie continuă , pas cu pas, cu întreruperi de program Încărcarea programelor de la tastatură sau de la calculator

Interacţiunea cu utilizatorul se face prin intemediul tastaturii şi al display-ului.

Descrierea funcţionalităţii butoanelor tastaturii este prezentată mai jos. Pentru o descriere mai detaliată a comenzilor monitorului consultaţi appendix-ul.

BUTON FUNCŢIEMEM Analizează/Modifică conţinutul memorieiREG Analizează/Modifică conţinutul regiştrilor generaliSEG Analizează/Modifică conţinutul regiştrilor de segment

LD_KB Încarcă un program de la tastaturăLD_PAR Încarcă un program prin intermediul interfeţei paraleleLS_SER Încarcă un program prin intermediul interfeţei seriale

RUN Rulează un program de la o adresă fixăGO Rulează un program de la orice adresăSS Rulează o instrucţiune de program şi se opreşte

GEN Buton liberBR Controlează întreruperileCB Anulează întreruperea de afişareINC Incrementează adresa de memorie, registrul sau întreruperea de afişareDEC Decrementează adresa de memorie, registrul sau întreruperea de afişare

FIRST Vizualizează prima adresă de memorie, registru sau întrerupereLAST Vizualizează ultima adresă de memorie, registru sau întrerupere

CHG/RET Face trecerea în modul modificare (CHG) sau încheie sesiunea de modificare(RET) şi revine la linia de comandă

→ Mută cursorul la dreapta în timpul modificării datelor← Mută cursorul al stânga în timpul modificării datelor

RESET Provoacă o resetare a microprocesorului (acest buton este conectat direct la pinul de RESET al microcontrolerului)

LISTA ÎNTRERUPERILOR SOFTWARE

Lista întreruperilor software ale modului pe 32 de biţi EV/Z3 este următoarea:

Numărul întreruperii

Numele rutinei Descriere

INT 00H IMONITOR Împărţire la 0. Revine la MonitorINT 01H Rezervată Se execută un pasINT 02H Neutilizată Întrerupere nemascabilăINT 03H Rezervată BreakpointINT 04H Neutilizată DepăşireINT 05H NeutilizatăINT 06H NeutilizatăINT 07H IMONITOR Sfârşitul programului utilizator şi revenire la Monitor

85

Page 86: Manual 1 Final

INT 08H IKEYBOARD Citirea valorii unei tasteINT 09H IDIS_BYTE Afişarea unui octet hexazecimal INT 0AH IDIS_CHAR Afişarea unui caracter ASCIIINT 0BH IDIS_OUTS Afişarea unui şir de caractere pe ecranINT 0CH IDIS_CODE Trimite comenzi către displayINT 0DH IWAIT_MS Aşteaptă x milisecundeINT 0EH IAD_READ Citeşte de la convertorul A/DINT 0FH IDA_WRITE Comandă convertorul D/AINT 10H IBUZZER Comandă buzzerulINT 11H NeutilizatăINT 12H IPARAL Managementul interfeţei paralelăINT 13H NeutilizatăINT 14H ISERIAL Managementul interfeţei seriale

DESCRIEREA ÎNTRERUPERILOR SOFTWARE

În următoarea secţiune vor fi descrise întreruperile împreună cu parametrii necesari.

INT 07HSfârşitul programuluiAceastă întrerupere este utilizată pentru finalizarea execuţiei programului şi transferul controlului către programul Monitor.Trebuie apelată la sfârşitul fiecărui program pentru a ceda controlul programului Monitor.

INTRĂRI NuIEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_JUMP.

INT 08HCitirea unei taste de la tastatură.Această întrerupere permite atenţionarea la apăsarea unei taste. Realizează scanarea tastaturii şi aşteaptă până când o tastă este apăsată. Codul tastei (0 – 18) este încărcat în registrul AL.

INTRĂRI NuIEŞIRI AL = codul tastei (0 – 18)Regiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_KB.

86

Page 87: Manual 1 Final

INT 09HTrimite un caracter hexazecimal către afişaj.Această întrerupere permite scrierea unui octet în formă hexazecimală în orice poziţie a afişajului.Poziţia se poate identifica prin utilizarea registrului CL, iar octetul prin intermediul registrului AL.

INTRĂRI CL = poziţia pointerului pe afişaj (0 – 14)AL = octetul afişat

IEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_KB.

INT 0AHTrimite un caracter ASCII pe afişaj.Această întrerupere permite scrierea unui caracter ASCII în orice poziţie a afişajului.Poziţia se poate identifica prin utilizarea registrului CL, iar octetul prin intermediul registrului AL.

INTRĂRI CL = poziţia pointerului pe afişaj (0 – 14)AL = octetul afişat

IEŞIRI NuRegiştrii modificaţi

Nu

INT 0BHTrimite un şir de caractere pe afişaj.Această întrerupere permite trimiterea unui şir de caractere pe afişaj. Şirul de caractere constă într-un şir de octeţi, ce corespund unor caractere diferite. Sfârşitul şirului este semnalat prin prezenţa codului 00H.Şirul de caractere este localizat în regiştrii DS:SI.Şirul de caractere este afişat începând cu prima căsuţă de pe afişaj.

INTRĂRI DS = indică segmentul ce conţine şirul de caractereSI = indică adresa de început a şirului de caractere, în interiorul segmentului DS

IEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_KB.

87

Page 88: Manual 1 Final

INT 0CHTrimite comenzi către afişaj.Această întrerupere trimite comenzi de control către afişaj.

INTRĂRI AH = 1 Anulează afişareaAH = 2 Poziţionează cursorul pe prima poziţieAH = 3 Mută cursorul la dreaptaAH = 4 Mută cursorul la stângaAH = 5 Activează cursorulAH = 6 Dezactivează cursorulAH = 7 Aduce cursorul în poziţia conţinută de registrul AL.

IEŞIRI NuRegiştrii modificaţi

Nu

INT 0DHAşteaptă x milisecunde.Această întrerupere realizează o pauză a programului. Lungimea acestei pauze (în milisecunde) este specificată de conţinutul registrului AX.

INTRĂRI AX = Numărul de milisecundeIEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_PAR.

INT 0EHCiteşte date de la convertorul analogic/digital.Această întrerupere realizează următoarele operaţii:

Trimite semnalul de începere a conversiei către convertorul A/D Aşteaptă semnalul de sfârşit de conversie Citeşte rezultatul conversiei şi îl returnează în registrul AL.

INTRĂRI NuIEŞIRI AL = rezultatul conversieiRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_AD.

INT 0FHComandă convertorul digital/analogic.

88

Page 89: Manual 1 Final

Această întrerupere trimite date (un octet) către convertorul digital/analogic, care le transformă apoi în valoarea analogică.

INTRĂRI AL = dateIEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_DA.

INT 10HAceastă întrerupere comandă sunetele ce vor fi declanşate de buzzer.Se poate specifica frecvenţa şi durata sunetelor emise.

INTRĂRI BX = durataCX = frecvenţa

IEŞIRI NuRegiştrii modificaţi

Nu

Puteţi urmări exemplul PRG_PAR.

INT 12HManagementul interfeţei paralele.Această întrerupere se ocupă de manipularea interfeţei paralele. Controlerul 8255 se va utiliza doar în Modul 0 (Modul standard I/O).Funcţiile acestei întreruperi pot fi identificate în funcţie de conţinutul registrului AH.

INTRĂRI AH = 0 Porturi de programareAH = 1 Trimite date pe portul AAH = 2 Trimite date pe portul BAH = 3 Trimite date pe portul CAH = 4 Citeşte date de pe portul AAH = 5 Citeşte date de pe portul BAH = 6 Citeşte date de pe portul C

IEŞIRI AL = datele cititeRegiştrii modificaţi

Nu

AH = 0: Porturile programabileConţinutul registrului AL determină direcţia de transmitere a datelor pe porturi:

Registrul AL ProgramareBitul 0 = 0 : portul A ca ieşire

= 1 : portul A ca intrareBitul 1 = 0 : portul B ca ieşire

= 1 : portul B ca intrare

89

Page 90: Manual 1 Final

Bitul 2 = 0 : portul C (C0 – C3) ca ieşire= 1 : portul C (C0 – C3) ca intrare

AH = 1, 2, 3 : Trimite date pe porturile A, B, CConţinutul registrului AL determină datele ce trebuiesc trimise pe porturi.

AH = 4, 5, 6 : Citeşte date de la porturile A, B, CConţinutul registrului AL la ieşire corespunde datelor citite de pe port.

Puteţi vedea exemplul PRG_PAR.

INT 14HManagementul interfeţei seriale.Această întrerupere se ocupă de funcţionarea interfeţei seriale asincrone RS-232. Se utilizează controlerul 8250.Funcţiile specifice acestei interfeţe sunt determinate în funcţie de conţinutul registrului AH.

INTRARE AH = 0 IniţializareAH = 1 Trimite un caracterAH = 2 Primeşte un caracterAH = 3 Citeşte stareaAH = 4 Controlează modemul

AH = 0 : Iniţializează portului de comunicaţieConţinutul registrului AL determină parametrii de iniţializare:

Registrul AL ProgramareBiţii 7, 6, 5 Rată de transfer

=000 : 1200=001 : 2400=010 : 4800=011 : 9600(utilizaţi rata de transfer 1200 pentru controlerul UMB 8250)

Biţii 4, 3 Paritate=00 : nu=01 : impar=10 : no=11 : par

Bitul 2 Bit de stop=0 : 1=1 : 2

Biţii 1, 0 Lungimea cuvântului=10 : 7 biţi=11 : 8 biţi

AH = 1 : Transmisia unui caracterConţinutul registrului AL conţine caracterul ce trebuie trimis.Înainte de trimiterea unui caracter, rutina aşteaptă trimiterea eventualelor caractere rămase de trimis.

90

Page 91: Manual 1 Final

AH = 2 : Recepţia unui caracterConţinutul registrului AL conţine caracterul primit.Rutina aşteaptă disponibilitatea unui caracter înainte de reveni la programul apelat.

AH = 3 : Citirea stăriiConţinutul registrului AH conţine starea liniei curente şi a modemului.

Registrul AH Starea modemuluiBitul 7Bitul 6Bitul 5Bitul 4Bitul 3Bitul 2Bitul 1Bitul 0

Detectarea semnalului recepţionatIndicatorul de inelPregăteşte setul de dateŞterge pentru trimitereDetectarea semnalului delta de recepţieFrontul pozitiv al detectorului de inelPregăteşte setul de date deltaŞterge delta pentru trimitere

Registrul AL Starea linieiBitul 7Bitul 6Bitul 5Bitul 4Bitul 3Bitul 2Bitul 1Bitul 0

Time-outGolirea registrului de shiftare a transmisiei Golirea registrului de menţinere a transmisieiDetectarea întreruperiiEroare de cadruEroare de paritateEroare de depăşireDatele sunt pregătite

AH = 4 : Controlul modemuluiConţinutul registrului AH conţine starea curentă a modemului, ce urmează a fi modificată.

Registrul AL Starea modemuluiBitul 7Bitul 6Bitul 5Bitul 4Bitul 3Bitul 2Bitul 1Bitul 0

000SaltIeşire 2Ieşire 1Necesitate de trimitere (RTS)Terminal de date pregătit (DTR)

Puteţi vedea programele PRG_TX şi PRG_RX.

91

Page 92: Manual 1 Final

QUIZ

Se setează toate comutatoareleurile în poziţia OFF

Q1 Care dintre următoarele combinaţii reprezintă într-un mod corect amplitudinea datelor şi adreselor din modulul Z3/EV?

SET

A B

1 2 8, 16

2 4 16, 16

3 5 32, 32

4 1 16, 20

5 3 16, 32

Q2 Câţi biţi utilizează microprocesorul atunci când scrie sau citeşte date în memoria RAM a modulului Z3/EV?

SET

A B

1 5 8 biţi

2 4 16 biţi

3 2 20 biţi

4 3 26 biţi

5 1 32 biţi

Q3 Care dintre următoarele componente nu este inclusă în modulul EV/Z3?

SET

A B

1 2 Interfaţa serială asincronă

2 4 Interfaţa serială sincronă

3 1 Interfaţa paralel

4 5 Interfaţă analogică

5 3 Unitate de display

92

Page 93: Manual 1 Final

Q4 Unitatea serială de I/O primeşte semnalul de ceas pentru transmiterea datelor de la ?

SET

A B

1 4 Un oscilator intern al unităţii

2 3 Ceasul microprocesorului

3 2 Un oscilator intern al cotrolerului 8250

4 1 Perifericul cu care comunică

Q5 Care dintre următoarele funcţii nu este implemetată în cadrul monitorul modulului EV/Z3?

SET

A B

1 6 Afişarea/Modificarea regiştrilor generali

2 5 Afişarea memoriei RAM

3 4 Afişarea memoriei EPROM

4 3 Afişarea instrucţiunilor microprocesorului

5 2 Execuţia programului pas cu pas

6 1 Inserarea întreruperilor de program

Q6 Care este adresa de început la care utilizatorul poate să încarce programul în memoria RAM?

SET

A B

1 3 0000:0000

2 5 0000:FFFF

3 2 FFFF:FFF0

4 1 0000:0800

5 4 0000:07FF

Alimentarea, utilizarea şi depanarea sistemului

Comutaţi pe modulul Z3/EV şi verificaţi pe display dacă apare mesajul ce indică faptul că sistemul este gata să accepte comenzi: Command PromptÎn cazul în care acest mesaj nu apare, apăsaţi butonul Reset pentru a reiniţializa microprocesorul. Încercaţi şi alte comenzi ale monitorului ilustrate în cadrul acestei lecţii.

93

Page 94: Manual 1 Final

Setaţi comutatorul S2 în poziţia ON

94

Page 95: Manual 1 Final

Q7 Sistemul este blocat şi nu mai răspunde la comenzi introduse de la tastatură. Care poate fi motivul acestei erori?

SET

A B

1 5 Nu există alimentare la +5V pentru microprocesor

2 4 Semnalul de RESET al microprocesorului este activ (+5V)

3 2 Semnalul de clock are o amplitudine prea mică

4 3 Nu este semnal de clock pentru microprocesor

5 1 Tastatura nu funcţionează normal

Setaţi comutatorul S2 în poziţia OFF

Setaţi comutatorul S16 în poziţia ON

Q8 Sistemul este blocat şi continuă să nu răspundă la comenzile introduse de la tastatură. Care poate fi motivul acestei erori?

SET

A B

1 4 Nu există alimentare la +5V pentru microprocesor

2 3 Semnalul de RESET al microprocesorului este activ (+5V)

3 2 Semnalul de ceas are o amplitudine prea mică

4 1 Tastatura nu funcţionează normal

Setaţi comutatorul S16 în poziţia OFF

95

Page 96: Manual 1 Final

LECŢIA 8: PROGRAMARE AVANSATĂ

OBIECTIVE

Indicatorii de stare Instrucţiunile de salt condiţionat şi necondiţionat Subrutine Stiva şi instrucţiunile POP şi PUSH Realizarea de programe şi exerciţii

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

În această lecţie vor fi introduse câteva caracteristici importante ale programării pe microcontrolere şi o particularizare pentru sistemul cu microprocesor pe 32 de biţi, utilizând limbajul de asamblare.

Indicatorii de stare

Deja am văzut cum funcţionează indicatorii de condiţii FLAGS/EFLAGS ai microprocesoarelor 8086/80386 care conţin câteva condiţii furnizate în urma execuţiei diferitelor operaţii.Aceste condiţii au devenit foarte importante, pe baza lor putându-se lua decizii în timpul execuţiei programului.Există 6 indicatori de condiţii:

Indicatorul de transport (Flag Carry)(CF)Este utilizat pentru a indica:

Rezultatul adunării a două numere pe 8 biţi este un număr ce se scrie pe mai mult de 8 biţi

Rezultatul adunării a două numere pe 16 biţi este un număr ce se scrie pe mai mult de 16 biţi

Rezultatul adunării a două numere pe 32 biţi este un număr ce se scrie pe mai mult de 32 biţi

Cel de-al doilea număr al scăderii este mai mare decât primul Al doilea operand din instrucţiunea comparativă (CMP) este mai mare

decât primul

Indicatorul de paritate (Parity Flag)(PF)Indicatorul de paritate este folosit pentru a indica dacă un word scris binar conţine un număr par de biţi ”1”.

Indicatorul de transport auxiliar (Auxiliary Carry Flag)(AF)

96

Page 97: Manual 1 Final

Acest indicator este utilizat în adunările şi scăderile BCD. Se comportă în mod asemănător cu indicatorul de transport, dar este format din 4 biţi.

Indicatorul zero (Zero Flag)(ZF)Acest indicator este folosit pentru a indica dacă rezultatul unei operaţii aritmetice sau logice este 0.Se activează într-una din următoarele situaţii:

Scăderea a două numere egale Comparaţie (CMP) între 2 numere egale Decrementarea unui registru ce ajunge la valoarea 0 Incrementarea unui registru, care în mod curent conţine valoarea

maximă posibilă ce poate fi încărcată în acel registru

Indicatorul de semn (Zero Flag)(ZF)Atunci când se execută operaţii cu numere pozitive sau negative se utilizează reprezentarea în baza 2, unde bitul cel mai semnificativ (MSB) este bitul de semn:

MSB=1 pentru numere negative MSB=0 pentru numere pozitive

Bitul de semn conţine informaţii despre semnul rezultatului unei operaţii logice sau aritmetice.

Indicatorul de depăşire (Overflow Flag)(OF)Acest indicator indică dacă rezultatul unei operaţii cu semn este prea mare pentru a putea fi scris pe numărul de biţi alocat.

Instrucţiuni de salt condiţionat şi necondiţionat

Instrucţiunile de salt sunt utilizate pentru a indica programului să execute o altă instrucţiune aflată în spaţiul de memorie decât următoarea instrucţiune din secvenţa de program.

Salt necondiţionat (instrucţiunea JMP)Instrucţiunea JMP permite saltul la o instrucţiune aflată oriunde în spaţiul de memorie.Dacă această adresă de memorie face parte din acelaşi cod de segment, microprocesorul modifică conţinutul registrului IP (Instruction Pointer – Pointer de instrucţiune), iar saltul poartă numele de salt apropiat(near) sau intrasegment(intrasegment).Dacă această adresă de memorie se află într-un al segment de date, microprocesorul este nevoit să modifice conţinutul regiştrilor CS şi IP. În acest caz, instrucţiunea de salt se numeşte salt la distanţă (far) sau intersegment (intersegment).

Instrucţiuni … JMP OUT_DATA Instrucţiuni …OUT_DATA: instrucţiuni …

Salt necondiţionat

97

Page 98: Manual 1 Final

Mare parte din puterea microprocesorului constă în capacitatea acestuia de a alege între diferite acţiuni în funcţie de starea indicatorilor de condiţii.Posibilitatea de a alege dintre mai multe acţiuni este posibilă prin intermediul instrucţiunilor de salt condiţionat.

Instrucţiunile de salt condiţionat sunt descrise în tabelul de mai jos:

Instrucţiune Condiţie Salt în cazul în careJA/JNBE (CF or ZF)=0 Mai mare/Nu e mai mic sau egalJAE/JNB CF=0 Mai mare sau egal/Nu e mai micJB/JNAE CF=1 Mai mic/Nu e mai mare sau egalJBE/JNA (CF or ZF)=1 Mai mic sau egal/Nu e mai mare

JC CF=1 TransportJE/JZ ZF=1 Egal/Zero

JG/JNLE ((SF xor OF) or ZF)=0

Mai mare decât/Nu e mai mic şi nici egal

JGE/JNL (SF xor OF)=0 Mai mare sau egal/Nu e mai micJL/JNGE (SF xor OF)=1 Mai mic/Nu e mai mare sau egalJLE/JNG ((SF xor OF) or

ZF)=1Mai mic sau egal/Nu e mai mare

JNC CF=0 Fără transportJNE/JNZ ZF=0 Nu e egal/Nu e 0

JNO OF=0 Nu e depăşireJNP/JPO PF=0 Imparitate

JNS SF=0 Nu e semnJO OF=0 Depăşire

JP/JPE PF=1 ParitateJS SF=1 Semn

Instrucţiunile de salt condiţionat permit implementarea într-un mod simplu a structurii IF-THEN sau IF-THEN-ELSE.Exemplu:

Să implementăm structura: IF (Operand AX = Operand BX) THEN Operand AX+=2

CMP AX,BXJNE CONTADD AX,2

CONT: instrucţiuni...

Procedură

Atunci când sunt scrise programele, există adeseori nevoie să se folosească o anumită secvenţă de instrucţiuni în anumite zone ale programului.Pentru a evita scrierea în mod repetat a unei secvenţe de instrucţiuni, aceasta poate fi scrisă o singură dată într-o zonă separată de memorie numită procedură (procedure).

De fiecare dată când se doreşte apelarea acestei intrucţiuni se utilizează instrucţiunea CALL, ce indică zona de memorie unde începe procedura.

98

Page 99: Manual 1 Final

Instrucţiunea RET este folosită la sfârşitul procedurii şi returnează controlul instrucţiunii la care s-a ajuns înainte de apelarea procedurii.Pentru a se putea realiza acest lucru, instrucţiunea CALL salvează automat adresa de revenire într-o zonă de memorie specifică numită stivă.Acest lucru este exemplificat în figura de mai jos.

Instrucţiunea CALLAtunci când este apelată instrucţiunea CALL realizează două operaţii:

Memorează adresa instrucţiunii în memoria stack. Aceasta se va numi adresă de revenire. Dacă procedura ce a fost apelată se află în acelaşi segment, atunci apelarea poartă numele de apelare în apropiere (near) şi se salvează doar IP, altfel apelarea poartă numele de apelare la distanţă(far) şi se salvează atât CS cât şi IP.

Modifică conţinutul registrului IP cu adresa procedurii în cazul apelării în apropiere, altfel modifică atât CS cât şi IF.

Instrucţiunea RETInstrucţiunea RET se comportă într-un mod diferit în funcţie de modul în care s-a efectuat apelarea:

Dacă apelarea a fost în apropiere, doar preia un word de pe stivă şi îl copiază în IP provocând execuţia intrucţiunii ce urmează după CALL.

Dacă apelarea este la distanţă, preia un word de pe stivă şi îl copiază în IP şi apoi preia în mod succesiv alt word pe care îl copiază în CS.

Exemplu:

InstrucţiuniCALL ADUNAREInstrucţiuniCALL ADUNARE

ADUNARE: instrucţiuniRET

Stiva şi instrucţiunile POP şi PUSH

Stiva este o zonă de memorie care deserveşte la memorarea adresei de întoarcere din procedură. De asemenea este utilizată pentru a salva temporar conţinutul unor regiştrii, ce pot fi moficaţi în timpul execuţiei procedurii.

99

Page 100: Manual 1 Final

Se poate folosi un întreg segment de 64KB ca zonă pentru stivă.În fiecare dintre cazuri, adresa stivei este reţinută în registrul de segment SS împreună cu pointerul de stivă SP (SS:SP).Registrul SP trebuie încărcat cu valoarea corespunzătoare dimensiunii maxime a memoriei dedicate stivei, deoarece se decrementează automat cu 2 la fiecare salvare a unui word pe stivă.

În figura de mai jos se face referire la o situaţie în care vârful stivei este identificat de SS:SP (0300:0100), şi se execută instrucţiunea CALL, la adresa 2420H.

În modulul Z3/EV există o zonă de stivă a sistemului localizată în partea inferioră a memoriei RAM.În mod normal nu este nevoie să se încarce în program SS:SP cu o anumită valoare, doar în cazul este nevoie de multă memorie. În această situaţie putem încărca SS:SP cu adresa de început a memoriei RAM folosind următoarele instrucţiuni:

MOV AX,0700H ;valoarea segmentului de stivăMOV SS,AXMOV AX,0FFFH ;valorea pointerului de stivă.MOV SP,AX

Instrucţiunile POP şi PUSHDeseori este nevoie ca în interiorul unei proceduri să se utilizeze regiştrii de uz general ai microprocesorului pentru prelucrări locale. În acest fel se modifică valoarea lor iniţială, iar dacă regiştrii vor fi folosiţi şi în programul principal vor apărea erori.Pentru a evita acest fapt regiştrii care au fost modificaţi vor trebui să fie salvaţi pe stivă la începutul procedurii, iar apoi, la încheierea procedurii trebuiesc reiniţializaţi cu valoarea de pe stivă.Instrucţiunile PUSH şi POP permit realizarea acestui lucru într-un mod foarte eficient.Instrucţiunea PUSH decrementează pointerul de stivă cu 2 şi copiază conţinutul registrului în stivă.Instrucţiunea POP copiază un word de pe stivă şi îl pune în registrul indicat; valoarea pointerului de stivă este apoi incrementată cu 2.

Exemplu:

100

Page 101: Manual 1 Final

PROC1 PROC NEAR PUSH AX ;salvează AX pe stivă MOV AX,0100H Alte instrucţiuni POP AX ;resetează AX RET

PROC1 ENDP

101

Page 102: Manual 1 Final

QUIZ

Setaţi toate comutatoarele în poziţia OFF

Utilizarea instrucţiunile de salt condiţionatVom dori să realizăm un program pentru modulul Z3/EV care aşteaptă un timp predefinit, iar apoi cedează controlul Monitorului de sistem.Codul sursă este reprezentat în ceea ce urmează.

1 PAGE 70,1662 ;---------------- PRG_JUMP -------------------------3 ;acest program urmează o serie de cicluri4 ;pentru a determina un timp de aşteptare de câteva5 ;secunde, iar apoi cedează controlul monitorului6 = 0007 IMONITOR EQU 07H78 ;---------------------------------------- CODE9 ;program încărcat la adresa 0000:MEM_POS1011 0000 PROG SEGMENT12 ASSUME CS:PROG, DS:PROG1314 0000 B8 1000 START: MOV AX,1000 ;încarcă counterul AX1516 0003 B9 0108 LOOP2: MOV CX,108 ;încarcă counterul CX17 0006 49 LOOP1: DEC CX ;18 0007 83 F9 00 CMP CX,0000H ;19 000A 75 FA JNZ LOOP1 ;20 000C 48 DEC AX21 000D 3D 0000 CMP AX,0000H22 0010 75 F1 JNZ LOOP22324 0012 CD 07 INT IMONITOR ;revine la monitor2526 0014 PROG ENDS27 END START

Instrucţiunea: INT MONITOR apelează o întrerupere software ce realizează revenirea la monitorul de sistem (acest fapt va fi analizat în următoarea lecţie).Timpul de aşteptare constă în 2 cicluri de ceas.În primul ciclu se încarcă registrul CX cu numărul 108, şi se decrementează până la valoarea 0.În al doilea ciclu se utilizează un registru counter AX. Acest ciclu se repetă de 10000 ori.

Introduceţi acest program în modulul Z3/EV utilizând tastatura.Daţi comanda: LD_KBSpecificaţi adresa de plecare: 0000:0800Întroduceţi codul generat de program: B8, 10, 27, B9, 6C, 00,....., 07Rulaţi programul apelând comanda RUN.

Q1 Cât timp va trece de la începutul programului până la revenirea la monitor?

SET

A B

1 4 1,5 secunde

2 5 2 secunde

102

Page 103: Manual 1 Final

3 1 10 secunde

4 2 15 secunde

5 3 20 secunde

Utilizarea procedurilorDorim să realizăm un program pentru modulul Z3/EV care să emită 3 beepuri de la buzzer, la intervale fixe de timp, iar apoi să returneze controlul Monitorului de sistem.Se va folosi o procedură pentru a obţine intervalele de timp. Această procedură va fi apelată de 2 ori.Codul sursă este următorul.1 PAGE 70,1662 ;-------------------------- PRG_CALL ---------------3 ;sunt emise 3 bipuri de la buzzer la4 ;intervale fixe de timp.5 ;Se va folosi o procedură ce va fi apelată de 2 ori6 ;pentru a obţine intervalele de timp dorite.7 = 0007 IMONITOR EQU 07H8 = 0010 IBUZZER EQU 10H9 = 0012 IPARAL EQU 12H1011 ;---------------------------------------- CODE12 ;programul se încarcă la adresa 0000:0800H1314 0000 PROG SEGMENT15 ASSUME CS:PROG, DS:PROG1617 0000 B4 00 START: MOV AH,00H18 0002 B0 00 MOV AL,00H19 0004 CD 12 INT IPARAL ;portul de ieşire şi enable-ul acestuia20 0006 BB 00C8 MOV BX,200 ;durata beepului21 0009 B9 0014 MOV CX,20 ;frecvenţa beepului22 000C CD 10 INT IBUZZER ;--------------- BEEP123 000E E8 0026 R CALL ATT ;aşteaptă24 0011 BB 00C8 MOV BX,200 ;25 0014 B9 0014 MOV CX,20 ;26 0017 CD 10 INT IBUZZER ;--------------- BEEP227 0019 E8 0026 R CALL ATT ;aşteaptă28 001C BB 00C8 MOV BX,200 ;29 001F B9 0014 MOV CX,20 ;30 0022 CD 10 INT IBUZZER ;--------------- BEEP33132 0024 CD 07 INT IMONITOR ;revenire la monitor3334 ;procedură de aşteptare35 0026 ATT PROC NEAR36 0026 50 PUSH AX ;salvează regiştrii folosiţi37 0027 51 PUSH CX38 0028 B8 03E8 MOV AX,1000 ;încarcă counterul AX39 002B B9 0064 LOOP2: MOV CX,100 ;încarcă counterul CX40 002E 49 LOOP1: DEC CX ;loop41 002F 83 F9 00 CMP CX,0000H ;42 0032 75 FA JNZ LOOP1 ;43 0034 48 DEC AX44 0035 3D 0000 CMP AX,0000H45 0038 75 F1 JNZ LOOP246 003A 59 POP CX ;resetează regiştrii47 003B 58 POP AX48 003C C3 RET49 003D ATT ENDP50 003D PROG ENDS51 END START

Se va folosi întreruperea software: INT IBUZZER pentru a comanda buzzerul.Înainte de utilizare, încărcaţi registrul BX cu o valoare ce reprezintă durata semnalului emis şi registrul CX cu frecvenţa semnalului.Inseraţi acest program în modulul Z3/EV de la tastatură.

103

Page 104: Manual 1 Final

Daţi următoarea comandă: LD_KBSpecificaţi adresa de început: 0000:0800Inseraţi codurile programului din lista de mai sus.Rulaţi programul folosind comanda RUN.

Q2 Cât timp va trece de la începutul programului până la revenirea la monitor?

SET

A B

1 5 0,5 secunde

2 4 1 secundă

3 3 3 secunde

4 2 5 secunde

5 1 10 secunde

Q3 Care va fi conţinutul registrului CX la terminarea execuţiei programului?

SET

A B

1 4 0000:0000

2 1 FFFF

3 5 0000

4 3 0000FFFF

5 2 oricare

Q4 Care va fi conţinutul registrului BX la terminarea execuţiei programului?

SET

A B

1 2 0000:0000

2 4 FFFF

3 1 0000

4 5 0000FFFF

5 3 oricare

104

Page 105: Manual 1 Final

LECŢIA 9: MANAGEMENTUL ÎNTRERUPERILOR

OBIECTIVE

Sursele de întrerupere Întreruperile şi răspunsul la întreruperi Tipuri de întreruperi Întreruperi software Întreruperi hardware Prioritatea întreruperilor Întreruperile software ale modulului Z3/EV Realizarea unor aplicaţii şi exerciţii

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

Sursele de întrerupere

Cea mai mare parte a microcontrolerelor permit întreruperi prin intermediul unui semnal extern sau prin intermediul unor instrucţiuni ale programului în sine.Ca răspuns la aceste întreruperi, microprocesorul opreşte execuţia programului şi apelează o procedură de rezolvare a întreruperii.La finalul procedurii de rezolvare a întreruperii se apelează o instrucţiune specială care cedează controlul programului care a fost întrerupt.Pentru microprocesorul 80386EX, o întrerupere poate avea loc în trei moduri diferite:

Întrerupere hardware: prin aplicarea unui semnal pe linia externă NMI (Non Maskable Interrupt – Întrerupere nemascabilă) sau pe liniile de întrerupere INT0, INT1,..

Întrerupere software: prin execuţia instrucţiunii INT În condiţiile când apar erori speciale care se declanşează în timpul

execuţiei unei instrucţiuni (Ex: depăşire, împărţire la 0)

Întreruperile şi răspunsul la întreruperi

Atunci când apare o întrerupere, microprocesorul urmează următorii paşi pentru a răspunde la întrerupere:

Decrementează pointerul de stivă cu 2 şi salvează pe stivă indicatorii de condiţii

Dezactivează alte eventuale întreruperi şi dezactivează indicatorul de înterupere IF (IF=0) în registrul indicatori de condiţii.

Resetează indicatorul de condiţii TF în registrul indicatorilor de condiţii

105

Page 106: Manual 1 Final

Decrementează pointerul de stivă cu 2 şi adaugă în stivă valoarea curentă a registrului de segment CS.

Decrementează pointerul de stivă cu 2 şi adaugă în stivă valoarea curentă a registrului pointer al stivei (IP).

Efectuează un salt la distanţă până la începutul procedurii care trebuie să răspundă instrucţiunii.

Adresele de început ale procedurilor ce trebuie să răspundă la întreruperi sunt memorate într-un tabel reţinut în primii KB ai memoriei RAM a sistemului, de la adresele 00000H la 003FFH.Adresele de început sunt numite vectori de întrerupere, iar tabelul poartă numele de tabelul vectorilor de întrerupere.

Tabelul vectorilor de întrerupere conţine 256 de vectori, fiecare dintre ei ocupând câte 4 octeţi (2 folosiţi pentru reţinerea registrului CS şi 2 pentru IP).În figura de mai jos este reprezentat tabelul vectorilor de întrerupere.Puteţi observa faptul că cei mai semnificativi 2 octeţi ai fiecărui vector conţin regiştrii IP şi CS.

La finalul unei proceduri de rezolvare a întreruperii trebuie să existe instrucţiunea IRET pentru a face posibilă revenirea la programul care a fost întrerupt.Instrucţiunea IRET preia din stivă următoarele informaţii în următoarea ordine logică:

Valoarea registrului IP, şi apoi incrementează stiva cu 2. Valoarea registrului CS, şi apoi incrementează stiva cu 2. Valorile regiştrilor indicatori de condiţii, şi apoi incrementează stiva cu

2.

Tipuri de întrerupere

Aţi putut vedea cum se pot implementa întreruperile cu ajutorul tabelei vectorilor de întrerupere. Fiecare vector de întrerupere are asociat un număr de la 0 la 255.Acest număr reprezintă de fapt tipul întreruperii.Tipurile ce au asociate numere de valoare mai mică sunt rezervate întreruperilor speciale, în timp ce cele de valoare mai mare sunt la dispoziţia programatorului.În ceea ce urmează vor fi descrise întreruperile speciale.

Întreruperea de tip 0 – Împărţirea la 0 (Division by zero)

106

Page 107: Manual 1 Final

Această întrerupere apare automat în cazul în care în urma execuţiei unei operaţii de împărţire, coeficientul depăşeşte valoarea maximă admisă de intrucţiune.

Întrerupere de tip 1 – Un singur pas (Single-Step)Această întrerupere este generată în instrucţiune atunci când indicatorul TF din registrul de indicatori de condiţii este activat . Este folosită atunci când se doreşte urmărirea unui program instrucţiune cu instrucţiune.

Întrerupere de tip 2 – Întrerupere nemascabilăAceastă întrerupere este generată de o modificare a semnalului din LOW în HIGH pe pinul extern NMI al microprocesorului. Această întrerupere are prioritatea maximă şi nu poate fi dezactivată.

Întrerupere de tip 3 – Punct de întrerupere (Breakpoint)Aceasta este o înterupere software ce este generată de o cerere specială de întrerupere, ce are dimensiunea codului de operaţiei de un octet. Se utilizează pentru a introduce puncte de întrerupere în program în timpul fazei de depanare.

Înterupere de tip 4 – Depăşire (Overflow)Această întrerupere este generată la activarea indicatorului de condiţii OF după execuţia unei instrucţiuni.

Întreruperi software

Înteruperile software pot fi generate utilizând instrucţiunea de 2 octeţi INT nn.Primul octet conţine codul instrucţiunii, iar cel de-al doilea octet (nn) conţine numărul sau tipul întreruperii ce trebuie rezolvată.Acest număr (nn) este inclus în intervalul 0 – 255.Aceste întreruperi sunt utilizate pe scară largă la reapelarea procedurilor din memorie fără a se cunoaşte adresele procedurilor.Pentru a se apela o procedura cu instrucţiunea CALL este nevoie să se cunoască adresa procedurii.Întreruperile software sunt utilizate în interiorul modulului Z3/EV pentru a apela proceduri de sistem din orice program scris de utilizator.

Întreruperile hardware

Înteruperile nemascabile sunt în mod normal generate de către un semnal extern aplicat pe pinul INTR al microprocesorului.Prezenţa unui singur pin INTR face ca un singur echipament periferic să poată sa întrerupă microprocesorul.Pentru a se putea evita această limitare se folosesc echipamente externe capabile să controleze mai multe întreruperi. Un exemplu de astfel de echipament este controlerul de întrerupere cu priorităţi 8259A (Priority Interrupt Controller 8259A).În figura de mai jos se poate observa un exemplu de conexiune între microprocesor şi controlerul de întreruperi externe.

107

Page 108: Manual 1 Final

Controlerul extern are 8 linii de întrerupere, iar atunci când are loc o întrerupere pe una din linii se va semnala evenimentul către microprocesor prin intermediul pinului INTR, iar comunicarea tipului de întrerupere se va face prin intermediul magistralei de date (un număr de la 0 la 255).Aceste întreruperi pot fi dezactivate prin intermediul instrucţiuni CLI (Clear Interrupt - Şterge întreruperea) şi poate fi activată prin intermediul instrucţiunii STI (Set Interrupt – Setează întreruperea).

Mircroprocesorul 80386EX nu are prevăzută o linie externă INTR, dar conţine intern o unitate de control al întreruperilor (Interruption Control Unit) formată din două controlere 8259A dispuse în cascadă.Pentru detalii privind rezolvarea întreruperilor în cadrul microprocesorului 80386EX consultaţi manualul microprocesorului.

Prioritatea întreruperilor

În cazul în care mai multe întreruperi se declanşează concomitent, microprocesorul le rezolvă în ordinea priorităţilor.Întreruperea cu prioritatea maximă va fi rezolvată mai întâi, apoi întreruperea cu prioritatea imediat următoare, ş.a.m.d.Următorul tabel ilustrează prioritatea întreruperilor.

Întrerupere PrioritateÎmpărţire la 0, INT nn, INTO maximăNMIINTRSingle-Step minimă

Întreruperile software ale modulului Z3/EV

Aţi putut vedea deja de ce întreruperile software sunt un instrument foarte important ce permit execuţia unor proceduri a căror adresă nu este nevoie să se cunoască.

Monitorul sistemului conţine în interiorul lui o aplicaţie software pentru fiecare componentă periferică a modulului EV/Z3.

În tabelul de mai jos este prezentată o listă a instrucţiunilor software. Pentru mai multe detalii consultaţi appendixul.

108

Page 109: Manual 1 Final

Numărul instrucţiunii

Numele rutinei Descriere generală

INT 00H IMONITOR Împărţire la 0. Revine la monitorINT 01H Rezervată Single-stepINT 02H Neutilizată Întrerupere nemascabilăINT 03H Rezervată Punct de întrerupere(Breakpoint)INT 04H Neutilizată DepăşireINT 05H NeutilizatăINT 06H NeutilizatăINT 07H IMONITOR Încheie programul utilizatorului şi revine la

monitorINT 08H IKEYBOARD Citeşte o tastă de la tastaturăINT 09H IDIS_BYTE Trimite un octet hexazecimal către afişajINT 0AH IDIS_CHAR Trimite un caracter ASCII către afişajINT 0BH IDIS_OUTS Trimite un şir de caractere către afişajINT 0CH IDIS_CODE Trimite comenzi către afişajINT 0DH IWAIT_MS Aşteaptă un număr de milisecundeINT 0EH IAD_READ Citeşte de la converterul A/DINT 0FH IDA_WRITE Comandă converterul A/DINT 10H IBUZZER Comandă buzzerulINT 11H NeutilizatăINT 12H IPARAL Comandă interfaţa paralelINT 13H NeutilizatăINT 14H ISERIAL Comandă interfaţa serială

109

Page 110: Manual 1 Final

QUIZ

Setaţi toate swichurile în poziţia OFF

Utilizarea instrucţiunilor softwareDorim să realizăm un program pentru modulul Z3/EV ce citeşte o tastă de la tastatură şi reprezintă codul acesteia pe afişaj.Codul sursă al programului este următorul:

1 PAGE 70,1662 ;------------------ PRG_KB ------------------------3 ;citirea unei taste de la tastatură4 ;şi afişaţi codul tastei pe display5 PAGE 70,1666 = 0800 MEM_POS = 0800H7 = 0080 DS_SEG = 0080H8 = 0008 IKEYBOARD = 08H ;întrerupere citire tastă9 = 0009 IDIS_BYTE = 09H ;întrerupere afişare octet10 = 000B IDIS_STR = 0BH ; întrerupere afişare string1112 ;---------------------------------------- CODE13 ;programul se încarcă la adresa 0000:MEM_POS14 0000 CODE SEGMENT15 ASSUME CS:CODE, DS:CODE16 0000 ORG 0H17 0000 B8 0080 START: MOV AX,DS_SEG18 0003 8E D8 MOV DS,AX ;încarcă segmentul de date19 0005 BE 0012 R MOV SI,OFFSET MSG20 0008 CD 0B INT IDIS_STR ;afişează mesajul MSG21 000A CD 08 TLOOP: INT IKEYBOARD ;citeşte de la tastatură22 000C B1 0D MOV CL,1323 000E CD 09 INT IDIS_BYTE ;afişează codul instrucţiunii24 0010 EB F8 JMP TLOOP2526 0012 4B 42 2C 20 68 65 MSG DB 'KB, hex key: xx ',00H27 78 20 6B 65 79 3A28 20 78 78 20 002930 0023 CODE ENDS31 END START

Introduceţi programul în modulul EV/Z3 de la tastatură (în cazul utilizării unui PC folosiţi aplicaţia MODZ3 pentru transferul programului PRG_KB prin interfaţa serială sau paralelă, utilizând cablurile adecvate).

Daţi comanda: LD_KBSpecificaţi adresa de plecare: 0000:0800Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

Citire tasta para si buzz dc e sau nu eSau afisare tasta.1 2 3 4 5 6...

Q1 Care este efectul instrucţiunii MOV SI, OFFSET MSG de pe linia 18 din program?

SET

A B

1 5 Încarcă în SI şirul de caractere MSG reţinut în DS

110

Page 111: Manual 1 Final

2 4 Încarcă în SI şirul de caractere MSG reţinut în CS

3 3 Încarcă în SI lungimea şirului de caractere MSG

4 2 Încarcă în SI primii doi octeţi ai şirului de caractere MSG

5 1 Încarcă în SI valoarea şirului de caractere MSG

Q2 Care este efectul instrucţiunii MOV CL, 13 de pe linia 21 din program?

SET

A B

1 4 Încarcă în CL poziţia de pe afişaj

2 3 Încarcă în CL octetul de pe afişaj

3 2 Încarcă în CL dimensiunea în octeţi a şirului de caractere MSG

4 1 Încarcă în CL pointerul de pe afişaj

Setaţi comutatorul S8 în poziţia ON

Q3 Apăsând pe butoanele de la tastatură, pe display vor apărea doar în mod ocazional simboluri. Care este motivul apariţiei acestei erori?

SET

A B

1 2 Display-ul nu este conectat corect la magistrala microprocesorului (Pinul D6 este neconectat, va avea permanent valoarea ”0”)

2 4 Display-ul nu este conectat corect la magistrala microprocesorului (Pinul D6 este neconectat, va avea permanent valoarea ”1”)

3 1 Semnalul de Enable (Pornire) al display-ului nu a fost activat

4 5 Semnalul de R/W# al display-ului nu a fost activat

5 3 Ceasul microprocesorului nu a fost sincronizat.

Setaţi comutatorul S8 în poziţia OFF.Setaţi comutatorul S14 în poziţia ON.

Q4 Apăsând pe butoanele de la tastatură,valorile de pe display nu mai sunt reupdatate. Care este motivul apariţiei acestei erori?

SET

A B

1 6 Semnalul de Enable (Pornire) al display-ului nu este bun

2 5 Semnalul de R/W# al display-ului nu este bun

3 4 Semnalul de RS al display-ului nu este bun

4 3 Tastele nu mai funcţionează corect

111

Page 112: Manual 1 Final

5 2 Semnalul de pe linia R1 a tastaturii nu este corect

6 1 Semnalul de pe linia R5 a tastaturii nu este corect

Setaţi comutatorul S14 în poziţia OFF.

112

Page 113: Manual 1 Final

LECŢIA 10: MEMORIA EPROM ŞI INTERFAŢAREA CU MICROCONTROLERUL

OBIECTIVE

Tipurile de memorie volatilă Structura de bază a memoriei EPROM Caracteristicile memoriei EPROM 27C256 Interfaţarea cu 80386EX Realizarea unor aplicaţii şi exerciţii

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

Tipurile de memorie volatilă

Un sistem cu microprocesoare are nevoie de memorii volatile, ce pot păstra informaţia chiar şi după închiderea sistemului. În această memorie se reţine şi programul de bază ce facilitează funcţionarea sistemului.Acest program de bază poartă numele de Monitor de sistem.Principalele tipuri de memorii non-volatile sunt:

ROM(Read Only Memory): este un tip de memorie a cărei conţinut este scris direct în timpul procesului de fabricaţiei. Utilizarea acestui tip de memorii este convenabilă doar pentru fabricarea într-un număr foarte mare.

PROM(Programmable Read Only Memory): este o memorie non-volatilă ce poate fi scrisă doar o singură dată de către utilizator, iar în rest poate fi doar citită.

EPROM(Erasable Programmable Read Only Memory): este o memorie non-volatilă ce poate fi scrisă şi citită, dar care poate fi ştearsă doar cu ajutorul razelor ultraviolete. Numărul de scrieri şi citiri posibile este mare. Acest tip de memorie este foate utilizat în sistemele cu microprocesoare.

Structura de bază a memoriei EPROM

Memoriile EPROM sunt bazate pe o structură cu tranzistori MOS organizaţi sub forma unei matrici, ca în figura de mai jos.În mod normal este formată din ”n” cuvinte de 8 biţi.

113

Page 114: Manual 1 Final

Selecţia unui cuvânt se face prin intermediul liniilor de adresare. În această figură există două linii de adresare A0 şi A1 ce pot adresa până la 4 cuvinte. Fiecare cuvânt corespunde unei linii de 8 tranzistoare.

Decodificatorul setează nivelul logic 0 pentru linia selectată, iar cele 8 ieşiri (D0,...,D7) vor avea valori logice 0 sau 1 în funcţie de starea tranzistorului corespunzător (dacă tranzistorul conduce sau nu). În cazul în care acesta conduce, este adus la saturaţie şi se scurtcircuitează semnalul Vdc către masă.

Tranzistorul MOS are în mod normal o impedanţă foarte mare atunci când este blocat. Această caracteristică poate fi modificată prin aplicarea unui semnal de tensiune ridicată la bază (în mod normal între 20 şi 30 V).

Programarea acestui tip de memorie constă în aplicarea unei tensiuni mari la fiecare poartă a tranzistorilor ce trebuie să memoreze valoarea logică 0.Prin expunerea tranzistorilor MOS la raze ultraviolete are loc procesul invers, iar tranzistorul revine la starea de impedanţă mare (nivel logic 1).

Aceste memorii pot fi astfel foarte uşor scrise sau modificate.

Caracteristicile memoriei EPROM 27C256

În interiorul modului EV/Z3 se utilizează memorii de tipul EPROM 27C256. Aceste memorii pot conţine până la 256 Kbiţi de informaţie organizaţi în 32768 cuvinte a câte 8 octeţi fiecare (32KB).Necesită utilizarea unei singure surse de tensiune de +5V şi e disponibilă sub forma unui pachet de 28 de pini.Caracteristicile principale sunt descrise în următorul tabel:

Configuraţia internă 32768 x 8 biţiSursă +5V

Consumator în modul activ 25 mW (1MHz)Consumator în modul stand-by 5µW

Timp de acces 100-150 nsTensiune de programare +12.5 VDC

Intrări şi ieşiri TTL

114

Page 115: Manual 1 Final

Diagrama bloc şi configuraţia pinilor este prezentată în figura de mai jos.

Interfaţarea cu 80386EX

Diagrama de conexiune a memoriei EPROM 27C256 cu microprocesorul 80386EX din interiorul modulului EV/Z3 este prezentată mai jos.

115

Page 116: Manual 1 Final

În figura de mai jos sunt prezentate temporizările unei operaţii de citire din memoria EPROM.

Din diagrama precedentă putem observa: Operaţiile de citire ale memoriei EPROM sunt executate folosind

magistrala de 8 biţi. Linia de selecţie UCS# se foloseşte pentru activarea memoriei

EPROM. Linia UCS# este conectată la linia BS8# ce indică microprocesorului să folosească magistrala de 8 biţi.

Linia UCS# devine activă, împreună cu adresa 3FFFFF0H după resetarea microprocesorului. Cunoscând faptul că magistrala este de 20 de biţi, putem observa cum această adresă corespunde adresei de memorie FFF0H a memoriei EPROM. Aici se găseşte prima instrucţiune a programului Monitor.

Linia UCS# este apoi programată în unitatea de selecţie a componentei (Chip Select Unit) pentru a opera în marja de adrese F8000H-FFFFFH cu o magistrala de date pe 8 biţi şi generarea unui semnal READY intern.

Linia CS0# este folosită pentru activarea celei de-a doua memorii EPROM. Această linie este programată în unitatea de selecţie a componentei (Chip Select Unit) a microprocesorului pentru a opera în marja de adrese F0000H-F7FFFH cu o magistrala de date pe 8 biţi şi generarea unui semnal READY intern.

Datele sunt citite din 2 memorii utilizând semnalul RD# al microprocesorului pentru a activa linia OE# a memoriei.

Linia A0 a memoriei, ce nu e prezentă în magistrala de adrese a microprocesorului, este generată în mod direct prin utilizarea semnalului BLE# al microprocesorului (semnal ce indică faptul că este utilizat cel mai semnificativ octet al magistralei de 16 biţi)

116

Page 117: Manual 1 Final

QUIZ

Setaţi toate comutatoarele în poziţia OFF

Dorim să realizăm un program pentru modulul EV/Z3 prin care să se vizualizeze conţinutul memoriei USER EPROM, câte un octet pe rând, în mod continuu.

Verificaţi dacă în spaţiul rezervat memoriei USER EPROM există inserată o memoriei EPROM.

Codul sursă al programului este următorul:

1 PAGE 70,1662 ;----------------------- PRG_EP2 --------------------3 ;afişează conţinutul memoriei USER EPROM4 ;câte un octet odată, timp de o secundă5 = 0800 MEM_POS = 0800H6 = 0080 DS_SEG = 0080H7 = 0009 IDIS_BYTE = 09H ;întrerupere de afişare a unui octet8 = 000B IDIS_STR = 0BH ;întrerupere de afişare a unui şir de

caractere9 = 000D IWAIT_MS = 0DH ;întrerupere de aşteptare(ms)10 ;---------------------------------------- CODE11 ;programul este încărcat la adresa 0000:MEM_POS12 0000 CODE SEGMENT13 ASSUME CS:CODE, DS:CODE14 0000 ORG 0H15 0000 B8 0080 START: MOV AX,DS_SEG16 0003 8E D8 MOV DS,AX ;încarcă segmentul de date17 0005 BE 002F R MOV SI,OFFSET MSG18 0008 CD 0B INT IDIS_STR ;afişarea mesajului MSG19 000A B8 F000 MOV AX,0F000H ;segment USER EPROM20 000D 8E C0 MOV ES,AX21 000F BE 0000 MOV SI,0000H ;adresa USER EPROM22 0012 26: 8A 04 TLOOP: MOV AL,ES:[SI] ;citeşte date USER EPROM23 0015 B1 0C MOV CL,1224 0017 CD 09 INT IDIS_BYTE ;afişarea datelor25 0019 8B C6 MOV AX,SI26 001B 8A C4 MOV AL,AH27 001D B1 05 MOV CL,528 001F CD 09 INT IDIS_BYTE ;afişarea MSB al adresei29 0021 8B C6 MOV AX,SI30 0023 B1 07 MOV CL,731 0025 CD 09 INT IDIS_BYTE ;afişarea LSB al adresei32 0027 B8 03E8 MOV AX,100033 002A CD 0D INT IWAIT_MS ;aşteaptă34 002C 46 INC SI ;incrementează adresa35 002D EB E3 JMP TLOOP3637 002F 41 64 64 3A 20 78 MSG DB 'Add: xxxx - xx ',00H38 78 78 78 20 2D 2039 78 78 20 20 004041 0040 CODE ENDS42 END START

Inseraţi acest program în modulul EV/Z3 de la tastatură (în cazul utilizării unui PC folosiţi programul PRG_EP2 pentru transferul programului prin intermediul interfeţei seriale sau paralele, utilizând cablurile adecvate).Daţi comanda: LD_KBSpecificaţi adresa de început: 0000:0800Inseraţi codurile programului din lista de mai sus.Daţi comanda GO 0080:0000 (sau RUN) pentru execuţia programului.

117

Page 118: Manual 1 Final

Q1 Care este adresa fizică de început a memoriei USER EPROM?

SET

A B

1 2 0000:0000

2 5 00000

3 1 FFFFF

4 3 0F000

5 4 F0000

Q2 Care dintre următoarele activităţi nu este comandată de microprocesor în timpul execuţiei programului?

SET

A B

1 4 Citirea din RAM M0L, M0H

2 1 Citirea din SYSTEM EPROM

3 2 Citirea de la tastatură

4 3 Afişarea pe display

Setaţi comutatorul S7 în poziţia ON

Q3 Sistemul nu afişează corect octeţii din memoria EPROM. Pentru fiecare celulă de memorie se afişează valoarea FF. Care este cauza acestei erori?

SET

A B

1 4 Magistrala de date a fost deconectată de la memorie

2 1 Memoria USER EPROM nu primeşte semnal de activare

3 5 Memoria USER EPROM nu primeşte semnal de citire

4 2 Adresele de selecţie ale memoriei USER EPROM nu sunt corecte

5 3 Ceasul microprocesorului s-a oprit.

Setaţi comutatorul S7 în poziţia OFF

118

Page 119: Manual 1 Final

Q4 Memoria USER EPROM este conectată la microprocesor prin intermediul magistralei de 8 biţi. Cum este mai bine să se folosească cei 8 biţi de date ai magistralei pentru citirea datelor din memorie?

SET

A B

1 2 Prin intermediul programării semnalului de selecţie CS0# ce activează memoria EPROM

2 4 Prin intermediul semnalului BS8#

3 1 Prin intermediul semnalului BHL#

4 3 Cei mai semnificativi 8 biţi ai magistralei nu sunt luaţi în considerare.

Q5 Câte linii de adrese sunt utilizate pentru citirea datelor de la memoria EPROM?

SET

A B

1 2 13

2 1 14

3 4 15

4 3 16

119

Page 120: Manual 1 Final

LECŢIA 11: MEMORIA RAM ŞI INTERFAŢAREA CU MICROCONTROLERUL

OBIECTIVE

Memoriile RAM statice Memoriile RAM dinamice Analiza memoriei RAM 6264 Interfaţarea cu 80386EX Realizarea unor aplicaţii şi exerciţii

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

Memoria RAM statică

Memoriile RAM statice sunt cel mai des folosite în sistemele cu microprocesoare datorită timpului de acces mic şi a faptului că nu au nevoie de refacere, cât şi a dimensiunilor compacte (în general de ordinul a zeci de KB).Cuvântul RAM (Random Access Memory) indică faptul că este posibil să se acceseze orice locaţie de memorie folosind aceeaşi procedură.

Structura unei celule de memorieMemoriile RAM au la bază tehnologia CMOS. O celulă de memorie are următoarea structură ca cea din figură:

Această celulă conţine un singur bit de informaţie şi este formată dintr-o singură poartă flip-flop.Această poartă poate fi setată(nivel logic 1), sau resetată (nivel logic 0). O dată ce a fost setată, va rămâne în această stare până va fi resetată.

Organizarea internă

120

Page 121: Manual 1 Final

Memoria RAM statică nu este mai mult decât o componentă ce conţine un număr mare de celule de bază, organizate sub forma unei matrici de linii şi coloane.În figura următoare este reprezentată structura unei memorii RAM de 4096 de biţi, organizaţi sub forma unei matrici de linii şi coloane.

Acestă memorie necesită 12 linii de adresă (A0 – A11). Aceste linii sunt conectate la coloanele şi la liniile decodificatorului de adrese.Decodificatorul de coloane foloseşte 6 biţi de adresă (A0 – A5), fiind capabil să acceseze în acest fel una din cele 64 de coloane posibile.Conexiunea dintre linie şi adresă indică celula activată.O dată ce a fost activată una dintre cele 64x64=4096 de celule, se poate citi sau scrie acea celulă.

Memoria RAM dinamică

Memoria RAM dinamică este formată din celule mai simple decât celulele memoriei RAM statice.În figura de mai jos este reprezentată o celula RAM dinamică.

Reţinerea informaţiei se face prin încărcarea capacităţii de la intrarea tranzistorului MOS.Această încărcare este menţinută timp de câteva ms, aşadar datele trebuiesc rescrise în mod continuu.Sistemele ce folosesc memorii dinamice trebuie să deţină şi un circuit care să se ocupe de rescrierea celulelor la un interval de câteva milisecunde.Memoria RAM dinamică este folosită atunci când este nevoie de o cantitate mare de memorie (de ordinul MB), ca de exemplu în PC-uri.Memoria RAM dinamică este orientată către bit şi are o structură internă adaptată pentru utilizarea unui număr cât mai mic de pini.

121

Page 122: Manual 1 Final

În figura de mai jos este ilustrată o memorie RAM dinamică de 64 K-biţi, ce conţine 65536 de celule de 1 bit fiecare.

Reţineţi că în loc să se utilizeze 16 linii de adresă, se folosesc doar 8 linii, iar adresa este formată din doi octeţi controlaţi de următoarele semnale:

RAS = semnal de activare a liniei CAS = semnal de activare a coloanei

Memoria RAM 6264

În interiorul modulului Z3/EV se utilizeaza memorii RAM 6264.Există memorii ce conţin până la 64 Kbiţi de informaţie organizată în 8192 de cuvinte de câte 8 octeţi (8KB).Are nevoie de o singură sursă de tensiune de +5V şi este disponibilă într-un pachet de 28 de biţi, compatibilă cu memoria EPROM.Principalele caracteristici sunt indicate în tabel:

Configuraţia internă 8192 x 8 biţiTensiune de alimentare +5V

Consumator în mod activ 15 mW (1 Mhz)Consumator în stand-by 0.1 mW

Timp de acces 100 – 150 nsIntrări şi ieşiri TTL

Diagrama bloc şi configuraţia pinilor este indicată în figura de mai jos:

122

Page 123: Manual 1 Final

Temporizarea pentru citirea datelor, respectiv scrierea datelor este reprezentată în figurile de mai jos.

123

Page 124: Manual 1 Final

124

Page 125: Manual 1 Final

Interfaţarea memoriei cu microprocesorul 80386EX

Diagrama de conexiune a memoriei RAM 6264 cu microprocesorul 80386EX din interiorul modulului EV/Z3 este prezentată mai jos.

Din diagrama de mai sus putem deduce următoarele informaţii: Operaţiile de citire şi scriere din memoria RAM sunt realizate folosind

capacitatea maximă a magistralei: 16 biţi. Aşadar este nevoie de două memorii grupate.

Memoriile IC7 şi IC8 funcţionează în pereche pentru a acoperi adresele 00000H – 03FFFH, IC7 furnizând cel mai semnificativ octet, iar IC8 cel mai puţin semnificativ.

Memoriile IC9 şi IC10 funcţionează în pereche pentru a acoperi adresele 04000H – 07FFFH, IC9 furnizând cel mai semnificativ octet, iar IC10 cel mai puţin semnificativ.

Activarea memoriilor IC7-IC8 se face prin intermediul bitului de selecţie CS4# care este programat să acopere adresele de la 00000H – 03FFFH (16KB) şi să genereze semnalul intern READY.

Semnalul CS4# este pus într-o poartă SAU împreună cu semnalul BLE# pentru a genera semnalul CSB0# pentru a activa memoria RAM IC7, şi într-o poartă SAU cu BHE pentru a genera semnalul CSB1# pentru a activa memoria RAM IC8.

Activarea memoriilor IC9-IC10 se face prin intermediul bitului de selecţie CS1# care este programat să acopere adresele de la 04000H – 07FFFH (16KB) şi să genereze semnalul intern READY.

Semnalul CS1# este pus într-o poartă SAU împreună cu semnalul BLE# pentru a genera semnalul CSB2# pentru a activa memoria RAM

125

Page 126: Manual 1 Final

IC9, şi într-o poartă SAU cu BHE pentru a genera semnalul CSB3# pentru a activa memoria RAM IC10.

Pentru activarea acţiunii de scriere a memoriei trebuie activat pinul WE# al memoriei prin trimiterea unui semnal direct de la microprocesor prin pinul WR#.

Pentru activarea acţiunii de citire a memoriei trebuie activat pinul OE# al memoriei prin trimiterea unui semnal direct de la microprocesor prin pinul RD#.

Liniile de adresă A0 – A12 ale memoriei RAM sunt conectate la liniile de adresă A1 – A13 ale microprocesorului.

126

Page 127: Manual 1 Final

QUIZ

Setaţi toate comutatoarele în poziţia OFF

Dorim să realizăm un program pentru modulul Z3/EV care să testeze memoriile RAM M1H şi M1L. Acest program va trebuie să scrie datele în celule, apoi va trebui să le citească şi să le vizualizeze pe display, câte un octet pe rând, în mod continuu sau la o frecvenţă de timp dată.Se folosesc memoriile M1L şi M1H pentru că sunt goale. Programul este încărcat la adresa 00800 ce aparţine memoriilor M0L şi M0H. În caz contrar, scrierea datelor în RAM va distruge programul.Codul sursă al programului este următorul:

1 PAGE 70,1662 ;----------------------- PRG_RAM --------------------3 ;scrie codul AA în fiecare celulă RAM4 ;M1L şi M1H,apoi citeşte celulele şi vizualizează datele5 ;pe display, timp de 1 secundă fiecare6 = 0800 MEM_POS = 0800H7 = 0080 DS_SEG = 0080H8 = 0009 IDIS_BYTE = 09H ;întrerupere de afişare a unui octet9 = 000B IDIS_STR = 0BH ;întrerupere de afişare a unui şir de

caractere10 = 000D IWAIT_MS = 0DH ;întrerupere se aşteptare(ms)11 ;---------------------------------------- CODE12 ;programul este încărcat la adresa 0000:MEM_POS13 0000 CODE SEGMENT14 ASSUME CS:CODE, DS:CODE15 0000 ORG 0H16 0000 B8 0080 START: MOV AX,DS_SEG17 0003 8E D8 MOV DS,AX ;încarcă segmentul de date18 0005 BE 0034 R MOV SI,OFFSET MSG19 0008 CD 0B INT IDIS_STR ;afişează mesajul MSG20 000A B8 0400 MOV AX,0400H ;segment RAM21 000D 8E C0 MOV ES,AX22 000F BE 0000 MOV SI,0000H ;adresă RAM23 0012 B0 AA TLOOP: MOV AL,0AAH24 0014 26: 88 04 MOV ES:[SI],AL ;scrie date în RAM25 0017 26: 8A 04 MOV AL,ES:[SI] ;citeşte date din RAM26 001A B1 0C MOV CL,1227 001C CD 09 INT IDIS_BYTE ;afişează datele28 001E 8B C MOV AX,SI29 0020 8A C4 MOV AL,AH30 0022 B1 05 MOV CL,531 0024 CD 09 INT IDIS_BYTE ; afişează MSB din memorie32 0026 8B C6 MOV AX,SI33 0028 B1 07 MOV CL,734 002A CD 09 INT IDIS_BYTE ; afişează LSB din memorie35 002C B8 03E8 MOV AX,100036 002F CD 0D INT IWAIT_MS ;aşteaptă37 0031 46 INC SI ; incrementează adresa38 0032 EB DE JMP TLOOP3940 0034 52 41 4D 3A 20 78 MSG DB 'RAM: xxxx - xx ',00H41 78 78 78 20 2D 2042 78 78 20 20 004344 0045 CODE ENDS45 END START

Introduceţi programul în modulul EV/Z3 de la tastatură (în cazul utilizării unui PC folosiţi aplicaţia MODZ3 pentru transferul programului PRG_DA prin interfaţa serială sau paralelă, utilizând cablurile adecvate).

Daţi comanda: LD_KBSpecificaţi adresa de plecare: 0000:0800

127

Page 128: Manual 1 Final

Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

Q1 Care este adresa de început a memoriei RAM M1L, M1H?

SET

A B

1 5 0000:0000

2 1 04000

3 4 FFFFF

4 3 00000

5 2 F0000

Setaţi comutatorul S1 în poziţia ON

Q2 Afişarea octeţilor din memorie nu este corectă. Asta presupune faptul că se scrie o valoare în celulă şi se citeşte o altă valoare. Care este cauza acestei erori?

SET

A B

1 3 Magistrala de date a fost deconectată de la memorie.

2 4 Semnalele BLE# şi BHE# pentru selecţia a doi octeţi ai magistralei de 16 biţi nu sunt corecte.

3 5 Semnalul RD# nu ajunge corect la memorii.

4 1 Octeţii LSB şi MSB sunt interschimbaţi în timpul operaţiilor de citire

5 2 Semnalul de selecţie al RAM-ului (CS1#) nu este corectă.

Setaţi comutatorul S1 în poziţia OFF

Q3 Care sunt semnalele care servesc la activarea citirii celui mai semnificativ octet şi a celui mai puţin semnificativ octet al magistralei de 16 biţi ai microprocesorului?

SET

A B

1 4 Liniile A0, A1 ale adreselor

2 3 Liniile BLE# şi BHE#

3 2 Liniile RD# şi WR#

4 1 Diferitele conexiuni ale magistralei de adrese.

128

Page 129: Manual 1 Final

Q4 Câte linii de adresă sunt folosite pentru a citi datele din memoria RAM 6264?

SET

A B

1 4 13

2 3 14

3 2 15

4 1 16

Q5 Cum este semnalul READY generat, necesar microprocesorului pentru finalizarea operaţiilor de citire şi de scriere în memoria RAM?

SET

A B

1 4 În interiorul microprocesorului

2 3 Prin intermediul frontului pozitiv al semnalului CE# ce activează memoria

3 2 Prin intermediul semnalului W/R#

4 1 Prin intermediul celui mai semnificativ bit al adresei

129

Page 130: Manual 1 Final

LECŢIA 12: INTERFAŢA PARALELĂ

OBIECTIVE

Structura interfeţei paralele a modului Z3/EV Analiza controlerului 8255 Analiza modurilor de operare ale controlerului 8255 Analiza programării controlerului 82555 Utilizarea resurselor Monitorului Realizarea unor aplicaţii şi exerciţii

MATERIALE

Unitatea de bază pentru sistemele IPES (sursă de curent mod.PS1-PSU/, priză mod.MU/EV, unitate de management individual mod.SIS1/SIS2/SIS3)

Modul experimental mod.Z3/EV Osciloscop

Structura interfeţei paralele a modului Z3/EV

Interfaţa paralelă a modului EV/Z3 utilizează interfaţa periferică programabilă 8255.Este un dispozitiv de programare I/O, de uz general, proiectat pentru microprocesoarele de la Intel.Diagrama de utilizare este reprezentată în figura de mai jos.

Puteţi observa cum se poate conecta acest dispozitiv direct la magistrala microprocesorului şi deţine 3 porturi I/O de 8 biţi (portul A, portul B, portul C).

Liniile I/O sunt disponibile prin conectorul J1, pentru a face legătura modulului Z3 cu dispozitivele externe.

În următorul tabel sunt ilustrate resursele ce pot fi disponibile prin intermediul conectorului de ieşire:

Port UtilizarePort A, biţii A0 – A7 Disponibil pe pinii 15 – 22 ai conectorului J1.

Programabil ca intrare sau ieşire.Port B, biţii B0 – B7 Disponibil pe pinii 7 – 14 ai conectorului J1.

Programabil ca intrare sau ieşire.Port C, biţii C0 – C3 Disponibil pe pinii 5 – 3 – 23 – 25 ai conectorului J1.

Programabil ca intrare sau ieşire.Port C, bitul C4 Comandă buzzerul

Programabil la ieşire

130

Page 131: Manual 1 Final

Controlerul 8255

În figura de mai jos este reprezentată diagrama bloc a controlerului 8255.În partea dreaptă a magistralei se pot observa cele 24 de lini I/O.Porturile A şi B pot fi utilizate ca porturi de intrare sau ieşire pe 8 biţi.Portul C este împărţit în două secţiuni a câte 4 biţi, ce pot fi programaţi în mod independent ca intrare sau ca ieşire.În partea stângă a diagramei sunt prezentate liniile prin care se face conectarea controlerului la magistrala microprocesorului.Cele 8 linii de date permit scrierea/citirea de pe porturile I/O sau în regiştrii interni de control ai cotrolerului.Citirea se activează prin intermediul liniei RD#, iar scrierea se activează prin intermediul liniei WR#.Linia CS# (Chip Select) se utilizează pentru alegerea dispozitivului.

131

Page 132: Manual 1 Final

Liniile de adresă A0, A1 sunt folosite pentru adresarea porturilor interne A, B, C şi a regiştrilor de control.

Adresă A1

A0 Componentă internă

0310H 0 0 Port A0311H 0 1 Port B0312H 1 0 Port C0313H 1 1 Registrul de control

Semnalul de RESET se utilizează pentru reiniţializarea dispozitivului. După fiecare resetare, controlerul 8255 va avea porturile setate ca porturi de intrare, pentru a se evita eventualele conflicte cu dispozitivele periferice externe ce ar putea afecta funcţionarea componentei.

Modurile de operare ale controlerului 8255

Controlerul 8255 poate funcţiona în 3 moduri diferite, în funcţie de cerinţele conexiunii cu dispozitivele externe.

Modul 0Este utilizat atunci când porturile pentru operaţiile de intrare/ieşire sunt folosite independent.Aceasta este modalitatea folosită în modulul EV/Z3, întrucât aplicaţiile cu caracter industrial ce pot fi realizate conectând alte module prin intermediul conectorului J1, utilizează porturi de I/O simple.Diagrama de funcţionare a Modului 0 este reprezentată în figura de mai jos.

132

Page 133: Manual 1 Final

Porturile A şi B pot fi programate cu toţi cei 8 biţi luaţi ca intrări sau ca ieşiri. Portul C este împărţit în 2 grupări egale a câte 4 biţi fiecare ce pot fi programate independent.

Modul 1Este utilizat atunci când se doreşte ca porturile A şi B să fie utilizate ca intrări sau ieşiri legate între ele.Portul C este utilizat pentru a face legătura între porturile A şi B.

Modul 2Este utilizat atunci când se doreşte transfer bidirecţional cu legătură. Acest mod este funcţional doar pentru portul A.

Programarea controlerului 8255

Programarea controlerului 8255 se face prin intermediul a două cuvinte de control.Cuvântul de control pentru definirea modului are formatul prezentat în figura de mai jos.Cuvântul de control pentru Set/Reset se foloseşte pentru setarea bitului portului C şi activarea întreruperilor (nu sunt luate în considerare în acest caz).Sa presupunem că dorim să iniţializăm controlerul cu următoarele caracteristici:Portul A ca intrarePortul B ca ieşirePortul C (0 – 3) ca intrarePortul C (4 – 7) ca ieşire

Instrucţiunile folosite sunt următoarele:MOV AL, 00010001BMOV DX, 0313HOUT DX, AL

133

Page 134: Manual 1 Final

Utilizarea resurselor Monitorului

Aţi putut vedea mai sus cum se poate programa controlerul 8255.Acest mod de lucru poate fi simplificat utilizând întreruperile software ale monitorului de sistem, realizate special în acest scop.Monitorul de sistem conţine de fapt următoarele întreruperi software:

INT 10H: pentru utilizarea buzzerului INT 12H: programare, scriere, citire a datelor pe porturile A, B, C

INT 10HComandă buzzerul.Această întrerupere comandă emisiile de sunet ale buzzerului.Este posibil să se specifice frecvenţa şi durata sunetelor emise.

INTRARE BX = duratăCX = frecvenţă

IEŞIRE -Regiştrii

modificaţi-

INT 12HComandă interfaţa paralelă.Această întrerupere se ocupă cu controlul funcţionării interfeţei paralele.Controlerul 8255 este utilizat întotdeauna în modul 0.Funcţiile disponibile sunt determinate din conţinutul registrului AH

134

Page 135: Manual 1 Final

INTRARE AH = 0 Programarea porturilorAH = 1 Trimiterea datelor pe portul AAH = 2 Trimiterea datelor pe portul BAH = 3 Trimiterea datelor pe portul CAH = 4 Citirea datelor de pe portul AAH = 5 Citirea datelor de pe portul BAH = 6 Citirea datelor de pe portul C

IEŞIRE AL = datele cititeRegiştrii

modificaţi-

AH=0: Programarea porturilorConţinutul registrului AL determină direcţia (I/O) porturilor:

Registrul AL ProgramareBit 0 =0 : portul A este ieşire

=1 : portul A este intrareBit 1 =0 : portul B este ieşire

=1 : portul B este intrareBit 2 =0 : portul C (C0 – C3) este ieşire

=1 : portul C (C0 – C3) este intrare

AH=1, 2, 3: Trimiterea datelor pe porturile A, B, CConţinutul registrului AL conţine datele ce vor fi trimise pe porturi

AH=4, 5, 6: Citirea datelor de pe porturile A, B, CConţinutul registrului AL conţine datele citite de pe port.

135

Page 136: Manual 1 Final

QUIZ

Setaţi toate comutatoarele în poziţia OFF

Vom dori să realizăm un program pentru modulul EV/Z3 ce comandă în mod ciclic biţii de pe porturile A şi B, şi emite câte un beep la fiecare schimbare de stare.Codul sursă al programului este următorul:

1 PAGE 70,1662 ;--------------------- PRG_PAR ----------------------3 ; comandă în mod ciclic biţii de pe porturile A/B şi4 ; generează câte un beep la fiecare schimbare de stare5 = 0800 MEM_POS = 0800H6 = 0080 DS_SEG = 0080H7 = 000D IWAITMS = 0DH ;întrerupere de aşteptare8 = 0010 IBUZZER = 10H ;întrerupere a buzzerului9 = 0012 IPARAL = 12H ;întrerupere a portului paralel1011 ;---------------------------------------- CODE12 ;programul este încărcat la adresa 0000:MEM_POS13 0000 CODE SEGMENT14 ASSUME CS:CODE, DS:CODE15 0000 ORG 0H16 0000 B8 0080 START: MOV AX,DS_SEG17 0003 8E D8 MOV DS,AX ;încarcă segmentul de date18 0005 B4 00 MOV AH,00H19 0007 B0 00 MOV AL,00H20 0009 CD 12 INT IPARAL ;porturile de ieşire21 000B B3 01 MOV BL,00000001B ;datele de ieşire22 000D B4 01 LOOP1: MOV AH,123 000F 8A C3 MOV AL,BL24 0011 CD 12 INT IPARAL ;comandă portul A25 0013 B4 02 MOV AH,226 0015 8A C3 MOV AL,BL27 0017 CD 12 INT IPARAL ;comandă portul B28 0019 53 PUSH BX29 001A BB 0014 MOV BX,2030 001D B9 000A MOV CX,1031 0020 CD 10 INT IBUZZER ;beep32 0022 5B POP BX33 0023 B8 03E8 MOV AX,70034 0026 CD 0D INT IWAITMS35 0028 D0 E3 SHL BL,1 ;shiftează la stânga36 002A 80 FB 00 CMP BL,00H37 002D 75 DE JNZ LOOP138 002F B3 01 MOV BL,00000001B39 0031 EB DA JMP LOOP14041 0033 CODE ENDS42 END START

Introduceţi programul în modulul EV/Z3 de la tastatură (în cazul utilizării unui PC folosiţi aplicaţia MODZ3 pentru transferul programului PRG_PAR prin interfaţa serială sau paralelă, utilizând cablurile adecvate).

Daţi comanda: LD_KBSpecificaţi adresa de plecare: 0000:0800Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

136

Page 137: Manual 1 Final

137

Page 138: Manual 1 Final

Q1 Care este timpul total al ciclului de ardere al unui bit?

SET

A B

1 3 5s

2 5 1s

3 1 10s

4 2 20s

5 4 2s

Setaţi comutatorul S10 în poziţia ON

Q2 Se poate observa că unul dintre biţi nu este activat. Care este acel bit?

SET

A B

1 5 A5

2 4 B2

3 1 A7

4 2 A0

5 3 B0

Q3 Care este cauza acestei erori?

SET

A B

1 2 Magistrala de date nu este conectată în mod corect la cotrolerul 8255

2 3 Linia de ieşire A0 a controlerului 8255 este conectată la masă

3 4 Linia de ieşire A7 a controlerului 8255 este conectată la masă

4 5 Linia A0 este în scurtcircuit cu linia A1

5 1 Controlerul 8255 nu este programat corect.

Setaţi comutatorul S10 în poziţia OFFSetaţi comutatorul S12 în poziţia ON

138

Page 139: Manual 1 Final

Q4 Se poate observa că unul dintre biţi nu este activat. Care este acest bit?

SET

A B

1 3 B5

2 4 B2

3 1 A7

4 5 A0

5 2 B0

Q5 Care este cauza acestei erori?

SET

A B

1 2 Magistrala de date nu este conectată în mod corect la cotrolerul 8255

2 1 Linia de ieşire B5 a controlerului 8255 este conectată la masă

3 5 Linia de ieşire A6 a controlerului 8255 este conectată la masă

4 3 Linia B5 este în scurtcircuit cu linia B6

5 4 Controlerul 8255 nu este programat corect.

Setaţi comutatorul S12 în poziţia OFF

Q6 Care este rezultatul instrucţiunii PUSH BX în interiorul programului (instrucţiunea se utilizează o singură dată)

SET

A B

1 4 Încarcă BX cu o nouă valoare

2 3 Preia registrul BX ca parametru pentru întreruperea IBUZZER

3 2 Transferă registrul BX către un alt registru

4 1 Salvează temporar valoarea registrului BX

139

Page 140: Manual 1 Final

Q7 Care este cuvântul de 16 biţi care trebuie încărcat în registrul AX pentru a programa portul A ca intrare, portul B ca ieşire şi portul C C0-C3 ca intrare, prin intermediul întreruperii INT 12H?

SET

A B

1 2 00000000 00000101

2 1 00000001 00000101

3 4 00000000 00000010

4 3 00000001 00000010

140