Professional Documents
Culture Documents
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
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)
Figură 2
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.
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
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:
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.
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
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.
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.
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.
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.
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.
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.
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).
Î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.
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.
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.
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
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
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):
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ă.
18
Cele două instrucţiuni precedente pot fi scrise:
MODURILE DE ADRESARE
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:
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:
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.
Exemplu:
19
Instrucţiunea conţine codul pentru identificarea registrului sursă BX şi registrul destinaţie
AX.
Adresarea directă a memoriei se face prin indicarea adresei efective sub forma unui
număr de 16 biţi direct în instrucţiune.
Exemplu:
Parantezele pătrate indică: „conţinutul adresei de memorie este shiftat faţă registrul de bază
cu 0421H octeţi”.
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.
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
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
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
24
QUIZ
SET
A B
1 3 Cod maşină
2 1 Limbaj de asamblare
3 2 Limbaj de nivel înalt
SET
A B
1 2 Un număr
2 3 Un registru
3 1 O adresă de memorie
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
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
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.
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.
MOV AL,0F2H
1 0 1 1 w reg
Date imediate
27
W = 1 pentru word
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.
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).
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.
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.
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.
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
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
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
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.
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)
PROG ENDS
END START
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.
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.
PROG SEGMENT
……………..
PROG ENDS
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.
MOV AL,DATA_1
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).
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.
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.
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.
Structura standard, chiar daca nu este strict obligatorie, a unui program assembler este
Directivele din aceasta structura sunt descrise prin prisma exemplului urmator:
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.
.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.
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
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.
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).
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ă.
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.
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
43
Exemple de programe
#make_COM#
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
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
#make_COM#
ORG 100h
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
JMP next_char
45
stop:
RET
count DB 10
c1 DB 'A'
END
#make_COM#
ORG 100h
;***************************************************************
; AFISEAZA UN SIR DE CARACTERE CARE SE TERMINA PRIN ZERO
;***************************************************************
JMP skip_proc_print_string
next_char:
MOV AL, [SI]
CMP AL, 0
JZ printed
INC SI
MOV AH, 0Eh ;
INT 10h
JMP next_char
printed:
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
wait_for_key:
JMP wait_for_key
exit:
MOV [SI], 0
RET
READ_STRING ENDP
skip_proc_read_string:
;***************************************************************
; CONVERTESTE UN SIR DE CARACTERE LA UN INTREG
;***************************************************************
JMP skip_proc_strtoint
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:
RET
STRTOINT ENDP
skip_proc_strtoint:
;***************************************************************
; CONVERTESTE UN STRING LA UN INTREG STOCAT IN AX
;***************************************************************
JMP skip_proc_prime
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:
RET
PRIME ENDP
skip_proc_prime:
;***************************************************************
CALL read_string
CALL strtoint
CALL prime
RET
; DEFINIRE SIRURI
END
49
QUIZ
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
51
2 5 SEGMENT
3 4 ENDS
4 3 DATA
5 1 0241H
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
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.
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.
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.
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 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.
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.
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
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
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
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.
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.
64
QUIZ
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
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
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.
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.
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.
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ă
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).
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.
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.
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.
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.
79
80
QUIZ
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
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#
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
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 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:
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.
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:
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.
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.
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)
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.
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.
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.
INT 0CH
Trimite comenzi către afişaj.
Această întrerupere trimite comenzi de control către afişaj.
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.
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.
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.
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 = 3 : Citirea stării
Conţinutul registrului AH conţine starea liniei curente şi a modemului.
AH = 4 : Controlul modemului
94
Conţinutul registrului AH conţine starea curentă a modemului, ce urmează a fi
modificată.
95
QUIZ
Se setează toate comutatoareleurile în poziţia OFF
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
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ă
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
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
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:
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.
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.
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).
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
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.
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
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
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.
SET
A B
1 5 0,5 secunde
2 4 1 secundă
3 3 3 secunde
4 2 5 secunde
5 1 10 secunde
SET
A B
1 4 0000:0000
2 1 FFFF
3 5 0000
4 3 0000FFFF
5 2 oricare
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)
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.
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.
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.
Î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).
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ă
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
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
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
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
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.
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).
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.
122
QUIZ
Setaţi toate comutatoarele în poziţia OFF
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.
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
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
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ă.
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.
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.
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.
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
CODE ENDS
END START
135
QUIZ
Setaţi toate comutatoarele în poziţia OFF
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
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ă.
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
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
Liniile I/O sunt disponibile prin conectorul J1, pentru a face legătura
modulului Z3 cu dispozitivele externe.
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.
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.
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
145
QUIZ
Setaţi toate comutatoarele în poziţia OFF
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
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.
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
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
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
;---------------------------------------- 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
CODE ENDS
END START
151