Documente Academic
Documente Profesional
Documente Cultură
C SoltrA31
C SoltrA31
CALCULATOR
UNIVERSAL
1
2
.
.
n
PERIFERICE
GENERALE
CUPLOR DE
PROCES
PROCES
C. O. P.
CALCULATOR
DE
PROCES
CONDUS
Fig. 1.1
din schema funcional a instalaiei la diferite nivele de detaliere. Astfel de console (console cu
display cu faciliti grafice) permit i alte funcii speciale ca, de exemplu, depanarea asistat de
calculator a instalaiei.
Calculatorul universal este de obicei un microcalculator realizat cu microprocesor de 16 bii
sau chiar de 8 bii sau un minicalculator.
Cuplorul de proces asigur dialogul bidirecional ntre procesul condus i calculatorul
universal.
Evideniind cile de introducere i extragere (furnizare) a datelor de la i respectiv ctre
proces putem defini urmtoarele moduri poteniale de conectare dintre calculator i proces:
- Sisteme de calcul off-line, la care legtura informaional ntre calculator i proces este
stabilit prin intermediul operatorului uman. Datele din proces pot fi culese normal, prin citire, de
ctre operator, sau automat ntr-o form care poate fi utilizat direct de calculator (band
magnetic, band perforat etc.);
- Sisteme de calcul in-line, sunt sistemele la care operatorul poate introduce datele n mod
aleator direct de la tastatur, ele trebuind s fie "imediat" preluate i prelucrate. Apare, n acest caz,
necesitatea "ntreruptibilitii" calculatorului n procesul de calcul;
- Sisteme de calcul on-line, care sunt cuplate direct cu procesul pe partea de culegere de
date prin intermediul cuploarelor de proces (convertoare analog-numerice).
n cazul n care datele de ieire sunt transmise operatorului sub form de mesaje, iar acesta
intervine n proces n urma interpretarii lor, sistemul de numete on-line n circuit deschis.
Calculatorul funcioneaz n regim de "ghid operator" sau "consultant" al conducerii procesului.
n cazul n care, pe baza datelor culese, sistemul de calcul elaboreaz mrimi pe care le
aplic direct procesului, far intervenia operatorului, sistemul se numete on-line n circuit nchis.
Conectarea on-line n circuit nchis poate fi de urmrire, situaie n care calculatorul calculeaz
(determin) i modific referinele unor regulatoare convenionale), sau direct (calculatorul
calculeaz i elaboreaz comanda la nivelul elementelor de execuie).
Pentru a realiza funciile impuse, calculatorul de proces trebuie s posede o serie de
faciliti:
- s fie ntreruptibil;
- s permit prelucrarea datelor culese direct din procesul condus prin intermediul unor
periferice specializate;
- s ofere rspunsul ntr-un anumit interval de timp strict corelat cu evenimentele din proces
(s funcioneze n "timp real");
- s rezolve contradicia ntre capacitatea lui de a executa la un moment dat un singur
program i cerina procesului de a fi "servit" n n, n > 1, puncte simultan.
Definiie: Sistemele de calcul care preiau suficient de rapid datele de intrare, le prelucreaz
ntr-un interval de timp suficient de scurt i ofer utilizatorului sau direct procesului (prin periferice
specializate) rezultatele suficient de rapid pentru a mai putea influena desfurarea fenomenelor
din procesul care a produs datele de intrare, se numesc sisteme de calcul n timp real (SCTR).
Deci, din definiia dat, se observ c, calculatoarele de proces fac parte din clasa SCTR.
Dezvoltarea acestor clase de calculatoare a fost posibil, pe de o parte datorit perfecionrilor
tehnologice (uniti centrale ultrarapide, specializarea echipamentelor periferice, perfecionarea
transmisiei datelor), iar, pe de alt parte, prin dezvoltarea i perfecionarea sistemelor de operare
(SO). Toate aceste perfecionri au dus la micorarea timpului de rspuns al sistemului de calcul.
Definiie: Se numete timp de rspuns al unui sistem de calcul intervalul de timp dintre
momentul generrii datelor primare i momentul obinerii rezultatului prelucrrii datelor.
Pentru un sistem de calcul on-line, timpul de rspuns este dat de intervalul de timp dintre
momentul producerii unui eveniment n procesul condus i momentul n care se genereaz comanda
1-2
ctre proces. Se observ c acest timp nglobeaz timpul necesar achiziiei datelor, prelucrrii
datelor i generrii comenzii ctre proces.
Indiferent de modul de conectare cu procesul, calculatorul de proces a format cel de-al
doilea nivel de conducere a proceselor industriale, primul nivel fiind reprezentat de elemente de
automatizare convenionale realizate de regul cu regulatoare de tip PID.
Creterea complexitii proceselor de conducere, impunerea unor cerine superioare de
fiabilitate, a avut drept efect imposibilitatea ndeplinirii ntregului volum de sarcini legate de
conducerea acestora cu un singur calculator de proces. Din aceste considerente a aprut necesitatea
distribuirii funciilor de conducere ntre mai multe uniti de calcul, care, la rndul lor, au fost
subordonate unui calculator "universal" de mare capacitate, care s rezolve rapid o serie de
probleme complexe cum ar fi: identificarea procesului, conducerea optimal sau adaptiv a
procesului etc. Se obine astfel o ierarhizare funcional clasic pe trei nivele a unei structuri de
conducere numit structur distribuit de conducere caracterizat prin fiabilitate, flexibilitate i
potenialitate ridicat. Prin intermediul unei astfel de structuri se poate asigura conducerea
proceselor de medie sau de mare complexitate dup strategii de la cele mai simple (de tipul PID) la
cele mai evoluate care vizeaz conducerea adaptiv i cea optimal. O structur distribuita de
conducere, frecvent ntlnit n prezent este prezentat n Fig.1.2.
CONSOLA
OPERATOR
MINICALCULATOR
DE PROCES
Magistrala de
Nivel
3
comunicaie
Microcalculator
Nivel
2
sau
reg. numeric
Nivel
1
Microcalculator
sau
reg. numeric
D
...
D
Nivel
0
...
SUBPROCES 1
...
DIRECTOR
DE
TRAFIC
D - date
R - referine
C - comenzi
AUTOMATIZARE
CONVENIONAL
Nivel
2
Microcalculator de
proces sau regulator
numeric specializat
D
Tastatura
Display
Imprimanta
C
Automatizare
convenional
Nivel
1
D
Consola
operator de
proces
D - date
R - referine
C - comenzi
Nivel
0
Proces condus
Fig.1.3.
Acest echipament poate fi, aa cum am artat, fie un regulator numeric specializat avnd
aceti algoritmi implementai sub forma unei biblioteci de programe organizat dup o arhitectur
bine pus la punct, corespunztoare unei anumite clase de procese, sau poate fi un calculator
destinat conducerii proceselor industriale (microcalculator de proces) capabil de a fi dotat cu astfel
de algoritmi la momentul dorit.
Fr a face o analiz detaliat a avantajelor i dezavantajelor celor dou moduri de rezolvare
a problemei conducerii, precizm c vom insista asupra celei de-a doua variante, i anume,
utilizarea n conducerea direct a proceselor a unui microcalculator de proces. Aceste echipamente
permit eleborarea i implementarea unor algoritmi strict necesari orientai ctre aplicaie i sunt
1-4
mult mai flexibile. Efortul de programare devine minim dac este pus la punct tehnica i
tehnologia de elaborare a unor astfel de programe i dac organizarea hardware a echipamentului
este capabil s suporte un software dup aceste principii.
1.2. Schema de principiu a unei structuri de echipament cu microprocesor destinate
conducerii proceselor industriale (microcalculator de proces)
n cele ce urmeaz va fi prezentat o structur cu microprocesor (microcalculator de proces)
amplasabil la nivelul 2 de automatizare n cadrul structurii ierarhizate de conducere prezentate n
Fig.1.2. Structura este destinat s ndeplineasc funciile de supraveghere automat (culegere,
validare i protocolare de date) i de conducere numeric direct prin intermediul unor algoritmi
bipoziionali, tripoziionali, de tip PID sau evoluai a unei ntregi clase de procese, n special, din
categoria celor numite "lente". De asemenea, structura trebuie s asigure comunicarea cu consola
operatorului de proces i cu nivelul ierarhic superior. Schema bloc a unei astfel de structuri, la nivel
de black-box, este prezentat n Fig.1.4. Ea trebuie s permit o funcionare permanent, lipsit de
blocaje, iar legturile dintre modulele de program utilizator i resursele hardware s se realizeze
uor i eficient.
Comunicare cu
nivelul ierarhic
superior (NIS)
Intrri
analogice
Intrri
numerice
..
Comunicare cu
consola operatorului
de proces (COP)
MICROCALCULATOR
DE
..
PROCES
Ieiri
analogice
Ieiri
numerice
Fig. 1.4.
Mergnd pe linia dezvoltrii arborescente, se poate obine o detaliere a schemei din Fig.1.4,
detaliere prezentat n Fig.1.5. O asemenea configuraie permite din punct de vedere software
urmtoarele:
- achiziia i prelucrarea primar (validare, filtrare, liniarizare) a unui numr de mrimi
analogice din proces;
- primirea unui numr de comenzi (intrri numerice) din proces prin intermediul unor
contacte de releu;
- reglarea unor bucle simple sau n cascad cu algoritmi de tip PID cu ieire analogic
constant pe poriuni, pe durata intervalului de discretizare;
- comanda unui numr de relee (ieiri numerice) destinate realizrii att a comenzilor
automate (ieiri numerice), ct i a algoritmilor de reglare bipoziionli sau tripoziionali sau de tip
PI sau PID cu ieire n impulsuri modulate n durat;
- memorarea datelor curente n memoria RAM;
- nscrierea i memorarea programelor de baz (MONITOR, EXECUTIV) i utilizator n
memoria EPROM;
- memorarea datelor strict necesare (din proces, sau cele configurabile) n memoria RAM
nevolatil n vederea relurii funcionrii sistemului exact din punctul unde a rmas la o eventual
cdere intempestiv a tensiunii de alimentare a calculatorului;
1-5
Display
SURSA
Tastatura
NIS
Imprimanta
MEM.
RAM
MEM.
EPROM
MEM.
RAM
nevolatil
Interfata cu
nivelul ierarhic superior
Interfata cu
COP
Unitate
central
- microprocesor
- ceas de timp
real
- circuit pentru
gestiunea
ntreruperilor
Magistrala
de date
Interfa
intrri
analogice
Interfa
ieiri
analogice
...
...
curent
2 - 10 mA
4 - 20 mA
tensiune
0-5V
-10 - 10 V
curent
2 - 10 mA
4 - 20 mA
tensiune
0-5V
-10 - 10 V
Interfa
intrri
numerice
...
contacte
(de releu)
Interfa
ieiri
numerice
...
tensiuni pentru
comanda releelor
Fig. 1.5
- comunicarea cu consola operator proprie, format din:
- display, pentru afiarea mrimilor curente i a celor configurabile;
- tastatur, pentru configurarea sistemului i pentru conducerea manual a procesului
sau a nivelului 1 de automatizare;
- imprimant, pentru protocolare de date i pentru nregistrarea evoluiei unor
mrimi de interes din proces;
- comunicarea cu nivelul ierarhic superior.
Numrul de intrri/ieiri analogice i/sau numerice depinde de configuraia aleas pentru
echipament, adic de numrul de plachete de interfa prezente n sistem.
Menionm c numrul de intrri/ieiri al unei plachete specifice (IA-intrri analogice,
EA-ieiri analogice, IN-intrri numerice, EN-ieiri numerice) variaz de la echipament la
echipament.
Indiferent de tipul echipamentului, unitatea central trebuie s conin pe lng
microprocesor i un ceas pentru msurarea timpului i n funcie de care se desfoar toate
operaiile din sistem, precum i un puternic sistem de ntreruperi prin intermediul cruia se va lansa
n execuie, la un moment dat, acel program care va avea prioritate maxim.
1-6
1-7
Un segment este o unitate logic de memorie format din locaii adiacente de memorie
fizic, cu dimensiunea maxim precizat, de regul, 64 Koctei.
Segmentarea memoriei implic formarea adresei unei locaii fizice de memorie din 2
componente:
- componenta de SEGMENT, se mai numete i adres de segment (adres de baz) a
segmentului logic, notat "ssss", unde s este o cifr hexazecimal;
- componenta de OFFSET, se mai numete i adres relativ a locaiei fa de adresa de baz
a segmentului, notat "oooo", unde o este o cifr hexazecimal.
Dac n interiorul unui segment toate adresele de referire (pentru program i pentru date)
sunt relative la adresa de baz a segmentului, atunci un segment poate fi plasat la orice adres n
memoria fizic principal, conducnd astfel la proprietatea de relocabilitate a segmentelor i
implicit a programelor.
La p I8086, memoria fizic este divizat n segmente cu dimensiunea de 64 Koctei. La un
moment dat pot fi active: un segment de cod (program), un segment de date, un segment de stiv i
un extra-segment (pentru date suplimentare). Adresa de baz a fiecrui segment activ este pstrat
n cte un registru de 16 bii numit, respectiv:
- Code Segment (CS), pentru segmentul de cod;
- Data Segment (DS), pentru segmentul de date;
- Stack Segment (SS), pentru segmentul de stiv;
- Extra Segment (ES), pentru segmentul de date auxiliare (extrasegment).
Deoarece toate registrele p I8086 sunt pe 16 bii (inclusiv cele segment), adresa fizic FA
(physique address) corespunztoare unei perechi (SEGMENT, OFFSET) sau (ssss, oooo) se
calculeaz cu relaia:
AF = ssss * 16 + EA = ssss * 16 + oooo,
unde EA = oooo este adresa efectiv (effective address). Se obine astfel o adres pe 20 bii, numit
pointer. Un pointer se mai noteaz i sub forma ssss:oooo i nseamn c operandul se gsete la
adresa oooo n segmentul ssss.
Exemplu: Dac DS = 1300h, iar EA = 0125h, atunci adresa absolut a datei (aflat n
segmentul de date) este:
FA = 1300h * 16 + 0125h = 13125h (adres pe 20 bii)
2-1
Deci, valoarea ssss pe 16 bii, coninut ntr-un registru-segment, reprezint adresa de nceput a
segmentului respectiv. Modul de reprezentare ales impune restricia ca un segment s nceap la o
adres absolut multiplu de 16.
n memoria principal segmentele pot fi disjuncte, parial suprapuse sau total suprapuse:
A
10000h
B
20000h
40000h
30000h
Memorie fizic
Rezult c, o locaie de memorie de adres fizic dat poate aparine mai multor segmente i poate
fi referit n mod corespunztor prin registrul-segment respectiv i deplasamentul n cadrul
segmentului. n cel mai simplu caz, n care coninutul registrului CS = DS = SS = ES, revenim, de
fapt, la cazul cel mai simplu al UCP fr segmentarea memoriei.
Registrele interne ale p I8086
Din punct de vedere al programatorului, cea mai simpl arhitectur intern a p I8086 arat
astfel:
16 bii
Accumulator
Base register
Counter register
AH
AL
AX
BH
BL
BX
CH
CL
CX
Data register
DH
DL
DX
8 bii
Registre
de
date
8 bii
Registre
de
segment
Numrtorul de instruciuni
Deosebim:
2-2
A
F
P
F
1. Registre de date: AX, BX, CX, DX sunt registre generale de 16 bii utilizate n
instruciuni aritmetice i logice. Sunt adresabile att la nivel de octet prin AH, AL, BH, BL, CH,
CL, DH, DL ct i direct ca registre de 16 bii AX = (AH, AL), ... , DX = (DH, DL). Majoritatea
instruciunilor aritmetice utilizeaz n acelai mod toate aceste registre. Exist ns i instruciuni
aritmetice pentru care anumite registre generale au semnificaii speciale (implicite), astfel:
- AX este utilizat pentru efectuarea instruciunilor aritmetice de nmulire i mprire pe 16
bii precum i pentru operaii de intrare-ieire (I/O) pe 16 bii;
- AL, AH sunt utilizate pentru efectuarea instruciunilor aritmetice de nmulire i mprire
pe 8 bii;
- AL este utilizat n operaiile aritmetice efectuate cu operanzi BCD i n cele de conversie;
- BX este utilizat ca registru de baz n operaiile de adresare;
- CX este utilizat n operaiile cu iruri i are rol de contor n operaiile de buclare;
- DX este utilizat pentru efectuarea instruciunilor aritmetice de nmulire i mprire pe 16
bii i ca registru de adresare indirect n operaiile de I/O.
2. Registre indicatoare de adres
2a) Registrele pointer:
- IP (Instruction Pointer) este contorul de program reprezentat printr-un registru de 16 bii a
crui valoare conine adresa relativ (offsetul) a instruciunii curente (instruciunea ce urmeaz a fi
executat) n cadrul segmentului de cod curent. Adresa complet a instruciunii curente este
precizat prin pointerul CS:IP. n cazul unei instruciuni de salt inter-segment, coninutul lui IP
mpreun cu coninutul lui CS este salvat n vrful stivei, dup care CS este ncrcat cu adresa de
baz a segmentului, iar IP-ul cu adresa relativ din segmentul de cod, corespunztoare instruciunii
int.
- SP (Stack Pointer) - registru pe 16 bii care conine adresa relativ a vrfului stivei n
cadrul segmentului de stiv. SP-ul este utilizat implicit n toate operaiile cu stiva. Adresa complet
a vrfului stivei este dat de pointerul SS:SP.
- BP (Base Pointer) - registru pe 16 bii folosit pentru adresarea operanzilor plasai n stiv.
Observaie: Registrele SP i BP pot fi utilizate n anumite instruciuni aritmetice i logice
ca registre pe 16 bii.
2b) Registrele index SI i DI sunt utilizate, n general, pentru adresarea indexat a
operanzilor, coninnd adresele relative ale acestora n cadrul segmentului de date curent.
Segmentul implicit utilizat n adresare poate fi modificat prin folosirea n instruciuni a unor prefixe
speciale.
Registrele index sunt utilizate ca registre implicite n instruciunile efectuate pe iruri de
caractere. n acest ultim caz, registrul SI conine adresa relativ curent a elementelor irului surs
plasat n segmentul de date curent, iar DI conine adresa relativ curent a elementelor irului
destinaie plasat n segmentul de date suplimentar. i registrele index pot fi utilizate n
instruciunile de transfer de date i n instruciunile aritmetice i logice ca registre de 16 bii.
2c) Registrele segment CS, DS, SS, ES conin respectiv:
- CS : adresa segmentului de cod (program) curent;
- DS : adresa segmentului de date curent;
- SS : adresa segmentului de stiv curent;
- ES : adresa segmentului de date suplimentare curent.
Instruciunea ce urmeaz a fi executat se gsete n segmentul a crui adres de nceput se
afl n registrul CS, la adresa relativ n segment coninut n IP.
Coninutul registrului DS definete adresa de nceput a segmentului de date curent. Toate
referirile la datele din memorie, cu excepia celor care utilizeaz registrele BP, SP sau DI, utilizeaz
implicit segmentul referit de registrul DS.
2-3
OF DF IF TF SF ZF
4
AF
PF
Bitul numrul
CF
Registrul PSW
3a) Flagurile de stare (de condiie) - Status Flags - memoreaz informaii referitoare la
rezultatul unor operaii aritmetice i logice executate de ALU (Arithmetic and Logic Unity): AF,
CF, OF, PF, SF, ZF.
- Indicatorul AF (Auxiliary Carry Flag) este setat (devine 1) dac, n execuia unei
instruciuni care poziioneaz acest indicator, a aprut un transport de la rangul (bitul) 3 la rangul 4
al rezultatului sau a fost efectuat un mprumut de la rangul 4 la rangul 3, altfel AF = 0. Este utilizat
de procesor pentru corectaea rezultatelor efectuate cu operanzi BCD.
- Indicatorul CF (Carry Flag) este setat dac a aprut un transport din, sau s-a fcut un
mprumut n, rangul cel mai semnificativ (c.m.s.) al rezultatului, altfel CF = 0.
- Indicatorul OF (Overflow Flag) se seteaz dac n execuia unei instruciuni aritmetice cu
semn, care poziioneaz acest indicator, a aprut o depire, adic s-a obinut un rezultat care nu
poate fi memorat corect n destinaia stabilit de ctre instruciune.
- Indicatorul SF (Sign Flag) bitul c.m.s. al rezultatului: SF = 1 semnific rezultat negativ,
iar SF = 0 semnific rezultat pozitiv sau nul.
- Indicatorul PF (Parity Flag) se seteaz dac, n urma execuiei unei instruciuni care
poziioneaz acest indicator, octetul cel mai puin semnificativ (c.m.p.s.) al rezultatului are un
numr par de cifre 1, altfel PF = 0.
- Indicatorul ZF (Zero Flag) devine 1 dac, n urma execuiei unei instruciuni care
poziioneaz acest indicator, s-a obinut un rezultat nul, altfel ZF = 0.
Adrese mici
5522h
22h
5673h:12A0h
55h
Adrese mici
12h
73h
56h
Adrese mari
Adrese mari
Moduri de adresare
Prin mod de adresare se nelege acea modalitate de determinare a adresei unui operand
specificat ntr-o instruciune. Pentru p I8086 deosebim dou categorii de moduri de adresare:
- moduri de adrersare a datelor;
- moduri de adresare a instruciunilor.
Moduri de adresare a datelor
1. Adresarea imediat este adresarea n care operandul (data) este specificat n instruciune,
imediat dup codul operaiei. Operandul poate fi pe 1, 2 sau 4 octei.
Exemplu:
data_segment SEGMENT
aw
DW 'AB'
data_segment ENDS
mov al, 5 ; Registrul AL se ncarc cu valoarea 5
mov ax, 5 ; Registrul AX se ncarc cu valoarea 5
mov ax, OFFSET aw
; Registrul AX se ncarc cu adresa
; relativ a operandului aw din
; segmentul data_segment
2-5
mov
ax, data_segment
mov
ds, ax ; DS <--- AX
2. Adresarea direct la registru este adresarea n care operandul este coninutul unui registru
specificat n instruciune. Pentru operanzi reprezentai pe cuvnt, registrul poate fi: AX, BX, CX,
DX, SI, DI, SP, BP. Pentru operanzi reprezentai pe octet, registrul poate fi: AL, AH, BL, BH, CL,
CH, DL, DH.
Exemplu:
mov bx, ax ;
mov al, cl ;
mov ds, ax ;
mov bp, bx ;
3. Adresarea direct la memorie. n instruciune apare adresa efectiv a operandului (datei).
Exemplu:
mov ax, aw
; AX <--- operandul de la adresa relativ aw
mov aw+2, ax
; La adresa relativ a operandului aw+2 se transfer valoarea
; registrului AX
4. Adresarea indirect prin registru. Adresa efectiv a operandului se afl ntr-unul din
registrele BX, BP, SI, DI, registru specificat n cadrul instruciunii.
Exemplu:
mov ax, [bx]
; AX <---- coninutul locaiei de memorie a crei adres
; relativ se afl n BX
mov bl, [si]
;
mov ah, [di]
;
;
mov bx, OFFSET aw
; ncarc BX cu adresa de offset a parametrului aw
mov ax, [bx]
; Aceste 2 instruciuni sunt echivalente cu ultimele 2
mov [bx+2], ax
; instruciuni din exemplul de la punctul 3
5. Adresarea bazat este similar adresrii indirecte prin registru, cu excepia faptului c n
aceast situaie, se pot utiliza numai registrele de baz BX i BP, iar la coninutul acestora se poate
aduna un deplasament pe 8 sau 16 bii. Dac drept registru de baz se utilizeaz registrul BX, atunci
se consider implicit, ca registru de segment, registrul DS, iar dac drept registru de baz se
utilizeaz registrul BP, atunci se consider implicit, ca registru de segment, registrul SS. De obicei,
adresarea bazat se utilizeaz pentru a referi elementele unei structuri pentru care adresa de nceput
este coninut n registrul de baz, iar adresa relativ n cadrul structurii apare explicit n
instruciune.
Exemplu:
mov bx, OFFSET structura
; ncarc BX cu adresa de nceput a
; operandului structura
mov al, [bx+5]
; ncarc AL cu coninutul de la adresa BX+5 (al aselea octet
; al structurii)
5. Adresarea indexat utilizeaz registrele index SI i DI mpreun cu un nume de variabil
pentru a adresa date de tip tablou (vectori). Aceste registre sunt folosite ca un index fa de adresa
de offset reprezentat prin numele variabilei. Coninutul registrului utilizat ca index specific un
deplasament pe un octet/cuvnt fa de adresa de offset a variabilei. Registrul de segment considerat
implicit este registrul DS.
Exemplu:
mov si, 0 ; ncarc indexul sursei cu 0
mov di, 0 ; ncarc indexul destinaiei cu 0
mov ax, sir_surs[si] ; ncarc AX cu primul element al irului surs
mov sir_dest[di], ax ; Memoreaz AX n primul element al irului destinaie
2-6
Dac elementele irului sunt cuvinte, atunci acestea au adresele de offset 0, 2, 4, 6, 8, ... Atunci:
mov si, 6 ; ncarc indexul sursei cu 6
mov di, 6 ; ncarc indexul destinaiei cu 6
mov ax, sir_surs[si] ; ncarc AX cu al patrulea element al irului surs
mov sir_dest[di], ax ; Memoreaz AX n al patrulea element al irului destinaie
5. Adresarea bazat-indexat. n instruciune apare att registrul de baz (BX sau BP), ct i
registrul index (SI sau DI) utilizate i, opional, un deplasament. Adresa fizic rezult pe baza
adresei de segment implicat n instruciune, adresa efectiv a operandului n cadrul segmentului
fiind suma dintre coninutul registrului de baz, coninutul registrului index i deplasamentul
coninut n instruciune. Registrul de baz este cel care dicteaz registrul-segment considerat
implicit. Acest tip de adresare este util pentru a realiza accesul la structurile de date create n stiv,
sau accesul la elementele unui vector de nregistrri. n acest ultim caz, n registrul de baz se
ncarc adresa de nceput a vectorului, n registrul index se ncarc adresa relativ a nregistrrii
referite n vector, iar n instruciune apare adresa relativ a elementului referit din nregistrare.
Exemple:
array DB
100 DUP (55h)
;
mov bx, OFFSET array ;
mov si, 2
;
mov ax, WORD PTR [bx][si]
; ncarc AX cu coninutul de la adresa BX+SI
mov ax, WORD PTR [bx+si]
; ncarc AX cu coninutul de la adresa BX+SI
mov al, [bx][si+50]
;
mov al, [bx+si+50]
;
Moduri de adresare a instruciunilor
Adresarea instruciunilor este asemntoare cu adresarea datelor. Adresa efectiv a
instruciunii curente, calculat ca i n cazul adresei efective a unui operand, se ncarc n registrul
contor de program IP. Pentru adresarea instruciunii curente se utilizeaz un subset al modurilor de
adresare prezentate mai sus. Astfel, deosebim:
1. Adresarea secvenial: IP <--- IP+n, unde n 1 este un deplasament pn la adresa
instruciunii imediat urmtoare (lungimea, n octei a instruciunii). Aceast adresare este utilizat
implicit pentru adresarea tuturor instruciunilor cu excepia celor de salt, pentru care se disting:
2a. Adresarea direct: IP <--- adresa, unde adresa este un numr ce reprezint adresa
instruciunii unde se face saltul.
2b. Adresarea relativ: IP <--- IP+d, unde d este un deplasament ce corespunde etichetei la
care se face saltul, provocnd deplasarea execuiei "nainte" sau "napoi" relativ la valoarea curent
a registrului IP. Acest tip de adresare are marele avantaj de a produce coduri (programe) relocabile,
deoarece adresa de salt fiind indicat n instruciune prin valoarea sa relativ, nu depinde de adresa
absolut la care este plasat instruciunea n memorie. Un program n care instruciunile de salt sunt
numai de tip relativ produce, prin asamblare, un cod obiect care poate fi plasat oriunde n memorie
i executat fr nici o modificare. Acest lucru nu se ntmpl la adresarea direct.
2c. Adresarea indirect: IP <--- Registru sau IP <--- (EA), unde Registru este coninutul
unui registru pe 16 bii, iar (EA) indic cuvntul din memorie plasat la adresa efectiv EA.
2-7
Mnemonica codului
de operatie
Operand1, Operand2
Operand
[ ; Comentariu ]
unde parantezele drepte [ ] arat c elementele incluse pot apare sau nu n mod facultativ, iar
acoladele { } indic faptul c numai un element din cele scrise pe vertical poate apare ntr-o
instruciune dat.
Cmpul Eticheta este opional, iar cnd apare este un identificator cruia i se asociaz adresa
primului octet al instruciunii respective.
Mnemonica codului de operaie este numele simbolic al instruciunii sau al unui grup de
instruciuni; apare obligatoriu n orice instruciune.
Cmpul operanzi poate conine doi operanzi, unul sau niciunul, n funcie de tipul
instruciunii. Cnd exist doi operanzi, primul este operandul destinaie, iar cel de-al doilea,
operandul surs. Operanzii identific datele asupra crora acioneaz instruciunea, modul de
adresare i alte informaii auxiliare.
Cmpul Comentariu este opional. Acesta servete pentru creterea inteligibilitii
programului. La asamblare, textul comentariului este ignorat de ctre asamblor.
Exemple:
mov bx, 7a2h
; ncarc registrul BX cu valoarea 7a2h
alfa: mov beta [bx][di], al
; Transfer octetul din AL la adresa OFFSET beta + BX +
; DI n segmentul de date asociat variabilei beta
xchg bl, cl
; Interschimb coninutul registrelor BL i CL
gama: popf
; Reface din stiv coninutul registrului de flaguri F
Menionm c pentru realizarea programelor scrise n limbaj de asamblare, se pot utiliza
mediile de dezvoltare MASM i TASM, care pun la dispoziia utilizatorului o serie de directive din
care, aici, menionm numai directivele pentru definirea tipurilor de date asupra crora acioneaz
instruciunile. Macroasamblorul MASM, respectiv TASM opereaz cu urmtoarele tipuri de date:
BYTE (1 octet), WORD (2 octei), DWORD (4 octei), QWORD (8 octei) i TBYTE (10 octei).
De asemenea se utilizeaz tipurile NEAR pentru etichete din segmentul curent i FAR pentru
etichete din alte segmente.
Pentru definirea constantelor se utilizeaz directiva EQU (EQUate) al crei format este:
nume EQU
operand
unde nume este numele ce se atribuie operandului operand care poate fi o constant, un nume
simbolic definit anterior, o expresie sau un ir constant.
Expresia este o concatenare de simboluri (operatori i operanzi) care pot fi:
- Constante numerice, ncep ntotdeauna cu o cifr i pot fi ntregi sau reale. n cazul
constantelor ntregi, reprezentarea se poate face n baza 2, 8, 10 sau 16, indicarea bazei
realizndu-se respectiv prin sufixele B, Q, D, H (sau literele mici corespunztoare). Dac indicarea
bazei lipsete, atunci se consider n mod implicit c baza este 10.
- Constante alfanumerice, iruri de caractere scrise ntre ghilimele sau ntre apostrofuri.
Pentru fiecare caracter dintr-un ir alfanumeric de caractere, valoarea corespunztoare este codul
ASCII al caracterului respectiv.
ANA EQU 0c2h
;
Exemple:
ANY EQU ANA
;
2-8
lista operanzi
[nume_variabila] {DB | DW | DD | DQ | DT}
[; comentariu]
factor DUP (lista operanzi)
unde:
nume_variabila este numele prin care pot fi referite datele definite. Acest nume are asociat
un tip i o valoare. Tipul rezult din tipul datei, iar valoarea este adresa la care se va gsi n
memorie, n timpul execuiei programului, primul octet rezervat pentru data referit cu numele
respectiv. Limbajul de asamblare utilizeaz nume rezervate care nu pot fi utilizate ca etichete sau
variabile. Numele rezervate sunt: mnemonicele instruciunilor i pseudoinstruciunilor, numele
operatorilor, numele registrelor i caracterele $ i ?.
list operanzi reprezint lista unor constante, simboluri sau expresii separate prin virgul, cu
ale cror valori se vor iniializa zonele de date rezervate pentru declaraia respectiv.
factor este un numr care indic de cte ori se repet lista de operanzi care urmeaz n
paranteze. n particular, drept operand poate fi folosit i caracterul ? care indic faptul c zona de
date corespunztoare este rezervat, dar nu i iniializat.
Operatorul DUP indic generarea repetat de factor ori a listei de operanzi ce apare ntre
parantezele de dup cuvntul DUP.
Precizm c datele de tip adres ce pot fi definite i prin directivele DW (adresa relativ) i
DD (pointer) sunt memorate inversat, adic la adresa mai mic - octetul mai puin semnificativ al
valorii, respectiv la adresa mai mare - octetul mai semnificativ al valorii.
Exemple:
Nume_var
Dir
List operanzi
Rezultat (n cod hexazecimal)
DATA_B
DB
10, 5, 13h, -5, 'A'
;
0A 05 13 FB 41
DATA_W
DW 100, 100h, -5, 'AB'
;
64 00 00 01 FB FF 42 41
DATA_D
DD
5*20, 0FCFBh, 'BA' ;
64 00 00 00 FB FC 00 00 41 42 00 00
DB
200 DUP (1)
;
Definete 200 octei iniializai cu 1
DB
50 DUP (1, 0)
;
Definete 100 octei iniializai cu 1,0,1,0, . . .
ARRAY1
DB
2 DUP (0, 1, 2, ?)
;
Definete 8 octei iniializai cu
;
0, 1, 2, _, 0, 1, 2, _
2-9
M - operand din memorie: M8, M16, M32 unde indicele 8, 16, 32 precizeaz lungimea n bii pentru
operanzi cu 1, 2, respectiv 4 octei;
SR - registru segment oarecare: CS, DS, SS, ES;
nume_reg - coninutul numeric al registrului indicat de nume (surs sau destinaie);
DATA - operand numeric imediat: DATA8, DATA16 - operand numeric pe 8, respectiv 16 bii;
DEPL - deplasament (offset) de adres: DEPL8, DEPL16 - deplasament pe 8, respevtiv 16 bii;
(EA) - octetul cu adresa de offset egal cu EA;
(EA + 1, EA) - cuvntul cu adresa de offset egal cu EA;
( nume_reg ) - octetul adresat indirect prin registrul de 16 bii indicat;
(nume_ reg + 1, nume_reg ) - cuvntul adresat indirect prin registrul indicat;
SRC - notaie general pentru o surs de date: DATA8, DATA16, M8, M16, (EA), (EA+1, EA),
nume_reg, (nume_reg), (nume_ reg + 1, nume_reg );
DST - notaie general pentru o destinaie a datelor: M8, M16, (EA), (EA+1, EA), nume_reg,
(nume_reg), (nume_ reg + 1, nume_reg );
EA - adresa efectiv; FA - adresa fizic.
1. Instruciuni pentru transferul datelor
n aceast categorie se ncadreaz urmtoarele tipuri de instruciuni: instruciuni de transfer
de tip "clasic", instruciuni pentru ncrcarea adreselor i instruciuni pentru transferul valorilor
indicatorilor de condiie.
mov
M16, SR
; M16 <---SR
Observaii:
a. Nu este permis execuia unei instruciuni MOV de forma:
; ncarc un registru segment cu un operand imediat.
mov SR, DATA16
b. Nu se pot transfera direct date ntre dou locaii de memorie sau ntre dou registre segment.
Exemple de utilizare a instruciunilor MOV
t_data SEGMENT
; Segmentul de date
cuvint1
dw 0ffffh
cuvint2
dw 0f0fh
octet1
db 55h
t_data ENDS
; Sfritul segmentului de date
stiva SEGMENT STACK
; Segmentul de stiv
DB
256 DUP (?)
; Definete spaiul stiv
s_data
EQU $
; Definete vrful stivei
stiva ENDS
; Sfritul segmentului de stiv
code SEGMENT
; Numele segmentului de cod
ASSUME
cs: code, ds: t_data, ss: stiva ; Asignarea segmentelor
START:
; Modulul principal ncepe de la locaia START
mov ax, t_data
; Adresa lui t_data n AX
mov ds, ax
mov ax, stiva
; Adresa lui stack n AX
mov ss, ax
mov sp, OFFSET s_data
; Stabilete SP
; Transfer imediat de date in registre
mov ax, 0ffffh
mov bl, '0'
; Codul ASCII pe 8 bii al lui 0 trece n reg. BL
; Transfer registru - registru (16 biti)
mov bx, ax
mov cx, bx
mov dx, cx
; Transfer registru - registru (8 biti)
mov al, 0
; Data 0 trece n registrul AL
mov bl, al
mov cl, bl
mov dl, cl
; Transfer registru - memorie
mov ax, cuvint1
; Coninutul locaiei cuvnt1 trece n reg. AX
mov dl, BYTE PTR cuvint2
; Transfer din memorie cu adresare indirecta
mov bx, OFFSET octet1
; Adresa de offset a variabilei octet1 trece n reg. BX
mov al, [bx]
; Transfer memorie - memorie (trebuie utilizat un registru in doua etape)
mov bx, cuvint2
; Urmtoarele 4 instruciuni interschimb ntre ele
mov ax, cuvint1
; coninutul celor dou cuvinte din memorie
mov cuvint2, ax
mov cuvint1, bx
mov cx, SIZE cuvint1
; Mrimea operandului (CX = 2)
mov ah, 4ch
; Revenire n MS-DOS
int
21h
code ENDS
; Sfritul segmentului de cod
end
START
; Sfritul programului
2 - 12
b) Instruciunile PUSH i POP sunt instruciuni de lucru cu stiva. Stiva este o zon special de
memorie n care se memoreaz date n ordinea invers folosirii acestora (este o memorie de tip
LIFO). O astfel de situaie apare de exemplu n cazul salvrii i refacerii contorillor din buclele
incuibate.
BUCLA1
BUCLA2
Call BUCLA2
ARB1
STIVA
BUCLA3
Call BUCLA3
ARB2
SP-4
ARB2
SP-2
ARB1
SP
RET
RET
Accesul la aceast zon se face printr-un registru special numit indicator (pointer) de stiv SP care
este gestionat de procesor prin mecanisme hardware. n lucrul cu stiva sunt permise dou operaii:
operaia de depunere n stiv: PUSH i operaia de extragere din stiv: POP.
Adresa ultimului element depus n stiv se afl totdeauna memorat n SP i se numete vrful
stivei. La microprocesoarele I8086/I8088, adresa fizic a vrfului stivei este dat de perechea
SS:SP. Coninutul lui SS d limita inferioar a stivei, numindu-se baza stivei. Stiva poate fi
considerat ca ocupnd zona de memorie limitat inferior de SS*1610 i superior de SS*1610 +
valoarea iniial a registrului SP.
Adrese mici
SP
Instruciunea:
PUSH SRC
; SP <--- SP - 2, (SP + 1, SP) <--- SRC
transfer n vrful stivei cuvntul precizat prin operandul SRC. Se poate utiliza sub forma:
; Salveaz pe stiv coninutul unui registru de 16 bii, R16
; Salveaz pe stiv coninutul locaiei de memorie avnd adresa relativ
; precizat n instruciune
push SR
; Salveaz pe stiv coninutul unui registru segment
La fiecare salvare pe stiv, indicatorul SP se decrementeaz cu 2.
push
push
R16
M16
2 - 13
Instruciunea:
POP DST
; DST <--- (SP + 1, SP), SP <--- SP + 2
reface din vrful stivei cuvntul precizat n operandul DST. Se poate utiliza sub forma:
; Reface din stiv coninutul unui registru de 16 bii, R16
pop R16
pop M16
; Reface din stiv coninutul locaiei de memorie avnd adresa relativ
; precizat n instruciune
pop SR
; Reface din stiv coninutul unui registru segment (SR nu poate fi CS)
La fiecare extragere din stiv, indicatorul SP se incrementeaz cu 2.
Observaie: Se poate executa o instruciune
push cs
; Salvare registru segment de cod
dar nu se poate executa o instruciune
pop cs.
ncrcarea registrului CS prin intermediul stivei se poate face numai executnd o instruciune de
rentoarcere dintr-o procedur n context FAR.
Accesul la informaiile memorate n stiv se poate face i fr descrcarea stivei, utiliznd
adresarea bazat n felul urmtor:
; Secven de memorare informaii n stiv
mov bp, sp
; Se precizeaz "baza stivei"
push ax
; SP = SP - 2
push bx
; SP = SP - 4
push cx
; SP = SP - 6
; Secven de acces la informaiile memorate n stiv
mov ax, [bp-2]
; Prima informaie introdus n stiv
mov bx, [bp-4]
; A doua informaie introdus n stiv
mov cx, [bp-6]
; Ultima informaie introdus n stiv
.................................
add
sp, 6
; Se descarc stiva
c) Instruciunea XCHG DST, SRC are ca efect interschimbarea coninutului sursei cu cel al
destinaiei. Instruciunea poate fi folosit sub forma:
; R8 <----> R8
XCHG
R8 , R8
XCHG
R 8 , M8
; R8 <----> M8
XCHG
R16, R16
; R16 <----> R16
XCHG
R16, M16
; R16 <----> M16
Observaie: Nu se pot utiliza drept operatori registrele de segment.
Exemplu: Interschimbarea coninutului a doi operanzi din memorie op1 i op2 se poate face prin
secvena:
mov R, op1
xchg R, op2
mov op1, R
unde R este un registru pe 8 sau 16 bii, funcie de lungimea operanzilor.
d) Instruciunea XLAT (Translate Byte to AL) translateaz (convertete) valoarea registrului AL,
adic o nlocuiete cu un octet dintr-un tabel a crui adres de nceput se afl n registrul BX.
Indexul n acest tabel este tocmai valoarea lui AL ( AL <--- [BX + AL]).
Exemple:
1. S considerm urmtoarea codificare pentru cifrele zecimale de la 0 la 9 (codul 2 din 5
folosit n telefonie):
0 --> 1 1000
5 --> 0 1010
1 --> 0 0011
6 --> 0 1100
2 - 14
2 --> 0 0101
7 --> 1 0001
3 --> 0 0110
8 --> 1 0010
4 --> 0 1001
9 --> 1 0100
S presupunem c dorim s convertim cifra 6 ntr-un cod "2 din 5". Programul trebuie s conin
instruciunile:
mov bx, OFFSET TABEL ; Se plaseaz n BX adresa de nceput a tabelei cu codurile "2
; din 5"
mov al, 6
;
xlat
; n AL se va gsi codul cifrei 6, adic 00001100b
Observaie: Pentru ca instruciunile s fie executate este necesar ca TABEL (tabelul de conversie)
s se afle n segmentul de date curent.
2. Conversia unei valori numerice cuprins ntre 0 i 15 n cifrele hexazecimale
corespunztoare, se poate face prin:
tabel DB
'0123456789abcdef'
...............
mov bx, OFFSET tabel
mov al, 11
xlat
; n registrul AL se va depune cifra hexazecimal b
se ncarc n registrul DS, respectiv ES i n registrul R16 specificat n instruciune adresa aflat n
memorie la adresa efectiv EA a operandului referit n instruciune. Cei patru octei aflai n
memorie la aceast adres sunt interpretai ca o adres de tip pointer. Astfel, valoarea coninut n
2 - 15
primii doi octei (componenta de offset) se ncarc n registrul R16, iar valoarea coninut n
urmtorii doi octei (componenta de segment) se ncarc n registrul DS, respectiv ES.
Flow
Fhigh
x
OF
DF IF
TF SF ZF
AF x
SF ZF
PF x
PF x
CF F (Flags)
astfel:
AH
AF x
CF Flow
SAHF
b)
; Store AH in Flags
ncarc n octetul inferior al registrului F, registrul AH , astfel:
Flow
SF
ZF x
AF x
PF x
CF
AH
(CF = 0)
(CF = 1)
(CF = CF )
(DF = 1)
(DF = 0)
(IF = 1); Activeaz sistemul de ntreruperi
(IF = 0); Dezactiveaz sistemul de ntreruperi
add | adc
R16, R16
; R16 <--- R16
; R16 <--- R16
add | adc
R16, M16
; M16 <--- M16
add | adc
M16, R16
add | adc
R8, DATA8 ; R8 <--- R8
add | adc
M8, DATA8 ; M8 <--- M8
add | adc
R16, DATA16 ; R16 <--- R16
add | adc
M16, DATA16 ; M16 <--- M16
Indicatorii afectai sunt: AF, CF, PF, SF, ZF, OF
+ R16 | + CF
+ M16 | + CF
+ R16 | + CF
+ DATA8
+ DATA8
+ DATA16
+ DATA16
| + CF
| + CF
| + CF
| + CF
Observaii:
a. Pentru instruciunile SUB (SUBtract) i SBB SuBtract with Borrow) sunt permise
aceleai tipuri de operanzi ca i la instruciunile ADD i ADC (ADd with Carry);
b. Operaiile se execut cu operanzi pe 8 sau 16 bii, cu sau fr semn. Cei doi operanzi
trebuie s aib aceeai dimensiune (acelai tip). Numerele fr semn sunt interpretate n notaie
binar direct, iar numerele cu semn, n complement fa de 2.
c. Instruciunile ADD i SUB se utilizeaz pentru efectuarea calculelor cu operanzi n
simpl precizie, adic cu operanzi reprezentai pe cte un cuvnt.
Exemplu: Dac operanzii x, y, z sunt n simpl precizie, urmtoarea secven de
instruciuni calculeaz valoarea x+y+100-z i depune rezultatul n w:
mov ax, x
add
ax, y
add
ax, 100
sub
ax, z
mov w, ax
Dac pentru reprezentarea operanzilor se utilizeaz mai multe cuvinte spunem c avem o
reprezentare multipl precizie. Pentru efectuarea de calcule multipl precizie se utilizeaz
instruciunile ADC i SBB.
Exemplu: Secvena de instruciuni corespunztoare adunrii a dou numere scrise n dubl
precizie, plasate la adresele n1_dp i n2_dp, cu depunerea rezultatului la adresa n3_dp este:
n1_dp DD
12345678h
n2_dp DD
98765432h
rez
DD
?
...............
clc
mov ax, WORD PTR n1_dp
; AX <--- c.m.p.s. cuvnt al lui n1_dp
add
ax, WORD PTR n2_dp
; AX <--- AX + c.m.p.s. cuvnt al lui n2_dp
mov WORD PTR rez, ax
; c.m.p.s. cuvnt al rezultatului se depune la adresa rez
mov ax, WORD PTR n1_dp+2 ; AX <--- c.m.s. cuvnt al lui DP1
adc
ax, WORD PTR n2_dp+2 ; AX <--- AX + c.m.s. cuvnt al lui DP2
mov rez+2, ax
; c.m.s. cuvnt al rezultatului se depune la adresa rez
n cazul operanzilor cu semn, se pot efectua i operaii aritmetice mixte cu numere de
precizii diferite. Pentru aceasta se vor utiliza instruciuni pentru extinderea semnului operandului.
Exemplu: Se dorete adunarea unui numr reprezentat pe 8 bii plasat la adresa n1 cu un numr
reprezentat pe 16 bii plasat la adresa n2, cu depunerea rezultatului la adresa rez. Se poate utiliza
urmtorul set de instruciuni:
n1
DB
-45
n2
DW 150
rez
DW ?
..............
mov al, n1
cbw
;Se convertete octetul la cuvnt
add
ax, n2
mov rez, ax
b)
CWD
; Convert Word to Double word
Realizeaz conversia cuvntului cu semn coninut n registrul AX, n dublul-cuvnt cu semn
coninut n registrele (DX, AX) prin extinderea bitului de semn al registrului AX la toi biii
registrului DX, astfel: dac AX15 = 0, atunci DX = 0000h, iar dac AX15 = 1, atunci DX = ffffh.
Observaie: Instruciunile CBW i CWD nu afecteaz indicatorii de condiie.
Exemplu: Urmtoarea secven de program adun un numr plasat n registrul BX reprezentat n
simpl precizie cu un numr n dubl precizie plasat la adresa d_p. Rezultatul se depune la adresa
rez:
d_p DD
12345678h
rez
DD
?
...............
clc
; CF = 0
mov bx, 0ABCDh
mov ax, bx
;
cwd
; Se convertete cuvntul la dublu_cuvnt
add
ax, WORD PTR d_p
;
mov WORD PTR rez, ax
;
adc
dx, WORD PTR d_p+2
;
mov WORD PTR rez+2, dx
;
dec
dec
dec
al
BYTE PTR VAR
WORD PTR VAR
Observaii:
a) Instruciunile INC i DEC nu afecteaz flagul CF;
b) Instruciunile INC i DEC se execut modulo valoarea lui R sau M.
De exemplu, dac AL = 0ffh i se execut inc AL, atunci dup execuia instruciunii, AL = 00h.
Dac BX = 0000h i se execut dec BX, atunci dup execuia instruciunii, BX = 0ffffh.
b) Instruciuni de negare
NEG DST
; NEGate
DST <--- - (DST) = (DST)2
Schimb semnul operandului DST, sau, altfel spus realizeaz complementarea aritmetic a acestuia.
Forme de utilizare:
neg
R
; Se schimb semnul coninutului registrului general R, unde R poate fi R8
; sau R16
neg
M
; Se schimb semnul coninutului locaiei de memorie adresat prin M, unde
; M poate fi M8 sau M16.
Exemple:
neg
al
; Presupunnd c AL = -1 adic 11111111b, instruciunea neg al, va nscrie
; n AL valoarea +1, adic 00000001b
neg
BYTE PTR VAR
c) Instruciuni de comparare
CMP DST, SRC
; CoMPare
(DST) - (SRC)
Se compar, prin scdere, coninutul operandului surs cu coninutul operandului destinaie, fr
modificarea operanzilor i fr depunerea rezultatului, dar cu poziionarea corect a indicatorilor de
condiie. Sunt posibile urmtoarele forme de utilizare:
; Se compar coninutul a dou registre generale de 8 bii
cmp R8, R8
; Se compar coninutul a dou registre generale de 16 bii
cmp R16, R16
; Se compar coninutul unui registru general de 8 bii cu coninutul
cmp R8, M8
; unei locaii de memorie adresat prin M8
cmp R16, M16
; Se compar coninutul unui registru general de 16 bii cu coninutul
; unei locaii de memorie
cmp R8, DATA8 ; Se compar coninutul unui registru de 8 bii cu un operad imediat
; pe 8 bii
cmp R16, DATA16 ;
cmp M8, DATA8 ;
cmp M16, DATA16 ;
Indicatorii afectai sunt: AF, CF, PF, SF, ZF, OF.
Observaie: Instruciunnea CMP este urmat, de obicei, de o instruciune de salt condiionat, care
testeaz bistabilii de condiie pentru a verifica dac relaia din condiia testat a fost satisfcut.
Starea bistabililor de condiie trebuie interpretat diferit, dup cum ceea ce se compar sunt
numere fr semn, sau numere cu semn. Astfel, dac numerele sunt fr semn:
CF = 0 i
ZF = 0,
dac (DST) > (SRC)
CF = 0 i
ZF = 1,
dac (DST) = (SRC)
CF = 1 i
ZF = 0,
dac (DST) < (SRC)
Pentru numere cu semn:
SF = OF,
dac (DST) > (SRC)
ZF = 1,
dac (DST) = (SRC)
2 - 19
Exemple:
cmp
cmp
cmp
cmp
SF OF,
bx, cx
dh, ALPHA
[bp+2], si
cx, 100h
dac
;
;
;
;
Exemple:
mul
mul
mul
mul
R8
M8
R16
M16
mul
mul
mul
mul
bl
; AX <--- AL*BL
BYTE PTR ALPHA[si]
; AX <--- AL*(ALPHA[SI])
bx
; (DX, AX) <--- AX*BX
WORD PTR ALPHA[si]
; (DX, AX) <--- AX*(ALPHA[SI])
IMUL SRC
; Integer MULtiply accumulator by register or memory
Instruciunea IMUL are aceleai forme ca i instruciunea MUL, deosebirea dintre cele dou
instruciuni constnd n faptul c IMUL opereaz asupra unor operanzi cu semn.
Exemple:
imul cl
; AX <--- AL*CL
imul BYTE PTR BETA[si]
; AX <--- AL*(BETA[SI])
imul bx
; (DX,AX) <--- AX*BX
imul WORD PTR BETA[si]
; (DX, AX) <--- AX*(BETA[SI])
b)
Observaie: Pentru o instruciune de nmulire cu semn, dac octetul (cuvtul) cel mai semnificativ
al rezultatului nu este extensia de semn al octetului (cuvtului) cel mai puin semnificativ al
rezultatului, atunci att CF ct i OF vor fi poziionai pe 1, altfel sunt poziionai pe 0.
Exemplul 1:
n1
DB
20h
n2
DW 200h
rez1 DW ?
rez2 DD
?
...............
mov al, 10h
mul n1
; nmulire pe octet, (AX) <---- (AL)*(n1)
mov rez1, ax
mov ax, 10h
mul n2
; nmulire pe cuvnt, (DX,AX) <---- (AX)*(n2)
mov WORD PTR rez2, ax;
mov WORD PTR rez2+2, dx;
Exemplul 2:
Fie:
div
div
div
div
R8
M8
R16
M16
; AL
; AL
; AX
; AX
<--- AX / R8 = ct ;
AH <--- (AX) MOD (R8) = rest
<--- AX / M8 = ct ;
AH <--- (AX) MOD (M8) = rest
<--- (DX, AX) / R16 = ct ; DX <--- (DX, AX) MOD (R16) = rest
<--- (DX, AX) / M16 = ct ; DX <--- (DX, AX) MOD (M16) = rest
b)
IDIV SRC
; Integer DIVide, signed
Instruciunea IDIV are aceleai forme ca i instruciunea DIV, deosebirea dintre cele dou
instruciuni constnd n faptul c IDIV opereaz asupra unor operanzi cu semn. Restul are acelai
semn ca i dempritul.
Observaii:
1. Dup efectuarea operaiilor de mprire, indicatorii AF, CF, OF, PF, SF, ZF sunt
nedefinii.
2. La obinerea unui ct care nu ncape n destinaie, eroarea de depire conduce la o
ntrerupere pe nivel 0 i rezultat nedefinit:
- Pentru instruciunea DIV SRC, depirea apare cnd:
- ctul > 0FFh, dac mprirea se face pe octet;
- ctul > 0FFFFh, dac mprirea se face pe cuvnt.
- Pentru instruciunea IDIV SRC, depirea apare cnd:
- ctul > 07Fh, dac mprirea se face pe octet;
- ctul > 07FFFh, dac mprirea se face pe cuvnt.
AX = 400h = 102410 n ambele reprezentri (cu semn i fr semn)
180 10 in reprezentare fara semn
BL = 0B4h =
76 10 in reprezentare cu semn
Instruciunea DIV BL ne conduce la : AL = 05h (ctul); AH = 7Ch = 12410 (restul);
Instruciunea IDIV BL ne conduce la : AL = 0F3h = -1310 (ctul); AH = 24h = 3610 (restul).
Exemplu:
Fie:
2 - 21
DAA
; Decimal Adjust after Addition
Instruciunea realizeaz corecia zecimal a rezultatului obinut, n registrul AL, dup
adunarea a doi operanzi n format BCD mpachetat. Rezultatul corect (n format BCD mpachetat)
rmne n AL. Corecia rezultatului se face n funcie de valoarea bistabilelor de condiie AF i CF,
astfel:
Dac (AL0-3) > 9 sau AF = 1, atunci
{ (AL) <--- (AL) + 6
AF <--- 1
}
Dac (AL4-7) > 9 sau CF = 1, atunci
{ (AL) <--- (AL) + 60h
CF <--- 1
}
b)
DAS
; Decimal Adjust after Subtraction
Instruciunea realizeaz corecia zecimal a rezultatului obinut, n registrul AL, dup
scderea a doi operanzi n format BCD mpachetat. Rezultatul corect (n format BCD mpachetat)
rmne n AL. Corecia rezultatului se face n funcie de valoarea bistabilelor de condiie AF i CF,
astfel:
Dac (AL0-3) > 9 sau AF = 1, atunci
{ (AL) <--- (AL) - 6
AF <--- 1
}
Dac (AL4-7) > 9 sau CF = 1, atunci
{ (AL) <--- (AL) - 60h
CF <--- 1
}
Observaie. n aritmetica BCD mpachetat nu se pot executa direct operaii de nmulire i
mprire.
Exemple:
- Reprezentare n cod BCD
0001 1010 in binar
Numrul 2610 =
0010 0110 in cod BCD
a) Adunare n format BCD
a1)
34 = 0011 | 0100 +
25 = 0010 | 0101
-------------------59 = 0101 | 1001 +
6 = 0000 | 0110 (corecia)
-------------------65 = 0101 | 1111 (AF = 0)
2 - 22
34 = 0011 | 0100 +
29 = 0010 | 1001
-------------------5? 0101 | 1101 +
6 = 0000 | 0110 (corecia)
-------------------63 = 0110 | 0011 (AF = 1)
Rezultatul 63 este corect deoarece dup adunarea cifrei 6, indicatorul AF = 1.
AAA
AAS
; ASCII Adjust after Subtraction
Instruciunea realizeaz corecia zecimal a rezultatului obinut, n registrul AL, dup
scderea a doi operanzi n format BCD nempachetat. Rezultatul corect, n format BCD
nempachetat este depus n registrele AH i AL, astfel:
Dac (AL0-3) > 9 sau AF = 1, atunci
{ (AL) <--- (AL) - 6
(AH) <--- (AH) - 1
AF <--- 1
CF <--- 1
(AL) <--- (AL) AND 0Fh
}
c)
AAM
; ASCII Adjust after Multiplication
Instruciunea realizeaz corecia zecimal a rezultatului obinut, n registrul AL, dup
nmulirea a doi operanzi n format BCD nempachetat. nmulirea se face cu MUL, iar rezultatul
corect, n format BCD nempachetat este depus n registrele AH i AL, astfel:
(AH) <--- (AL) / 10
(AL) <--- (AL) MOD 10
Exemplu:
mov al, 7
mov bl, 9
mul bl
; n AX se va obine valoare 003Fh
aam
; n AX se va obine valoare 0603 (rezultat corect)
d)
AAD
; ASCII Adjust before Division
Instruciunea realizeaz corecia zecimal a dempritului naintea mpririi a doi operanzi
n format BCD nempachetat. mprirea se face cu DIV, rezultatul din AL corectat, n format BCD
nempachetat fiind depus n registrele AH i AL, astfel:
(AL) <--- (AH) * 10 +(AL)
(AH) <--- 0
Exemplu: Urmtoarea secven de program calculeaz expresia UP1+UP2-UP3, numerele fiind
reprezentate pe cte 2 cifre zecimale n aritmetica BCD nempachetat, rezultatul depunndu-se n
registrul DX:
mov al, BYTE PTR UP1
; C.m.p.s. cifr a lui UP1 n AL
add
al, BYTE PTR UP2
; C.m.p.s. cifr a lui UP1+UP2 n AL
aaa
; Corecie BCD
mov dl, al
; C.m.p.s. cifr a lui UP1+UP2 n DL
mov al, BYTE PTR UP1+1
; C.m.s. cifr a lui UP1 n AL
adc
al, BYTE PTR UP2+1
; C.m.s. cifr a lui UP1+UP2 n AL
aaa
; Corecie BCD
2 - 24
xchg
al, dl
sub
aas
xchg
sbb
aas
mov
al,dl
dh, al
Deoarece se lucreaz implicit cu registrul AL, se observ c la fiecare pas se trateaz cte o
singur cifr.
2 - 25
JMP
2.
JMP
3.
JMP
Exemplu:
etichet
Semnificaii:
Jmp de tip SHORT: (IP) <--- (IP) + distana dintre offsetul instruciunii curente i cel al
operandului
Jmp de tip NEAR:
(IP) <--- Offsetul adresei operandului
Jmp de tip FAR:
(IP) <--- Offsetul adresei operandului
(CS) <--- Segmentul adresei operandului
4.2. Instruciuni de salt condiionat
Instruciunile de salt condiionat se folosesc, de obicei, mpreun cu instruciunile de
comparare (CMP DST, SRC), care determin relaia dintre dou numere. n prima etap,
2 - 26
Condiie ndeplinit ?
DA
Se execut
saltul
IP <--- IP + DEPL
Dac se execut saltul, adresa efectiv de salt se determin efectund suma dintre coninutul
actual al registrului IP i un deplasament cu semn pe 8 bii, care prin extindere de semn devine un
deplasament pe 16 bii. Deoarece instruciunile de salt au o distan de salt limitat de intervalul
[-128, +127], saltul la o instruciune din afara acestui domeniu se poate realiza prin efectuarea unui
salt condiionat urmat de un salt necondiionat la instruciunea dorit.
Observaie: Trebuie fcut distincia ntre "mai mare" i "mai mic" n cazul numerelor cu semn i
fr semn. Astfel, dac se compar dou numere cu semn, se folosesc termenii "less than" (mai mic
dect) i "greater than" (mai mare dect), iar dac se compar dou numere fr semn, se folosesc
termenii "below" (inferior, sub) i "above" (deasupra, peste, superior).
Exist urmtoarele instruciuni de salt condiionat:
a) Pentru numere cu semn:
1.
JL / JNGE
etichet
; Jump if less / not greater nor equal (SF OF) = 1
Salt dac DST < SRC
2.
JLE / JNG
etichet
; Jump if less or equal / not greater ((SF OF) ZF) = 1
Salt dac DST SRC
3.
JNL / JGE
etichet
; Jump if not less / greater or equal (SF OF) = 0
Salt dac DST SRC
4.
JNLE / JG
etichet
; Jump if not less nor equal / greater ((SF OF) ZF) = 0
Salt dac DST > SRC
5.
JNO
etichet
; Jump if no overflow (OF = 0)
Salt dac nu exist depire
6.
JO
etichet
; Jump if overflow (OF = 1)
Salt dac exist depire
7.
JS
etichet
; Jump if sign (SF = 1)
Salt dac numrul este negativ
8.
JNS
etichet
; Jump if not sign (SF = 0)
Salt dac numrul este pozitiv
b) Pentru numere fr semn
9.
JB / JNAE / JC etichet
Salt dac DST < SRC
10.
JBE / JNA
etichet
Salt dac DST SRC
11.
JNB / JAE / JNC etichet ; Jump if not below / above or equal / not carry (CF = 0)
Salt dac DST SRC
12.
JNBE / JA
etichet
; Jump if not below nor equal / above (CF ZF) = 0
Salt dac DST > SRC
c) Alte categorii
13.
JC
etichet
; Jump if carry set (CF = 1)
Salt dac flagul CF a fost setat
14.
JNC
etichet
; Jump if no carry (CF = 0)
Salt dac flagul CF nu a fost setat
15.
JZ / JE
etichet
; Jump if zero / equal (ZF = 1)
Salt dac DST = SRC
16.
JNZ / JNE
etichet
; Jump if not zero / not equal (ZF = 0)
Salt dac DST SRC
17.
JP / JPE
etichet
; Jump if parity / parity even (PF = 1)
Salt dac paritate par
18.
JNP / JPO
etichet
; Jump if no parity / parity odd (PF = 0)
Salt dac paritate impar
19.
JCXZ
etichet
; Jump if CX = 0
Salt la eticheta dac CX = 0, unde etichet [-128, 127] faa de (IP).
Exemplu: Dac se lucreaz cu numere fr semn, atunci dup execuia instruciunilor
mov ax, 0FFFFh
mov bx, 2
cmp ax, bx
ja
Etic
se va produce saltul la eticheta Etic, deoarece 0FFFFh > 2.
Dac se lucreaz cu numere cu semn, atunci dup execuia instruciunilor
mov ax, 0FFFFh
mov bx, 2
cmp ax, bx
Etic
jg
nu se va produce saltul la eticheta Etic, deoarece 0FFFFh < 2.
4.3. Instruciuni pentru controlul ciclurilor (Bucle)
Schema de construcie a buclelor cu test final este urmtoarea:
(Numrtor) <---- Numr iteraii
CORP BUCL
(Numrtor) <----- (Numrtor) -1
NU
(Numrtor) = 0 ?
DA
2 - 28
Dac drept numrtor se utilizeaz registrul CX, iar variabila N conine numrul de repetiii
(iteraii) schema devine:
BEGIN:
mov cx, N
---------------------------------------------------------------dec
cx
jnz
BEGIN
CORP
BUCL
Instruciunea LOOP a fost gndit pentru a simplifica aceast scriere. Astfel rescrierea
secvenei anterioare cu instruciunea LOOP este urmtoarea:
BEGIN:
mov cx, N
---------------------------------------------------------------LOOP
CORP
BUCL
BEGIN
LOOP
etichet
; Loop until count complete
Se execut salt repetat la operandul etichet att timp ct coninutul registrului CX este
nenul. Instruciunea funcioneaz dup structura din Fig. 4.2.
CX <--- CX - 1
Execut instruciunea
urmtoare
DA
CX = 0
NU
Salt la etichet
IP <--- IP + DEPL8
Figura 4.2.
2.
LOOPZ/LOOPE
etichet
; Conditional LOOP
Se execut salt repetat la operandul etichet att timp ct coninutul registrului CX este
nenul i indicatorul de condiie ZF = 1. Instruciunea funcioneaz dup structura din Fig. 4.3.
CX <--- CX - 1
DA
Execut instruciunea
urmtoare
CX = 0
NU
NU
Figura 4.3.
3.
ZF = 1
DA
Salt la etichet
IP <--- IP + DEPL8
LOOPNZ/LOOPNE etichet
Se execut salt repetat la operandul etichet att timp coninutul registrului CX este nenul i
indicatorul de condiie ZF = 0. Instruciunea funcioneaz dup o structur identic cu cea din Fig.
4.3, singura diferen fiind c se testeaz ZF = 0 n loc de ZF = 1.
2 - 29
2 - 30
; Logical AND
; Logical OR
; Exclusive OR
realizeaz operaiile logice SI, SAU i SAU EXCLUSIV, bit cu bit, ntre coninutul operandului
surs SRC i coninutul operandului destinaie DST, rezultatul depunndu-se n destinaia DST,
sursa nefiind afectat. Pentru aceste instruciuni sunt permise urmtoarele tipuri de operanzi:
; R8 <--- R8 R8
and | or | xor R8, R8
and | or | xor R8, M8
; R8 <--- R8 M8
and | or | xor M8, R8
; M8 <--- M8 R8
and | or | xor R16, R16
; R16 <--- R16 R16
and | or | xor R16, M16
; R16 <--- R16 M16
and | or | xor M16, R16
; M16 <--- M16 R16
and | or | xor R8, DATA8 ; R8 <--- R8 DATA8
and | or | xor M8, DATA8 ; M8 <--- M8 DATA8
and | or | xor R16, DATA16 ; R16 <--- R16 DATA16
and | or | xor M16, DATA16 ; M16 <--- M16 DATA16
; DST SRC;
TEST
AX
15 14 13 12 11 10 9
5 4
TASK2:
TASK1:
TASK3:
not
ax
test
ax, 4002h
jz
TASK1
test
ax, 0280h
jz
TASK1
not
ax
test
ax, 0018h
jnz
TASK3
----------------------------------------------------------------------------------------------------------------------------------------------------------
Instruciunile logice pot fi utilizate i pentru simularea unor scheme logice combinaionale.
5.2. Instruciuni logice pentru deplasare i rotaie
Instruciunile de deplasare i rotaie lucreaz pe octei sau cuvinte. Deplasarea (logic sau
aritmetic) sau rotaia spre stnga sau spre dreapta se poate efectua cu o singur poziie (un bit) sau
cu un numr de poziii (bii) specificat n registrul CL. Exist urmtoarele instruciuni de deplasare
i de rotaie:
a)
SHL DST, 1
SHL DST, CL
Observaie: Pentru toate instruciunile din acest paragraf, DST poate fi coninutul unui registru
general pe 8 sau 16 bii, R8 respectiv R16 sau coninutul unei locaii de memorie de 8 sau 16 bii, M8
respectiv M16 .
Forme de utilizare:
SHL R, 1
; R <---- R*2
SHL M, 1
; M <---- M*2
Dup execuia instruciunii, flagul CF va conine bitul c.m.s. al registrului R sau locaiei de
memorie M.
SHL R, CL
; R <---- R*2(CL)
SHL M, CL
; M <---- M*2(CL)
Dup execuia instruciunii, flagul CF va conine ultimul bit deplasat spre stnga al registrului R sau
locaiei de memorie M.
2 - 32
b)
SHR DST, 1
SHR DST, CL
Forme de utilizare:
SHR R, 1
; R <---- R/2
SHR M, 1
; M <---- M/2
Dup execuia instruciunii, flagul CF va conine bitul c.m.p.s. al registrului R sau locaiei de
memorie M.
Exemplu: Dac AL = 00001011b = 11, dup execuia execuiei shr al,1 flagul CF = 1, iar AL =
00000101b.
SHR R, CL
; R <---- R/2(CL)
SHR M, CL
; M <---- M/2(CL)
Dup execuia instruciunii, flagul CF va conine ultimul bit deplasat spre dreapta al registrului R
sau locaiei de memorie M.
c)
DST, 1
; Deplasare aritmetic stnga a operandului DST cu 1 poziii
DST, CL
; Deplasare aritmetic stnga a operandului DST cu (CL) poziii
Observaie: Instruciunea SAL DST, 1 (CL) este analoag instruciunii SHL DST, 1 (CL).
SAL
SAL
d)
SAR DST, 1
; Deplasare aritmetic dreapta a operandului DST cu 1 poziii
SAR DST, CL
; Deplasare aritmetic dreapta a operandului DST cu (CL) poziii
Observaie: Instruciunea SAR DST, 1 (CL) este analoag instruciunii SHR DST, 1 (CL) cu
precizarea c aceasta din urm se aplic operanzilor cu semn (din aceast cauz, semnul
operandului se pstreaz).
e)
ROL DST, 1
; Rotire la stnga (cu carry) a operandului DST cu 1 poziii
ROL DST, CL
; Rotire la stnga (cu carry) a operandului DST cu (CL) poziii
Forme de utilizare:
ROL R, 1
;
ROL M, 1
;
Bitul c.m.s. al registrului R sau a locaiei de memorie M se deplaseaz n flagul CF i n poziia
bitului c.m.p.s. al registrului R sau a locaiei de memorie M.
ROL R, CL
;
ROL M, CL
;
Dup execuia instruciunii, flagul CF precum i bitul c.m.p.s. al registrului R sau a locaiei de
memorie M va conine ultimul bit deplasat spre stnga al registrului R sau locaiei de memorie M.
f)
ROR DST, 1
; Rotire la dreapta (cu carry) a operandului DST cu 1 poziii
ROR DST, CL
; Rotire la dreapta (cu carry) a operandului DST cu (CL) poziii
Forme de utilizare:
ROR R, 1
;
ROR M, 1
;
Bitul c.m.p.s. al registrului R sau a locaiei de memorie M se deplaseaz n flagul CF i n poziia
bitului c.m.s. al registrului R sau a locaiei de memorie M.
ROR R, CL
;
ROR M, CL
;
Dup execuia instruciunii, flagul CF precum i bitul c.m.s. al registrului R sau a locaiei de
memorie M va conine ultimul bit deplasat spre dreapta al registrului R sau a locaiei de memorie
M.
g)
RCL DST, 1
RCL DST, CL
Forme de utilizare:
RCL R, 1
;
RCL M, 1
;
Bitul c.m.s. al registrului R sau a locaiei de memorie M se deplaseaz n flagul CF, iar vechiul
coninut al lui CF se deplaseaz n poziia bitului c.m.p.s. al registrului R sau a locaiei de memorie
M.
RCL R, CL
;
RCL M, CL
;
Dup execuia instruciunii, flagul CF va conine ultimul bit deplasat spre stnga al registrului R sau
locaiei de memorie M, iar CF se deplaseaz n poziia bitului c.m.p.s. al registrului R sau a locaiei
de memorie M.
h)
RCR DST, 1
; Rotire la dreapta prin carry a operandului DST cu 1 poziii
RCR DST, CL
; Rotire la dreapta prin carry a operandului DST cu (CL) poziii
Forme de utilizare:
RCR R, 1
;
RCR M, 1
;
Bitul c.m.p.s. al registrului R sau a locaiei de memorie M se deplaseaz n flagul CF, iar vechiul
coninut al lui CF se deplaseaz n poziia bitului c.m.s. al registrului R sau a locaiei de memorie
M.
ROR R, CL
;
ROR M, CL
;
Dup execuia instruciunii, flagul CF va conine ultimul bit deplasat spre dreapta al registrului R
sau a locaiei de memorie M, iar CF se deplaseaz n poziia bitului c.m.s. al registrului R sau a
locaiei de memorie M.
Observaii:
a. Instruciunile de deplasare logic i aritmetic afecteaz toi indicatorii de condiie;
b. Instruciunile de rotire afecteaz numai fanioanele CF i OF.
Cei opt operatori de mai sus sunt sugestiv prezentai n Fig. 5.1.
Exemplul 1: Urmtoarea secven de program realizeaz conversia unui numr reprezentat n
format BCD nempachetat, avnd 16 cifre zecimale, n format mpachetat. Precizm c numrul
nempachetat se afl memorat ncepnd de la adresa UNPCK, iar cel mpachetat, ncepnd de la
adresa PCK.
UNPCK
DB
1,2,4,0,7,8,9,0,6,7,9,1,2,5,8,3
PCK
DB
8 DUP (?)
...........................
mov dx, 8 ; DX conine numrul cuvintelor cu numere nempachetate
mov cl, 4
mov si, 0 ; SI = 0
mov di, si ; DI = 0
CONVERT: mov ax, WORD PTR UNPCK[si] ; n AX se ncarc cte dou cifre
; zecimale nempachetate
shl
al, cl ; Cifra zecimal mai puin semnificativ se deplaseaz n tetrada
; superioar a registrului AL
shr
ax, cl ; n registrul AL se mpacheteaz 2 cifre zecimale
mov PCK[di], al ; Se memoreaz, pe un singur octet, 2 cifre zecimale
add
si, 2 ; Se trece la cifrele urmtoare
inc
di, 1 ;
2 - 34
dec
jnz
dx
CONVERT
Operand
a) SHL
b) SHR
c) SAL
CF
MSB
CF
CF
g) RCL
h) RCR
CF
LSB
LSB
CF
CF
LSB
CF
LSB
LSB
LSB
MSB
MSB
LSB
MSB
MSB
f) ROR
LSB
MSB
MSB
d) SAR
e) ROL
MSB
CF
Fig. 5.1.
6. Grupul instruciunilor pe iruri de caractere
Pentru toate instruciunile pe iruri de caractere, se consider c irul surs este coninut n
segmentul curent de date (a crui adres de nceput este coninut n registrul DS), iar adresa
relativ a irului n segment este coninut n registrul SI. irul destinaie este coninut n segmentul
de date suplimentare (a crui adres de nceput este coninut n registrul ES), iar adresa relativ a
irului n segment este coninut n registrul DI. Pentru irul surs se poate considera i alt registru
de segment utiliznd un prefix de registru adecvat (ES, CS sau SS). Flagul DF indic sensul de
parcurgere n memorie al irurilor sau, altfel spus, modul n care se actualizeaz registrele SI i DI
dup execuia operaiei. Astfel, dac flagul DF are valoarea zero, atunci se consider c irurile se
vor parcurge de la adrese mici ctre adrese mari. Actualizarea registrelor SI i DI se face prin
incrementarea acestora cu 1 sau cu 2 dup cum se execut o operaie care implic un octet sau un
2 - 35
cuvnt. Dac flagul DF are valoarea unu, atunci se consider c irurile se vor parcurge de la adrese
mari ctre adrese mici. Actualizarea registrelor SI i DI se face prin decrementarea acestora cu 1
sau cu 2 dup cum se execut o operaie care implic un octet sau un cuvnt.
Operaiile elementare pe iruri de caractere sunt:
1.
LODS SRC
; Load String
LODSB (LODSW) SRC
Instruciunea ncarc fiecare octet (cuvnt) din irul surs SRC adresat prin DS:SI n
registrul AL (AX), cu actualizarea corespunztoare a registrului SI. Coninutului irului surs nu se
modific.
2.
STOS DST
; Store String
STOSB (STOSW) DST
Instruciunea memoreaz coninutul registrului AL (AX) n octetul (cuvntul) din irul
destinaie DST adresat prin ES:DI, cu actualizarea corespunztoare a registrului DI. Coninutul
registrului AL (AX) nu se modific.
Exemplu:
STOSB
; Memoreaz coninutul registrului AL la adresa ES:DI i
; incrementeaz coninutul lui DI cu 1
STOSW
; Memoreaz coninutul registrului AX la adresa ES:DI i
; incrementeaz coninutul lui DI cu 2
3.
MOVS
DST, SRC
; Move String
MOVSB (MOVSW) DST, SRC
Transfer un octet (o pereche de octei) din irul surs SRC adresat prin DS:SI n octetul
(perechea de octei) din irul destinaie DST adresat prin ES:DI, cu actualizarea corespunztoare a
registrelor index SI i DI. Coninutului irului surs nu se modific.
Observaie: Este clar c naintea operaiei de transfer trebuie ncrcate n registrele SI i DI
adresele de nceput ale celor dou iruri (surs, respectiv destinaie), iar n CX numrul elementelor
ce trebuie transferate. Pentru claritate prezentm urmtoarele exemple:
Exemplul 1. Mutarea unui bloc de memorie de la o adresa sursa la o adresa destinaie. Vom
prezenta o prim variant a acestei probleme care nu utilizeaz primitivele pentru iruri.
DATA SEGMENT
sir1 DB 100 DUP(7)
sir2 DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME cs: CODE, ds: DATA
start: mov ax, DATA
mov ds, ax
; Atenie ! Cnd nu se utilizeaz primitivele MOVSB
; sau MOVSW, ambele iruri (surs i destinaie) se
; pot gsi n acelai segment (de exemplu, segmentul
; de date)
mov si, OFFSET sir1
mov di, OFFSET sir2
mov cx, LENGTH sir1
cld
; terge DF (DF = 0)
muta: mov al, [si]
mov [di], al
inc
si
inc
di
2 - 36
SF:
loop
mov
int
CODE
END start
muta
ax, 4c00h
21h
ENDS
SF:
DATA SEGMENT
sir1 DB 100 DUP(7)
sir2 DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME cs: CODE, ds: DATA
start: mov ax, DATA
mov ds, ax
mov es, ax
; Atenie ! Cnd se utilizeaz MOVSB sau MOVSW, registrul
; DI se folosete numai cu segmentul adresat prin ES
mov si, OFFSET sir1
mov di, OFFSET sir2
mov cx, LENGTH sir1
cld
; terge DF (DF = 0)
muta: movs sir2, sir1
; sau movsb ;
Se recomand utilizarea lui MOVSB
loop muta
mov ax, 4c00h
int
21h
CODE
ENDS
END start
Exemplul 3. n general, transferul unui bloc de date de la o adres la alta se face astfel:
................
mov ax, extra_sgm
; Se ncarc registrul ES cu adresa de baz a
mov es, ax
; segmentului de date suplimentare
mov si, OFFSET SRC
mov di, OFFSET DST
mov cx, numar_elemente
cld
; DF = 0 - irurile se vor parcurge n sens cresctor
MUTA:
movsb
; Transferul octeilor de la sursa SRC la destinaia
loop MUTA
; DST se execut pn cnd CX = 0
...............
4.
sir1 DB
'AAAABC'
lsir1 EQU $-sir1
sir2 DB
'AAAACB'
DATA
ENDS
CODE
SEGMENT
ASSUME cs:CODE, ds:DATA, es:DATA
start: mov
ax, DATA
mov
ds,ax
mov
es,ax
mov
si, OFFSET sir1
mov
di, OFFSET sir2
mov
cx, lsir1/TYPE sir1
comp: cmpsb
jne
exit
loop comp
exit: nop
CODE
ENDS
END
start
4.
SCAS DST
; Scan String
SCASB (SCASW) DST
Scaneaz irul destinaie DST adresat prin ES:DI. Instruciunea poziioneaz indicatorii de
condiie conform rezultatului diferenei dintre coninutul registrului AL (AX) i octetul (perechea
de octei) din irul destinaie DST fr nscrierea rezultatului i fr modificarea coninutului
registrului AL (AX) i a coninutului irului. Se actualizeaz corespunztor registrul DI.
Pentru repetarea operaiile elementare pe iruri de caractere se pot utiliza urmtoarele
prefixe (obinnd astfel o instruciune cu opcod-ul pe 2 octei):
1.
REP - Se repet operaia care urmeaz pn cnd coninutul registrului CX devine zero (nu
mai este nevoie de instruciunea LOOP ca n exemplul anterior). Precizm c dup fiecare execuie
a operaiei elementare coninutul registrului CX este decrementat cu 1.
Exemplu: Dorim s transferm 100 octei de la adresa DS:0200h la adresa DS:0300h.
Secvena de instruciuni va fi urmtoarea:
mov ax, ds
mov es, ax
mov si, 200h
mov di, 300h
mov cx, 100
cld
rep
movsb
2.
REPZ, REPE - Se repet operaia care urmeaz pn cnd coninutul registrului CX devine
zero sau pn cnd indicatorul ZF devine zero. Indicatorul ZF este setat numai de ctre
instruciunile SCASB (SCASW) i CMPSB (CMPSW) la egalitatea a dou elemente. Menionm
c dup fiecare execuie a operaiei elementare coninutul registrului CX este decrementat cu 1.
REPNZ, REPNE - Se repet operaia care urmeaz pn cnd coninutul registrului CX
3.
devine zero sau pn cnd indicatorul ZF devine unu. Indicatorul ZF este setat numai de ctre
instruciunile SCASB (SCASW) i CMPSB (CMPSW) la egalitatea a dou elemente. Menionm
c dup fiecare execuie a operaiei elementare coninutul registrului CX este decrementat cu 1.
2 - 38
Observaie: Tipul prefixului este semnificativ numai pentru operaiile SCASB (SCASW) i
CMPSB (CMPSW). Pentru toate celelalte instruciuni pe iruri de elemente, toate prefixele au
aceeai semnificaie ca i prefixul REP.
Prezentm n continuare cteva exemple de utilizare a instruciunilor pe iruri de caractere.
Exemplul 5. Utiliznd prefixul REP, bucla
muta: movs sir2, sir1;
sau MOVSB
loop muta
din Exemplul 2 se poate rescrie astfel:
rep
movs sir2, sir1
sau
rep
movsb ;
Se recomand aceast utilizare
Exemplul 6. n varianta cu prefix REP, bucla din Exemplul 4
comp: cmpsb
jne
exit
loop comp
exit: nop
se nlocuiete cu
repe cmpsb
jne
exit
exit: nop
Exemplul 7.
; TRANSFB - transfer un bloc de date dintr-o zon de memorie n alt zon de memorie
DOSSEG
.MODEL
SMALL
.STACK
100h
lung_bloc
EQU 10h
.DATA
bloc_sursa
db
20 DUP (0Ah)
bloc_dest
db
20 DUP (0)
.CODE
START:
mov ax, @DATA
; ncarc n AX adresa de baz a segmentului de date
mov ds, ax
cld
; terge DF (DF = 0)
mov cx, lung_bloc
; Se ncarc CX cu lungimea blocului de date
mov si, OFFSET bloc_sursa
; Se ncarc SI cu adresa de nceput a blocului surs
mov ax, SEG bloc_sursa
; Se ncarc AX cu adresa de segment a blocului
mov ds, ax
; surs, care se nscrie apoi n DS
mov di, OFFSET bloc_dest; Se ncarc DI cu adresa de nceput a blocului dest
mov ax, SEG bloc_dest
; Se ncarc AX cu adresa de segment e blocului
mov es, ax
; destinaie, care se nscrie apoi n ES
trans: movsb
; Se realizeaz transferul octet cu octet
loop trans
mov ax, 4c00h
; Ieire n sistem
int
21h
END START
2 - 39
Exemplul 8.
; COMPAS - compara doua siruri de octeti, numarul locatiilor diferite fiind contorizat
; in registrul DX
DOSSEG
.MODEL
SMALL
.STACK
100h
.DATA
lungs
EQU
20h
; lungs - lungimea sirurilor de comparat
bloc_sursa
db
lungs DUP (0)
bloc_dest
db
lungs/4 DUP (1)
db
lungs/4 DUP (0)
db
lungs/4 DUP (5)
db
lungs/4 DUP (0)
.CODE
START:
mov ax, @DATA
mov ds, ax
mov ax, SEG bloc_sursa
mov ds, ax
mov si, OFFSET bloc_sursa
mov ax, SEG bloc_dest
mov es, ax
mov di, OFFSET bloc_dest
cld
; Sterge DF
mov cx, lungs
; Incarca CX cu lungimea sirurilor de comparat
xor
dx, dx
compb: cmpsb
; Bucla pentru compararea sirurilor, octet cu octet
loope compb
jcxz SF1
; Daca CX = 0, operatia de comparare s-a terminat
inc
dx
; In DX se contorizeaza numarul locatiilor
; diferite dintre cele doua siruri
inc
cx
;
loop compb
SF1: jz
SF
inc
dx
SF:
mov ax, 4c00h
; Iesire in sistem
int
21h
END START
7. Instruciuni de intrare/ieire (I/O)
Accesul la interfeele corespunztoare echipamentelor periferice se realizeaz prin
intermediul unor instruciuni speciale. Fiecare interfa are asociate un numr de coduri specifice
numite porturi. Atribuirea codurilor pentru fiecare interfa se face la proiectarea sistemului de
calcul. Comunicaia ntre microprocesor i mediul exterior reprezentat de interfeele de I/O se face
prin execuia unor instruciuni care adreseaz aceste porturi. Un port este o valoare ntreag
reprezentat pe 8 sau 16 bii.
Citirea unor date sau informaii de stare se face prin intermediul unor instruciuni de forma:
a)
IN
AL (AX), PORT
; Input byte or word
b)
IN
AL (AX), DX
2 - 40
Forma a) poate fi utilizat numai dac portul de intrare PORT are un cod mai mic dect 256
(PORT {0, 1, ..., 255} ) i este specificat direct printr-un octet n cadrul instruciunii. Efectul
acestei instruciuni const n ncrcarea valorii citite din PORT-ul specificat n registrul AL (AX).
Exemplu:
in
al, 14
; Citete octetul din portul cu numrul 14
in
ax, 5
; Citete cuvntul din portul cu numrul 5
Efectul execuiei unei instruciuni de forma b) const n ncrcarea valorii citite de la portul
adresat indirect prin coninutul registrului DX, n registrul AL (AX).
Exemplu:
mov dx, 14
;
in
al, dx
; Citete octetul din portul cu numrul 14
mov dx, 5
;
in
ax, dx
; Citete cuvntul din portul cu numrul 5
Observaii:
1. Numai primele 256 porturi pot fi specificate direct n instruciune, n timp ce oricare din cele
2**16 porturi pot fi specificate indirect prin registrul DX.
2. Avantajul specificrii directe a portului const n aceea c nu mai este necesar executarea unei
instruciuni suplimentare de ncrcare prealabil a numrului portului n registrul DX.
3. Avantajul specificrii indirecte a portului const n aceea c se pot adresa (prin bucle) porturi cu
adrese consecutive.
Transmiterea unor date sau a unor comenzi se face prin intermediul unor instruciuni de
forma:
a)
OUT PORT, AL (AX)
; Output byte or word
b)
OUT DX, AL (AX)
Efectul acestor instruciuni const n:
a) Scrierea coninutului registrului AL (AX) n portul de adres (cod) PORT specificat n
instruciune (PORT {0, 1, ..., 255} ).
b) Scrierea coninutului registrului AL (AX) n portul adresat indirect prin coninutul registrului
DX.
Exemple:
out
49, al
; Se nscrie octetul din AL n portul 49
out
15, ax
; Se nscrie cuvntul din AX n portul 15
Echivalentul acestor instruciuni, utiliznd ns registrul DX este urmtorul:
mov dx, 49
;
out
dx, al
; Se nscrie octetul din AL n portul 49
mov dx, 15
;
out
dx, ax
; Se nscrie cuvntul din AX n portul 15
Observaie: Comentariile de la instruciunea IN sunt valabile i pentru instructiunea OUT.
8. Instruciuni pentru controlul ntreruperilor
Aciunea provocat de ndeplinirea unei condiii (interne sau externe n raport cu programul
aflat n execuie) prin care se realizeaz automat transferul controlului unei rutine speciale de tratare
se numeste ntrerupere, iar rutina respectiv se numete rutin de ntrerupere. Exist dou clase
de ntreruperi:
ntreruperi interne: acestea sunt iniiate de starea programului aflat n execuie sau prin
executarea unor instruciuni speciale de ntrerupere. Ele se caracterizeaz prin faptul c sunt
sincrone n raport cu programul aflat n execuie. Se mai numesc ntreruperi software.
ntreruperi externe: acestea sunt iniiate de partea hardware prin intermediul semnalelor de
ntrerupere trimise ctre procesor. Declanarea lor semnific ndeplinirea unor evenimente externe
procesorului. Ele se caracterizeaz prin faptul c sunt asincrone n raport cu programul aflat n
execuie. Se mai numesc ntreruperi hardware.
2 - 41
Adresa memorie
0000: 0000 h
0000: 0001 h
0000: 0002 h
0000: 0003 h
0000: 0004 h
0000: 0005 h
0000: 0006 h
0000: 0007 h
0000: 0008 h
0000: 0009 h
Memorie
IP
CS
IP
Intrerupere tip 0
Intrerupere tip 1
CS
Fig. 8.1.
n general, legtura cu sistemul de operare (BIOS, DOS) de realizeaz utiliznd instruciuni
de tip INT.
Rentoarcerea din procedurile de tratare a ntreruperilor se face cu ajutorul instruciunii
IRET, plasat la sfritul unei astfel de proceduri i care are ca efect refacerea valorilor registrelor
IP i CS salvate anterior n stiv, precum i starea indicatorilor de condiie salvai de asemenea n
stiv, astfel:
IP <----- (SP +1, SP)
SP <----- SP + 2
CS <----- (SP +1, SP)
SP <----- SP + 2
F <----- (SP +1, SP)
SP <----- SP + 2
Instruciunea INTO (Interrupt on Overflow) este o instruciune pe un octet care genereaz o
ntrerupere de tipul 4, dac bistabilul de condiie OF = 1. O astfel de instruciune ar trebui s
urmeze dup fiecare instruciune aritmetic aplicat unor operanzi cu semn ori de cte ori exist
posibilitatea apariiei unei depiri.
n afara ntreruperilor software INT n prezentate, activitatea procesorului poate fi
ntrerupt i de un semnal extern ce se aplic pe pinul INTR al procesorului. Dac indicatorul IF =
1, dup terminarea execuiei instruciunii curente, procesorul se oprete din taskul su obinuit i se
2 - 43
-primul octet al zonei va conine, la apel, numrul maxim (fie acesta n) de caractere care vor
fi citite, inclusiv un caracter CR;
-al doilea octet al zonei va conine, dup execuia funciei, numrul de caractere efectiv
citite, caracterul CR nefiind contorizat;
-restul zonei va trebui s conin cel puin atia octei ci au fost specificai n primul octet.
Dup execuia funciei aici va fi depus irul citit, primul caracter din ir fiind plasat la adresa cea
mai mic.
Caracterele citite sunt plasate n zona tampon specificat, ncepnd cu al treilea octet al
zonei. Citirea se termin cnd se tasteaz CR. Dac se ncearc introducerea mai multor caractere
dect numrul specificat, adic n-1, caracterele n plus se ignor, la ieirea standard fiind trimis
caracterul BEL (07h). Ultimul caracter din zona tampon este ntotdeauna CR. Dac se tasteaz
CTRL-C, se execut int 23h.
Exemplu. Urmtorul program citete o tast, determin dac este o tast obinuit sau funcional
i apoi afieaz codul tastei. Citirea tastei se face cu funcia 07h. Dac la primul apel se ntoarce
codul 0 n registrul AL, nseamn c tasta apasat este o tast funcional, codul extins al tastei
fiind determinat cu un al doilea apel al funciei.
DATA
SEGMENT
cerere DB 'Tastati o tasta', 0ah, 0dh, '$'
sir
DB 3 DUP (?), 0ah, 0dh, '$'
mesaj1 DB 'Codul tastei este:', 0ah, 0dh, '$'
mesaj2 DB 'Codul extins al tastei este:', 0ah, 0dh, '$'
DATA
ENDS
STIVA SEGMENT STACK 'STACK'
DW
30 DUP(?)
virf
LABEL WORD
STIVA ENDS
COD
SEGMENT
ASSUME cs:COD, ds:DATA, ss:STIVA
start:
jmp incep
conv
PROC NEAR
; Primete n registrul AL un numr ntreg i n registrul BX adresa unei zone de 3 octei.
; ntoarce n aceast zon irul de caractere corespunztor scrierii zecimale a numrului
push dx
xor
ah, ah ;
AH = 0
mov dl, 10 ;
AL = AX/10, AH = AX MOD 10
div
dl
add
ah, '0' ;
Se formeaz codul ASCII al cifrei din AL
mov [bx+2], ah
xor ah, ah
div dl
add ah, '0'
mov [bx+1], ah
add
al, '0'
mov [bx], al
pop dx
ret
conv
ENDP
2 - 45
; Se citete o tasta
; Se testeaz dac este tast funcional
; Se determin codul tastei
; Se afieaz mesaj1
alterarea MCB-ului, iar dac AX=9 nseamn c se dorete eliberarea unui bloc ce nu a fost alocat
corect (cu funcia 48h). Dac la retur CF=0 nseamn c eliberarea s-a fcut cu succes.
- Funcia 4Ah: Aceast funcie modific dimensiunea unui bloc de memorie alocat anterior.
La apel AH=4Ah, BX=noua dimensiune a blocului, n numr de paragrafe. Dac la retur CF=1,
nseamn c a aprut o eroare, codul de eroare fiind specificat n registrul AX, astfel: AX=7
nseamn alterarea MCB-ului, AX=8 nseamn memorie insuficient (n situaia n care s-a dorit
mrirea dimensiunii blocului), dac AX=9 nseamn c se dorete modificarea dimensiunii unui
bloc de memorie ce nu a fost alocat corect. Dac AX=8, registrul BX va conine numrul de
paragrafe disponibile. Dac la retur CF=0 nseamn c modificarea dimensiunii blocului s-a fcut
cu succes.
Exemplu. Urmtorul program aloc un bloc de memorie suficient de mare pentru a memora
n octei, realizeaz umplerea zonei de n octei cu o valoare constant, dup care dezaloc zona
alocat. La ncrcarea unui program n memorie, sistemul de operare DOS i aloc toat memoria
disponibil. Programul va trebui s ajusteze blocul de memorie care i se aloc la dimensiunea
efectiv necesar.
DATA
a1
a2
d
n
cnst
segm
DATA
STIVA
SEGMENT
DB 'Alocare efectuata cu succes', 0ah, 0dh, '$'
DB 'Alocare esuata', 0ah, 0dh, '$'
DB 'Dezalocare efectuata cu succes', 0ah, 0dh, '$'
DW 7000h
; dimensiunea blocului
DB 88h
DW ?
ENDS
SEGMENT STACK 'STACK'
DW
150 DUP (?)
virf
LABEL WORD
STIVA ENDS
COD
SEGMENT
ASSUME cs:COD, ds:DATA
start: mov ax, DATA
mov ds, ax
mov ax, STIVA
mov ss, ax
mov sp, OFFSET virf
; Calculeaz numrul de paragrafe alocate programului n AX
mov ax, cs
mov bx, es
sub
ax, bx
mov cl, 4
shl
ax, cl
add
ax, OFFSET ultima_instr
xor
dx, dx ; DX = 0
mov cx,10h
div
cx
; Dup mprire, AX va conine numrul de paragrafe alocate programului
inc
ax
; Se reduce dimensiunea blocului de memorie alocat programului
mov bx, ax
mov ah, 4ah
; Se modific dimensiunea unui bloc de memorie alocat anterior
int
21h
2 - 47
Procedura pentru controlul ceasului de timp real permite citirea, respectiv iniializarea
contorului de treceri prin procedura de tratare a ntreruperilor provenite de la ceasul de timp real.
Pentru controlul ceasului de timp real se pot selecta urmtoarele funcii:
Funcia 0 - Citire contor.
Ca rezultat al apelului acestei funcii, registrul CX va conine partea cea mai semnificativ,
iar registrul DX va conine partea mai puin semnificativ a contorului. Registrul AL va conine
valoarea indicatorului de depire a 24 de ore.
Funcia 1 - Iniializare contor:
Contorul se poate iniializa n modul urmtor: cei mai semnificativi 2 octei vor primi
valoarea coninut n registrul CX, iar cei mai puin semnificativi 2 octei vor primi valoarea
coninut n registrul DX.
Observaie:
Funcia 2 - Citete timpul din contorul nevolatil (CMOS) al ceasului de timp real.
La ieire:
Registrul
CH
- ora n BCD;
Registrul
CL
- minutul n BCD;
Registrul
DH
- secunda n BCD;
Flagul
CF = 1 dac ceasul nu este operaional.
Funcia 3 - Seteaz timpul n contorul nevolatil (CMOS) al ceasului de timp real.
La intrare:
Registrul
CH, CL
- ora i minutul n BCD;
Registrul
DH
- secunde n BCD;
Registrul
DL = 1 pentru salvarea opiunii.
Funcia 4 - Citete data din contorul nevolatil (CMOS) al ceasului de timp real.
La ieire:
Registrul
CH
- secolul n BCD;
Registrul
CL
- anul n BCD;
Registrul
DH
- luna n BCD;
Registrul
DL
- ziua n BCD;
Flagul
CF = 1 dac ceasul nu este operaional.
Funcia 5 - Seteaz data n contorul nevolatil (CMOS) al ceasului de timp real.
La intrare:
Registrul
CH, CL
- secolul i anul n BCD;
Registrul
DH, DL
- luna i ziua n BCD.
9. Instruciuni pentru sincronizare extern
Pentru sincronizarea cu evenimentele externe, microprocesoarele I8086/I8088 admit
instruciunea
HLT
; Halt
Prin execuia acestei instruciuni, UCP-procesor intr n starea HALT. Efectul acestei
instruciuni const n aceea c ofer posibilitatea procesorului s atepte sosirea unei ntreruperi
care ar reprezenta realizarea unui eveniment n proces.
Ieirea din starea HALT se poate face prin ntreruperi de tip NMI, ntreruperi pe pinul INTR
cnd IF = 1, precum i prin semnalul hardware RESET = 1.
a). La apariia unei ntreruperi, valorile curente ale indicatorilor de condiie i ale
indicatorilor de stare, precum i valorile curente ale registrelor CS i IP sunt salvate n stiv i
procesorul trece i execut subrutina de tratare a ntreruperii respective. Cnd, n aceast subrutin,
procesorul ntlnete instruciunea IRET, valorile lui IP, CS i registrului F sunt refcute din stiv,
dup care se va executa instruciunea care urmeaz imediat dup HLT.
b). Dac din HALT se iese cu RESET = 1, atunci ntregul sistem se iniializeaz.
2 - 49
data_seg2
SEGMENT
; nceputul segmentului de date data_seg2
. . . . Directive
data_seg2
ENDS
; Sfritul segmentului data_seg2
SEGMENT
; nceputul segmentului de cod code_seg
code_seg
. . . . Directive
start:
. . . . . Instruciuni
code_seg
ENDS
; Sfritul segmentului code_seg
END start
Avnd n vedere c ntr-un program pot s existe mai multe segmente este necesar ca asamblorul s
"tie" n fiecare moment care sunt cele patru segmente logice curente pentru a putea s genereze corect
codurile instruciunilor. De asemenea, asamblorul trebuie s "tie" ce registre de segment se pot utiliza
pentru a realiza accesul la datele referite. Aceast informaie este transmis asamblorului cu ajutorul
pseudoinstruciunii ASSUME a crei form general este:
reg_segment : nume_segment [, . . . . . .]
ASSUME
unde:
reg_segment
= CS | DS | SS | ES;
2 - 50
nume_segment = numele segmentului logic sau numele unui grup de segmente definit anterior
printr-o directiv GROUP sau cuvntul cheie NOTHING care anuleaz selecia precedent a segmentului.
Precizm c nume_segment va fi adresat prin reg_segment corespunztor. ncrcarea registrului
segment reg_segment cu adresa de baz este sarcina programatorului.
Trebuie remarcat c ASSUME este o pseudoinstruciune pentru care nu se genereaz cod, rolul ei
fiind numai de a informa asamblorul de intenia programatorului.
Exemplu: ASSUME CS : code_seg, DS : data_seg1, ES : data_seg2
Aceast directiv va informa asamblorul c adresa de segment a segmentului code_seg se va gsi n CS,
adresa de segment a segmentului data_seg1 se va gsi n DS i adresa de segment a segmentului data_seg2 se
va gsi n ES. Asupra lui SS nu s-a fcut nici o presupunere.
data2
gama
delta
data2
SEGMENT
dw
0
dw
0
ENDS
code
SEGMENT
; nceputul segmentului de cod code
ASSUME CS : code, DS : data1, ES : data2
; Iniilaizare registre segment conform directivei ASSUME
; ncrcarea registrului DS cu
start:
mov ax, data1
mov ds, ax
; adresa de baz a segmentului data1
mov ax, data2
; ncrcarea registrului ES cu
mov es, ax
; adresa de baz a segmentului data2
; Referire la date
mov ax, alfa
; Utilizare registru DS
mov gama, ax
; Utilizare registru ES
mov es : gama, ax ; Utilizare registru ES
; Schimbare coninut registru DS
mov ax, cs
; Segmentul de date coincide cu cel de cod
mov ds, ax
;
; Referire la date n segmentul de cod code
mov ds : psi, ax
; Utilizare registru DS
mov es : psi, ax
; Utilizare registru ES
mov cs : psi, ax
; Utilizare registru CS
psi
dw
0
; Definirea variabilei psi
mov ax, 4c00h
int
21h
code
ENDS
; Sfritul segmentului de cod code
2 - 51
END
start
Combinarea segmentelor
ntr-un program se pot defini oricte segmente; n mod uzual, se definesc segmente pentru: date
globale, date locale, stiv, program principal, proceduri comune, vectori de ntrerupere, rutine pentru servirea
ntreruperilor.
Forma sintactic complet a directivei SEGMENT introduce o serie de atribute, aa cum reiese din
definiia urmtoare:
nume_seg
SEGMENT
[tip aliniere] [combinare] [utilizare] ['clasa']
Corpul segmentului
nume_seg
ENDS
unde nume_seg este numele atribuit segmentului de ctre utilizator. Acesta poate fi unic sau poate fi identic
cu un nume atribuit altor segmente. Segmentele cu acelai nume vor fi combinate ntr-un singur segment de
ctre linker funcie de celelalte atribute ale definiiei de segment.
Atributele ce nsoesc directiva SEGMENT ofer o serie de informaii editorului de legturi,
informaii ce se refer la:
- modul de ncrcare a segmentului la momentul execuiei;
- modul de grupare a segmentelor;
- modul de aliniere a segmentului.
Exist urmtoarele tipuri de aliniere: PARA, BYTE, WORD, PAGE. Acestea indic tipul adresei de
nceput a segmentului. Astfel, PARA | BYTE | WORD | PAGE indic faptul c adresa de nceput a zonei de
memorie rezervat segmentului este divizibil cu 16 | 1 | 2 | 256. Valoarea adresei de segment utilizat se
obine prin truncherea adresei fizice. De exemplu, dac prima locaie liber are adresa fizic 12345h i pentru
un segment se consider o aliniere de tip BYTE, atunci pentru adresa de segment se va utiliza valoarea
1234h. Prima rezervare din acest segment va avea adresa relativ 5. Dac pentru aceeai situaie se consider
o aliniere de tip PARA, atunci, pentru adresa de segment se va utiliza valoarea 1235h. Implicit se consider
tipul de aliniere PARA.
combinare este o informaie pentru editorul de legturi care definete modul de combiare a
segmentelor avnd acelai nume. Aceast informaie indic raportul ntre acest segment i segmente
definite n alte module obiect. Tipul de combinare poate fi:
- PUBLIC : dac n alte module obiect cu care se leag modulul obiect curent sunt coninute alte
segmente cu acelai nume, atunci se va face o concatenare a acestora, obinndu-se un unic segment. Toate
instruciunile i/sau datele din noul segment se refer la un registru de segment unic, toate deplasamentele
fiind astfel nct s reprezinte distana fa de nceputul noului segment.
- COMMON : dac n alte module obiect cu care se leag modulul obiect curent sunt coninute alte
segmente cu acelai nume, atunci acestea vor fi suprapuse unul peste cellalt, adic ncep la aceeai adres.
Lungimea zonei rezultate va fi dat de lungimea celui mai lung segment de acest fel.
- AT expresie : segmentul va fi ncrcat n memorie la adresa de segment reprezentat de valoarea
expresiei (ce nu va putea conine o referin la vreun simbol definit ulterior).
- STACK : vor fi concatenate toate segmentele cu acelai nume pentru a forma un unic segment ce
constituie segmentul de stiv al programului. Registrul SP
va fi iniializat cu lungimea stivei. De asemenea initializarea
Segment1
10000h
lui SS se face automat. Daca se creeaz un segment stiv ce
nu utilizeaz tipul STACK se vor da explicit instruciuni
pentru iniializarea registrelor SS i SP.
- MEMORY : segmentul curent va fi aezat n
memorie n spaiul disponibil rmas dup aezarea celorlalte
segmente n memorie.
Observaii:
1. Dac pentru un segment nu se specific tipul de
aliniere, atunci acesta va fi aliniat implicit la o adresa de
paragraf divizibil cu 16 (vezi figura alturat).
2 - 52
10215h
10220h
Segment2
Data
pentru
MODUL2
Code
pentru
MODUL1
Code
pentru
MODUL2
Data
pentru
MODUL1
Data
Code
3. Tipul de combinare AT permite specificarea exact a adresei de nceput a unui segment. Adresa
specificat prin tipul de combinare AT este o adres absolut.
4. Pentru combinarea unor segmente cu nume diferite se folosete directiva GROUP.
utilizare se foloseste numai pentru procesorul 80386 cnd specific mrimea cuvntului unui
segment. n acest caz poate fi USE16 cuvnt pe 16 bii sau USE32 cuvnt pe 32 bii. n rest nu se folosete.
clasa reprezinta un mijloc de asociere a segmentelor cu nume diferite dar cu scopuri similare. Tipul
se foloseste pentru a controla ordinea segmentelor i a identifica segmentul de cod. Toate segmentele aparin
unei clase. Segmentele pentru care nu este stabilit explicit un mume de clasa, vor avea numele de clasa nul.
Linkerul consider c segmentele cu numele de clas CODE sau avnd sufixul CODE conin codul
programului.
2 - 53
cseg2
dseg1
dseg1
dseg2
dseg2
dgrup
proc2 PROC
.........
proc2 ENDP
.....................
ENDS
SEGMENT
.....................
alfa1 db
?
beta1 db
?
.....................
ENDS
SEGMENT
.....................
alfa2 db
?
beta2 db
?
.....................
ENDS
GROUP dseg1, dseg2
dgrup
cgrup GROUP cseg, cseg1, cseg2 ; Se definete grupul de segmente de cod cgrup
cseg
SEGMENT
ASSUME
CS : cgrup, DS : dgrup
mov ax, dgrup
; Adresa de nceput a grupului de date
mov ds, ax
;
................................
mov al, beta1
; Referire la date
mov bl, beta2
;
..............................
call
proc1
; Referire la cod
..............................
call
proc2
; Referire la cod
cseg
ENDS
Se observ c utiliznd pseudoinstruciunea GROUP, pentru adresarea datelor i procedurilor aflate
n segmente diferite se folosete acelai registru de segment. Adresa relativ asociat unei instruciuni
coninute ntr-un grup se calculeaz fa de nceputul grupului i nu fa de nceputul segmentului din care
face parte instruciunea respectiv.
2 - 54
mesaj
lung
start:
TITLE
salut
DOSSEG
.MODEL SMALL
.STACK 256
.DATA
PUBLIC mesaj, lung
DB "Salut !", 13, 10
EQU $ - mesaj
.CODE
EXTRN afis : PROC
mov ax, @data
mov ds, ax
call afis
mov ax, 4C00h
int 21h
END start
2 - 55
Pentru fiecare modul surs, MASM scrie un nume de modul n fiierul obiect, care este utilizat de
programele de depanare i de editorul de legturi cnd afieaz mesaje de eroare. ncepnd cu versiunea
5.00, numele modulului este numele de baz al fiierului ce conine modulul surs.
Exemplul 2. S se determine suma elementelor unui vector array avnd n componente utiliznd o
procedur la care transferul parametrilor se face printr-o zon comun de memorie plasat ntr-un segment cu
tipul de combinare COMMON:
TITLE ad_elem
DATA
SEGMENT COMMON 'DATA'
num
DW 5 DUP(?)
n
DW ?
sum
DW ?
DATA
ENDS
CODE
SEGMENT PUBLIC 'CODE'
PUBLIC
ad_elem
ASSUME cs:CODE, ds:DATA
ad_elem
PROC NEAR
push ax
push cx
push si
lea
si, num
mov cx, n
xor
ax, ax
inel: add ax, [si]
add si,2
loop inel
mov sum, ax
pop si
pop cx
pop ax
ret
ad_elem
ENDP
CODE
ENDS
END
TITLE sumav
DATA
SEGMENT COMMON
array
DW
7, 9, -1, 2, 10
n
DW
5
total
DW
?
DATA
ENDS
'DATA'
CODE
SEGMENT PUBLIC 'CODE'
EXTRN ad_elem : NEAR
ASSUME cs:CODE, ds:DATA
start: mov
ax, DATA
mov
ds, ax
call
ad_elem
mov
ax, 4c00h
int
21h
CODE
ENDS
END
start
2 - 56
Programul este alctuit din dou module surs. Modulul surs ad_elem conine procedura de calcul ce
acceseaz o zon comun de memorie plasat n segmentul comun DATA. Modulul surs sumav plaseaz
datele n acelai segment comun DATA i dei acestea au nume diferite, ele sunt accesate corect de
procedura ad_elem. Segmentul de cod CODE a fost declarat PUBLIC, astfel c cele dou poriuni ale sale
din cele dou module surs sunt concatenate, formnd un singur segment.
Pentru crearea unui program executabil din aceste dou module, fiecare modul va fi asamblat separat astfel:
TASM ad_elem
TASM sumav
Apoi se vor edita legaturile pentru cele dou module astfel:
TLINK sumav ad_elem
Rezultatul este obinerea fiierului sumav.exe.
Exemplul 3. Programul urmtor determin de asemenea suma a dou numere ntregi reprezentate n dubl
precizie. Suma se calculeaz printr-o procedur adecvat. Noutatea fa de exemplul anterior o constituie
modul de comunicare a parametrilor procedurii care, de data aceasta, se face prin variabilele comune par1 i
par2, cu plasarea rezultatului n variabila comun result. Programul va fi structurat pe dou module: un
modul ce conine programul principal i un modul ce conine procedura de calcul:
Modulul principal este:
TITLE princ
DOSSEG
.MODEL SMALL
INCLUDE param.inc
.DATA
num1 DW
9999h, 7777h
num2 DW
6666h, 1111h
suma DW
2 DUP(?)
.CODE
EXTRN calcs:PROC
start: mov ax, @data
mov ds, ax
mov ax, num1
mov par1, ax
mov ax, num1+2
mov par1+2, ax
mov ax, num2
mov par2, ax
mov ax, num2+2
mov par2+2, ax
call calcs
mov ax, result
mov suma, ax
mov ax, result+2
mov suma+2, ax
mov ah, 4ch
int 21h
END start
TITLE calcs
.MODEL SMALL
INCLUDE param.inc
.CODE
PUBLIC calcs
2 - 57
calcs PROC
mov ax, par1
add ax, par2
mov result, ax
mov ax, par1+2
add ax, par2+2
mov result+2, ax
ret
calcs ENDP
END
Fiierul de includere param.inc conine urmtoarea declaraie de variabile comune: COMM
par1:WORD:2, par2:WORD:2, result:WORD:2.
Pentru crearea unui program executabil din aceste dou module, fiecare modul va fi asamblat separat astfel:
TASM princ
TASM calcs
Apoi se vor edita legaturile pentru cele dou module astfel:
TLINK princ calcs
Rezultatul este obinerea fiierului princ.exe.
Observaie: Fiierul param.inc trebuie s se afle n acelai director cu fiierele princ.asm i calcs.asm.
Definirea i utilizarea procedurilor
Limbajul de asamblare ASM86 implementeaz conceptul de subrutin cu ajutorul definiiei de
procedur. Deci, o procedur este o poriune de program care se poate accesa printr-o instruciune special de
apel i dup execuia creia se poate reveni la instrucinea imediat urmtoare celei care a generat apelul,
printr-o instruciune special de revenire.
La apelul unei proceduri trebuie satisfcute urmtoarele 3 cerine:
- instruciunea de apel trebuie s salveze adresa urmtoarei instruciuni astfel nct s poat fi
posibil revenirea din procedur;
- registrele utilizate de procedur trebuie salvate n stiv la intrarea n procedur i restaurate naintea
instruciunii de revenire din procedur;
- procedura trebuie s poat comunica cu secvena apelant i, eventual, s ntoarc rezultate pentru
secvena apelant.
Datorit mecanismului specific de adresare (utiliznd registre segment) execuia unei instruciuni de
apel sau de rentoarcere din procedur se poate face n cadrul aceluiai segment sau ntre 2 segmente diferite.
n primul caz, ceea ce trebuie s se salveze/refac n/din stiv este numai coninutul registrului IP, n timp ce
n al doilea caz trebuie s se salveze/refac n/din stiv i coninutul registrului CS.
Definirea i delimitarea procedurilor ntr-un program surs se face cu ajutorul directivelor PROC
i ENDP, astfel:
nume_procedur
PROC [atribut]
..........
..........
Corpul procedurii
..........
RET
nume_procedur
ENDP
unde:
nume_procedur este un identificator cu care se vor face apelurile procedurii respective. Acest nume
are asociat ca valoare adresa primei instruciuni din procedur. Ca orice adres, aceast valoare are dou
componente: adresa de segment i adresa relativ n segment. n funcie de numele atributului sunt
semnificative ambele componente sau numai adresa relativ n segment.
atribut - poate s fie FAR sau NEAR. Dac atributul lipsete, pentru el se consider valoarea
implicit NEAR. Atributul NEAR indic faptul c apelurile la aceast procedur se fac fr a schimba
coninutul registrului segment de cod CS (adic se opereaz numai n segmentul de cod curent). Atributul
2 - 58
FAR indic faptul c apelurile la aceast procedur se fac i cu schimbarea coninutul registrului segment de
cod CS (n stiv se va salva i adresa de segment pentru a permite o rentoarcere corect n punctul de apel).
n cazul unui apel de procedur putem avea urmtoarele situaii de amplasare a procedurii apelate:
1. n acelai segment de cod cu instruciunea de apel; n acest caz atributul trebuie s fie NEAR;
2. ntr-un segment de cod diferit de cel care conine instruciunea de apel; n acest caz atributul
trebuie s fie FAR;
3. ntr-un alt modul surs dect cel care conine instruciunea de apel; n acest caz atributul trebuie s
fie FAR, iar numele procedurii trebuie declarat ntr-o directiv PUBLIC - n modulul care conine definiia
procedurii i ntr-o directiv EXTRN - n modulul care conine instruciunea de apel.
Exemplu: S considerm urmtoarea procedur:
PROCED
proc FAR
.................
alfa:
.................
.................
ret
PROCED
endp
Orice instruciune de apel a procedurii PROCED are ca efect salvarea n stiv a coninutului
registrului CS i apoi a coninutului registrului IP. La execuia instruciunii de rentoarcere din procedur se
realizeaz refacerea corespunztoare a coninutului registrelor IP i CS.
Pentru microprocesoarele I8086/I8088, instruciunile pentru apelul procedurilor sunt urmtoarele:
1.
CALL DST
unde DST este un deplasament pe 16 bii, notat DEPL16 ce reprezint distana dintre destinaia apelului i
adresa urmtoarei instruciuni de dup apel. Se efectueaz operaiile:
SP <----- SP - 2
(SP+1, SP) <----- IP
IP <----- IP + DEPL16
Exemplu:
call
NEAR_PROC
2.
CALL DST
unde DST este o etichet deprtat (SEGMENT:OFFSET) - 4 octei. Se efectueaz operaiile:
SP <----- SP - 2
(SP+1, SP) <----- CS
SP <----- SP - 2
(SP+1, SP) <----- IP
IP <----- OFFSET
CS <----- SEGMENT
Exemplu:
call
FAR_LABEL
2 - 59
call
FAR_PROC
Cei 4 octei ai operandului DST indic adresele de OFFSET i de SEGMENT.
a) Revenire intrasegment
RET
(Return)
IP <----- (SP+1, SP)
SP <----- SP + 2
Instruciunea reface din stiv coninutul indicatorului (numrtorului) de instruciuni IP.
c) Revenire intersegment
RET
Se realizeaz operaiile:
(Return)
2 - 60
ad_elem
REPET:
ad_elem
COD
SEGMENT
ASSUME cs:COD, ds:DATA
mov ax, DATA
mov ds, ax
mov bx, OFFSET VECTOR
; Adresa de nceput a vectorului n BX
mov cx, NR_ELEM/TYPE VECTOR
; Numrul de elemente ale
; vectorului n CX
call
NEAR PTR
ad_elem
; Apel procedur
mov SUMA, ax
; Rezultatul se depune n variabila SUMA
mov ax, 4c00h
int
21h
PROC
xor
xor
add
add
loop
ret
ENDP
ENDS
END
NEAR
ax, ax
si, si
ax, [bx][si]
si, 2
REPET
start
SEGMENT
2 - 61
VECTOR
NR_ELEM
SUMA
DATA
dw
10 DUP (0102h)
equ
$ - vector
dw
?
ENDS
STIVA
SEGMENT
STACK
dw
100 DUP (?)
ENDS
SEGMENT
ASSUME cs:COD, ds:DATA, ss:STIVA
mov ax, DATA
mov ds, ax
mov ax, STIVA
mov ss, ax
call
NEAR PTR ad_elem ; Apel procedur
mov ax, 4c00h
int
21h
STIVA
COD
start:
ad_elem
REPET:
ad_elem
COD
PROC
push
push
push
lea
mov
NEAR
; Procedura pentru calculul sumei elementelor
ax
cx
si
si, VECTOR
; Adresa de nceput a vectorului n SI
cx, NR_ELEM/TYPE VECTOR
; Numrul de elemente ale
; vectorului n CX
ax, ax
; AX = 0
ax, [si]
; Suma se calculeaz n AX
si, 2
REPET
SUMA, ax
; Rezultatul se depune n variabila SUMA
si
cx
ax
xor
add
add
loop
mov
pop
pop
pop
ret
ENDP
ENDS
END start
SEGMENT
dw
10 DUP (0102h)
dw
$ - VECTOR
dw
?
ENDS
Stack_seg
SEGMENT
dw
100 DUP (?)
LABELWORD
ENDS
VIRF
Stack_seg
Code
START:
SEGMENT
ASSUME cs:Code, ds:Param_seg, ss:Stack_seg
mov ax, Param_seg
; Se ncarc registrul DS corespunxtor
mov ds, ax
; directivei ASSUME
2 - 62
mov
mov
mov
mov
push
mov
Code
mov
push
call
mov
int
ENDS
ax, Stack_seg
ss, ax
sp, OFFSET VIRF
bx, OFFSET VECTOR
bx
bx, OFFSET NR_ELEM
push bx
bx, OFFSET SUMA
bx
FAR PTR
adun
ax, 4c00h
21h
SEGMENT
ASSUME
Stack_struc
STRUC
save_BP
dw
save_CS_IP
dw
par3_adr
dw
par2_adr
dw
par1_adr
dw
Stack_struc
ENDS
Code2
adun
REPET:
adun
Code2
PROC
push
mov
push
push
push
push
mov
mov
mov
mov
div
xor
mov
mov
xor
add
add
loop
mov
pop
pop
pop
pop
pop
ret
ENDP
ENDS
END
cs:Code2
; Se definete o structur de date salvate n stiv
; Coninutul lui BP
; Coninutul lui CS i IP
; Adresa relativ a rezultatului SUMA
; Adresa relativ a numrului de elemente
; Adresa relativ a vectorului VECTOR
?
?, ?
?
?
?
FAR
bp
bp, sp
ax
cx
si
di
si, [bp].par1_adr
di, [bp].par2_adr
ax, [di]
cl, TYPE VECTOR
cl
ah, ah
cx, ax
di, [bp].par3_adr
ax, ax
ax, [si]
si, 2
REPET
[di], ax
di
si
cx
ax
bp
6
START
2 - 63
Adrese mici
DI
SI
CX
AX
BP (vechi)
Se salveaz la apelul
procedurii adun
6 octei
Adrese mari
Dup salvare, BP = SP
IP
CS
Adresa relativ a param. SUMA SP - 6
Adresa relativ a NR_ELEM
SP - 4
Adresa relativ a param. VECTOR SP - 2
SP
Dup salvarea registrului DI, structura stivei arat ca n figura de mai sus. Ca elemente de noutate
apar urmtoarele:
1. Salvarea registrului BP n stiv imediat dup intrarea n procedur i utilizarea lui BP pentru
adresarea datelor de pe stiv. Datele adresate reprezint parametrii transmii.
2. Definirea unui cadru al stivei cu ajutorul directivei STRUC.
3. Utilizarea, pentru ieirea din procedur, a unei instruciuni RET cu parametru, care descarc
automat stiva astfel nct la rentoarcerea n programul principal starea stivei s fie identic cu cea de
dinaintea apelului.
SEGMENT
dw
10 DUP (0102h)
dw
$ - VECTOR
dw
?
dw
?, ?, ?
; Tabela prin intermediul creia se transmit parametrii
dw
100 DUP (?)
; Rezervai pentru stiv
LABELWORD
; Vrful stivei este de tip WORD
ASSUME
cs : Prog_seg, ds : Prog_seg, ss : Prog_seg
mov ax, Prog_seg
; Se ncarc registrele DS i SS corespunxtor
mov ds, ax
; directivei ASSUME
mov ss, ax
;
mov sp, OFFSET VIRF
; Vrful stivei se ncarc n SP
mov TABEL, OFFSET VECTOR
; Se completeaz tabela cu
mov TABEL+2, OFFSET NR_ELEM
; adresele relative ale
mov TABEL+4, OFFSET SUMA
; parametrilor
mov bx, OFFSET TABEL
; Adresa relativ a tabelei n BX
call
NEAR PTR
adun
; Apel procedur adun
mov ax, 4c00h
int
21h
;
adun
PROC
push
push
push
push
NEAR
ax
cx
si
di
; Procedura de adunare
; Se salveaz coninutul registrelor AX, CX, SI, DI
2 - 64
mov
mov
REPET:
adun
Prog_seg
mov
mov
mov
div
xor
mov
mov
xor
add
add
loop
mov
pop
pop
pop
pop
ret
ENDP
ENDS
END START
2 - 65
CALL) sau macrouri de apel. Aceste subrutine, parte component a EXECUTIVULUI (pe care
utilizatorul le poate doar utiliza, dar nu modifica), poart denumirea de directive sau primitive,
deoarece la nivelul taskului se comport ca i instruciunile, deci sunt indivizibile i
nentreruptibile. Ele au o semantic uor accesibil i pot fi utilizate far a fi necesar cunoaterea
modului lor de implementare n SW-ul EXECUTIVULUI. Pentru a ti dac o directiv a lucrat sau
nu, unul din parametrii ei, numit parametru de stare al directivei ne indic acest lucru prin diferitele
valori pe care le returneaz.
Astfel, programul aferent unei anume aplicaii, reprezint un ansamblu de instruciuni scrise
de utilizator n care sunt incluse i cererile de servicii ctre EXECUTIV n vederea obinerii
atributelor de timp real. n realitate, EXECUTIVUL folosete mecanismul de ntreruperi i ceasul
de timp real, dar aceasta este o activitate programat o singur dat i utilizat ulterior ori de cte
ori este nevoie. n felul acesta programatorul va fi preocupat mai puin de aspectele particulare ale
implementrii diferitelor comenzi, concentrndu-se strict asupra organizrii programului de
aplicaie. n plus, performanele acestor programe sunt comparabile cu cele din cazul anterior
oferind ns avantaje nete n ceea ce privete flexibilitatea, extensibilitatea i portabilitatea lor.
Arhitectura programelor de aplicaie
Bazndu-ne pe existena unui EXECUTIV n timp real putem aborda n mod sistematic
dezvoltarea programelor de aplicaie pe baza urmtoarelor elemente:
1. Definirea conceptului de "echipament virtual de conducere", un echipament ipotetic (care
nu exist fizic), dar care nglobeaz caracteristicile unor echipamente de conducere existente, crora
le va fi destinat programul de aplicaie. Aceste echipamente au o structur de tipul celei din figura
de mai jos:
Comunicare cu
Comunicare cu
nivelul ierarhic
consola operatorului
de proces (COP)
superior (NIS)
Intrri
analogice
..
Intrri
numerice
..
MICROCALCULATOR
DE
PROCES
Ieiri
analogice
Ieiri
numerice
Fig. 3.1.
Ca atare, configuraia echipamentului virtual, poate fi definit, din punct de vedere al
utilizatorului, astfel:
- unitatea central cu microprocesor I80x86;
- modul de intrri analogice;
- modul de ieiri analogice;
- modul de intrri numerice;
- modul de ieiri numerice;
- consol operator (display + tastatur + imprimant);
- 8 sau mai multe nivele de ntrerupere;
- ceas de timp real;
- interfa de comunicare cu nivelul ierarhic superior.
Utilizatorul va fi preocupat de modul de scriere a aplicaiei, avnd n minte structura acestui
echipament virtual i mai puin modul cum se comand concret modulele specificate mai sus.
3-2
ECHIPAMENT VIRTUAL
EXECUTIV DE TIMP REAL
INTERFAA
(subrutine i
proceduri
INDEPENDENT
specifice
dependente de
DE
echipamente,
ECHIPAMENT
dar avnd
nume dedicate)
COMPONENTA
ECHIPAMENT
REAL
PROGRAM DE
APLICATIE
PROPRIU - ZIS
Fig. 3.2.
Pentru clasa echipamentelor de conducere, "interfeele" ar trebui s conin urmtoarele
subrutine i funcii:
- subrutin de programare a circuitului 8259 (sistem prioritar de ntreruperi);
- subrutin de poziionare i citire a mtilor circuitului 8259;
- subrutin de achitare a ntreruperii (uzual se lucreaz n modul nespecificat);
- funcie de preluare a unui caracter de la tastatur n urma unei ntreruperi;
- subrutin de transmisie a unui caracter la display n urma unei ntreruperi de tip TxRDY
(interfa gata de transmisie);
3-3
3-4
4-1
- ine evidena utilizrii memoriei, adic permite cunoaterea n orice moment a zonelor de
memorie libere i ocupate;
- decide ce proces primete memorie, cnd i ce cantitate de memorie i se aloc. Alocarea
memoriei se face att pentru pstrarea programului corespunztor procesului ct i pentru necesitile de
execuie.
- asigur tehnici corespunztoare de protecie a memoriei;
- dezaloc resursa cnd procesul s-a ncheiat sau nu mai are nevoie de o anumit cantitate de
memorie.
2) Funcia de gestiune a procesorului i proceselor:
- ine evidena procesorului precum i evidena strii proceselor;
- decide prioritatea n utilizarea procesorului, n funcie de prioritatea lucrrilor ce trebuie
executate;
- planificatorul lucrrilor aloc resursele procesorului necesare realizrii unui proces (lucrare);
- elibereaz resursa cnd procesul nu mai are nevoie de procesor sau cnd s-a depit o anumit
cuant de timp alocat pentru utilizare.
3) Funcia de gestiune a dispozitivelor periferice are rolul de a aloca resursele i a iniializa operaiile
de I/E precum i de a dezaloca aceste resurse cnd operaiile de I/E s-au ncheiat.
4) Funcia de gestiune a informaiei:
- ine evidena resurselor (fiierelor) i localizarea acestora pe suporturi magnetice;
- ofer rutinele de acces la informaie;
- aloc i dezaloc informaie prin funcia de deschidere i respectiv de nchidere a fiierelor.
Deci, putem spune c:
- funcia de gestiune trebuie s prevad funciile de control automat prin rutine specializate asupra
tuturor resurselor fizice i logice ce apar;
- s asigure o ct mai mare independen a programelor utilizator fa de particularitile sistemului
pe care s-a implementat S.O.;
- s rezolve toate problemele de control al funcionrii sistemului printr-un procedeu performant de
tratare a ntreruperilor (utilizarea ntreruperilor permite un dialog foarte flexibil ntre U.C. i mediul extern,
permind semnalarea prompt a diverselor evenimente interne sau externe);
- s permit modificarea configuraiei de echipamente periferice, fr ca aceasta s afecteze
programele deja implementate.
Din punct de vedere al utilizatorului, S.O. apare ca o interfa ntre programele sale de aplicaii i
echipamentele (elementele) sistemului de calcul, care poate fi reprezentat printr-o structur ierarhic de
forma din Fig.4.1.
Se observ c accesul direct la resursele sistemului de calcul este puternic limitat de existena a dou
nivele intermediare: procesorul de limbaj i S.O. Fiecare nivel introduce funcii noi inexistente la nivelele
inferioare definind o main virtual corespunztoare acelui nivel.
Program aplicaii
Procesor limbaj
S.O.
Sistem de calcul
Fig. 4.1.
4.2. Structura S.O.
Componentele n care se descompune un S.O. sunt situate la diferite nivele ierarhice, avnd, de
exemplu, structura din Fig.4.2. Plasarea unei funcii a S.O. pe unul din cele trei nivele se realizeaz pe baza
deprtrii funciei respective de echipamentul fizic. Acest aspect este foarte evident n toate calculatoarele
care folosesc S.O. i, n special, pentru S.O. scrise n limbaje evoluate.
4-2
1 - Nucleu
1
2 3
S.O. pot fi scrise ntr-un limbaj de nivel evoluat numai la nivelele superioare, care nu interacioneaz
direct cu maina fizic.
Existena nucleului este obligatorie n orice S.O. Nucleul conine funciile privind tratarea
operaiilor de I/E la nivel fizic, tratarea ntreruperilor, tratarea sincronizrii i comunicrii ntre procese, care
sunt scrise, de obicei, n cod main sau limbaj de asamblare. Funciile care formeaz nucleul S.O. sunt
intens utilizate de celelalte dou nivele superioare i, din aceast cauz, se implementeaz prin secvene de
program rezidente n M.O. ntr-o zon special rezervat acestui scop.
Funciile de suport pentru execuia programului sunt apelate n timpul execuiei unui program
printr-un procedeu asemntor apelului macroinstruciunilor, adic prin folosirea unor parametri. Nu toate
funciile acestui nivel sunt rezidente n memorie, ci numai acele funcii care sunt cel mai des utilizate, iar
celelalte se ncarc numai n funcie de necesiti.
Nivelul superior (3) const din programe relativ rar apelate, care permit aducerea unui program n
starea n care s poat fi executat. Programele scrise n limbaje evoluate utilizeaz S.O. tocmai la acest nivel.
Orice acces al programelor utilizator la funciile de la nivelele 2 i 1 se realizeaz indirect (i din aceast
cauz, acest nivel se numete de pregtire a programelor). Apelul la componentele S.O. se realizeaz
printr-un limbaj de comand specific S.O. respectiv.
ntr-o succesiune normal, un program de aplicaie parcurge, nainte de a fi executat, urmtoarele
etape: introducerea n sistem, compilarea, editarea de legturi, activarea programului. Nu este obligatoriu ca
toate lucrrile s parcurg toate aceste etape. Sunt lucrri la care fiecare faz poate s apar o dat sau de mai
multe ori.
Fiecreia din etapele prezentate, n S.O. i corespund programe specifice: compilatoare, editoare de
legturi, editoare de rapoarte pentru prezentarea rezultatelor etc.
4.3. Caracteristici ale S.O.
Modul n care diversele S.O. implementeaz funciile specifice determin atributele S.O. Punerea n
eviden a acestor atribute este foarte important pentru c reprezint un mijloc obiectiv de comparare ntre
diverse S.O.
Fiecare S.O. prezint anumite caracteristici specifice, dar pot fi puse n eviden i cteva
caracteristici de ordin general, valabile n orice sistem de operare, din care putem enumera:
1) Timpul de rspuns, calculat ca intervalul de timp ntre lansarea unei comenzi (cereri de servicii
ctre executiv) i achitarea acesteia de ctre sistem. Acest atribut are n general dou componente distincte i
anume:
- timpul de ateptare corespunztor intervalului de timp pentru ca cererea s fie luat n considerare;
- timpul de execuie (timpul necesar pentru a efectua lucrrile specifice cererii).
2) Simultaneitatea utilizrii, se refer la gradul n care un sistem poate fi utilizat n acelai timp de
mai muli utilizatori (multiprogramare) sau s execute simultan mai multe programe (lucrri) ale aceluiai
utilizator (multitasking).
3) Eficiena, reprezint proprietatea S.O. de a folosi n mod optim resursele de care dispune sistemul
de calcul.
4) Partajarea i protecia, caracterizeaz gradul n care utilizatorii au posibilitatea s utilizeze n
comun informaia prezent n sistem, modul n care ei pot s comunice ntre ei fr ca execuia programelor
specifice unui utilizator s afecteze execuia programelor celorlali utilizatori. Este necesar ca, interaciunea
dintre utilizatori s nu conduc la alterarea intenionat sau accidental a informaiei.
5) Generalitatea, flexibilitatea, extensibilitatea, msoar gradul n care un S.O. poate fi adaptat pe
alte sisteme de calcul dect sistemul pentru care a fost creat. De asemenea, indic gradul n care un S.O.
4-3
poate fi dezvoltat, fie prin modificarea unora din funciile deja implementate, fie prin introducerea de noi
funcii i componente software i hardware fr eforturi deosebite de programare i proiectare.
6) Fiabilitatea i disponibilitatea unui S.O. este strns legat de fiabilitatea ntregului sistem de calcul
i exprim proprietatea sistemului de a funciona n continuu, fr a avea goluri de funcionare din cauza
defectrii sau blocrii unor componente ale sale. Creterea fiabilitii se poate face pe dou ci:
- creterea fiabilitii componentelor hardware i software precum i introducerea rezervrii unor
blocuri critice;
- utilizarea unor S.O. i programe tolerante la defecte; aceasta nseamn c, n cazul apariiei unor
anomalii de funcionare, S.O. asigur n continuare desfurarea activitii sistemului, acceptndu-se o
degradare a performanelor n anumite limite impuse care nu afecteaz ns esena activitii sistemului.
Un accent deosebit se pune pe fiabilitatea i disponibilitatea sistemelor n cazul utilizrii acestora
pentru prelucrri n timp real.
7) Transparena i vizibilitatea. Transparena indic gradul n care realizarea funciilor S.O. se face
fr aportul utilizatorului. Pentru utilizator, ceea ce se afl sub interfaa de utilizare care i se ofer trebuie s
fie invizibil, deci realizarea efectiv a funciilor S.O. trebuie s fie invizibil. Vizibilitatea indic msura n
care un utilizator poate avea acces la programele ce implementeaz anumite funcii ale S.O. Exist situaii n
care, dei nu este absolut necesar, utilizatorul are nevoie s cunoasc anumite informaii specifice activitii
S.O. pentru a putea crete eficiena programelor sale de aplicaie.
4.4. Tipuri de sisteme de operare
Plecnd de la caracteristicile S.O. i avnd n vedere i destinaia sistemului de calcul utilizat, s-a
ajuns la urmtoarea clasificare a S.O.:
- S.O. secveniale;
- S.O. cu multiprogramare;
- S.O. n timp real;
- S.O. cu prelucrare multipl.
Un sistem de operare secvenial permite executarea, la un moment dat, a unui singur program care
trebuie terminat nainte de a se lua n considerare un alt program. Principalul dezavantaj al acestui tip de S.O.
este timpul de rspuns mare comparativ cu timpul de operare al unitii centrale.
Sistemele cu multiprogramare accept la un moment dat mai multe programe n memoria central
partajat, acestea aflndu-se n diverse stadii de execuie. Execuia acestor programe se realizeaz prin
multiplexarea unitii centrale, urmrindu-se obinerea, la un grad de simultaneitate ct mai ridicat, a unui
timp de rspuns ct mai mic i a unei eficiene de utilizare maxim. n acest caz utilizatorul nu poate s
intervin la nivelul S.O. pentru a dirija modul de execuie a programului.
Un S.O. n timp real este dedicat unei anumite clase de aplicaii. Prelucrarea n timp real presupune o
vitez de rspuns foarte mare pentru c toate cererile din proces trebuie luate n considerare imediat ce au
fost formulate.
Noiunea de timp de rspuns este foarte elastic, domeniul de variaie al acestuia fiind foarte larg n
funcie de domeniul de utilizare al sistemului de calcul (microsecunde pentru procese foarte rapide, pn la
ore n dirijarea unor procese economice).
n general, aplicaiile implementate pe echipamente de calcul ce funcioneaz n timp real sunt n
bucl infinit i presupun o baleiere permanent a datelor sosite din proces concomitent cu calculul
comenzilor corespunztoare, iar intervenia din partea operatorului este minim.
Complexitatea S.O. n timp real este mult mai mare dect a celorlalte tipuri de S.O. pentru c se
impun performane deosebite pentru a satisface ntr-un timp critic diversele cereri sosite din exterior.
Deoarece, n multe astfel de sisteme apare problema cooperrii ntre diversele programe executate, trebuie
rezolvate probleme sofisticate privind sincronizarea i comunicarea ntre programe.
Un sistem de calcul dotat cu un S.O. cu prelucrare multipl dispune de de mai multe procesoare care
pot s execute simultan unul sau mai multe programe. n cazul execuiei mai multor programe independente,
avem de-a face cu efectul de multiprogramare menionat mai sus, dar cu performane mult mbuntite.
n cazul execuiei simultane a unui singur program de ctre mai multe uniti trebuie s existe
posibilitatea de descopunere a acestui program n pri componente numite sarcini de program sau taskuri,
care n timpul execuiei trebuie s coopereze ntre ele n vederea atingerii obiectivului urmrit de program n
ansamblu.
4-4
Un sistem de operare care ofer posibilitatea de a executa n paralel (sau simultan) mai multe
programe (taskuri) care interacioneaz ntre ele, pri componente ale unui program dat, poart denumirea
de S.O. cu faciliti multitasking.
Menionm ns c nici multiprogramarea i nici multitaskingul nu impun capacitatea de prelucrare
multipl din partea sistemului de calcul, deci astfel de S.O. pot fi implementate i pe sisteme monoprocesor.
Sistemele de calcul destinate conducerii proceselor industriale trebuie s posede n mod necesar
sisteme de operare n timp real cu faciliti multitasking. O particularitate esenial a unui astfel de S.O. este
aceea c el trebuie s fie accesibil utilizatorului care i poate cere o serie de servicii n vederea realizrii
evoluiei dorite a programului.
Privit prin prisma utilizatorului i a programelor de aplicaii, ansamblul de programe al acestui tip de
S.O. poate fi mprit n dou categorii:
- programe necesare n faza de pregtire, elaborare i testare a programelor de aplicaii (editorul de
texte, compilatorul, link-editorul, debuggerul etc.) numite, din acest motiv, i programe de serviciu;
- programe necesare n etapa de conducere, care se leag cu programele utilizatorului n faza de
dezvoltare, formnd aplicaia dedicat care se implementeaz pe echipamentul de conducere.
Pentru a nu ncrca n mod nejustificat att din punct de vedere hardware ct i software
echipamentul de calcul destinat conducerii procesului industrial, dezvoltarea aplicaiei se va face pe un alt
sistem numit sistem de dezvoltare care va conine ambele categorii de programe.
4.5. Principiile programrii paralele
Consideraii generale
Programarea paralel sau concurent este activitatea de scriere a unui program care conine o serie de
pri componente necesar a se afla n execuie n acelai moment.
Orice aplicaie n timp real conine astfel de operaii paralele care reprezint etape de execuie
asincron a acesteia. Aa cum am menionat n capitolul anterior, prile componente ale programului ce pot
fi executate n paralel poart denumirea de taskuri. Din punct de vedere al sistemului de calcul, taskul este
cea mai mic unitate de prelucrare creia i se atribuie o identitate.
4-5
Dac sistemul de calcul (conducere) este multiprocesor, paralelismul execuiei taskurilor poate fi
asigurat n mod real n sensul c fiecare task poate fi executat de ctre un procesor. n acest caz, se obine o
execuie paralel suprapus n timp, numit i execuie paralel fizic.
Dac echipamentul este monoprocesor i dotat cu un S.O. n timp real cu faciliti multitasking,
execuia paralel a taskurilor se va face intercalat, pe principiul distribuirii timpului unitii centrale ntre
taskuri ("time slicing"). La un moment dat, va deine controlul procesorului un singur task, dar datorit
vitezei mari de lucru a acestuia, precum i datorit modului de programare se las impresia c taskurile se
execut simultan, ca i cnd fiecare task ar beneficia de un procesor propriu - virtual, evident ceva mai lent.
n acest caz, se spune ca are loc o execuie pseudo-paralel sau o execuie paralel logic.
n cele ce urmeaz ne vom referi la acest din urm mod de execuie paralel a taskurilor, ceea ce
corespunde situaiei mai frecvent ntlnite n aplicaiile de conducere i supraveghere automat a proceselor.
Pentru a putea realiza acest paralelism n prelucrarea taskurilor, arhitectura sistemelor de calcul
trebuie s conin obligatoriu canale care s execute toate operaiile de transfer de informaie, independent de
procesor. Procesorul va avea doar rolul de a iniia i iniializa operaia de I/E printr-un dialog adecvat cu
canalul. n continuare canalul execut toate operaiile de transfer necesare, iar n ncheiere semnaleaz
procesorului, printr-un semnal de ntrerupere, c i-a ncheiat activitatea. Aceasta presupune existena unui
sistem de ntreruperi bine pus la punct.
Exemplu de execuie a taskurilor n regim de multiprogramare
Considerm cazul unui sistem n care exist disponibile simultan trei taskuri T1, T2, T3. Taskul T1
are prioritatea maxim, dar la iniializarea sistemului, se presupune c este gata pentru execuie taskul T3.
Schematic, ocuparea de ctre cele trei taskuri a procesorului i activitatea S.O. i a canalelor de I/E
este reprezentat n urmtoarea diagram.
T3
T2
terminat
blocat
*********
t
terminat
t
5
T1
3
SO
Canal
terminat
8
t
********
Haurat s-a reprezentat starea activ a unui task, a S.O. sau a CANAL-ului.
*** - reprezint starea blocat a unui task, adic starea n care acesta nu poate fi executat, fiind n
ateptarea unei resurse (pentru exemplul dat, resursa este un canal I/E).
------ reprezint starea de ntrerupere a unui task.
Iniial, la pornirea sistemului, se execut programe specifice S.O. Acesta, va da la un moment dat,
controlul primului program gata de execuie, adic taskului T3. La momentul (1), taskul T3 iniiaz o operaie
de I/E. Dup ce transmite canalului toi parametrii necesari executrii operaiei de I/E, T3 trece n starea
blocat pentru c ateapt rezultatele operaiei de I/E iniiate. Aceasta conduce la preluarea controlului de
ctre S.O., care va selecta acum taskul T1 (task care are prioritate maxim n acest moment) cruia i va da
controlul.
La momentul (2) canalul lanseaz o ntrerupere ctre procesor indicnd ncheierea operaiei de I/E
iniiat de taskul T3 ceea ce duce la suspendarea taskului T1 aflat n execuie (trecerea lui n starea ntrerupt)
controlul prelundu-l S.O., care trece la o subrutin de tratare a ntreruperii sosite. Dup acceptarea i tratarea
ntreruperii, taskul T3 trece din starea blocat n starea ntrerupt. Aceasta nseamn c, din acest moment,
execuia taskului T3 poate fi reluat imediat ce se ncheie execuia taskurilor de prioritate superioar.
4-6
Dup terminarea tratrii ntreruperii, la momentul (3) se reia execuia taskului T1 pentru c acesta
este, n acest moment, de prioritate maxim. La momentul (4) i taskul T1 lanseaz o operaie de I/E, dup
care trece n starea blocat, rednd controlul S.O. Acesta va lansa n execuie la momentul (5) taskul cu
prioritate maxim n acel moment, n cazul nostru taskul T2. Dup terminarea operaiei de I/E, canalul
trimite, la momentul (6), un semnal de ntrerupere, care determin trecerea taskurilor T1 i T2 n starea de
ntrerupere, controlul procesorului fiind preluat de S.O. Acesta trece la subrutina de tratare a ntreruperii
generate de canal i, dup ncheierea tratrii acesteia, d controlul taskului T1 care are acum prioritate
maxim. Terminarea execuiei taskului T1 determin reactivarea S.O. (momentul (7)), care va da controlul
taskului T2, care la terminarea execuiei (momentul (8)) red controlul S.O. Acesta reactiveaz taskul T3, iar
dup terminarea acestuia (momentul (9)), controlul este preluat de S.O.
Din acest exemplu, se vede clar c n cazul programrii paralele, un task este un ansamblu indivizibil
program-procesor.
n cadrul oricrui fel de execuie paralel exist dou categorii de taskuri peste un program dat:
taskuri disjuncte sau independente i taskuri care interacioneaz (sau care coopereaz).
Dou sau mai multe taskuri se numesc disjuncte dac nu schimb informaii ntre ele sau dac nu
utilizeaz resurse (zone de memorie, periferice etc.), n comun. n caz contrar, se spune c ele
interacioneaz. Evoluia unui program alctuit numai din taskuri disjuncte este unic indiferent de ordinea
de execuie a taskurilor. Dar, n cazul unei execuii pseudo-paralele a dou sau mai multe taskuri peste un
program dat, avem de-a face, n general, cu taskuri care interacioneaz.
Pentru o mai bun nelegere a celor spuse prezentm o serie de exemple.
Exemplul l: Fie o aplicaie format din trei taskuri: T1, T2, T3 avnd urmtoarea componen:
Task T1
Task T2
Task T3
M1 = MAX(A,B)
M2 = MAX(C,D)
M = MAX(M1,M2)
Structura taskurilor este foarte simpl: T1 i T2 calculeaz valoarea maxim dintre dou numere A, B,
respectiv C, D, rezultatele fiind numerele M1, respectiv M2. Taskul T3 determin maximul dintre M1 i M2. Se
observ imediat c taskurile T1 i T2 sunt disjuncte, ordinea execuiei lor nealternd evoluia n ansamblu a
programului. Taskul T3, n schimb, coopereaz cu taskurile T1 i T2 (preia valorile M1 i M2 de la acestea) i,
ca atare, el trebuie s intre n execuie numai dup terminarea execuiei acestor dou taskuri.
Ca urmare, ordinea de execuie a taskurilor pentru o evoluie corect a programului dat va fi: T1, T2,
T3 sau T2, T1, T3, oricare alt ordine de execuie avnd ca rezultat scparea de sub control a evoluiei
programului.
Exemplul 2: Fie o aplicaie format din dou taskuri T1 i T2.
Taskul T1 observ i contorizeaz o serie de evenimente incrementnd o variabil CONTOR. Taskul
T2 tiprete ocazional numrul evenimentelor contorizate de taskul T1 i dup fiecare tiprire anuleaz
variabila CONTOR:
Task T1
Observ evenimentul
CONTOR=CONTOR +1
Task T2
Tiparete CONTOR
CONTOR=0
Se observ c cele 2 taskuri interacioneaz ntre ele utiliznd n comun variabila CONTOR care se
modific n timp.
Dac nu se iau msuri speciale de programare, poate apare urmtoarea situaie eronat: presupunem
c T1 a incrementat variabila CONTOR la 20, iar taskul T2 a tiprit aceaste cifre. Se poate ntmpla ns ca
nainte ca T2 s anuleze variabila CONTOR, taskul T1 s sesizeze un nou eveniment i s incrementeze
variabila CONTOR de la 20 la 21. Rezult deci c acest eveniment se va pierde, el rmnnd neraportat.
O alt situaie, mai puin evident, dar care conduce la rezultate eronate este urmtoarea:
Implementrea operaiei CONTOR = CONTOR + 1 presupune existena mai multor instruciuni n
cod main:
- ncarc CONTOR n acumulator;
- incrementeaz acumulatorul;
- memoreaz coninutul acumulatorului n CONTOR.
n timp ce taskul T1 execut aceast secven, el poate fi ntrerupt de T2 i s se ajung la urmtoarea
situaie:
4-7
Task T2
Poziioneaz cursor n (L2,C2)
Scrie MESAJ 2
MESAJ 1 i MESAJ 2 sunt de fapt iruri de caractere, iar (L1, C1) i (L2, C2) numere de linie i
coloan pe display (uzual, un display alfanumeric are 24 de linii i 80 de coloane).
Dac nu se iau msuri speciale de protecie, se poate ajunge la urmtoarea situaie eronat: taskul T1
preia controlul, poziioneaz cursorul n linia i coloana (L1, C1) i ncepe s tipreasc MESAJ 1; dac T1
este ntrerupt nainte ca s fie terminat tiprirea lui MESAJ 1 i controlul este preluat de T2, acesta va
poziiona cursorul pe display n linia/coloana (L2, C2), va scrie MESAJ 2, dup care controlul revine lui T1,
care continu din punctul n care a fost ntrerupt, deci continu tiprirea lui MESAJ 1; cursorul a rmas ns
n poziia lsat de aciunea taskului T2 i tiprirea lui MESAJ 1 este astfel compromis.
Din aceste exemple rezult clar c dac nu se iau msuri speciale de programare, n cazul taskurilor
care interacioneaz, rezultatul nu poate fi prevzut, aceasta datorit imposibilitii aprecierii momentului
cnd se face transferul controlului.
Evoluia unui program compus din astfel de taskuri nu este unic, ea depinznd de modul de
planificare al taskurilor spre execuie, precum i de timpul de execuie al acestora. Pentru obinerea unei
evoluii dorite a programului, e necesar o programare foarte atent care s permit realizarea interaciunii
corecte ntre taskurile componente.
4.6. Gestiunea memoriei
Alturi de procesor, memoria constituie o resurs fizic fundamental a oricrui calculator numeric.
Distingem: memoria principal sau operativ - MO reprezentnd memoria intern a sistemumlui de calcul i
memoria secundar sau extern. Se tie c nici un program nu poate fi executat dac el nu se afl depus n
memoria operativ. innd cont de lungimea, n general, mare a programelor de aplicaie n timp real, de
obicei, acestea nu sunt integral rezidente n memoria intern. Din aceast cauz, se impune ca, parial sau
total, programul s fie nmagazinat pe un suport extern de memorie, de regul, disc magnetic. Dup cum s-a
artat, fiecare program de aplicaie poate fi privit ca o reuniune de taskuri care interacioneaz ntre ele.
Pentru a putea fi executat, la un moment dat, un task trebuie s fie complet ncrcat n memoria intern.
Taskul trebuie s aib alocat suficient memorie, att pentru el, ct i pentru datele pe care le vehiculeaz.
Rezult c sistemul de operare trebuie s dispun de un mecanism special care s aloce memorie intern
diferitelor taskuri care sunt activate la un moment dat. Deoarece mai multe taskuri pot ndeplini condiiile de
activare, la un moment dat, acestea cer s li se aloce spaiu n memoria intern. Avnd n vedere c memoria
are o capacitate limitat, gestiunea memoriei presupune introducerea unor tehnici de plasare i nlocuire n
memoria operativ a programelor i datelor aflate pe suporturi de memorie secundar. Alocatorul de
memorie trebuie s rezolve problema schimbului de informaie ntre memoria operativ i memoria
secundar n mod automat, printr-o tehnic de dute-vino (swapping) i s determine n orice moment cum
trebuie distribuit informaia n memorie, n scopul optimizrii utilizrii ei. Componentele sistemului de
operare prevzute pentru gestiunea memoriei fac parte din suportul de execuie a programelor i sunt situate
deasupra suportului de gestiune a unitii centrale.
Prin spaiu de adresare se nelege totalitatea numerelor de adres referite ntr-un program. n timpul
execuiei programului, fiecrei variabile din program i va fi asociat o anumit adres din memoria
operativ.
Gestiunea memoriei include dou operaii eseniale:
- adresarea memoriei;
4-8
- protecia memoriei.
Adresarea memoriei const din procedee prin care se realizeaz asocierea ntre un element al
spaiului de memorie i o adres efectiv din memoria operativ (un element al spaiului de adresare).
Protecia memoriei const din acele procedee care garanteaz utilizarea corect a memoriei operative
de ctre toate taskurile aflate n execuie la un moment dat.
Zona rerervat
sistemului de operare - SO
Spaiul pentru programele utilizator
Figura 4.3.
Neutilizat
n zona rezervat sistemului de operare (SO) sunt plasate modulele rezidente ale SO sau anumite
module folosite temporar. Restul memoriei operative este disponibil programelor utilizatorului.
Suportul software pentru gestiunea memoriei n aceste sisteme este foarte redus. De regul se
verific dac programele utilizator planificate pentru execuie nu depesc capacitatea memoriei operative
disponibile n sistem (capacitatea MO - capacitatea zonei destinate SO). Dac se constat depirea
capacitii disponibile, se va emite un semnal de eroare, iar lucrarea respectiv se va abandona. Mecanismele
de protecie a memoriei constau din procedee relativ simple prin care se permite citirea informaiei din zona
aferent SO i interzicerea operaiei de a nscrie informaii n aceast zon. Sistemele de operare de acest tip
se numesc monitor sau supervizor. Funciile unui asemenea SO sunt:
1. - Asigurarea continuitii ncrcrii sistemumui. Aceasta nseamn c n momentul n care se
termin execuia unui task, controlul este preluat de supervizor, care iniiaz execuia taskului celui mai
prioritar n acel moment, care preia i controlul. Dac taskul aflat n execuie este ntrerupt (de un task mai
prioritar), SO va suspenda execuia taskului curent i acesta, mpreun cu informaia aferent contextului
cnd a fost ntrerupt, va fi imediat transferat pe un suport de memorie extern, n memoria operativ
ncrcndu-se noul task ce urmeaz a fi executat. Reluarea execuiei taskului ntrerupt se va face, dup
rencrcarea acestuia n memorie, din punctul n care a fost ntrerupt.
2. - Iniierea i achitarea operaiilor de intrare-ieire solicitate de programele utilizator.
3. - Punera la dispoziie, pentru programele utilizator, a unor rutine standard frecvent utilizate.
Singura cale de a obine accesul n zona aferent SO de ctre programele utilizator const n apelul unor
rutine ale SO.
Pprincipalul avantaj al acestei metode const n simplitatea SO i a spaiului de memorie mic ocupat
de acesta, precum i n faptul c se dispune pentru execuia taskului curent de ntregul spaiu al memoriei
disponibile.
Dezavantajul metodei l constituie timpul de rspuns mare datorat comutrilor frecvente ntre taskuri
sau de la un program la altul, deoarece transferul ntre memoria intern i memoria extern cere mult timp.
O metod de a elimina acest dezavantaj const n desemnarea unor taskuri critice pentru care se
impune un timp de rspuns minim, care rmn permanent ntr-o zon protejat a memoriei interne. De
asemenea, utilizatorul are la dispoziie un mecanism prin care va putea executa programe, uneori cu mult mai
mari dect spaiul de adrese fizice disponibile. Acest mecanism se numete metoda nlnuirii i suprapunerii
(overlay) i const n suprapunerea unor module de program. n acest caz, un program aplicativ sau un task
aflat n execuie controleaz el nsui ncrcarea de pe suportul extern a unor module de program sau taskuri.
ncrcarea se face la momente de timp bine definite impuse de evenimente externe sau interne, noile taskuri
aducndu-se n memoria intern n zona proprie a programului apelant, putnd s-l acopere parial sau total.
Rezult c programul de aplicaie preia att funcia de planificare a execuiei taskurilor, ct i de gestiune a
memoriei interne, substituindu-se SO. Dei aceast metod presupune o complicare a programului de
4-9
aplicaie, totui este foarte util pentru aplicaii de complexitate mic i medie i la care timpii de rspuns au
valori foarte critice, precum i n cazul sistemelor cu divizarea timpului.
Dezavantajul esenial al monoprogramrii este acela c existnd la un moment dat un singur program
n memorie, nu poate fi utilizat paralelismul ntre efectuarea operaiilor de intrare-ieire i operaiile de
prelucrare propriu-zise, ceea ce conduce la un timp de lucru global mult mai mare i un factor redus de
utilizare a resurselor.
Cu toate acestea, aceast tehnic este foarte utilizat, mai ales, n cazul unor calculatoare de putere
mic i medie destinate prelucrrii unor lucrri cu caracter tehnico-tiinific. Astfel de lucrri ocup un timp
ndelungat procesorul cu efectuarea unor operaii aritmetice i logice complexe ceea ce face s se resimt mai
puin influena timpului necesar schimbului informaiei ntre MO i memoria extern.
Zona rezervat
sistemului de operare - SO
Taskul 1
Partiia 1
Neutilizat
Figura 4.4.
Taskul 2
Partiia 2
Neutilizat
Taskul 3
Partiia3
Neutilizat
Se observ c, i n acest caz, o anumit zon de memorie va fi alocat necesitilor SO. Fiecare
partiie va fi format dintr-o zon util n care se ncarc programele i datele aferente unui task i o zon
neutilizat. n ceea ce privete protecia memoriei, apar dou aspecte:
1. - Ca i n cazul monoprogramrii este necesar ca programele utilizator s nu afecteze n nici un fel
informaiile din zona SO.
2. - Se impune ca execuia unui program (task) s nu afecteze n nici un fel celelalte programe
(taskuri) cu care coexist n memorie.
Un mecanism uor de implementat care s rspund cerinelor de mai sus l reprezint mecanismul
cheie de protecie - cheie de acces. Conform acestui mecanism, fiecrei partiii i se asociaz, utiliznd
mijloace hardware, o cheie de protecie. Cnd procesorul este alocat unui program (task), cmpul din tabela
de stare a taskului ce conine cheia de acces la memorie va fi actualizat corespunztor partiiei programului
curent aflat n execuie. n timpul execuiei, la fiecare acces la memorie se verific egalitatea cheii de acces
cu cea a cheii de protecie, accesul fiind permis numai n partiiile unde se nregistreaz egalitatea.
Mecanismul cheie de protecie - cheie de acces poate fi extins uor i la canalele de intrare-ieire.
Dac memoria operativ este divizat n partiii nainte de execuia oricrei lucrri, se spune ca
lucrm cu partiii statice (fixe). n acest caz dimensiunea partiiei este fixat nc din etapa de generare a SO.
ntr-o asemenea organizare, un program (task) dintr-o partiie este executat pn n momentul n care va
iniia o operaie de intrare-ieire. Evident c cel care iniiaz propriu-zis operaia de intrare-ieire este SO.
Dup iniierea operaiei de intrare-ieire, SO va trece controlul unui alt task rezident n alt partiie a
memoriei i care dispune de toate resursele necesare cu excepia procesorului. La fel se petrec lucrurile i n
cazul n care un task este ntrerupt de un task mai prioritar sau ca urmare a apariiei unui eveniment n
4 - 10
proces: SO va da controlul taskului mai prioritar sau se trece la rutina de tratare a ntreruperii solicitate. Dac
ntr-o faz a lucrrii cantitatea de memorie solicitat depeste cantitatea de memorie ce poate fi pus la
dispoziie ntr-o partiie, ntreaga lucrare se abandoneaz.
Modul de alocare a memoriei cu partiii fixe este indicat n situaia n care se cunosc dimensiunile
programelor (taskurilor) i zonele de memorie ocupate de datele pe care acestea le vehiculeaz. n acest caz
partajarea memoriei se va face n funcie de necesiti, obinnd deci o bun utilizare a memoriei.
Dac partiiile sunt create nu la generarea sistemului, ci chiar n timpul execuiei lucrrii, naintea
nceputului fiecrei faze a lucrrii, se spune c sistemul de calcul lucreaz cu partiii dinamice. n aceast
situaie SO poate ajusta dimensiunea partiiilor n funcie de necesitile curente. Uneori aceste modificri se
realizeaz chiar n timpul execuiei unor programe prin extensia sau reducerea memoriei alocate acestor
programe. SO poate modifica i numrul partiiilor existente la un moment dat n memorie. Aceste apecte
impun ca SO s dein informaii detaliate despre organizarea memoriei sub forma a dou tabele: una, pentru
partiiile alocate i alta, pentru partiiile libere. Informaiile ce se pstreaz n aceaste tabele se refer la
dimensiunile partiiilor, adresa primei locaii a partiiei, rectriciile de acces la fiecare partiie.
Cele mai cunoscute procedee de alocare dinamic a memoriei sunt: procedeul FIRST FIT (procedeul
primei partiii) - eficient n cazul programelor de dimensiuni mari i procedeul BEST FIT (procedeul celei
mai bune partiii) - specific n cazul unor programe mici i cu o mare diversitate. Alte algoritme de alocare
dinamic a memoriei sunt: algoritmul njumtirii (BUDDY SYSTEM), care impune ca fiecare partiie
liber s aibe o dimensiune egal cu o putere a lui 2, algoritmul numerelor lui Fibonacci, care presupune o
divizare a memoriei proporional cu numerele din irul lui Fibonacci etc.
Deoarece alocarea dinamic a memoriei duce la apariia unor fragmente de memorie neutilizate, n
general de dimensiuni mici, ceea ce duce la amnarea introducerii n execuie a unor lucrri noi pn la
terminarea unei lucrri n curs de execuie ce elibereaz o partiie suficient de memorie, este necesar ca,
periodic, aceste regiuni libere s fie combinate ntr-o regiune mai mare, operaie numit compactare sau
recompactare a memoriei. Operaia este foarte costisitoare deoarece presupune deplasarea programelor n
memorie, cu modificarea tuturor adreselor (mai puin adresele porturilor dispozitivelor de intrare-ieire) i se
realizeaz printr-un mecanism comun software-hardware.
Principalul avantaj al alocrii dinamice, n special n cazul folosirii programelor relocabile (adic
programe ce conin adrese relative dup faza de editare a legturilor) l constituie eliminarea fragmentrii
memoriei, cea ce duce la o utilizare mult mai eficient a MO i la un grad superior de multiprogramare.
Dezavantajul const n folosirea unor componente hardware suplimentare, reducerea vitezei de lucru
datorit timpului necesar pentru calculul adreselor efective i creterea timpului efectiv de lucru datorit
timpului mare necesar compactrii memoriei, n special dac aceast operaie se realizeaz frecvent.
Menionm c metoda este mai puin utilizat n cazul SO cu divizarea timpului.
4 - 11
reprezentat n sistemul de operare printr-o structur de date numit bloc de comand a procesului (taskului).
Un bloc de comand a procesului (taskului) va reflecta starea procesului (taskului) i va conine toate
informaiile necesare pentru a relua procesul (taskul) din punctul n care a fost ntrerupt. Cu mici diferene de
la un sistem de operare la altul, un bloc de comand a procesului (taskului) va conine:
- identificatorul procesului (taskului);
- starea procesului (taskului);
- copia registrelor generale la suspendarea procesului;
- informaii despre resursele alocate procesului.
Observaie: Modul n care este creat un proces (task) este specific fiecrui sistem de operare.
Taskurile care compun o aplicaie se pot afla n una din urmtoarele trei stri: NEINSTALAT,
INACTIV sau ACTIV, Fig. 4.5.
5
BLOCAT
(BLOCKED)
Cerere de
terminare
9
forat
(din alt task)
7
6
GATA DE
EXECUIE
(READY)
Cerere de 1
intrare n
execuie
(din alt task)
8 Cerere de
terminare
forat
(din alt task)
N EXECUIE
(RUN)
ACTIV
INACTIV
(INACTIVE)
tergere
Instalare
NEINSTALAT
Figura 4.5.
Un task ACTIV poate fi, la rndul lui, n una din urmtoarele substri: BLOCAT (BLOCKED),
GATA DE EXECUIE (READY) sau N EXECUIE (RUN).
Un task neinstalat este un task creat rezident pe un suport extern sau n memoria intern a
calculatorului, dar care nu a fost nc adus la cunotinta sistemului de operare (EXECUTIVULUI). Un task
creat este fcut cunoscut sistemului de operare prin operaia de instalare, n urma creia el este trecut automat
n starea INACTIV.
Un task se afl n starea INACTIV dac este instalat, dar nu este planificat pentru execuie. Prin
instalare se creeaz i i se aloc taskului un vector de stare sau un bloc de control al taskului care reprezint
materializarea taskului n sistem i care conine informaiile specificate mai sus. Vectorii de stare ai
taskurilor sunt grupai ntr-o tabel a taskurilor care este folosit de sistemul de operare cu ocazia instalrii
i distrugerii (tergerii) taskurilor, precum i pentru efectuarea schimbrilor survenite n starea taskurilor pe
parcursul duratei lor de existen. Taskului i se atribuie un nume sau un numr care permite sistemului de
operare i altor taskuri s-l desemneze fr ambiguitate pe toat durata lui de existen. Un task poate reveni
n starea NEINSTALAT numai din starea INACTIV prin operaia de tergere (sau distrugere) a lui,
dezafectndu-i-se vectorul de stare.
Un task pentru care se face o cerere de intrare n execuie trece din starea INACTIV n starea ACTIV
i anume n substarea READY, tranziia 1, adic are ndeplinite toate condiiile i poate astfel concura la
ocuparea procesorului. Momentul trecerii unui task n substarea GATA DE EXECUIE nu poate fi prevzut
cu exactitate de ctre programator, acest moment fiind funcie de complexitatea aplicaiei i de modul n care
4 - 12
se face planificarea taskurilor pentru intrarea lor n execuie. Precizm c planificarea taskurilor pentru
execuie este realizat de un modul al sistemului de operare numit planificator (SCHEDULER). Trecerea
unui task n substarea N EXECUIE (RUN) se face numai din substarea READY, tranziia 2. Exist dou
tehnici de baz pentru realizarea planificrii taskurilor spre execuie:
10. Procedeul round-robin, prin care taskurile aezate ntr-o coad de ateptare sunt executate
succesiv, fie pn la terminarea lor normal, fie un interval (cuant) de timp t bine determinat. Strategia de
administrare a cozii este de tip FIFO (First In - First Out : Primul venit - Primul ieit). Dup ce un task a fost
executat, acesta este trecut n coada de ateptare i este lansat n execuie taskul urmtor. Dac taskul nu se
termin n timpul alocrii curente, el este trecut prin coada de ateptare de n ori, unde n este cel mai mic
ntreg care satisface relaia t n t unde t este cuanta de timp alocat rulrii curente a unui task, iar t este
timpul de execuie al taskului. De obicei, parametrul t se alege astfel nct majoritatea interaciunilor
utilizator-sistem s se termine ntr-o singur cuant (de regul de ordinul milisecundelor). Se observ c,
acest algoritm ntrerupe un task n curs de execuie indiferent dac la epuizarea cuantei de timp acordate
taskul respectiv s-a terminat sau nu.
20. Procedeul dup prioriti, prin intermediul cruia fiecrui task i este atribuit un indicator de
importan materalizat printr-un nu numr numit prioritate, iar dintre taskurile gata de execuie, la un
moment dat, care concur la ocuparea procesorului, sistemul de operare va aduce N EXECUIE taskul cu
prioritatea cea mai mare la acel moment.
Observaii:
1. n cazul EXECUTIVELOR care permit ambele moduri de planificare a taskurilor pentru execuie,
procedeul round-robin se aplic taskurilor de aceeai prioritate.
2. Exist sisteme de operare evoluate care ofer posibilitatea de activare a taskurilor n condiii de
criz de timp i care dispun de proprietatea remarcabil de cretere automat a prioritii unui task dac
acesta nu a fost executat ntr-un anumit interval de timp.
3. Este evident c pe un sistem de calcul monoprocesor, la un moment dat, un singur task se afl N
EXECUIE.
Trecerea unui task dintr-o stare n alta se poate realiza, de asemenea, n dou moduri:
10. Prin intermediul ntreruperilor determinate de evenimentele interne sau externe generate prin
intermediul sistemului de ntreruperi, contextul comutrii fiind determinat de nivelul ntreruperii i de
subrutina de tratare a acesteia. Evenimentele ce sunt luate n considerare de sistem sunt:
- ntreruperi de la procesul condus;
- ntreruperi de la ceasul de timp real;
- ntreruperi generate de dispozitivele de intrare-ieire;
- ntreruperi iniiate de operator de la COP;
- terminarea sau suspendarea executrii unui task activ.
20. Prin directive (cereri de servicii) ctre sistemul de operare (EXECUTIV) din taskul care se afl n
execuie, contextul comutrii fiind determinat de tipul directivei i de parametrii acesteia.
Un sistem de operare n timp real trebuie s permit ambele procedee de comutare a taskurilor,
aceasta i datorit faptului c directivele folosesc implicit sistemul de ntreruperi al microprocesorului.
Mai mult, un EXECUTIV de timp real este necesar s fie nsoit de un MONITOR care s constituie
interfaa ntre operator i programul ce reprezint aplicaia de conducere i care s conin comenzi avnd
acelai efect asupra taskurilor ca i directivele. Astfel, prin intermediul MONITORULUI, operatorul se poate
informa asupra strii taskurilor, poate realiza, dac este necesar, modificarea strii acestora, aciuni necesare,
mai ales, n faza de dezvoltare i depanare a programului.
Celelalte tranziii ale unui task dintr-o stare n alta au loc n urmtoarele condiii:
- Tranziia 3 din substarea RUN n starea INACTIV apare n mod logic (sau normal) la terminarea
taskului.
- Tranziia 4 din substarea RUN n substarea READY se realizeaz n dou situaii:
a) - taskul curent este ntrerupt de un alt task, de un task critic, mai prioritar, aprut n condiii de context
extern sau intern;
4 - 13
b) - n cazul modului de prelucrare a taskurilor n regim de time sharing (cu divizarea timpului), cnd cuanta
de timp alocat execuiei taskului curent s-a epuizat, dei el dispune n continuare de toate resursele necesare
execuiei sale.
- Trecerea din substarea RUN n substarea BLOCKED, tranziia 5, se realizeaz n situaia n care
taskul aflat n execuie este ntrerupt pentru ndeplinirea uneia dintre urmtoarele condiii:
a) - terminarea unei operaii de intrare-ieire solicitat de task;
b) - apariia unui eveniment extern;
c) - trecerea unui anumit interval de timp.
- Un task trece din substarea BLOCKED n substarea READY, tranziia 6, cnd cauzele care au
produs blocarea execuiei taskului au fost nlturate, adic sunt ndeplinite condiiile:
a) - s-a ncheiat operaia de intrare-ieire iniiat de task;
b) - s-a eliberat o zon de memorie intern suficient pentru a permite execuia taskului;
c) - a avut loc evenimentul extern ateptat;
d) - a expirat intervalul de timp de ateptare.
- Tranziia 7 din substarea READY n substarea BLOCKED apare n situaia cnd un task ce era gata
de execuie este trecut n substarea BLOCAT de un task aflat n execuie, sau nu mai poate fi executat din
considerente c nu mai dispune de suficient memorie intern.
- De asemenea, un task n execuie poate trece, prin terminare forat, n starea INACTIV att
taskuri aflate n substarea READY, tranziia 8, ct i taskuri aflate n substarea BLOCKED, tranziia 9.
Observaie: Prin terminare forat, unui task activ i se suspend toate condiiile de ateptare i i se retrage
orice posibilitate de alocare a unei resurse.
Trebuie fcut meniunea c dac un task pierde controlul procesorului rmnnd n starea ACTIV,
reluarea execuiei lui se va face din punctul n care a fost ntrerupt. Pentru ca reluarea execuiei s se fac n
contextul ntreruperii taskului este necesar ca, n momentul ntreruperii unui task, sistemul de operare s
asigure salvarea ntregului context aferent taskului, adic coninutul registrelor generale ale unitii centrale,
coninutul registrului indicatorilor de stare etc.
Dac comutarea strii taskurilor se face sub controlul unui EXECUTIV de timp real prin intermediul
directivelor, n urma lansrii unei directive, controlul procesorului este transferat de la taskul aflat n execuie
(taskul care a lansat directiva) ctre EXECUTIV pentru ca acesta s satisfac imediat cererea coninut n
directiv. Din punct de vedere al returnrii controlului de ctre EXECUTIV ctre taskurile componente
aplicaiei distingem dou categorii de directive:
- Directive pe care EXECUTIVUL le satisface returnnd apoi controlul taskului care a dat directiva
(care a lansat cererea de servicii);
- Directive care cer o serie de servicii EXECUTIVULUI, dup satisfacerea crora acestea nu mai
returneaz controlul taskurilor apelante ci, determin o nou replanificare (rescheduling) a taskurilor pentru
execuie. EXECUTIVUL va aduce n execuie taskul gata de execuie cu prioritatea cea mai mare. n acest
caz, se spune c directiva declar eveniment semnificativ.
Structura general a unui task executat sub controlul unui EXECUTIV de timp real este prezentat n Fig 4.6.
Fig. 4.6.
4 - 14
Se execut
ciclic, n
bucl infinit
Excluderea mutual este operaia multitasking prin care se exclude accesul simultan al mai
multor taskuri la una i aceeai resurs (zona de date din memorie, fiier, periferic etc.). Restriciile,
n acest caz, sunt de tipul: operaiile A, B, C, ..., X nu pot avea loc simultan.
Definiie: Secvena de program a fiecrui task n care se apeleaz o resurs comun
partajat se numete seciune critic a taskului. (Din aceast cauz, de multe ori, excluderea
mutual a taskurilor se mai ntlnete i sub denumirea de problema seciunii critice).
Plecnd de la ipoteza c intervalele de timp de execuie ale taskurilor sunt diferite i
necunoscute i c orice task iese din seciunea sa critic dup un interval finit de timp, soluia unei
probleme de acest tip trebuie s satisfac urmtoarele condiii:
a) - utilizarea exclusiv: la un moment dat un singur task i numai unul se poate afla n
seciunea sa critic corespunztoare unei resurse;
b) - evitarea blocajului reciproc: dac mai multe taskuri sunt blocate n ateptarea aceleiai
resurse critice i aceasta nu este ocupat, atunci unul dintre aceste taskuri (de regul cel mai
prioritar), trebuie s poat s intre n seciunea sa critic la captul unui interval finit de timp;
c) - evitarea dependenelor inutile: dac un task este blocat n afara seciunii sale critice,
acest blocaj nu trebuie s mpiedice intrarea unui alt task n seciunea sa critic.
Datorit condiiilor restrictive similare, problemele sincronizrii i excluderii mutuale pot fi
tratate cu procedee comune. n prezent exist o mare varietate de procedee puse la dispoziia
utilizatorului pentru rezolvarea acestor operaii multitasking i anume:
- folosirea unor variabile de tip ntreg numite semafoare (Dijkstra - 1965);
- folosirea unor variabile logice numite variabile eveniment (Dijkstra - 1965, Latteux 1980);
- cu ajutorul unor structuri de date numite mesaje i a unor zone de memorie unde se depun
aceste mesaje numite celule mesaj sau cutii potale (Hoare - 1971);
- cu ajutorul conceptului de monitor (Brinch Hansen - 1972);
- cu ajutorul conceptului de rendezvous (Ichbiach - 1979).
Observaie: Ultimele trei procedee au avantajul de a rezolva n mod unitar i problema comunicrii
ntre taskuri.
5.2. Utilizarea semafoarelor pentru excluderea mutual a taskurilor i pentru sincronizarea
lor indirect
Un semafor SEM este definit de perechea [v(SEM), q(SEM)], unde:
- v(SEM) = valoarea semaforului;
- q(SEM) = o coad de ateptare destinat s primeasc taskurile care eueaz n ncercarea lor de a
trece de acest semafor.
Variabila v(SEM) este de tip ntreg, iar valoarea sa iniial v0(SEM) este fixat n momentul
crerii semaforului.
Administrarea cozii q(SEM) este la latitudinea sistemului de operare, iar coninutul su
naintea primei utilizri a semaforului este vid.
Semafoarele pot fi mprite n dou categorii:
- semafoare care pot lua numai dou valori, de obicei 0 i 1, numite, din acest motiv, semafoare
binare;
- semafoare care pot lua orice valoare ntreag, numite semafoare generale sau contorizate.
Pentru manipularea semafoarelor s-au creat dou primitive speciale, nentreruptibile, notate
cu P i V (notaii introduse de Dijkstra) implementate n software-ul EXECUTIVULUI. Primitiva P
apare ca o cerere de depire a semaforului, iar primitiva V are semnificaia eliberrii, n anumite
condiii, a unei autorizaii de trecere.
5-2
altfel
v(SEM) = v(SEM) - 1
Primitiva V(SEM):
dac v(SEM) 0 atunci
dac q(SEM) atunci
Tj q(SEM)
/* Deblocheaz taskul Tj, care poate fi fie primul task */
/* din coada de ateptare a semaforului, fie taskul cel */
/* mai prioritar din aceasta
*/
altfel
v(SEM) = v(SEM) + 1
dac q(SEM) atunci
Tk q(SEM)
/* Deblocheaz toate taskurile Tk din coada */
/* de ateptare q(SEM) a semaforului SEM */
Prin utilizarea semafoarelor binare i a primitivelor P i V care acioneaz asupra lor aa
cum s-a artat mai sus, se poate rezolva eficient problema excluderii mutuale a resurselor critice
partajate. Pentru aceasta, fiecrei resurse critice i se asociaz cte un semafor avnd iniial valoarea
1. Pentru claritate considerm:
Exemplul 5.1. Considerm n taskuri T1,T2, ..., Tn, care n execuia lor pot apela simultan o
aceeai resurs. Pentru realizarea excluderii mutuale asociem acestei resurse critice un semafor
binar SEM avnd valoarea iniial v0(SEM) = 1. nainte de a intra n propria seciune critic, fiecare
task este obligat s execute primitiva P(SEM), iar dup prsirea seciunii critice trebuie s execute
operaia V(SEM). Astfel, secvena de program care ncadreaz seciunea critic a fiecrui task arat
ca n Figura 5.3.
Taskul Ti aflat n execuie care efectueaz
operaia P(SEM) se blocheaz dac v(SEM) = 0 i
Task Ti
i continu execuia dac v(SEM) = 1. n cazul
Intrare controlat
P ( SEM )
blocrii taskului Ti pe operaia P(SEM), sistemul
n seciunea critic
de operare va da controlul unui alt task Tj din
coada de ateptare q(SEM) a semaforului, aflat n
Seciune critic
starea READY. Dac taskul Ti intr n propria sa
seciune critic, atunci v(SEM) = 0 i nici o alt
operaie P(SEM) nu mai poate avea loc, deci nici
Ieire controlat
V ( SEM )
un alt task Tj, j i nu mai poate intra n sectiunea
din seciunea critic
critic a programului su, pn cnd taskul Ti nu o
prsete pe a lui, moment n care executnd
Figura 5.3.
primitiva V(SEM), face v(SEM) = 1. n acest
moment are loc deblocarea taskurilor care ateptau
s intre n propria lor seciune critic pentru aceeai resurs.
5-3
Exist i situaii nedorite i care trebuie eliminate. De exemplu, dac taskul aflat n execuie
este blocat n propria sa seciune critic, atunci ntruct v(SEM) a rmas 0 (dup execuia primitivei
P(SEM)) se realizeaz blocajul infinit al tuturor celorlalte taskuri care utilizau aceeai resurs. Din
aceast cauz trebuie luate msuri pentru eliminarea acestei situaii, sau de eliberare a resursei.
Pentru a-i garanta fiecrui task introducerea n seciunea sa critic dup un interval de timp
finit, trebuie acordat o atenie deosebit administrrii cozilor de ateptare a semafoarelor. Cea mai
simpl metod din acest punct de vedere este metoda FIFO, dar, n multe situaii, metoda dup
prioriti (utilizat n multe EXECUTIVE de timp real) poate prezenta avantaje evidente.
Semafoarele binare mpreun cu primitivele P i V pot constitui un mijloc de soluionare a
problemelor de sincronizare indirect a taskurilor cu evenimente exterioare. Primitiva P acioneaz
ca o operaie de blocare a unui task, n timp ce primitiva V poate fi privit ca un semnal de
deblocare al acestuia. Valoarea semaforului v(SEM) se asociaz cu starea evenimentului exterior
astfel:
v(SEM) = 0 - evenimentul nu a avut loc;
v(SEM) = 1 - evenimentul a avut loc.
n aceste condiii, valoarea iniial a semaforului va fi totdeauna zero (v0(SEM) = 0). n cazul a
dou sau mai multe taskuri sincronizate pe un singur eveniment exterior, procedeul este foarte
eficient i se desfoar ca n exemplul 5.2.
Exemplul 5.2. Considerm 2 taskuri T1 i T2 care trebuie sincronizate pe un eveniment
exterior, eveniment de ndeplinirea cruia este condiionat la un moment dat execuia taskului T1.
Pentru aceasta procedm astfel. Asociem acestui eveniment un semafor SEM. Valoarea semaforului
v(SEM) se asociaz cu starea evenimentului exterior aa cum s-a artat mai sus. Realizarea
evenimentului respectiv este supravegheat de taskul T2. Att timp ct evenimentul nu a avut loc,
semaforul SEM are valoarea v(SEM) = 0. Taskul T1 fiind n execuie i ajungnd la momentul
critic al programului, va ncerca s execute operaia P(SEM) i se va bloca deoarece v(SEM) = 0.
Taskul T2 va debloca taskul T1 executnd primitiva V(SEM) care va face v(SEM) = 1 cnd va
sesiza ndeplinirea evenimentului. Structura programelor celor dou taskuri n vederea sincronizrii
Task T1
Secven de program
independent de eveniment
Task T2
Secven de program destinat
supravegherii evenimentului
P ( SEM )
V ( SEM )
Secven de program
Figura 5.4.
5-4
Taskul T1
Taskul T2
Secven de program
independent de eveniment
DECLANAZ(EV)
ATEAPT(EV)
Secven de program
CONSUM(EV)
Evenimentul a fost
luat n considerare
Secven de program
dependent de eveniment
Figura 5.5.
dup ndeplinirea evenimentului. Aceasta se realizeaz fie prin introducerea dup directiva
DECLANAZ(EV) a unei directive care s declare eveniment semnificativ, fie prin construirea
directivei DECLANAZ (EV) cu o opiune de acest fel.
Exemplul 5.4. Considerm trei taskuri T1, T2, T3, primele dou urmrind ndeplinirea a
dou evenimente externe, asincrone, asociate cu variabilele EV1 i EV2, iar al treilea fiind
condiionat n execuia lui, la un moment dat, de ndeplinirea ambelor evenimente. Ca atare, la
momentul critic, taskul T3 va fi obligat s execute primitiva ATEAPT(EV1 i EV2) i se va
bloca dac cel puin una dintre variabile are valoarea FALS, ceea ce semnific faptul c cel puin
unul dintre evenimente nu a avut loc. Pe msur ce evenimentele au loc, taskul T1, respectiv T2 vor
executa primitivele DECLANAZ(EV1), respectiv DECLANAZ(EV2) care vor avea ca efect
deblocarea taskului T3 i aducerea lui n situaia de ai putea continua execuia. Structura
programelor celor trei taskuri este prezentat n Figura 5.6.
Task T1
Task T2
Task T3
Secven de program
destinat supravegherii
evenimentului EV1
Secvena de program
destinat supravegherii
evenimentului EV2
Secven de program
independent de
evenimente
DECLANAZ(EV1)
DECLANAZ(EV2)
ATEAPT(EV1 i EV2)
Seven de program
Secven de program
CONSUM(EV1)
CONSUM(EV2)
Secven de program
dependent de
evenimentele EV1 i EV2
Figura 5.6.
5-6
Task T2
Secven de program
Secven de program
ATEAPT(EVM)
CONSUM(EVM)
ATEAPT(EVM)
CONSUM(EVM)
Seciune critic
Seciune critic
DECLANAZ(EVM)
DECLANAZ(EVM)
Secven de program
Secven de program
Figura 5.7.
Primul task care intr n seciunea critic ajunge n aceasta trecnd de primitiva
ATEAPT(EVM) - posibil, deoarece iniial EVM = ADEVRAT, executnd apoi primitiva
CONSUM(EVM) ceea ce duce la EVM = FALS. n acest moment orice alt task care dorete s
ptrund n propria sa seciune critic se va bloca pe primitiva ATEAPT(EVM) pn cnd taskul
iniial abandonnd resursa comun execut primitiva DECLANAZ(EVM) n urma creia
variabila eveniment EVM capt valoarea ADEVRAT.
5-7
Timp
Interval de timp de execuie a taskului
Interval de timp de ateptare
Figura 5.7.
Se observ c intervalul de timp de reprogramare a execuiei taskului este t + cu
variabil deoarece nu este cunoscut momentul intrrii n execuie a taskului i nici durata execuiei
lui. (Observaie: La expirarea intervalului de timp t , taskul este trecut n starea READY urmnd
s fie adus n execuie de ctre EXECUTIV funcie de procedeul ales pentru planificarea taskurilor
pentru execuie). Acest mod de sincronizare a execuiei unui task poate fi satisfctor numai dac
<< t . n caz contrar, intervalul de timp de reprogramare a execuiei taskului nu mai poate fi
evaluat.
n aplicaiile practice se dorete ns ca intervalul de reprogramare a execuiei unui task s
fie cunoscut i s aib valoarea t , specificat ca parametru n directiv. Altfel spus, se dorete o
sincronizare de tipul celei artate n Figura 5.8.
t
Timp
prezentat n Figura 5.9, iar diagrama de lucru este cea din Figura 5.10.
Task
PLANIFICATOR
Task
REPROGRAMAT
Secven de iniializare
Secven de iniializare
ATEAPT ( t )
ATEAPT (EVS)
CONSUM (EVS)
DECLANAZ (EVS)
Secven de program executat
ciclic
Figura 5.9.
t
Timp
Task REPROGRAMAT
Secven de iniializare
MARCHEAZ ( t, EV )
Secven de program
executat ciclic
ATEAPT (EV)
Figura 5.11
Task reprogramat - TR
Secven de iniializare
Secvena de iniializare
REPROGRAMEAZ (TR, t)
Secven de program
executat ciclic
Secven de program
EXIT
Figura 5.12.
Observaie: Pentru anularea reprogramrii unui task trebuie creat o primitiv special,
ANULEAZ, avnd ca parametru numrul sau numele taskului, care determin EXECUTIVUL
s-l scoat din listele de ceas.
5 - 10
1. Mesajul transmis de un task nu are o destinaie special, el putnd fi consumat de orice alt task al
aplicaiei. Dac mesajul nu este consumat ntre dou depuneri succesive, el se va pierde prin
nscriera peste el al unui alt mesaj. n acest caz este nevoie ca taskul consumator s nu poat extrage
un mesaj pe care productorul este n curs s-l depun, iar taskul depuntor s nu poat depune un
mesaj pe care consumatorul este n curs a-l extrage sau, altfel spus, operaiile de depunere i
extragere a mesajelor trebuie s se execute n excludere mutual la nivelul mesajului. Aceast
condiie este satisfcut prin introducerea unui semafor de excludere mutual asociat zonei comune,
notat ZC. Corespondena ntre dou taskuri Ti i Tj se stabilete programnd la nivelul fiecruia
urmtoarele secvene de instruciuni, Fig. 5.13.
Task Tj (CONSUMATOR)
Task Ti (PRODUCTOR)
Secven de program
- construire mesaj -
Secven de program
P ( ZC )
P ( ZC )
V (ZC )
Secven de program
Figura 5.13
Deci, zonei comune i se asociaz semaforul ZC avnd valoarea iniial 1. nainte de
depunerea mesajului, taskul PRODUCTOR Ti este obligat s execute primitiva P(ZC) n urma
creia este exclus accesul la zona comun al oricrui alt task Tj, j i, iar dup depunerea mesajului
este obligat s execute primitiva V(ZC) care elibereaz accesul la zona de date comune a taskurilor
consumatoare.
2. Mesajul este destinat numai unui singur task. n acest caz se creeaz primitive speciale de
transmitere, respectiv de recepionare a mesajelor care vor cuprinde pe lng mesajul transmis
(recepionat) numele sau numrul taskului transmitor (consumator), precum i un mecanism de
sincronizare. Cel mai eficient este ca acest mecanism s fie implicit, adic ncorporat n directive
prin intermediul variabilelor eveniment. Aceste primitive sunt de forma:
- TRANSMITE (EV, TASKCONS, MESAJ);
(SEND)
- RECEPTIONEAZ (TASKPROD, MESAJ).
(RECEIVE)
5 - 11
Secven de iniializare
REPROGRAMEAZ(TASKPROD, t )
ATEAPT (EV1)
CONSUM (EV1)
SEND(EV1,TASKCONS,MESAJ)
RECEIVE(TASKPROD, MESAJ)
ATEAPT (EV2)
CONSUM (EV2)
DECLANAZ (EV2)
EXIT
Figura 5.14
5 - 12
Task T2
Secven de iniializare
SEND(C2, MES_RSP)
RECEIVE(C1, 0)
P
CX
RECEIVE(CX, 0)
C2
SEND(C2, MES_RASP)
RECEIVE(C2, 0)
SEND(C1, MES_SINCR)
C1
Figura 5.15.
Taskul T2 este planificat pentru execuie de ctre un alt task T1 numit task planificator,
care are o structur ciclic bine determinat:
- ateapt pe o cutie potal CX un mesaj de la un periferic P sau din proces, mesaj care
are semnificaia c evenimentul exterior a avut loc;
5 - 13
Timp
5 - 14
Task T1 (planificator)
Secven de iniializare
Task T2
Secven de iniializare
SEND(C2, MES_RSP)
RECEIVE(C1, 0)
CX
RECEIVE(CX, t )
C2
SEND(C2, MES_RASP)
C1
RECEIVE(C2, 0)
SEND(C1, MES_SINCR)
Figura 5.17.
Task Ti
Secven de iniializare
Task Tj
Secven de iniializare
Secven de program
Secven de program
RECEIVE (CEM, 0)
RECEIVE (CEM, 0)
Seciune critic
CEM
Seciune critic
SEND (CEM, MEM)
Secven de program
Figura 5.18
Pentru realizarea comunicarii ntre taskuri se pot folosi zone de date comune protejate la
accesul simultan prin mecanismul de excludere mutual prezentat mai sus, sau se pot folosi
mesaje care se transmit ntre taskuri prin intermediul cutiilor potale.
n acest din urm caz, se utilizeaz 2 cutii potale C1 i C2, prima memornd mesajul util
(care conine datele transmise de ctre taskul productor ctre taskul consumator), iar a doua
memornd un mesaj simbolic, de rspuns, transmis de ctre taskul consumator ctre taskul
productor care semnific faptul c mesajul util a fost recepionat, taskul consumator este
funcional i deci capabil s primeasc un nou mesaj n cazul unei funcionri ciclice a acestuia.
Taskul productor nu va trimite un nou mesaj taskului consumator pn cnd acesta din urm nu
va confirma primirea lui prin mesajul rspuns pe care l returneaz. n felul acesta se va evita
blocarea sistemului prin ncrcarea cutiilor potale cu mesaje nepreluate. Acest procedeu se
5 - 15
utilizeaz cnd este necesar transferul unui volum mic de date ntre taskuri, care pot fi coninute
ntr-un singur mesaj.
Schema comunicrii ntre dou taskuri prin intermediul mesajelor i cutiilor potale este
prezentat n Figura 5.19.
Secven de iniializare
- pregtire mesaj - rspuns
MES - RSP
Secven de iniializare
Realizarea functiei
- pregtire MESAJ
SEND (C1, MESAJ)
RECEIVE (C1,0)
C1
Realizarea funciei
dependent de mesaj
RECEIVE (C2,0)
C2
Figura 5.19
Observaie: Un volum mai mare de date se transmite prin intermediul zonelor comune.
Taskul T2
ACCEPT NUME(list parametri)
do;
.....
end;
5 - 17
MONITOR EXECUTIV
TABELE SISTEM
- Lista de taskuri
- Lista variabilelor
tip eveniment (flaguri)
NUCLEUL EXECUTIVULUI
Iniializare
Planificator de taskuri
Directive
Subrutine utilitare
MODUL DE GESTIUNE A
INTRERUPERILOR
(Sistem de ntreruperi 8259)
- Subrutine pentru tratarea primar
a ntreruperilor
- Subrutine pentru programarea
circuitelor 8259, 8253, 8251
MODUL DE GESTIUNE A
TIMPULUI
(Ceas de timp real realizat cu 8253)
- Iniializare
- Directive
- Subrutine utilitare
DRIVERE PENTRU
PERIFERICE
- Convertor A/N
- NIS
- Display (CO)
- Tastatur (CI)
- Imprimant (LP)
Figura 6.1.
Acest EXECUTIV are urmtoarele caracteristici:
- este implementabil, cu mici modificri, pe orice echipament numeric de conducere bazat
pe microprocesorul 80x86;
- este modularizat, oferind posibilitatea folosirii n cadrul unei aplicaii numai a modulelor
SW necesare, evitndu-se astfel ncrcarea nejustificat a memoriei echipamentului;
- modulele executivului legate cu programele specifice aplicaiei sunt complet rezidente n
memoria calculatorului formnd aplicaia "dedicat";
- permite realizarea operaiilor multitasking de sincronizare i excludere mutual cu ajutorul
variabilelor tip eveniment (flaguri) care se mpart n dou categorii: flaguri pentru sincronizare i
flaguri pentru excludere mutual;
6-1
GATA DE
EXECUIE
ACTIV
6-2
?ABORT
?RUN(conditionat)
Figura 6.2.
NEINSTALAT
?INS
OPRIT
pe un eveniment
exterior
pe o condiie
de timp
BLOCAT
?EXIT
?CAN
?SETF + ?WAIT
?EXC
?ABORT
IN EXECUIE
- permite realizarea comunicrii ntre taskuri prin intermediul zonelor de date comune;
- planificarea taskurilor pentru execuie se poate face pe baz de prioriti alocate taskurilor;
- comutarea strii taskurilor se poate realiza att prin ntreruperi ct i prin directive
apelabile din taskuri;
- pentru efectuarea calculelor implicate n taskurile componente ale aplicaiei poate fi
folosit orice biblioteca aritmetic cu proceduri reentrante, fie n virgul fix (mai rapid), fie n
virgul mobil (mai lent), modulele bibliotecii legndu-se opional n cadrul aplicaiei alturi de
modulele scrise de utilizator;
- pentru uurarea activitii de dezvoltare i de depanare a programului aferent aplicaiei,
EXECUTIVUL poate fi nsoit de un MONITOR propriu care permite programatorului inspectarea
i modificarea tabelelor de taskuri i de flaguri.
Mecanismul multitasking pe care-l ofer EXECUTIVUL (strile taskurilor i tranziiile ntre
aceste stri) este prezentat n diagrama din Figura 6.2.
6.2. Nucleul EXECUTIVULUI de timp real (modulul de gestiune al taskurilor TKMS)
EXECUTIVUL prezentat permite lucrul pseudoconcurent a maximum 63 de taskuri de
aplicaie, un al 64-lea task fiind un task de ateptare (WAITSYS) propriu nucleului. Acest task
menine unitatea central a echipamentului n starea HALT pe perioadele cnd toate celelalte
taskuri aferente aplicaiei sunt blocate. S-a ales aceast stare (HALT), deoarece din aceast stare
microprocesorul poate servi o cerere de ntrerupere cu cea mai mare promptitudine. Taskurile
componente aplicaiei, rezidente n memoria echipamentului la adrese cunoscute, sunt aduse la
cunotina EXECUTIVULUI i, mai exact, a prii sale componente cea mai important numit
"planificatorul de taskuri" prin directiva de instalare.
Planificatorul de taskuri pstreaz o "list" cu informaii despre taskuri, aceast list avnd
un numr corespunztor de "casete" (cte o caset pentru fiecare task). Fiecare caset este format
din cte 4 octei de memorie.
Aceast list fiind aezat n aceeai pagin de memorie RAM limiteaz numrul maxim de
taskuri la 64 (256 : 4 = 64).
Informaiile care se pstreaz n casetele acestei liste sunt urmtoarele (Figura 6.3):
Adrese
low
octet 1
octet 2
octet 3
octet 4
Adrese
high
SP
Registrul
INDICATORILOR DE CONDIIE
..
.
BL
BH
AL
AH
X
X
ADRESA DE (RE)START
A TASKULUI
STARE
ADRES VRF
STIV
X
"Caseta a n-a"
Stiva taskului
Figura 6.3.
- Primul octet pstreaz informaii referitoare la starea taskului. Din punct de vedere al
planificatorului de taskuri, un task se poate afla n strile NEINSTALAT (planificatorul nu are nici
o informaie despre task, dei acesta este ncrcat n memorie; taskul nu are rezervat nici o caset
6-3
n lista taskurilor) i ACTIV, cu substrile prezentate n Fig. 6.2 (taskul a fost instalat printr-o
comand de monitor sau directiv de instalare i i s-a creat o caset n lista planificatorului). Octetul
de stare al casetei poate avea urmtoarele valori hexazecimale:
- 00h reprezentnd task OPRIT sau nivel liber;
- (01- 0FE)h reprezentnd task BLOCAT pe un flag al crui numr se calculeaz cu
relaia "numr flag = valoare octet stare - 1" (avem astfel la dispoziie un numr de 254 flagurieveniment a cror valoare este cuprins ntre 00h i 0FDh, fiecare flag fiind reprezentat pe un octet
ntr-o list sistem de flaguri);
- 0FFh reprezentnd task aflat n substarea GATA DE EXECUIE;
- Octeii 2 i 3 conin adresa vrfului stivei asociate taskului. Adresa bazei stivei se definete
la instalare i aceast stiv va rmne permanent sub administrarea unic a taskului. n momentul
blocrii taskului, informaiile despre el (adresa de continuare, coninutul registrelor generale i al
indicatorilor de condiie) sunt salvate n aceast stiv n continuarea datelor utile. Astfel, la
revenirea n execuie a taskului, dup refacerea contextului, stiva se va gsi la fel ca n momentul
blocrii taskului.
- Octetul 4 nu este folosit, fiind pstrat n rezerv.
Deci, fiecrui task i corespunde o astfel de caset n lista planificatorului. Ordinea acestor
casete n list este fix i determin totodat i nivelul de prioritate al taskului. Rezult c taskurile
vor avea prioriti fixe, nivelurile de prioritate fiind numerotate de la 0 la dimensiunea maxim a
listei de taskuri. Nivelul cel mai prioritar este nivelul 0 i pe fiecare nivel de prioritate se poate
instala cel mult un task.
La iniializarea sistemului, taskul de ateptare WAITSYS este automat instalat pe nivelul cu
prioritatea cea mai mic (ultima caset din list) i este trecut n substarea gata de execuie.
Planificatorul de taskuri va verifica lista taskurilor pornind de la nivelul de prioritate 0, va continua
verificarea listei de taskuri pn la nivelul de prioritate minim pe care se va afla taskul WAITSYS.
n caz c nici un task al aplicaiei nu este gata de execuie, planificatorul va gsi totui taskul
WAITSYS n starea GATA DE EXECUIE i va aduce unitatea central n HALT, urmnd s fie
scoas din aceast stare printr-o ntrerupere (eventual de la ceasul de timp real).
Pentru realizarea operaiilor multitasking de sincronizare, excludere mutual i comunicare
ntre taskuri, programatorul are la dispoziie un numr de 254 flaguri (variabile tip eveniment) care
pot lua doar dou valori: RESET (flagul are valoarea 00h) i SET (flagul are valoarea 0FFh) i care
sunt memorate pe un octet ntr-o list special de flaguri a nucleului. Asupra acestor flaguri
utilizatorul poate aciona numai prin intermediul unor directive specializate de tip declanaz,
consum, citete, ateapt, directive care vor fi prezentate n continuare. De regul, primele 16
flaguri sunt la dispoziia sistemului (se folosesc n drivere) i nu se recomand utilizarea lor de ctre
programator.
n vederea obinerii cu succes a operaiei de excludere mutual (de simulare a primitivelor P
i V), pentru flagurile ncepnd de la o anumit valoare (selectabil la generarea sistemului),
directivele de ateptare i consumare a unui eveniment se execut succesiv ntr-o secven
nentreruptibil (simularea primitivei P). Primitiva V este realizat de directiva de declanare a
evenimentului.
Directivele nucleului EXECUTIVULUI
Directivele nucleului executivului sunt subrutine de sistem prin intermediul crora este
permis accesul taskurilor utilizator la listele interne ale sistemului, producnd modificri n ele i,
implicit, modificri ale strilor taskurilor.
Directivele EXECUTIVULUI se pot mpri n dou categorii:
- directive explicite apelate de utilizator n cadrul taskurilor;
- directive implicite care sunt apelate prin intermediul directivelor din prima categorie.
6-4
De asemenea, directivele, dup necesiti, pot declara eveniment semnificativ la apelarea lor
(ceea ce va determina transferul controlului ctre planificatorul de taskuri) sau pot returna controlul
taskului apelant, dup efectuarea serviciului cerut (nu declar eveniment semnificativ).
Transferul de parametri ctre i dinspre directive se face prin intermediul registrelor
microprocesorului. Pe timpul lucrului directivelor, deoarece se fac modificri n tabelele de sistem,
sistemul de ntreruperi al microprocesorului trebuie dezactivat pentru a impiedica apariia unor
situaii nedorite. Din acest motiv, toate directivele explicite "sensibile" se prezint n dou variante,
apelabile astfel:
?nume i ?Inume
Funcia lor este identic, ns din punct de vedere al ntreruperilor situaia se prezint astfel:
- prima varianta (?nume) se folosete pentru apel din task i
?nume
conine n corpul ei instruciuni de dezactivare i apoi de
activare a sistemului de ntreruperi;
Dezactiveaz ntreruperile
- a doua variant se folosete fie ca apel direct din ntreruperi
(poate fi considerat ca o subrutin de tratare a ntreruperii), fie
?Inume
ca apel din task n condiiile n care sistemul de ntreruperi era
deja dezactivat.
Activeaz ntreruperile
Ca parametru de stare al directivelor se folosete indicatorul
CF cu urmtoarea semnificaie: dac directiva nu se execut cu
succes
CF = 1; n caz contrar CF = 0.
Figura 6.4
? IINS
Verific dac nivelul solicitat
este liber n lista planificatorului
(codul 00h n octetul de stare al casetei ?)
DA
Marcheaz adresa vrfului stivei
n caseta corespunztoare din lista planificatorului
(adresa bazei stivei - 22)
NU
CF = 1
RET
RET
- Nu necesit parametri;
- Are urmtorul coninut:
call
? MONI
jmp ? SC
Directiva ?MONI
- Este o directiv implicit care nu necesit parametri;
- Dezactiveaz ntreruperile (dac la apelul acestei directive, sistemul de ntreruperi era deja
dezactivat, se face apelul:
call
? MONI + 1);
- Salveaz n stiva taskului apelant contextul momentului ntreruperii (coninutul registrelor
microprocesorului precum i al indicatorilor de condiie);
- Marcheaz n caseta taskului (n lista de taskuri) adresa vrfului stivei taskului;
- Comut pe o stiv monitor definit iniial la generarea sistemului (pentru a nu altera stiva
taskului).
Adresa de restart (reluare) a taskului ntrerupt se salveaz n stiva taskului n momentul
apelului unei directive, care la rndul ei va apela ?MONI, nscriind n stiva taskului ali 2 octei care
nu vor avea nici o utilitate, deoarece din ?MONI nu se mai revine prin instruciunea RET (deoarece
SP-ul a fost comutat de pe stiva taskului pe stiva monitor) ci printr-o tehnic special (vezi listingul
programului - la aplicaii). Rezult deci necesitatea prevederii celor 2 octei suplimentari (dup
adresa de restart) n stiva taskului (vezi Fig. 6.3) i faptul c ei trebuie ignorai de ctre utilizator.
Directiva ?SC
- Este punctul de intrare n planificatorul de taskuri;
- Determin baleierea listei de taskuri i lanseaz n execuie taskul gata de execuie cu
prioritatea cea mai mare;
- Structura planificatorului de taskuri este dat n Figura 6.6;
6-6
?SC
Adresa de nceput a listei de taskuri
DA
Task OPRIT?
NU
DA
NU
Citete flagul corespunztor din lista de
flaguri (numr flag = STARE - 1)
Flag resetat ?
nscrie n ?ATCTA
adresa casetei taskului
?SCEXI
Se trece la urmtorul
task din list
NU
DA
Este un falg pentru excludere
mutual ?
DA
Seteaz flagul
NU
Figura 6.6
?ATCTA
Este adresa unei locaii de memorie unde se pstreaz, pe 2 octei, adresa de nceput a
casetei taskului aflat n execuie. Aceast adres este permanent mprosptat de ctre planificator
i coninutul ei este folosit de alte directive.
Directiva ?SCEXI
- Este o directiv implicit (n cazul de fa, partea final a planificatorului de taskuri);
- Nu necesit parametri;
- Preia adresa vrfului stivei asociate taskului care are adresa casetei n ?ATCTA;
- Reface din stiv toate registrele taskului;
- Activeaz sistemul de ntreruperi;
- D controlul taskului lansndu-l n execuie.
Directivele ?RUN / ?IRUN
- Sunt directive explicite de trecere a unui task n starea GATA DE EXECUIE (nscriu n
octetul de stare al casetei taskului codul 0FFh).
- Parametri: la apelul acestor directive, registrul AL trebuie s conin urmtoarele
informaii:
(AL) = <Mod> <Nivel de prioritate>
- biii A5-A0 ai acumulatorului AL conin nivelul de prioritate al taskului ce
trebuie activat, nivel cuprins ntre (00h - 3Fh);
6-7
- bitul A6 = 0;
- bitul A7 este bitul <Mod> care indic dac trecerea n starea GATA DE
EXECUIE a taskului specificat prin nivelul su de prioritate se va face "necondiionat", adic
indiferent de starea n care se afl, caz n care MOD = 1 sau "condiionat", adic numai n cazul n
care taskul era n substarea OPRIT, caz n care MOD = 0;
- n prima variant (?RUN), directiva declar eveniment semnificativ (vezi Figura 6.7.a), iar
n a doua variant (?IRUN) returneaz controlul taskului apelant;
- Structura directivei ?IRUN este prezentat n Figura 6.7.b.
?RUN
Dezactiveaz ntreruperile
(a)
?IRUN
?DECLR
?IRUN
Trece taskul n starea GATA DE
EXECUTIE, n mod necondiionat ?
(MOD = 1) ?
Trece taskul n starea
GATA DE EXECUTIE
(nscrie codul 0FFh n octetul
de stare al casetei)
CF = 0
DA
DA
(b)
NU
RET
Figura 6.7
6-8
Directiva ?EXIT
- Este o directiv explicit de terminare logic sau normal a unui task;
- Nu necesit parametri;
- Apeleaz directiva ?MONI pentru salvarea n stiva taskului apelant a strii taskului
(coninutul registrelor);
- Pentru cazul n care se va face un nou apel de intrare n execuie a acestui task este absolut
necesar ca n task, dup directiva ?EXIT s existe o instruciune de salt la prima instruciune a
taskului sau la un alt punct din task, pentru ca reluarea execuiei s se fac corect;
- Directiva preia de la locaia ?ATCTA adresa casetei taskului ce trebuie terminat sau
relansat n execuie i nscrie n octetul de stare al casetei lui codul 00h;
- Transfer controlul planificatorului de taskuri (declar eveniment semnificativ).
Directiva ?WAIT
- Este o directiv explicit care are ca efect punerea taskului apelant n ateptare pe un flag
(blocarea taskului pe un flag);
- Parametru: la apelul acestei directive, registrul AL trebuie s conin numrul flagului pe
care va fi blocat taskul;
- Dezactiveaz ntreruperile;
- Salveaz starea taskului apelnd directiva ?MONI;
- Preia din ?ATCTA adresa casetei taskului ce trebuie pus n ateptare i nscrie n octetul de
stare al casetei codul corespunztor (format din numrul flagului specificat + 1);
- Transfer controlul planificatorului de taskuri (declar eveniment semnificativ).
n momentul tergerii flagului, sau dac flagul era deja ters, taskul trece n starea GATA
DE EXECUIE, iar atunci cnd prioritatea i va permite i va continua execuia cu instruciunea
urmtoare acestei directive. Dac flagul este din categoria celor pentru excludere mutual el va fi
imediat setat de ctre planificator (vezi structura planificatorului din Figura 6.6).
Directivele ?SETF / ?ISETF
- Sunt directive explicite care au ca efect setarea unui flag (specificat ca parametru n
directiv);
- Parametru: la apelul acestor directive, registrul AL trebuie s conin numrul flagului care
va fi setat;
- Prima variant (?SETF) declar eveniment semnificativ (asemntor schemei din Figura
6.7.a), iar cea de-a doua variant (?ISETF) returneaz controlul taskului apelant;
- Directiva ?ISETF intr n lista de flaguri a sistemului i n octetul corespunztor flagului
ce trebuie setat nscrie codul 0FFh.
Directivele ?CLEF / ?ICLEF
- Sunt directive explicite care au ca efect resetarea (tergerea) unui flag (specificat ca
parametru n directiv);
- Parametru: la apelul acestor directive, registrul AL trebuie s conin numrul flagului care
va fi resetat;
- Directivele ?CLEF / ?ICLEF au aceleai caracteristici ca i directivele ?SETF / ?ISETF, cu
observaia c n lista de flaguri, n octetul corespunztor flagului specificat, directiva ?ICLEF va
trece codul 00h.
Directiva ?GETF
- Este o directiv explicit care permite citirea strii unui flag;
6-9
?GETF
Intrare n lista de flaguri i
poziionare pe locaia
flagului specificat
DA
Flag resetat ?
NU
CF = 1
CF = 0
RET
Directiva ?GTSK
- Este o directiv explicit care permite citirea nivelului de prioritare pe care este instalat
taskul apelant;
- Nu necesit parametri;
- Citete adresa casetei taskului din ?ATCTA i calculeaz, pe baza acestei adrese, nivelul
de prioritate al taskului;
- Returneaz valoarea nivelului de prioritate n acumulator (AL);
- Nu declar eveniment semnificativ.
Nucleul EXECUTIVULUI ofer pe lng directivele menionate i o serie de subrutine
scrise pentru uzul EXECUTIVULUI, dar care sunt accesibile i utilizatorului, cum ar fi:
- subrutin de umplere cu zero a unei zone de date din memorie, ?ZERO;
- subrutin care calculeaz adresa casetei unui task plecnd de la nivelul lui de prioritate,
?POZ;
- subrutin pentru modificarea indicatorului CF ntr-un task oprit (modificarea se face n
stiva taskului, acolo unde sunt salvai indicatorii de condiie ai taskului), ?MODCF;
- subrutin pentru ncrcarea n registrul BP a adresei vrfului stivei asociate taskului ce are
adresa casetei nscris n ?ATCTA, ?HLSPU etc.
Nucleul EXECUTIVULUI utilizeaz, prin intermediul planificatorului de taskuri, o zon de
memorie RAM rezervat pentru organizarea tabelelor sistem (lista de taskului, lista de flaguri,
anumite locaii speciale, ca de exemplu ?ATCTA etc.). Este indicat ca lungimea acestei zone s fie
ct mai mic avnd n vedere c la majoritatea microcalculatoarelor de conducere a proceselor,
dimensiunea memoriei este critic. Valorile maxime limit pentru numrul de taskuri (64), numrul
de flaguri (254) rezult din condiia necesitii plasrii fiecarei liste ntr-o aceeai pagin de RAM.
Tabelele de sistem se pot genera n limitele acestor dimensiuni prin intermediul urmtorelor
simboluri:
?NOT = numrul total de taskuri din list (Observaie: ?NOTmax = 64 = ?NOTT);
?TCT = adresa de nceput a listei de taskuri a planificatorului (lungimea maxim a listei va
fi (?NOTT x 4) octei);
?NOF = numrul de flaguri din list;
?NOPF = numrul de unde ncep flagurile pentru excludere mutual;
?FLAG = nceputul listei de flaguri;
?FRAM / ?LRAM = nceputul i sfritul zonei RAM de date sistem.
6 - 10
macro
NIVEL, START, STIVA
mov ax, NIVEL
mov dx, START
mov bp, STIVA
call
?IINS
endm
Observaie: Macroinstruciunea IINS poate fi apelat din ntreruperi
macro
call
?DECLR
endm
endm
Observaie: Macroinstruciunea ISETF nu declar eveniment semnificativ
eveniment semnificativ. n aceast situaie, dup instalarea taskului TB, la execuia directivei
?RUN se va declara eveniment semnificativ i planificatorul va da controlul taskului TB (cel mai
prioritar n acel moment) i deci secvena de mesaje afiate pe ecran va fi:
Task TB activ ...
Task TA activ ...
Task TA activ din nou ...
Cele trei situaii expuse mai sus presupun c un eveniment semnificativ poate apare numai
n urma execiei directivelor ?DECLR, ?EXIT, ?RUN.
Exist ns posibilitatea apariiei unui eveniment semnificativ datorit unei ntreruperi
externe (de exemplu, de la ceasul de timp real). Dac se consider o asignare a prioritilor de
forma TA --> 2, TB --> 1, iar pentru activarea lui TB se folosete directiva ?IRUN, apare ca foarte
probabil urmtoarea situaie: Taskul TA intr n execuie, instaleaz i activeaz taskul TB i
ncepe afiarea caracterelor din mesaj1a. Dac n acest moment apare o ntrerupere de la ceas, se
declar eveniment semnificativ i planificatorul gsete taskul TB (cel mai prioritar) n starea
READY i i d controlul. Dup terminarea lui TB se va continua execuia lui TA din punctul n
care a fost ntrerupt, deci mesajele afiate pe display ar putea apare n urmtoarea secven:
Task T
; Taskul TA a fost ntrerupt
Task TB activ ... A activ ...
Task TA activ din nou ...
Aceast situaie necesit ca cele dou taskuri s se exclud reciproc pe durata afirii mesajelor.
Exemplul 2. Sincronizarea taskurilor pe un eveniment
Considerm 2 taskuri T1 i T2 care, la un moment dat, trebuie s schimbe date ntre ele.
Taskul T1 preia o valoare dintr-un buffer, BUFT2 al taskului T2, dup ce T2 a pregtit aceste
valori. T2 semnaleaz c datele sunt disponibile prin resetarea unui flag, FLG, flag pe care ateapt
T1 ca datele s devin disponibile. Se folosete un task de iniializare T0 care instaleaz T1 i T2 i
seteaz flagul de sincronizare.
Structura programului este urmtoarea:
EXTRN AFIS, PRELUCRARE, GENERARE
STIVA1
equ
ADR1 ; STIVA1 reprezint adresa bazei stivei asociate taskului T1
STIVA2
equ
ADR2 ; STIVA2 reprezint adresa bazei stivei asociate taskului T2
BUFT2
dw
?
; Pentru bufferul BUFT2 se rezerv 2 octei ncepnd de la adresa
; BUFT2
T0:
IINS 1, T1, STIVA1
; Se instaleaz taskul T1 cu adresa de nceput T1 pe nivelul
; de prioritate 1
IRUN 1
; Taskul T1 este trecut n starea READY
IINS 2, T2, STIVA2
; Se instaleaz taskul T2 cu adresa de nceput T2 pe nivelul
; de prioritate 2
IRUN 2
; Taskul T2 este trecut n starea READY
SETF FLG
; Macroinstruciunea SETF seteaz flagul FLG i declar
; eveniment semnificativ, deci va da controlul
; planificatorului
EXIT
; Terminare normal a taskului T0 cu declarare de
; eveniment semnificativ
T1:
mov si, OFFSET mesaj1
call
AFIS
; Afieaz mesajul mesaj1
WAIT FLG
; Macroinstruciunea WAIT blocheaz taskul T1 pe flagul
; FLG n ateptarea pregtirii datelor de ctre taskul T2.
6 - 14
T2:
mov
call
bx, BUFT2
PRELUCRARE
mov
call
EXIT
call
mov
mov
call
CLEF
Contor tacturi
de ceas
Contor secunde
Contor minute
Contor ore
Contor zile
Adresa de nlnuire
(partea LOW a adresei de
CONTOARE
GENERALE
Octet 1
Contor luni
Contor ani
Cap list 1
Cap list 2
Cap list 3
Octet 2
de ntreruperile de la ceas)
Cap list 4
Cap list 5
Nivel de prioritate
al taskului
CASETA 2
Octet 3
Octet 4
CASETA a n - a
Figura 6.20
Figura 6.19
Diagramele de sincronizare ale taskurilor pe condiii de timp oferite de acest modul sunt
prezentate n Fig.6.21.a (unde durata de execuie a taskului este mai mic dect valoarea
intervalului de reprogramare) i Fig.6.21.b (unde durata execuiei taskului este mai mare dect
valoarea intervalului de reprogramare).
Interval de timp de
reprogramare a taskului
Durata de
execuie a
taskului
Interval
de
ateptare
Timp
(a)
Interval de timp de
reprogramare a taskului
(b)
Interval de timp
de ateptare
Timp
?TIMEINI
- Este o directiv de iniializare a modulului;
- Nu necesit parametri;
- Pune pe zero contoarele generale ale timpului astronomic n afara contoarelor pentru zile i
luni care sunt puse pe 1;
- Include n lista 1 (lista casetelor libere) toate casetele;
- Nu declar eveniment semnificativ.
?nume
Dezactiveaz
ntreruperile
?Inume
?SETTIME / ?ISETTIME
- Aceste directive permit potrivirea ceasului astronomic;
- Structura lor este asemntoare celei din Fig.6.5;
- Parametru: la apelul acestor directive, registrul SI trebuie s conin adresa
unei zone din memorie unde se gsesc noile valori ale contoarelor n ordinea:
or, minut, secund, tact de ceas, zi, lun, an;
- Nu declar eveniment semnificativ.
Activeaz
ntreruperile
?GETTIME / ?IGETTIME
- Directivele transfer din contoarele generale ntr-o zon indicat din
memorie valorile timpului astronomic;
Figura 6.5
- Structura lor este asemntoare celei din Fig.6.5;
- Parametru: la apelul acestor directive, registrul DI trebuie s conin adresa unei zone din
memorie unde se vor depune valorile contoarelor interne;
- Nu declar eveniment semnificativ.
?EXC/?IEXC
Sunt cele mai importante i utile directive explicite ale acestui modul, realiznd
reprogramarea execuiei unui task la intervale de timp dorite;
Parametri: la apelul acestor directive, urmtoarele registre vor conine:
(AL) = nivelul de prioritate al taskului (numrul taskului);
(BL) = valoarea intervalului de timp de reprogramare;
(CL) = <mod><unitate de msur>, cu urmtoarea asamblare:
0 = mod sincronizat
C7 = bitul de mod
1 = mod nesincronizat
C6 - C2 = 0
C1, C0 = unitate de msur:
00 = tacturi de ceas
01 = secunde
10 = minute
11 = ore
Modul sincronizat presupune c prima cerere de intrare n execuie a taskului are loc ca i
cnd reprogramarea sa ar fi fost fcut n momentul trecerii prin zero a contorului general aferent
unitii de msur specificate, dup care intervalele de timp vor fi msurate normal. Calculul primei
valori de reprogramare n modul sincronizat se realizeaz astfel:
- se citete valoarea curent a contorului general aferent unitii de msur specificate;
- se compar aceast valoare cu valoarea de reprogramare (plasat n registrul BL);
- dac valoarea curent a contorului general este mai mic dect valoarea de reprogramare,
se face diferena dintre valoarea de reprogramare i cea curent, iar aceast diferen se nscrie n
locaia a doua a casetei;
6 - 18
- dac valoarea curent este mai mare dect valoarea de reprogramare, se adun valoarea de
reprogramare cu ea nsi de attea ori pn devine strict mai mare dect valoarea curent, se face
apoi diferena ntre valoarea astfel obinut i valoarea curent i se nscrie aceast diferen n
locaia a doua a casetei.
Se observ c, n ambele situaii, iniial, n caset se nscrie diferena dintre valoarea de
reprogramare i valoarea curent, modulo valoarea de reprogramare. n modul acesta,
reprogramarea taskurilor n mod sincronizat presupune alocarea aceleiai origini de timp tuturor
valorilor de reprogramare aferente unei uniti de msur.
Modul nesincronizat presupune nceperea msurrii intervalului de timp de reprogramare
din momentul apelrii directivei;
Dac toate casetele sunt ocupate, se poziioneaza bitul de CF pe 1 (CF = 1), ceea ce
specific faptul c directiva nu s-a executat; altfel CF = 0;
Directivele nu declar eveniment semnificativ;
Structura acestor directive este asemntoare celei din Fig. 6.5
Exemplu: S presupunem c se dorete reprogramare un task n modul sincronizat, la un
interval de 5 sec. (Fig. 6.22.a)
15
10
Contor
general
secunde
Interval de
timp de ateptare
Interval de timp de execuie a taskului
Prima valoare a contorului local
a) mod SINCRONIZAT
13
15
Interval de timp
de ateptare
Contor
general
secunde
Dac valoarea contorului general este, de exemplu, egal cu 21, atunci se nsumeaz
intervalul de reprogramare cu el nsui pn la prima valoarea mai mare dect 21, adic 25. Apoi
din aceast valoare se scade 21 i se nscrie (25 - 21 = 4) n locaia a 2-a casetei. Taskul va intra
deci n execuie peste 4 secunde. n ambele exemple se observ c taskul va fi lansat n execuie la
valori multiplu de 5 ale contorului general.
Dac directiva se apeleaz n mod NESINCRONIZAT cu valoarea de reprogramare 5, iar
contorul general secunde, n momentul apelului directivei, era la 3 secunde, taskul va fi lansat n
execuie la urmtoarele valori ale contorului general 8, 13, 18, 23, ... (Fig. 6.22.b).
n concluzie, Fig. 6.22 prezint momentele de intrare n executie ale unui task reprogramat a
se executa la fiecare 5 secunde, apelul directivei ?EXC avnd loc cnd contorul general secunde are
valoarea 3, att n varianta sincronizat ct i n cea nesincronizat.
Structura directivei ?IEXC este prezentat n Fig.6.23.
?IEXC
Caut o caset liber n lista 1
NU
DA
CF = 1
Mod SINCRONIZAT ?
NU
Calculeaz valoarea
primului interval de
reprogramare i o nscrie
n contorul local al casetei
6 - 20
?CAN / ?ICAN
- Directive explicite care anuleaz toate reprogramarile unui task (un task poate aparea n
mai multe liste);
- Parametru: la apelul acestor directive, registrul AL trebuie s conin nivelul de prioritate
al taskului ce trebuie scos din listele de reprogramare;
- Directivele caut numrul taskului (menionat ca parametru al directivelor) n toate
casetele celor 4 liste de ateptare i, n caz c l gsesc, trec caseta respectiv n lista cu casete
libere;
- Structura celor 2 directive este asemntoare celei din Fig.6.5;
- Nu declar eveniment semnificativ;
- Organizarea directivei ?ICAN este prezentat n Fig. 6.24.
?ICAN
Se intr n lista 2 de ateptare
DA
NU
Sfrit de list ?
DA
S-au cercetat toate
listele ?
NU
Se trece la lista
urmtoare
NU
Se trece la caseta
urmtoare
DA
RET
Figura 6.24
?TINTR
- Este adresa de intrare a subrutinei de tratare a ntreruperii de la ceas (dup tratarea primar
care are loc n modulul de gestiune a ntreruperilor);
- Salveaz starea programului ntrerupt (cu ?MONI);
- Produce incrementarea contoarelor generale ale ceasului de timp astronomic i, dup
incrementarea fiecrui contor, parcurge, prin intermediul unei subrutine - CRUN - (inclus n
aceast subrutin de tratare a ntreruperii), lista de ateptare anexat, decrementnd contoarele
locale (n afara contoarelor corespunztoare zilelor, lunilor i anilor);
6 - 21
- Dac un contor local devine zero, subrutina CRUN l reiniializeaz i lanseaz o directiva
?IRUN conditionat, avnd ca parametru numrul taskului specificat;
- D controlul planificatorului de taskuri (declar eveniment semnificativ);
- Modul de organizare al subrutinei ?TINTR este prezentat n Fig. 6.25, iar n Fig. 6.26 este
prezentat structura subrutinei CRUN.
?TINTR
?MONI
Se salveaz starea
taskului ntrerupt
NU
NU
NU
?SC
Figura 6.25
6 - 22
CRUN
Acceseaz prima caset din list
frit de list ?
DA
RET
NU
Decrementeaz contorul local al casetei
Contorul local are valoarea zero ?
DA
NU
?IRUN
Se trece la caseta urmtoare
Figura 6.26.
6 - 23