Sunteți pe pagina 1din 151

SISTEMUL CU

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

1
INDEX
INDEX................................................................................................................................................................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
3
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
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 şi
magistrala 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
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
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 adrese
Este 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 memorie


16 64KB

7
20 1MB
24 16MB
Magistrala de adrese este unidirecţională: iese din microprocesor
şi merge spre dispozitivele de memorie şi porturi I / O.

Magistrala de date
Este 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 control
Constă î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 sale
caracteristici:

Microprocessoru Caracteristici
l
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ţi
68020 Microprocesor Motorola pe 32 biţi
32032 Microprocesor National pe 32 biţi
80486 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
Î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.

8086
Este 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).

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

80186
Este 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.

80286
Este 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.

80386
Este 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 mai
puternic.

80486
Este 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ă.

80386EX
Este 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
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-o
serie de acţiuni.

Figură 3
Unitatea de execuţie
Conţ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
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 principal
BX = Acumulator şi registru de bază
CX = Acumulator şi numărător
DX = 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 dimensiunea
de 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
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 asemenea
poate 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
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
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
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: Offset
Exemplu:
CS:IP
348A:4367

15
QUIZ
Q1 Cum sunt numite sistemele de microprocesoare utilizate în mod uzual în
aplicaţiile industriale?
SET
A B
1 4 Mainframe-uri
2 1 Minicomputere
3 3 PC-uri
4 2 Microcomputere

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


funcţionării?
SET
A B
1 2 Memorie EPROM
2 1 Memorie RAM
3 4 Porturile de intrare/ieşire
4 3 Magistrala

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


8086?
SET
A B
1 2 Regiştrii microprocesorului 8088 sunt pe 8 biţi, iar cei ai
microprocesorului 8086 sunt pe 16 biţi
2 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ţi
4 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 ?
SET
A B
1 3 Registrul IP
2 1 Registrul SP
3 4 Registrul AX
4 5 Registrul SI
5 2 Registrul BP

Q5 Câti biţi din cei ai adresei fizice utilizează procesorul 8086 pentru accesul la
memorie?
SET
A B
1 2 8 biţi
2 1 16 biţi
3 5 20 biţi
4 3 24 biţi
5 4 32 biţi

16
Q6 Într-o adresă de memorie specificată astfel 4AC2:6768, valoarea 4AC2
reprezintă ?
SET
A B
1 5 Offset-ul
2 4 Registrul AX
3 2 Registrul de segment
4 3 Registrul acumulator
5 1 Adresa fizică

Q7 Numele AL reprezintă?

SET
A B
1 3 Registrul acumulator
2 4 Cei mai semnificativi 8 biţi ai registrului acumulator
3 1 Cei mai puţin semnificativi 8 biţi ai registrului acumulator
4 2 Registrul de segment asociat acumulatorului

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


segment?
SET
A B
1 2 0000H
2 5 0001H
3 1 0010H
4 2 0100H
5 3 1000H

17
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 Codul de Câmpul de parametrii ai Câmpul de


titlu operaţie operaţiei comentarii
PRG: MOV AL,2FH ;încarcă 2FH în AL

18
Cele două instrucţiuni precedente pot fi scrise:

PRG: MOV AL,24H ;încarcă în AL numărul 24H


OUT 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
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
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ă
PUSH Copiază toţi regiştrii pe stivă (80186,..)
A
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

21
IDIV Împarte un word cu semn cu un octet sau un word dublu cu semn cu un word
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/SA Shiftează la stânga biţii unui octet/word şi pune 0 în MSB(bitul cel mai
L 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
REPE Prefixul instrucţiunii. Repetă instrucţiunea până când CX = 0 sau indicatorul de
REPZ condiţii zero(ZF) este≠1
REPNE Prefixul instrucţiunii. Repetă instrucţiunea până când CX = 0 sau indicatorul de
REPNZ condiţii zero(ZF) este≠1
MOVS Mută un octet sau un word de la un string la altul
MOVSB
MOVSW

22
COMPS Compară două stringuri de un octet sau două stringuri de un word.
COMPSB
COMPS
W
INS Preia datele de la un port dat printr-un string de un octet sau un word (80186, ..)
INSB
INSW
OUTS Trimitele datele către un port dat printr-un string de un octet sau word
OUTSB (80186, ..)
OUTSW
SCAS Scanează un string.
SCASB Compară un string de un octet cu octetul din AL sau un string de worduri cu un
SCASW word din AX
LODS Încarcă un octet al unui string în AL sau un word al unui string în AX
LODSB
LODSW
STOS Memorează un octet din AL sau un word din AX într-un string
STOSB
STOSW

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)

23
JS Sare dacă există semn (SF=1)
LOOP Urmăreşte o secvenţă de instrucţiuni până când CX=0
LOOPE Urmăreşte o secvenţă de instrucţiuni atâta timp cât ZF=1 şi CX≠0
LOOPZ
LOOPNE Urmăreşte o secvenţă de instrucţiuni atâta timp cât ZF=0 şi CX≠0
LOOPNZ
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)
LOC Instrucţiune prefix. Blochează posibilele procesoare externe
K
NOP Nicio operaţie

24
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
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
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:


W = 0 pentru octet

27
W = 1 pentru word

Regiştrii de 8 biţi Regiştrii de 16 biţi Cod


(Octet)(W=0) (Word)(W=1)
AL AX 000
BL BX 011
CL CX 001
DL DX 010
AH SP 100
BH DI 111
CH BP 101
DH SI 110
Regiştrii de
segment
CS 01
DS 11
ES 00
SS 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
 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

29
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).

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.

30
Câmpul MOD=00 pentru a reprezenta modul de ADRESARE DIRECTĂ.
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
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

32
Q2 Care din următoarele expresii codifică corect instrucţiunea
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
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
;----------------------------- 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:0000H
PROG SEGMENT
ASSUME CS:PROG, DS:PROG
START: 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:

01010101B
111111110000000B

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

MOV AL,15
MOV AH,110

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

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

24H
0A2H

Î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
Î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
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)

38
Verificarea funcţionării programului se realizează în mod direct în modulul Z3/EV.
Î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.

Structura standard, chiar daca nu este strict obligatorie, a unui program assembler este

Directivele din aceasta structura sunt descrise prin prisma exemplului urmator:

Program in limbaj de asamblare ce calculeaza valoarea expresiei e = a + b in care variabilele


au valori fixe:

Descriere program:

.model small : Liniile care incep cu “.“reprezinta instructiuni speciale care indica
programului assembler anumite informatii, descrise de cuvintele cheie ce urmeaza, cu
privire la programul de construit. in aceasta situatie model indica faptul ca urmeaza a se
indica modelul de memorie (si cantitatea de memorie) utilizat de program.

39
Acest program necesita un spatiu redus de memorie, fapt indicat prin small. Un model de
memorie specifica modul in care codul si datele sunt adresate, ori sunt in acelasi segment
fizic ori in mai multe segmente. Când toate datele (sau tot codul) se afla in acelasi segment
atunci elementele sunt adresate prin adrese near date de deplasarea lor (offset) fata de adresa
de inceput a segmentului.

Daca se utilizeaza mai multe segmente atunci elementele sunt adresate prin adrese far date
de adresa segmentului si offset. Tipuri standard de modele sunt: SMALL, MEDIUM,
COMPACT si LARGE.

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_model
Prin 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.

.DATA

40
Această 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.

.END : marcheaza sfârsitul fisierului sursa.

ATENTIE: Daca se specifica numele unei etichete definita anterior (de obicei inainte de
prima instructiune) atunci aceasta reprezinta adresa din CS la care porneste executia
programului.
De exemplu programul
...
.code
mov AX,@data
mov DS,AX
Start:
mov AL,a
add AL,b
mov e,AL
...
end Start

ruleaza incepând cu instructiunea mov AL,a.

Etichete

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 tip
Dacă 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 byte
alfaw 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

41
Forma generală pentru definirea unei proceduri este:
nume_proc PROC [FAR | NEAR]
……
RET
nume_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 de
revenire 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ă)

CALL nume_proc
CALL FAR PTR nume_proc
CALL 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ă)

RET
RETF
RETN

Î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)

42
JMP tinta
JMP SHORT PTR tinta
JMP NEAR PTR tinta
JMP 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

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.

43
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, s
MOV SI, DI
ADD SI, s_size
DEC SI ; indica catre locatia de memorie a ultimului caracter

MOV CX, s_size


SHR CX, 1 ; divide cu 2!

next_char:
MOV AL, [DI]
MOV BL, [SI]
CMP AL, BL
JNE not_Palindrome
INC DI
DEC SI
LOOP next_char

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

44
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, CS
MOV DS, AX

next_char:

CMP count, 0
JZ stop

; afisare caracter
MOV AL, c1
MOV AH, 0Eh
INT 10h

; urmatorul caracter
INC c1
DEC count

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

; oprire la orice eroare


JC stop

JMP next_char

45
stop:
RET

count DB 10
c1 DB 'A'

END

;----------------------------- PRG_PRIM -------------------------


;
; program care primeste un numar de la tastatura si verifica daca e prim

#make_COM#
ORG 100h

;***************************************************************
; AFISEAZA UN SIR DE CARACTERE CARE SE TERMINA PRIN ZERO
;***************************************************************

JMP skip_proc_print_string

PRINT_STRING PROC NEAR


PUSH AX ; SALVARE CONTEXT
PUSH SI ;

next_char:
MOV AL, [SI]
CMP AL, 0
JZ printed
INC SI
MOV AH, 0Eh ;
INT 10h
JMP next_char
printed:

POP SI ; REFACERE CONTEXT


POP AX ;

RET
PRINT_STRING ENDP

skip_proc_print_string:
;***************************************************************
; CITESTE UN STRING PANA LA ENTER (13,10) IN COD ASCII
;***************************************************************

46
JMP skip_proc_read_string

READ_STRING PROC NEAR


PUSH AX ; SALVARE CONTEXT
PUSH SI ;

wait_for_key:

; VERIFICA DACA S-A APASAT O TASTA


; AFECTEAZA FLAGUL ZF
MOV AH, 1
INT 16h
JNZ wait_for_key

; IA TASATA DIN BUFFER SI O PUNE IN AL:


;
MOV AH, 0
INT 16h

; print the key:


MOV AH, 0Eh
INT 10h
; APASA 'ENTER'13,10 PENTRU A MARCA SFARSITUL DE SIR:
CMP AL, 0Dh
JZ exit

; SALVAREA CODULUI ASCII AL CARACTERULUI:


MOV [SI], AL
INC SI

JMP wait_for_key
exit:
MOV [SI], 0

POP SI ; REFACERE CONTEXT


POP AX ;

RET
READ_STRING ENDP

skip_proc_read_string:
;***************************************************************
; CONVERTESTE UN SIR DE CARACTERE LA UN INTREG
;***************************************************************

JMP skip_proc_strtoint

STRTOINT PROC NEAR


PUSH CX ; SALVARE CONTEXT
PUSH SI ;

MOV AX, 0

47
MOV BX, 0

NEXT_DIGIT:
CMP [SI], 0
JZ ENDSTR
MOV BL, [SI]
ADD BL, -48
MOV CL, 10
MUL CL
ADD AX, BX
INC SI

JMP NEXT_DIGIT
ENDSTR:

POP SI ; REFACERE CONTEXT


POP CX ;

RET
STRTOINT ENDP

skip_proc_strtoint:
;***************************************************************
; CONVERTESTE UN STRING LA UN INTREG STOCAT IN AX
;***************************************************************

JMP skip_proc_prime

PRIME PROC NEAR


PUSH DX ; SALVARE CONTEXT
PUSH AX ;

CMP AX,2
JE ISNOTPRIME

MOV SI,AX
MOV CL,2
DIV CL
MOV BL,AL
MOV DL,2

bucla:
CMP DL,BL
JA ISPRIME
MOV CL,DL
MOV AX,SI
DIV CL
CMP AH,0
JE ISNOTPRIME
ADD DL,1
JMP bucla

48
ISPRIME:
LEA SI, msg_Prim
CALL print_string
JMP endprime

ISNOTPRIME:
LEA SI, msg_noPrim
CALL print_string
JMP endprime

ENDPRIME:

POP AX ; REFACERE CONTEXT


POP DX ;

RET
PRIME ENDP
skip_proc_prime:
;***************************************************************

; SECTIUNEA PRINCIPALA A PROGRAMULUI


LEA SI, msg1
CALL print_string

CALL read_string

CALL strtoint

CALL prime

LEA SI, msg_done


CALL print_string

RET

; DEFINIRE SIRURI

msg_done DB 13, 10, 'GATA.', 13, 10, 0


msg_Prim DB 13, 10, 'E PRIM.', 13, 10, 0
msg_noPrim DB 13, 10, 'NU E PRIM.', 13, 10, 0

msg1 DB 'n= ', 0

END

49
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 07H


DS_SEG 0080H
;---------------------------------------- DATA
DATA xxxxxxxxxxxx
DATA_1 xxxxxxxxxxxx
DATA_2 xxxxxxxxxxxx
xxxxxxxx ENDS
;---------------------------------------- CODE
;the program is charged to the address 0200:0000H
PROG SEGMENT
ASSUME xxxxxxxxxxxxxxxxxxx
START: MOV AX,xxxxx ; încarcă DS cu segemneul de date
MOV DS,AX
MOV xx,DATA_1 ; încarcă prima voloare
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

50
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

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


xxxxxxxx ENDS ?
SET
A B
1 2 ASSUME

51
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

52
4 5 DX
5 2 DS

53
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.

54
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.

55
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
 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.

56
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.

57
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

58
 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ă

59
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
PUSHF Copiază registrul EFLAGS pe stivă
D
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
Adunare
ADD Adună operanzii
ADC Adună cu transport
INC Incrementează cu 1 operandul
AAA Ajustare ASCII pentru adunare
DAA Ajustare zecimală pentru adunare
Scădere
SUB Scaderea operanzii
SBB Scadere ţinând cont şi de transport
DEC Decrementează cu 1 operandul
NEG Negarea biţilor operandului
CMP Compară operanzii
AAS Ajustare ASCII după scădere
DAS Ajustare zecimală după scădere
Înmulţire
MUL Înmulţire cu precizie simplă/dublă
IMUL Înmulţire
AAM Ajustare ASCII după înmulţire
Împărţire
DIV Împărţire fără semn
IDIV Împărţire
AAD Ajustare ASCII înainte de împărţire

60
Instrucţiuni pe şiruri de caractere
MOVS Mută stringuri de octeţi, word sau Dword
INS Preia un string de la un port I/O
OUTS Trimite un string către un port I/O
COMP Compară două şiruri de caractere de un octet, Word sau Dword
S
SCAS Scanează un string de un octet, Word sau Dword
LODS Încarcă un string de un octet, Word sau Dword
STOS Memorează un string de un octet, Word sau Dword
REP Repetiţie
REPE Repetă o intrucţiune până când CX=0 sau ZF ≠1
REPZ
REPNE Repetă o intrucţiune până când CX=0 sau ZF =1
REPNZ

Instrucţiuni logice
Logice
NOT ’NOT’ pe operanzi
AND ’ŞI’ pe operanzi
OR ’SAU’ pe operanzi
XOR ’SAU EXCLUSIV’ pe operanzi
TEST Testează operanzii
De shiftare
SHL/SHR Shiftare logică la stânga/dreapta
SAL/SAR Shiftare aritmetică la stânga/dreapta
SHLD/SHR Shiftare dublă la stânga/dreapta
D
De rotaţie
ROL/ROR Roteşte la stânga/dreapta
RCL/RCR Roteşte la stânga/dreapta cu carry

Instrucţiuni de manipulare la nivel de bit


Instrucţiuni de un singur bit
BT Testează un bit
BTS Testează şi setează un bit
BT Testează şi resetează un bit
R
BT Testează şi complementeză un bit
C
BSF Scanare directă a unui bit
BSR Scanare inversă a unui bit

Instrucţiuni de control al programului

61
Transfer condiţionat
SETCC Setează un octet egal cu codul condiţiei
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
JB/JNAE Sare dacă e mai mic/ Sare dacă nu e nici mai mare şi nici egal
JBE/JNA Sare dacă e mai mic sau egal/ Sare dacă nu e mai mare
JC Sare dacă CF=1
JE/JZ Sare dacă e egal/ Sare dacă ZF=1
JG/JNLE Sare dacă e mai mare/ Sare dacă nu 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 0 (ZF≠1)
JLE/JNG Sare dacă e mai mic sau egal/ Sare dacă nu e mai mare decât
JNC Sare dacă CF=0
JNE/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ţionat
CALL Apelare de procedură sau task
RET Revenire din procedură
JMP Salt
Control al interacţiunii
LOOP Urmează o secvenţă de instrucţiuni până când CX≠0
LOOPE Urmează o secvenţă de instrucţiuni până când ZF=0 şi CX≠0
LOOPZ
LOOPN Urmează o secvenţă de instrucţiuni până când ZF=1 şi CX≠0
E
LOOPN
Z
JCXZ Sare la adresa specificată dacă CX=0
Întreruperi
INT Întrerupere
INTO Întrerupe execuţia programului dacă OF=1
IRET Revine dintr-o întrerupere
CLI Dezactivează o întrerupere
STI Activeză o întrerupere

Instrucţiuni de nivel înalt


BOUND Verifică limitele unui vector
ENTER Setează paramatrii unei proceduri
LEAVE Iese dintr-o procedură

Înstrucţiuni din modul protected


SGDT Memorează tabela de descriptori globali
SIDT Memorează tabela de descriptori de întrerupere
STR Memorează registrul de taskuri
SLDT Memorează tabela de descriptori locali

62
LGDT Încarcă tabela de descriptori globali
LIDT Încarcă tabela de descriptori de întrerupere
LTR Încarcă registrul de taskuri
LLDT Încarcă tabela de descriptori locali
ARPL Nivelul de privilegiu Aggiusta Rethesed
LAR Încarcă drepturile de acces
LSL Încarcă limita de segment
VERR/VERW Verifică segmentul pentru scriere sau citire
LMSW Încarcă wordul ce conţine starea maşinii
SMSW Memorează wordul ce conţine starea maşinii

Instrucţiuni de control al procesorului


HLT Halt
WAIT Aşteaptă până când BUSY# este refuzat
ESC Escape
LOCK 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.

63
Î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.

Modul protected nu va fi analizat aici, datorită resurselor limitate disponibile de placa de


achiziţie Module Z3/EV.

64
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

65
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

66
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

67
 Spaţiu de adresare mare
- 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.

68
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.

ICU Este formată din două controllere cu întreruperi programabile 82C59A


Unitatea de control a configurate ca master/slave
întreruperilor
TCU Conţine 3 countere independente pe 16 biţi. Funcţionalitatea lor este
Unitatea de control a echivalentă cu cele 3 countere ale lui 82C54
timerului
SIO Conţine 2 unităţi UART asincrone, ce funcţionează ca şi NS16450. Fiecare
Unitatea serială canal conţine un generator, un receptor şi un transmiţător al ratei baud(baud-
asincronă de I/O rate) şi o unitate de control al modemului.
DMA Transferă datele interne sau externe între orice tip de memorie sau unităte I/O
Controler de acces printr-un spaţiu de adresare de 26 de biţi. Este compatibil cu controllerul
direct al memoriei 8237A.
SMM Oferă un mecanism pentru managementul de sistem prin intermediul unei
Modul de arhitecturi software combinată cu o arhitectură hardware. De asemenea
management de controlează o linie externă SMI# ce poate genera întreruperi transparente
sistem către sistemul de operare.
Ceasul şi unitatea de O sursă externă trebuie să se ocupe cu sincronizarea semnalelor de ceas ale
management a sursei microprocesorului, care apoi sunt trimise catre nucleul de bază şi către
de alimentare perifericele integrate. Unitatea de management a sursei de alimentare oferă
posibilitatea de a opri microprocesorul pentru a reduce consumul de curent.
SSIO Oferă un canal I/O bidirecţional, sincron şi de mare viteză. Conţine un canal
Unitatea serială de transmisie, unul pentru recepţie şi un generator al ratei de baud.
sincronă I/O
CSU Această unitate programabilă pe 8 canale oferă acces direct către 8 unităţi

69
Unitatea de selecţie a externe. Fiecare canal poate opera pe 8 sau 16 biţi şi poate genera până la 31
chipului de stări de aşteptare.
RCU Oferă posibilitatea regenerării periodice a adreselor de memorie. Este
Unitate de control al utilizată în sisteme cu memorie dinamică RAM.
regenerării memoriei
Porturile paralel de Oferă 3 porturi programabile de I/O. Pinii de ieşire ai porturilor de I/O sunt
I/O multiplexaţi împreună cu alte funcţii.
WDT Atunci când e activată, această unitate funcţionează ca un timer de uz general
Unitatea de watchdog pe 32 de biţi.
JTAG Prin intermediul acestei unităţi se uşurează testarea componentelor.
Unitatea de testare Rezultatele sunt în conformitate cu standardul IEEE.
logică

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):

Semnal Descriere
A25: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# Pin de activare a octetului: indică care octet al magistralei de adrese este transferat.
BLE# 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# Semnale pentru definirea ciclurilor de magistrală. Definesc tipul curent de ciclu.
D/C# Puteţi vedea următorul tabel.
W/R#
REFRESH#
NA# Următoarea adresă: utilizat în pipelining
RD# 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ă

70
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 întreruperi
0 0 1 1 Nu se întâmplă niciodată
0 1 0 1 Ciclu de citire I/O
0 1 1 1 Ciclu de scriere I/O
1 0 0 1 Citirea codului din memorie
1 0 1 1 Întreruperea sau oprirea unui ciclu
1 1 0 0 Ciclu de refresh
1 1 0 1 Ciclu de citire din memorie
1 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.


Î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.

71
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.

72
Î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.
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.

73
Pipeline

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.

74
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.

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).

75
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 1 1
0 1
i F F F F F
1 2 3 4 5
i+1 F F F F F
1 2 3 4 5
i+2 F F F F F
1 2 3 4 5
i+3 F F F F F
1 2 3 4 5
i+4 F F F F F
1 2 3 4 5
i+5 F F F F F
1 2 3 4 5
i+6 F F F F F
1 2 3 4 5
Pipeline-ul îmbunatateşte performanta prin creşterea productivitatii instructiunilor, nu prin
micşorarea timpului de executie al unei instructiuni individuale.

Observatii:

76
 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.

77
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.

78
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.

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).

79
80
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#

81
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

82
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ştrilor
o Execuţie continuă, pas cu pas, cu întreruperi de program
o Încărcarea programelor de la PC

Unităţile componente

83
Modulul experimental MOD Z3/EV este o placă pe care sunt integrate toate
componentele.
Î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 Adresa de Adresa de Dimensiune Ready Stări de


I/O început final aşteptare
UCS EPROM S MEM F8000 FFFFF 8 biţi Intern 8
CS0 EPROM U MEM F0000 F7FFF 8 biţi Intern 16
CS1 RAM2 MEM 04000 07FFF 16 biţi Intern 2
CS2 Componente I/O 00300 0037F 8 biţi Intern 31
I/O
CS3 Liber
CS4 RAM1 MEM 00000 03FFF 16 biţi Intern 2
CS5 Liber
CS6 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 Componente
300 – Convertor digital/analogic
30F
310 – Interfaţă paralelă
31F
320 – Tastatură
32F
330 – Interfaţă serială
33F
340 – Convertor analogic/digital

84
34F
350 – Display cu cristale lichide
35F
360 – Liber
36F
370 – Liber
37F

Unitatea de memorie
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 FFFFF
EPROM utilizator IC6 F0000 F7FFF
32KB
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ă.

85
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.
Primeşte comenzile şi datele direct de la magistrala de date şi utilizează
următoarele linii de adresă:
Adresă Funcţie
hexazecimală
350 Scrierea de coduri
351 Scrierea de date
352 Citirea stării
353 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 COL COL3 COL4


(32E) 2 (32B) (327)
(32D)
Riga Buton Buton Buton Buton
1 N.17 N.18 N.19 RESET
(D0)
Riga Buton Buton Buton Buton
2 N.13 N.14 N.15 N.16
(D1)
Riga Buton Buton Buton Buton
3 N.9 N.10 N.11 N.12
(D2)
Riga Buton Buton Buton Buton
4 N.5 N.6 N.7 N.8
(D3)

86
Riga Buton Buton Buton Buton
5 N.1 N.2 N.3 N.4
(D4)
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


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ă

87
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.

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ŢIE
MEM Analizează/Modifică conţinutul memoriei
REG Analizează/Modifică conţinutul regiştrilor generali
SEG 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 paralele
LS_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 liber
BR Controlează întreruperile
CB Anulează întreruperea de afişare
INC Incrementează adresa de memorie, registrul sau întreruperea de afişare
DEC Decrementează adresa de memorie, registrul sau întreruperea de afişare
FIRST Vizualizează prima adresă de memorie, registru sau întrerupere

88
LAST Vizualizează ultima adresă de memorie, registru sau întrerupere
CHG/RE Face trecerea în modul modificare (CHG) sau încheie sesiunea de modificare(RET) şi
T 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 Numele Descriere


întreruperii rutinei
INT 00H IMONITOR Împărţire la 0. Revine la Monitor
INT 01H Rezervată Se execută un pas
INT 02H Neutilizată Întrerupere nemascabilă
INT 03H Rezervată Breakpoint
INT 04H Neutilizată Depăşire
INT 05H Neutilizată
INT 06H Neutilizată
INT 07H IMONITOR Sfârşitul programului utilizator şi revenire la Monitor
INT 08H IKEYBOARD Citirea valorii unei taste
INT 09H IDIS_BYTE Afişarea unui octet hexazecimal
INT 0AH IDIS_CHAR Afişarea unui caracter ASCII
INT 0BH IDIS_OUTS Afişarea unui şir de caractere pe ecran
INT 0CH IDIS_CODE Trimite comenzi către display
INT 0DH IWAIT_MS Aşteaptă x milisecunde
INT 0EH IAD_READ Citeşte de la convertorul A/D
INT 0FH IDA_WRITE Comandă convertorul D/A
INT 10H IBUZZER Comandă buzzerul
INT 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 07H
Sfârşitul programului
Această î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.

89
INTRĂRI Nu
IEŞIRI Nu
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_JUMP.

INT 08H
Citirea 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 Nu
IEŞIRI AL = codul tastei (0 – 18)
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_KB.

INT 09H
Trimite 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 Nu
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_KB.

INT 0AH
Trimite 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 Nu
Regiştrii Nu

90
modificaţi

INT 0BH
Trimite 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 caractere
SI = indică adresa de început a şirului de
caractere, în interiorul segmentului DS
IEŞIRI Nu
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_KB.

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

INTRĂRI AH = 1 Anulează afişarea


AH = 2 Poziţionează cursorul pe prima poziţie
AH = 3 Mută cursorul la dreapta
AH = 4 Mută cursorul la stânga
AH = 5 Activează cursorul
AH = 6 Dezactivează cursorul
AH = 7 Aduce cursorul în poziţia conţinută de
registrul AL.
IEŞIRI Nu
Regiştrii Nu
modificaţi

INT 0DH
Aş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 milisecunde


IEŞIRI Nu
Regiştrii Nu
modificaţi

91
Puteţi urmări exemplul PRG_PAR.

INT 0EH
Citeş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 Nu
IEŞIRI AL = rezultatul conversiei
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_AD.

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

INTRĂRI AL = date
IEŞIRI Nu
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_DA.

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

INTRĂRI BX = durata
CX = frecvenţa
IEŞIRI Nu
Regiştrii Nu
modificaţi
Puteţi urmări exemplul PRG_PAR.

INT 12H
Managementul 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).
92
Funcţiile acestei întreruperi pot fi identificate în funcţie de conţinutul
registrului AH.

INTRĂRI AH = 0 Porturi de programare


AH = 1 Trimite date pe portul A
AH = 2 Trimite date pe portul B
AH = 3 Trimite date pe portul C
AH = 4 Citeşte date de pe portul A
AH = 5 Citeşte date de pe portul B
AH = 6 Citeşte date de pe portul C
IEŞIRI AL = datele citite
Regiştrii Nu
modificaţi
AH = 0: Porturile programabile
Conţinutul registrului AL determină direcţia de transmitere a datelor pe
porturi:

Registrul AL Programare
Bitul 0 = 0 : portul A ca ieşire
= 1 : portul A ca intrare
Bitul 1 = 0 : portul B ca ieşire
= 1 : portul B ca intrare
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, C
Conţinutul registrului AL determină datele ce trebuiesc trimise pe porturi.

AH = 4, 5, 6 : Citeşte date de la porturile A, B, C


Conţinutul registrului AL la ieşire corespunde datelor citite de pe port.

Puteţi vedea exemplul PRG_PAR.

INT 14H
Managementul 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ţializare
AH = 1 Trimite un caracter
AH = 2 Primeşte un caracter
AH = 3 Citeşte starea
AH = 4 Controlează modemul
AH = 0 : Iniţializează portului de comunicaţie
Conţinutul registrului AL determină parametrii de iniţializare:

Registrul AL Programare

93
Biţ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 caracter
Conţinutul registrului AL conţine caracterul ce trebuie trimis.
Înainte de trimiterea unui caracter, rutina aşteaptă trimiterea eventualelor
caractere rămase de trimis.

AH = 2 : Recepţia unui caracter


Conţinutul registrului AL conţine caracterul primit.
Rutina aşteaptă disponibilitatea unui caracter înainte de reveni la programul
apelat.

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

Registrul Starea modemului


AH
Bitul 7 Detectarea semnalului recepţionat
Bitul 6 Indicatorul de inel
Bitul 5 Pregăteşte setul de date
Bitul 4 Şterge pentru trimitere
Bitul 3 Detectarea semnalului delta de recepţie
Bitul 2 Frontul pozitiv al detectorului de inel
Bitul 1 Pregăteşte setul de date delta
Bitul 0 Şterge delta pentru trimitere
Registrul AL Starea liniei
Bitul 7 Time-out
Bitul 6 Golirea registrului de shiftare a transmisiei
Bitul 5 Golirea registrului de menţinere a transmisiei
Bitul 4 Detectarea întreruperii
Bitul 3 Eroare de cadru
Bitul 2 Eroare de paritate
Bitul 1 Eroare de depăşire
Bitul 0 Datele sunt pregătite

AH = 4 : Controlul modemului

94
Conţinutul registrului AH conţine starea curentă a modemului, ce urmează a fi
modificată.

Registrul AL Starea modemului


Bitul 7 0
Bitul 6 0
Bitul 5 0
Bitul 4 Salt
Bitul 3 Ieşire 2
Bitul 2 Ieşire 1
Bitul 1 Necesitate de trimitere (RTS)
Bitul 0 Terminal de date pregătit
(DTR)
Puteţi vedea programele PRG_TX şi PRG_RX.

95
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

96
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.

97
Setaţi comutatorul S2 în poziţia ON

98
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

99
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)

100
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 …

101
Salt necondiţionat
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ţiun Condiţie Salt în cazul în care


e
JA/JNBE (CF or ZF)=0 Mai mare/Nu e mai mic sau egal
JAE/JNB CF=0 Mai mare sau egal/Nu e mai mic
JB/JNAE CF=1 Mai mic/Nu e mai mare sau egal
JBE/JNA (CF or ZF)=1 Mai mic sau egal/Nu e mai mare
JC CF=1 Transport
JE/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 mic
JL/JNGE (SF xor OF)=1 Mai mic/Nu e mai mare sau egal
JLE/JNG ((SF xor OF) or ZF)=1 Mai mic sau egal/Nu e mai mare
JNC CF=0 Fără transport
JNE/JNZ ZF=0 Nu e egal/Nu e 0
JNO OF=0 Nu e depăşire
JNP/JPO PF=0 Imparitate
JNS SF=0 Nu e semn
JO OF=0 Depăşire
JP/JPE PF=1 Paritate
JS 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,BX
JNE CONT
ADD 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.

102
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 CALL
Atunci 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 RET
Instrucţ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ţiuni
CALL ADUNARE
Instrucţiuni
CALL ADUNARE
ADUNARE: instrucţiuni
RET

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.

103
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,AX
MOV AX,0FFFH ;valorea pointerului de stivă.
MOV SP,AX

Instrucţiunile POP şi PUSH


Deseori 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:

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

105
QUIZ
Setaţi toate comutatoarele în poziţia OFF

Utilizarea instrucţiunile de salt condiţionat


Vom 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,166
2 ;---------------- PRG_JUMP -------------------------
3 ;acest program urmează o serie de cicluri
4 ;pentru a determina un timp de aşteptare de câteva
5 ;secunde, iar apoi cedează controlul monitorului
6 = 0007 IMONITOR EQU 07H
7
8 ;---------------------------------------- CODE
9 ;program încărcat la adresa 0000:MEM_POS
10
11 0000 PROG SEGMENT
12 ASSUME CS:PROG, DS:PROG
13
14 0000 B8 1000 START: MOV AX,1000 ;încarcă counterul AX
15
16 0003 B9 0108 LOOP2: MOV CX,108 ;încarcă counterul CX
17 0006 49 LOOP1: DEC CX ;
18 0007 83 F9 00 CMP CX,0000H ;
19 000A 75 FA JNZ LOOP1 ;
20 000C 48 DEC AX
21 000D 3D 0000 CMP AX,0000H
22 0010 75 F1 JNZ LOOP2
23
24 0012 CD 07 INT IMONITOR ;revine la monitor
25
26 0014 PROG ENDS
27 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_KB
Specificaţi adresa de plecare: 0000:0800
Întroduceţi codul generat de program: B8, 10, 27, B9, 6C, 00,....., 07
Rulaţ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

106
3 1 10 secunde
4 2 15 secunde
5 3 20 secunde
Utilizarea procedurilor
Dorim 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,166
2 ;-------------------------- PRG_CALL ---------------
3 ;sunt emise 3 bipuri de la buzzer la
4 ;intervale fixe de timp.
5 ;Se va folosi o procedură ce va fi apelată de 2 ori
6 ;pentru a obţine intervalele de timp dorite.
7 = 0007 IMONITOR EQU 07H
8 = 0010 IBUZZER EQU 10H
9 = 0012 IPARAL EQU 12H
10
11 ;---------------------------------------- CODE
12 ;programul se încarcă la adresa 0000:0800H
13
14 0000 PROG SEGMENT
15 ASSUME CS:PROG, DS:PROG
16
17 0000 B4 00 START: MOV AH,00H
18 0002 B0 00 MOV AL,00H
19 0004 CD 12 INT IPARAL ;portul de ieşire şi enable-ul acestuia
20 0006 BB 00C8 MOV BX,200 ;durata beepului
21 0009 B9 0014 MOV CX,20 ;frecvenţa beepului
22 000C CD 10 INT IBUZZER ;--------------- BEEP1
23 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 ;--------------- BEEP2
27 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 ;--------------- BEEP3
31
32 0024 CD 07 INT IMONITOR ;revenire la monitor
33
34 ;procedură de aşteptare
35 0026 ATT PROC NEAR
36 0026 50 PUSH AX ;salvează regiştrii folosiţi
37 0027 51 PUSH CX
38 0028 B8 03E8 MOV AX,1000 ;încarcă counterul AX
39 002B B9 0064 LOOP2: MOV CX,100 ;încarcă counterul CX
40 002E 49 LOOP1: DEC CX ;loop
41 002F 83 F9 00 CMP CX,0000H ;
42 0032 75 FA JNZ LOOP1 ;
43 0034 48 DEC AX
44 0035 3D 0000 CMP AX,0000H
45 0038 75 F1 JNZ LOOP2
46 003A 59 POP CX ;resetează regiştrii
47 003B 58 POP AX
48 003C C3 RET
49 003D ATT ENDP
50 003D PROG ENDS
51 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.

107
Inseraţi acest program în modulul Z3/EV de la tastatură.
Daţi următoarea comandă: LD_KB
Specificaţi adresa de început: 0000:0800
Inseraţ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

108
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.

109
 Resetează indicatorul de condiţii TF în registrul indicatorilor de
condiţii
 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)

110
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.

111
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ă
NMI
INTR
Single-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.

112
Numărul Numele rutinei Descriere generală
instrucţiunii
INT 00H IMONITOR Împărţire la 0. Revine la monitor
INT 01H Rezervată Single-step
INT 02H Neutilizată Întrerupere nemascabilă
INT 03H Rezervată Punct de întrerupere(Breakpoint)
INT 04H Neutilizată Depăşire
INT 05H Neutilizată
INT 06H Neutilizată
INT 07H IMONITOR Încheie programul utilizatorului şi revine la
monitor
INT 08H IKEYBOARD Citeşte o tastă de la tastatură
INT 09H IDIS_BYTE Trimite un octet hexazecimal către afişaj
INT 0AH IDIS_CHAR Trimite un caracter ASCII către afişaj
INT 0BH IDIS_OUTS Trimite un şir de caractere către afişaj
INT 0CH IDIS_CODE Trimite comenzi către afişaj
INT 0DH IWAIT_MS Aşteaptă un număr de milisecunde
INT 0EH IAD_READ Citeşte de la converterul A/D
INT 0FH IDA_WRITE Comandă converterul A/D
INT 10H IBUZZER Comandă buzzerul
INT 11H Neutilizată
INT 12H IPARAL Comandă interfaţa paralel
INT 13H Neutilizată
INT 14H ISERIAL Comandă interfaţa serială

113
QUIZ
Setaţi toate swichurile în poziţia OFF

Utilizarea instrucţiunilor software


Dorim 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,166
2 ;------------------ PRG_KB ------------------------
3 ;citirea unei taste de la tastatură
4 ;şi afişaţi codul tastei pe display
5 PAGE 70,166
6 = 0800 MEM_POS = 0800H
7 = 0080 DS_SEG = 0080H
8 = 0008 IKEYBOARD = 08H ;întrerupere citire tastă
9 = 0009 IDIS_BYTE = 09H ;întrerupere afişare octet
10 = 000B IDIS_STR = 0BH ; întrerupere afişare string
11
12 ;---------------------------------------- CODE
13 ;programul se încarcă la adresa 0000:MEM_POS
14 0000 CODE SEGMENT
15 ASSUME CS:CODE, DS:CODE
16 0000 ORG 0H
17 0000 B8 0080 START: MOV AX,DS_SEG
18 0003 8E D8 MOV DS,AX ;încarcă segmentul de date
19 0005 BE 0012 R MOV SI,OFFSET MSG
20 0008 CD 0B INT IDIS_STR ;afişează mesajul MSG
21 000A CD 08 TLOOP: INT IKEYBOARD ;citeşte de la tastatură
22 000C B1 0D MOV CL,13
23 000E CD 09 INT IDIS_BYTE ;afişează codul instrucţiunii
24 0010 EB F8 JMP TLOOP
25
26 0012 4B 42 2C 20 68 65 MSG DB 'KB, hex key: xx ',00H
27 78 20 6B 65 79 3A
28 20 78 78 20 00
29
30 0023 CODE ENDS
31 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_KB


Specificaţi adresa de plecare: 0000:0800
Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.
Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

114
Q1 Care este efectul instrucţiunii MOV SI, OFFSET MSG de pe linia 18 din primul
program?
SET
A B
1 5 Încarcă în SI şirul de caractere MSG reţinut în DS
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 primul 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.

115
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
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.

116
In continuare dorim să realizăm un program pentru modulul Z3/EV ce afiseaza
temporizat mesaje pe display urmate de un beep de o anumita perioada si
frecventa.
Codul sursă al programului este următorul:
PAGE 70,166
;------------------ PRG_KB ------------------------
;citirea unei taste de la tastatură
;şi afişaţi codul tastei pe display
PAGE 70,166
MEM_POS = 0800H
DS_SEG = 0080H
IWAIT = 0DH ;intreruperede asteptare in milisecunde
IDIS_STR = 0BH ; întrerupere afişare string
;---------------------------------------- CODE
;programul se încarcă la adresa 0000:MEM_POS
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H
START: MOV AX,DS_SEG
MOV DS,AX ;încarcă segmentul de date
TLOOP:
MOV SI,OFFSET MSG0
INT IDIS_STR ;afişează mesajul MSG
INT IKEYBOARD ;citeşte de la tastatură
MOV AX,1000;
INT IWAIT;delay
MOV AH,00H
MOV AL,00H
INT 12H ; semnal de Enable pentru portul paralel
MOV BX,100;perioada
MOV CX,200;frecventa
INT 10H;intrerupere buzzer
MOV SI,OFFSET MSG1
INT IDIS_STR ;afişează mesajul MSG
INT IKEYBOARD ;citeşte de la tastatură
MOV AX,1000;
INT IWAIT;delay
MOV AH,00H
MOV AL,00H
INT 12H ; semnal de Enable pentru portul paralel
MOV BX,100;perioada
MOV CX,200;frecventa
INT 10H;intrerupere buzzer
MOV SI,OFFSET MSG2
INT IDIS_STR ;afişează mesajul MSG
INT IKEYBOARD ;citeşte de la tastatură
MOV AX,1000;
INT IWAIT;delay
MOV AH,00H
MOV AL,00H
INT 12H ; semnal de Enable pentru portul paralel
MOV BX,100;perioada
MOV CX,200;frecventa
INT 10H;intrerupere buzzer

JMP TLOOP

MSG0 DB 'Elettronica ',00H


MSG1 DB 'Vendetta ',00H
MSG2 DB 'SMP ',00H

CODE ENDS
END START;

117
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).

118
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.

119
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ţi


Sursă +5V
Consumator în modul activ 25 mW (1MHz)
Consumator în modul stand-by 5µW
Timp de acces 100-150 ns
Tensiune de programare +12.5 VDC
Intrări şi ieşiri TTL

120
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.

121
Î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)

122
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,166
2 ;----------------------- PRG_EP2 --------------------
3 ;afişează conţinutul memoriei USER EPROM
4 ;câte un octet odată, timp de o secundă
5 = 0800 MEM_POS = 0800H
6 = 0080 DS_SEG = 0080H
7 = 0009 IDIS_BYTE = 09H ;întrerupere de afişare a unui octet
8 = 000B IDIS_STR = 0BH ;întrerupere de afişare a unui şir de caractere
9 = 000D IWAIT_MS = 0DH ;întrerupere de aşteptare(ms)
10 ;---------------------------------------- CODE
11 ;programul este încărcat la adresa 0000:MEM_POS
12 0000 CODE SEGMENT
13 ASSUME CS:CODE, DS:CODE
14 0000 ORG 0H
15 0000 B8 0080 START: MOV AX,DS_SEG
16 0003 8E D8 MOV DS,AX ;încarcă segmentul de date
17 0005 BE 002F R MOV SI,OFFSET MSG
18 0008 CD 0B INT IDIS_STR ;afişarea mesajului MSG
19 000A B8 F000 MOV AX,0F000H ;segment USER EPROM
20 000D 8E C0 MOV ES,AX
21 000F BE 0000 MOV SI,0000H ;adresa USER EPROM
22 0012 26: 8A 04 TLOOP: MOV AL,ES:[SI] ;citeşte date USER EPROM
23 0015 B1 0C MOV CL,12
24 0017 CD 09 INT IDIS_BYTE ;afişarea datelor
25 0019 8B C6 MOV AX,SI
26 001B 8A C4 MOV AL,AH
27 001D B1 05 MOV CL,5
28 001F CD 09 INT IDIS_BYTE ;afişarea MSB al adresei
29 0021 8B C6 MOV AX,SI
30 0023 B1 07 MOV CL,7
31 0025 CD 09 INT IDIS_BYTE ;afişarea LSB al adresei
32 0027 B8 03E8 MOV AX,1000
33 002A CD 0D INT IWAIT_MS ;aşteaptă
34 002C 46 INC SI ;incrementează adresa
35 002D EB E3 JMP TLOOP
36
37 002F 41 64 64 3A 20 78 MSG DB 'Add: xxxx - xx ',00H
38 78 78 78 20 2D 20
39 78 78 20 20 00
40
41 0040 CODE ENDS
42 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_KB
Specificaţi adresa de început: 0000:0800
Inseraţi codurile programului din lista de mai sus.
Daţi comanda GO 0080:0000 (sau RUN) pentru execuţia programului.

123
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 comandand buzzerul la fiecare afisare de octet.

Verificaţi dacă în spaţiul rezervat memoriei USER EPROM există


inserată o memoriei EPROM.

Codul sursă al programului este următorul:


PAGE 70,166
;----------------------- PRG_EP2 --------------------
;afişează conţinutul memoriei USER EPROM
;câte un octet odată, timp de o secundă
MEM_POS = 0800H
DS_SEG = 0080H
IDIS_BYTE = 09H ;întrerupere de afişare a unui octet
IDIS_STR = 0BH ;întrerupere de afişare a unui şir de caractere
IWAIT_MS = 0DH ;întrerupere de aşteptare(ms)
;---------------------------------------- CODE
;programul este încărcat la adresa 0000:MEM_POS
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H
START: MOV AX,DS_SEG
MOV DS,AX ;încarcă segmentul de date
MOV SI,OFFSET MSG
INT IDIS_STR ;afişarea mesajului MSG
MOV AX,0F000H ;segment USER EPROM
MOV ES,AX
MOV SI,0000H ;adresa USER EPROM
TLOOP:
MOV AL,ES:[SI] ;citeşte date USER EPROM
MOV CL,12
INT IDIS_BYTE ;afişarea datelor
MOV AX,SI
MOV AL,AH
MOV CL,5
INT IDIS_BYTE ;afişarea MSB al adresei
MOV AX,SI
MOV CL,7
INT IDIS_BYTE ;afişarea LSB al adresei
MOV AX,1000
INT IWAIT_MS ;aşteaptă
PUSH SI
MOV AH,00H
MOV AL,00H
INT 12H ;semnal de chip select pentru portul paralel
MOV BX,100;perioada
MOV CX,200;frecventa
INT 10H;beep
POP SI
INC SI ;incrementează adresa
JMP TLOOP

MSG DB 'Add: xxxx - xx ',00H

CODE ENDS
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).

124
Daţi comanda: LD_KB
Specificaţi adresa de început: 0000:0800
Inseraţi codurile programului din lista de mai sus.
Daţi comanda GO 0080:0000 (sau RUN) pentru execuţia programului.

125
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

126
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

127
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 memorie


Memoriile 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ă

128
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.

129
Î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ţi


Tensiune de alimentare +5V
Consumator în mod 15 mW (1 Mhz)
activ
Consumator în stand-by 0.1 mW
Timp de acces 100 – 150 ns
Intrări şi ieşiri TTL
Diagrama bloc şi configuraţia pinilor este indicată în figura de mai jos:

130
Temporizarea pentru citirea datelor, respectiv scrierea datelor este reprezentată
în figurile de mai jos.

131
132
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

133
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.

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ă , si apoi sa astepte
introducerea unei taste de la tastatura matriceala a placutei EV/Z3 urmata de o
comanda a buzzerului in functie de tasta citita.

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:
PAGE 70,166
;----------------------- PRG_RAM --------------------
;scrie codul AA în fiecare celulă RAM
;M1L şi M1H,apoi citeşte celulele şi vizualizează datele
;pe display, timp de 1 secundă fiecare
MEM_POS = 0800H
DS_SEG = 0080H
IDIS_BYTE = 09H ;întrerupere de afişare a unui octet
IDIS_STR = 0BH ;întrerupere de afişare a unui şir de caractere
IWAIT_MS = 0DH ;întrerupere se aşteptare(ms)
;---------------------------------------- CODE
;programul este încărcat la adresa 0000:MEM_POS
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H
START:
MOV AX,DS_SEG
MOV DS,AX ;încarcă segmentul de date
MOV SI,OFFSET MSG
INT IDIS_STR ;afişează mesajul MSG
MOV AX,0400H ;segment RAM
MOV ES,AX
MOV SI,0000H ;adresă RAM
TLOOP: MOV AL,0AAH
MOV ES:[SI],AL ;scrie date în RAM
MOV AL,ES:[SI] ;citeşte date din RAM
MOV CL,12
INT IDIS_BYTE ;afişează datele
MOV AX,SI
MOV AL,AH
MOV CL,5
INT IDIS_BYTE ; afişează MSB din memorie
MOV AX,SI
MOV CL,7
INT IDIS_BYTE ; afişează LSB din memorie
MOV AX,1000
INT IWAIT_MS ;aşteaptă
MOV AH,00H

134
MOV AL,00H
INT 12H;enable-ul portului paralel
INT 08H;citire tasta cu OUTPUT in AL
MOV BH,00H
MOV BL,00H
ADD BL,AL;perioada este o functie liniara de tasta introdusa
MOV CX,100
INT 10H;comanda buzzer
INC SI ; incrementează adresa
JMP TLOOP

MSG DB 'RAM: xxxx - xx ',00H

CODE ENDS
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_KB


Specificaţi adresa de plecare: 0000:0800
Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.
Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

135
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,166
2 ;----------------------- PRG_RAM --------------------
3 ;scrie codul AA în fiecare celulă RAM
4 ;M1L şi M1H,apoi citeşte celulele şi vizualizează datele
5 ;pe display, timp de 1 secundă fiecare
6 = 0800 MEM_POS = 0800H
7 = 0080 DS_SEG = 0080H
8 = 0009 IDIS_BYTE = 09H ;întrerupere de afişare a unui octet
9 = 000B IDIS_STR = 0BH ;întrerupere de afişare a unui şir de caractere
10 = 000D IWAIT_MS = 0DH ;întrerupere se aşteptare(ms)
11 ;---------------------------------------- CODE
12 ;programul este încărcat la adresa 0000:MEM_POS
13 0000 CODE SEGMENT
14 ASSUME CS:CODE, DS:CODE
15 0000 ORG 0H
16 0000 B8 0080 START: MOV AX,DS_SEG
17 0003 8E D8 MOV DS,AX ;încarcă segmentul de date
18 0005 BE 0034 R MOV SI,OFFSET MSG
19 0008 CD 0B INT IDIS_STR ;afişează mesajul MSG
20 000A B8 0400 MOV AX,0400H ;segment RAM
21 000D 8E C0 MOV ES,AX
22 000F BE 0000 MOV SI,0000H ;adresă RAM
23 0012 B0 AA TLOOP: MOV AL,0AAH
24 0014 26: 88 04 MOV ES:[SI],AL ;scrie date în RAM
25 0017 26: 8A 04 MOV AL,ES:[SI] ;citeşte date din RAM
26 001A B1 0C MOV CL,12
27 001C CD 09 INT IDIS_BYTE ;afişează datele
28 001E 8B C MOV AX,SI
29 0020 8A C4 MOV AL,AH
30 0022 B1 05 MOV CL,5
31 0024 CD 09 INT IDIS_BYTE ; afişează MSB din memorie
32 0026 8B C6 MOV AX,SI
33 0028 B1 07 MOV CL,7
34 002A CD 09 INT IDIS_BYTE ; afişează LSB din memorie
35 002C B8 03E8 MOV AX,1000
36 002F CD 0D INT IWAIT_MS ;aşteaptă
37 0031 46 INC SI ; incrementează adresa
38 0032 EB DE JMP TLOOP
39
40 0034 52 41 4D 3A 20 78 MSG DB 'RAM: xxxx - xx ',00H
41 78 78 78 20 2D 20
42 78 78 20 20 00
43
44 0045 CODE ENDS
45 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_KB


Specificaţi adresa de plecare: 0000:0800

136
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.

137
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

138
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 Utilizare
Port A, biţii A0 – Disponibil pe pinii 15 – 22 ai conectorului J1.
A7 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

139
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.

140
Liniile de adresă A0, A1 sunt folosite pentru adresarea porturilor interne A, B,
C şi a regiştrilor de control.

Adresă A A0 Componentă internă


1
0310H 0 0 Port A
0311H 0 1 Port B
0312H 1 0 Port C
0313H 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 0
Este 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.

141
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 1
Este 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 2
Este 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 intrare
Portul B ca ieşire
Portul C (0 – 3) ca intrare
Portul C (4 – 7) ca ieşire

Instrucţiunile folosite sunt următoarele:


MOV AL, 00010001B
MOV DX, 0313H
OUT DX, AL

142
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 10H
Comandă 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 12H
Comandă 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

143
144
INTRARE AH = 0 Programarea porturilor
AH = 1 Trimiterea datelor pe portul A
AH = 2 Trimiterea datelor pe portul B
AH = 3 Trimiterea datelor pe portul C
AH = 4 Citirea datelor de pe portul A
AH = 5 Citirea datelor de pe portul B
AH = 6 Citirea datelor de pe portul C
IEŞIRE AL = datele citite
Regiştrii -
modificaţi
AH=0: Programarea porturilor
Conţinutul registrului AL determină direcţia (I/O) porturilor:

Registrul Programare
AL
Bit 0 =0 : portul A este ieşire
=1 : portul A este intrare
Bit 1 =0 : portul B este ieşire
=1 : portul B este intrare
Bit 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, C
Conţinutul registrului AL conţine datele ce vor fi trimise pe porturi

AH=4, 5, 6: Citirea datelor de pe porturile A, B, C


Conţinutul registrului AL conţine datele citite de pe port.

145
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,166
2 ;--------------------- PRG_PAR ----------------------
3 ; comandă în mod ciclic biţii de pe porturile A/B şi
4 ; generează câte un beep la fiecare schimbare de stare
5 = 0800 MEM_POS = 0800H
6 = 0080 DS_SEG = 0080H
7 = 000D IWAITMS = 0DH ;întrerupere de aşteptare
8 = 0010 IBUZZER = 10H ;întrerupere a buzzerului
9 = 0012 IPARAL = 12H ;întrerupere a portului paralel
10
11 ;---------------------------------------- CODE
12 ;programul este încărcat la adresa 0000:MEM_POS
13 0000 CODE SEGMENT
14 ASSUME CS:CODE, DS:CODE
15 0000 ORG 0H
16 0000 B8 0080 START: MOV AX,DS_SEG
17 0003 8E D8 MOV DS,AX ;încarcă segmentul de date
18 0005 B4 00 MOV AH,00H
19 0007 B0 00 MOV AL,00H
20 0009 CD 12 INT IPARAL ;porturile de ieşire
21 000B B3 01 MOV BL,00000001B ;datele de ieşire
22 000D B4 01 LOOP1: MOV AH,1
23 000F 8A C3 MOV AL,BL
24 0011 CD 12 INT IPARAL ;comandă portul A
25 0013 B4 02 MOV AH,2
26 0015 8A C3 MOV AL,BL
27 0017 CD 12 INT IPARAL ;comandă portul B
28 0019 53 PUSH BX
29 001A BB 0014 MOV BX,20
30 001D B9 000A MOV CX,10
31 0020 CD 10 INT IBUZZER ;beep
32 0022 5B POP BX
33 0023 B8 03E8 MOV AX,700
34 0026 CD 0D INT IWAITMS
35 0028 D0 E3 SHL BL,1 ;shiftează la stânga
36 002A 80 FB 00 CMP BL,00H
37 002D 75 DE JNZ LOOP1
38 002F B3 01 MOV BL,00000001B
39 0031 EB DA JMP LOOP1
40
41 0033 CODE ENDS
42 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_KB


Specificaţi adresa de plecare: 0000:0800
Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.
Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

146
147
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 OFF


Setaţi comutatorul S12 în poziţia ON

148
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

149
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

Vom dori să realizăm un program pentru modulul EV/Z3 ce comandă portul


paralel în functie de paritatea tastei citite.

Codul sursă al programului este următorul:


PAGE 70,166
;--------------------- PRG_PAR ----------------------
; comandă în mod ciclic biţii de pe porturile A/B şi
; generează câte un beep la fiecare schimbare de stare
MEM_POS = 0800H
DS_SEG = 0080H
IWAITMS = 0DH ;întrerupere de aşteptare
IBUZZER = 10H ;întrerupere a buzzerului
IPARAL = 12H ;întrerupere a portului paralel

;---------------------------------------- CODE
;programul este încărcat la adresa 0000:MEM_POS
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 0H
START:
MOV AX,DS_SEG
MOV DS,AX ;încarcă segmentul de date
MOV SI,OFFSET MSG0
INT 0BH;afisare mesaj de citire tasta
INT 08H;citire tasta in AL
MOV AH,00H
MOV BL,2;operandul
DIV BL;AL cat,AH rest
CMP AH,0
JE para
JNE impara

para:
MOV SI,OFFSET MSG1
INT 0BH;afisare mesaj para
MOV AH,00H
MOV AL,00H
INT IPARAL ;porturile de ieşire , semnal de chip select
MOV BL,01010101B ;datele de ieşire
MOV AH,1
MOV AL,BL
INT IPARAL ;comandă portul A
MOV AH,2
MOV BL,00000000B
MOV AL,BL
INT IPARAL ;comandă portul B
PUSH BX
MOV BX,20

150
MOV CX,10
INT IBUZZER ;beep
POP BX
MOV AX,700
INT IWAITMS
JMP START

impara:
MOV SI,OFFSET MSG2
INT 0BH;afisare mesaj impara
MOV AH,00H
MOV AL,00H
INT IPARAL ;porturile de ieşire , semnal de chip select
MOV BL,10101010B ;datele de ieşire
MOV AH,1
MOV AL,BL
INT IPARAL ;comandă portul A
MOV AH,2
MOV BL,11111111B
MOV AL,BL
INT IPARAL ;comandă portul B
PUSH BX
MOV BX,20
MOV CX,10
INT IBUZZER ;beep
POP BX
MOV AX,700
INT IWAITMS
JMP START

MSG0 DB 'Tasta ',00H


MSG1 DB 'este para ',00H
MSG2 DB 'este impara ',00H

CODE ENDS
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_KB


Specificaţi adresa de plecare: 0000:0800
Introduceţi codurile programului: B8, 80, 00, ..., 20, 00.
Daţi comanda GO 0080:0000 (sau RUN) pentru a executa programul.

151

S-ar putea să vă placă și