Sunteți pe pagina 1din 130

CAP.1.

STRUCTURI DE SISTEME CU MICROPROCESOR PENTRU


CONDUCEREA PROCESELOR INDUSTRIALE
1.1. Consideraii generale
Echipamentele numerice de conducere a proceselor industriale (regulatoarele numerice,
calculatoarele de proces), n special dup introducerea n structura lor a microprocesoarelor au
constituit un pas considerabil pe calea reducerii decalajului dintre rezultatele remarcabile oferite de
teoria sistemelor automate i tehnicile aplicate n practica conducerii proceselor industriale. Aceste
echipamente permit, fr a efectua modificri n structura sau n configuraia lor, implementarea
celor mai diverse strategii de conducere, ncepnd cu cele de tip convenional, PID, i ajungnd la
cele care s determine atingerea performanelor optime ale funcionrii proceselor cu un minimum
de energie i materie prim. Realizarea acestor deziderate impune specialitilor din domeniul
conducerii proceselor cunoaterea specificului procesului condus i a teoriei sistemelor automate,
precum i a calculatoarelor de proces, a funcionrii acestor elemente i, mai ales, a programrii lor
pentru asigurarea scopului propus: supravegherea i conducerea "n timp real" a unui proces.
Definiie: Se numete calculator de proces un complex de mijloace tehnice i de programe
care sunt destinate rezolvrii problemelor de supraveghere, de comand, de diagnosticare i de
prognozare a funcionrii instalaiilor industriale. Un calculator de proces poate fi privit ca o
reuniune ntre un calculator numeric universal (de obicei un microcalculator sau un minicalculator)
nzestrat cu un executiv sau un sistem de operare corespunztor capabil s funcioneze n timp real
i un sistem de interfa (cuplorul de proces) cu procesul condus i operatorul tehnolog. Schema
bloc a unui CP (calculator de proces) este prezentata n Fig.l.l.

CALCULATOR
UNIVERSAL

1
2
.
.
n
PERIFERICE
GENERALE

CUPLOR DE
PROCES

PROCES

C. O. P.

CALCULATOR
DE
PROCES

CONDUS
Fig. 1.1

n aceast schem, n categoria perifericelor generale sunt incluse: consola calculatorului


(pentru inginerul de sistem), imprimanta, uniti de discuri flexibile (floppy-disk), uniti de band
magnetic (eventual) etc.
Consola operatorului de proces (operatorului tehnolog) - C.O.P. - este consola specialistului
tehnolog care cunoate foarte bine procesul condus, dar care, n general, nu este informaticican.
C.O.P.-ul este de regul un panou cu un sistem de chei i lmpi de semnalizare sau un tablou
sinoptic sau, mai modern, un video-display color cu schema funcional a instalaiei sau elemente
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

SUBPROCES n PROCESUL CONDUS


Fig. 1.2

La nivelul 1 sunt plasate elementele de automatizare convenional care primesc


informaiile despre proces prin intermediul traductoarelor i elaboreaz comenzi pentru reglarea
acestuia utiliznd algoritmi simpli de reglare de tip PID.
Elementele de la nivelul 2, regulatoare numerice monocanal sau multicanal specializate sau
microcalculatoare pentru conducerea proceselor, au sarcini cvasi-identice i cvasi-independente,
schimbul de informaii ntre elemente realizndu-se prin intermediul magistralei sistemului sub
controlul directorului de trafic. Funciile ce trebuie realizate la acest nivel sunt: achiziia i
validarea datelor culese din proces, calculul i elaborarea comenzilor ctre procesul condus prin
intermediul cuploarelor de proces, comunicarea cu operatorul tehnolog (COP) i cu nivelul ierarhic
1-3

superior (minicalculatorul universal). n mod curent, la acest nivel se utilizeaz microcalculatoare


realizate cu microprocesoare pe 8 sau 16 bii sau regulatoare numerice realizate tot cu astfel de
elemente. Puterea de calcul a acestor microcalculatoare acoper necesitile de rulare a programelor
care asigur funciile de reglare pentru 8-16 bucle de reglare. Dac numrul buclelor de reglare este
mai mare (peste 20) se recomand folosirea unui microcalculator industrial de uz larg.
La cel de-al treilea nivel de automatizare se introduce un minicalculator de capacitate mare
destinat conducerii dup strategii evoluate a ntregului proces. n cazul proceselor mai simple se
poate utiliza chiar un microcalculator de proces de uz larg. Tot la acest nivel este plasat consola
operatorului de proces cu funcii complexe de comunicare cu toate echipamentele de calcul din
cadrul structurii, avnd rolul de a permite supravegherea i conducerea operativ a procesului.
Dinamica elaborrii rezultatelor la nivelul 3 este relativ lent. Minicalculatorul primete
date sintetice despre evoluia procesului de la nivelul inferior (nivelul 2), iar mrimile rezultate n
urma calculelor nu intervin direct n proces, deci la acest nivel nu sunt necesare cuploare de proces.
O problem important a acestei structuri de conducere este aceea a asigurrii
compatibilitii ntre structurile de date vehiculate ntre diferitele nivele pentru a permite un dialog
corect ntre acestea.
Unul din principalele avantaje ale unei astfel de structuri distribuite de conducere este acela
c ea poate fi dezvoltat n timp i spaiu, pe orizontal i pe vertical, de la simplu la complex,
putndu-se ncepe cu un singur echipament cu microprocesor plasat la nivelul 2 de automatizare,
dotat cu o consol operator proprie (display, tastatur, imprimant), Fig.1.3, avnd implementai
algoritmi de: achiziie i validare a datelor din proces, semnalizare i protecie la depirea
limitelor, calcul i elaborare a comenzilor ctre proces, comunicare cu operatorul n vederea
realizarii configurrii i urmririi evoluiei mrimilor din proces, posibiliti de comunicare cu NIS
(nivelul ierarhic superior).

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.3. Particularitile programarii sistemelor de calcul n timp real


Particularitile programrii sistemelor de calcul cu microprocesoare destinate supravegherii
i/sau conducerii n timp real a proceselor industriale rezult din urmtoarele condiii care trebuie
ndeplinite:
- posibilitatea sistemului de calcul de a rspunde instantaneu la semnale emise din proces n
mod aleator;
- capacitatea sistemului de calcul de a primi datele direct din proces sau/i de a le transmite
direct n proces prin intermediul unor periferice nestandard (convertoare analog-numerice,
convertoare numeric-analogice etc.);
- cerina ca "timpul real" n care sistemul de calcul este ocupat cu o anumit operaie
corespunztoare unui anumit eveniment, s fie strict corelat cu timpul n care se produc i alte
evenimente n procesul industrial condus;
- rezolvarea contradiciei ntre capacitatea sistemului de calcul de a executa la un moment
dat un singur program i cerina procesului de a fi "servit" n n puncte simultan; altfel spus, sistemul
trebuie s fac fa desfurrii simultane a diferitelor pri specifice ale procesului;
- posibilitatea programrii tuturor categoriilor de procese (continue sau discrete);
- existena elementelor pentru testarea i depanarea eficient a programelor.
Din cele de mai sus, rezult c, pentru programarea unei aplicaii n timp real, limbajul de
programare utilizat trebuie sa conin trei categorii de instruciuni:
- instruciuni care s permit programarea modului n care se desfoar evenimentele n
proces;
- instruciuni care s precizeze locul n care se desfoar evenimentele n proces;
- instruciuni care se refer la momentul sau intervalul de timp n care au loc evenimentele
n proces.
Instruciunile din prima categorie formeaz un set de baz care poate fi utilizat fr opiuni
de timp real din partea sistemului de calcul. Instruciunile din celelalte categorii sunt specifice
lucrului n timp real i formeaz o extensie a limbajului de baz. Ele pot fi obinute prin intermediul
sistemului de ntreruperi (locul desfurrii evenimentelor) i a ceasului de timp real (timpul sau
intervalul de timp n care au loc evenimentele n proces) existente obligatoriu n orice configuraie
de conducere sau supraveghere a unui proces.
Un sistem de calcul pentru conducerea unui proces reprezint o unitate dialectic ntre
componenta hardware a sa, cea care definete configuraia sistemului i componenta sa software,
care constituie totalitatea programelor sistemului.
Programele implementate pe un astfel de sistem de calcul se mpart n dou mari categorii:
a) programe de sistem;
b) programe de utilizator sau de aplicaie.
Programele de sistem sunt programe care au un caracter universal i sunt parte component
a unui anumit tip de calculator, independent de procesul pe care acesta l va conduce. Acest
ansamblu de programe formeaz ceea ce se numeste sistemul de operare al calculatorului i are
rolul de a asigura executarea corect a sarcinilor sale.
Programele de utilizator (programele de aplicaie sau de conducere), n opoziie cu
programele de sistem, au un caracter specific, funcie de proces, ele fiind o imagine a ceea ce se
ntmpl n proces.

1-7

CAP.2. PROGRAMAREA N LIMBAJ DE ASAMBLARE A


MICROPROCESORULUI I8086
Arhitectura intern a microprocesorului I8086
Microprocesorul I8086, una dintre primele uniti centrale monolitice pe 16 bii, este
elementul de baz al unei ntregi familii de circuite VLSI, ce permit realizarea de sisteme
programabile complexe. UCP (unitatea central de prelucrare) I8086, realizat n tehnologie
N-MOS i mpachetat ntr-o capsul cu 40 pini, funcioneaz la o frecven de tact de 5 8 MHz,
realizeaz transfer de date pe 8 sau 16 bii i adreseaz direct o memorie cu dimensiunea maxim de
1 Moctet, avnd o magistral de adresare de 20 bii.
Segmentarea memoriei
Pentru a simplifica gestiunea memoriei i protecia datelor, la microprocesoarele la care
dimensiunea memoriei principale crete (p: I8086, IAPX186, IAPX286 etc. cu dimensiunea
memoriei 1 Moctet) se poate utiliza segmentarea memoriei.

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

Stack Pointer (SP)


Registre de adresare
(pointer i index)

Base Pointer (BP)


Source Index (SI)
Destination Index (DI)
Code segment (CS)

Registre

Data Segment (DS)


Stack Segment (SS)

de
segment

Extra Segment (ES)

Numrtorul de instruciuni

Instruction Pointer (IP)


OD I T S Z
F F F F F F

Deosebim:
2-2

A
F

P
F

C PSW (Processor Status Word)


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

Coninutul registrului SS definete adresa de nceput a segmentului de stiv curent. Toate


referirile la datele din memorie care utilizeaz implicit registrele SP i BP sunt considerate ca
implicnd registrul SS.
Coninutul registrului ES definete adresa de nceput a segmentului de date suplimentar.
Operaiile pe iruri de caractere ce utilizeaz registrul DI sunt considerate ca implicnd segmentul
referit de registrul ES.
Selectarea registrului-segment care se va utiliza n calculul adresei fizice depinde att de
modul de adresare utilizat, ct i de tipul ciclului main curent. n acest sens, exist urmtoarele
reguli:
a) n ciclurilre de FETCH se utilizeaz ntotdeauna registrul CS;
b) n operaiile cu stiva se utilizeaz ntotdeauna registrul SS;
b) n operaiile cu iruri de caractere, pentru adresarea operandului destinaie, se utilizeaz
ntotdeauna registrul ES;
d) cnd la calculul offsetului particip coninutul lui BP se utilizeaz implicit SS, dar se
poate reindica folosirea oricruia dintre celelalte 3 registre;
e) n rest se utilizeaz DS, dar se poate reindica folosirea oricruia dintre celelalte 3 registre.
Deoarece exist 4 registre segment, nseamn c simultan pot fi adresabile 4 segmente: CS curent,
DS curent, SS curent i ES curent.
3. Registrul indicatorilor de condiii PSW
Asamblarea biilor din registril PSW este prezentat n figura urmtoare:
15 14 13 12 11 10 9

OF DF IF TF SF ZF

4
AF

PF

Bitul numrul

CF

Registrul PSW

Biii din PSW se numesc flaguri i se mpart n dou categorii:

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.

3b) Flaguri de control (Control Flags) al procesorului - memoreaz informaii referitoare la


controlul procesorului: DF, IF, TF.
2-4

- Indicatorul DF (Direction Flag) indic direcia de parcurgere a irurilor de caractere (octei


sau cuvinte) n cadrul instruciunilor pe iruri de caractere: DF = 1 nseamn autodecrementarea, iar
DF = 0 nseamn autoincrementarea registrelor index SI i DI (de la adrese mari la adrese mici,
respectiv de la adrese mici la adrese mari).
- Indicatorul IF (Interrupt-Enable Flag) controleaz acceptarea ntreruperilor mascabile
externe: dac IF = 1, sistemul de ntreruperi este validat (este validat acceptarea ntreruperilor
mascabile externe); dac IF = 0, sistemul de ntreruperi este invalidat. Indicatorul IF nu are
influen asupra ntreruperilor nemascabile.
- Indicatorul TF (Trap Flag) este utilizat pentru controlul execuiei instruciunilor n regim
pas cu pas. Dac TF = 1, atunci UCP lucreaz pas cu pas (single step) caz n care, dup fiecare
execuie a instruciunii, se genereaz o ntrerupere intern pe nivelul 1. Execuia secvenei de tratare
a acestei ntreruperi se face cu indicatorul TF avnd valoarea 0.
Tipurile de date elementare manevrate de p I8086 sunt:
- Octetul cu dimensiunea de 8 bii, poate fi plasat n memorie la orice adrese, pare sau
impare.
- Cuvntul cu dimensiunea de 16 bii, poate fi plasat n memorie att la adrese pare ct i
impare.
- Pointerul (cuvntul dublu) are dimensiunea de 32 bii i are 2 componente:
- componenta de segment (se memoreaz la adrese mai mari);
- componenta de offset (se memoreaz la adrese mai mici).
Convenia de reprezentare a datelor multioctet n memorie este cea standard pentru
microprocesoarele Intel: octeii mai puin semnificativi sunt plasai la adrese mai mici, iar octeii
mai semnificativi, la adrese mai mari. Exemple:
A0h

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

; Registrul AX se ncarc cu adresa


; segmentului de date data_segment

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

Formatul general (extern) al instruciunilor


Instruciunile microprocesoarelor I8086/I8088, scrise n limbaj de asamblare, au formatul
tipic acestor limbaje, constituit din mai multe cmpuri:
[ Eticheta: ]

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

char EQU ' A'


; char are valoarea 2041h
char1 EQU 'a125'
; char1 are valoarea 61313235h
Este permis n continuare scrierea unor instruciuni care s foloseasc aceste nume:
mov al, ANA
and
al, ANY
mov cx, char
Observaie: Numele utilizate n EQU nu pot fi redefinite.
- Operatori aritmetici: +, -, *, /, MOD;
- Operatori de deplasare: SHR, SHL;
- Operatori logici: NOT, AND, OR, XOR:
- Operatori relaionali: EQ, NE, LT, LE, GT, GE;
- Operatori de conversie de tip: PTR, SHORT, LOW, HIGH, SEG, OFFSET, LENGTH,
SIZE, MASK.
Expresiile utilizate pentru iniializarea datelor sunt expresii care pot fi evaluate n momentul
asamblrii programului.
Pentru definirea i nitializarea variabilelor, directivele utilizate sunt: DB (Define Byte),
DW (Define Word), DD (Define Doubleword), DQ (Define Quadword), DT (Define Tenbytes). La
asamblare, pentru o variabil, se aloc una sau mai multe locaii de memorie conform tipului
variabilei. n cadrul definirii se poate face, n mod facultativ, i iniializarea variabilei. Formatul
general al directivei este:

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

Rezervarea de spaiu fr iniializare se face cu caracterul ?, ca n exemplul:


ALFA
DB
?, ?, ?
; Se rezerv 3 octei ncepnd cu adresa ALFA
ARRAY2
DB
100 DUP (?)
; Se rezerv 100 octei neiniializai ncepnd cu
; adresa ARRAY2
BETA
DW ?, 0AAh
;
Operatorul DUP poate fi utilizat i imbricat ca n exemplele:
DB
2 DUP (3 DUP (1))
; Definete 6 octei iniializai cu 1
ARRAY3
DB
2 DUP (0, 2 DUP (1,2), 0, 3) ; Se va genera de 2 ori secvena 0,1,2,1,2,0,3
Observaii:
a) Exist instruciuni care opereaz att pe cuvnt, ct i pe octet. Acest lucru rezult fie din
modul de adresare, ca n instruciunile urmtoare:
mov ax, [bx]
; Se ncarc registrul AX cu cuvntul de la adresa DS*16+BX
mov al, [bx]
; Se ncarc registrul AL cu octetul de la adresa DS*16+BX
fie din modul de definire al datei, ca n instruciunile urmtoare:
VAR DB
55h ;
inc
VAR
; Se incrementeaz octetul de la adresa DS*16+OFFSET VAR
n cazul instruciunii inc [bx], asamblorul nu poate deduce dac instruciunea opereaz pe octet sau
pe cuvnt. Pentru aceasta trebuie explicitat tipul datei, astfel:
inc
BYTE PTR [bx] ; Se incrementeaz octetul de la adresa [bx]
inc
WORD PTR [bx] ; Se incrementeaz cuvntul de la adresa [bx]
unde s-a utilizat operatorul PTR pentru a preciza tipul datei. De fapt operatorul PTR se utilizeaz
pentru a specifica tipul unei date (variabile) sau pentru a modifica temporar tipul unei date
(variabile) sau distana unei etichete.
b) Pentru a deosebi modul de adresare intrasegment direct de intersegment direct se
utilizeaz construciile:
jmp FAR PTR
etich_indep ; Salt intersegment la instruciunea cu eticheta etich_indep
jmp NEAR PTR etich_aprop ; Salt intrasegment la instruciunea cu eticheta etich_aprop
Distincia ntre modurile de salt intrasegment indirect i intersegment indirect se face n
funcie de tipul operandului ce apare n instruciunea de salt i anume: operand tip cuvnt
nsemneaz salt intrasegment, iar operand pointer (cuvnt dublu) nsemneaz salt intersegment.
Exemplu:
jmp WORD PTR [bx]
; Salt intrasegment la instruciunea cu adresa dat de CS*16+BX
jmp DWORD PTR [bx] ; Salt intersegment la instruciunea cu adresa dat de pointerul
; (dublul cuvnt) aflat la adresa DS*16+BX

Descrierea setului de instruciuni ale microprocesoarelor I8086/I8088


Pentru prezentarea setului de instruciuni ale microprocesoarelor I8086/I8088 utilizm
urmtoarele notaii:
Numele registrelor din UCP I8086/I8088 :
AX, BX, CX, DX
- registre generale de 16 bii;
- registre generale de 8 bii;
AH, AL, BH, BL, CH, CL, DH, DL
SP, BP, SI, DI
- registre de 16 bii;
CS, DS, SS, ES
- registre de segment;
F (PSW) = x x x x OF DF IF TF | SF ZF x AF x PF x CF
- registrul de flaguri.
Referiri generale:
A - acumulator (AX sau AL sau AH, funcie de context);
R - registru oarecare de uz general: R8 - registru de 8 bii, R16
- registru de 16 bii;
2 - 10

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.

1o. Instruciuni de transfer de tip "clasic"


n categoria instruciunilor de transfer de tip "clasic" se ncadreaz urmtoarele instruciuni:
mov DST, SRC
push SRC
pop DST
xchg DST, SRC
xlat
a) Efectul instruciunii MOV este de a transfera valoarea desemnat de sursa SRC la destinaia
DST. Operanzii instruciunii MOV pot avea lungimea de 8 sau 16 bii i acetia pot fi: registre
generale, registre segment, registre pointer i index, coninutul unor locaii de memorie sau date
imediate. n urma execuiei operaiei MOV se modific numai coninutul operandului destinaie,
coninutul operandului surs rmnnd nemodificat. De asemenea, instruciunea MOV nu afecteaz
indicatorii de condiie. Formele admise de instruciunea MOV sunt:
; R8 <--- R8
mov R8, R8
mov R16, R16
; R16 <--- R16
mov SR, R16
; Coninutul unui registru de 16 bii se transfer ntr-un
; registru segment (SR nu poate fi CS)
; R16 <--- SR
mov R16, SR
; R8 <--- DATA8
mov R8, DATA8
; M8 <--- DATA8
mov M8, DATA8
; R16 <--- DATA16
mov R16, DATA16
; M16 <--- DATA16
mov M16, DATA16
; R8 <--- M8
mov R8, M8
mov M8, R8
; M8 <--- R8
mov R16, M16
; R16 <--- M16
mov M16, R16
; M16 <--- R16
mov SR, M16
; SR <--- M16 ; (SR nu poate fi CS)
2 - 11

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

Baza stivei: SS*16

Dac urmeaz o operaie


operaie
PUSH aici se depune
(Valoarea registrului SP
scade dup o operaie PUSH)

Ultimul octet depus

SP

Dac urmez o operaie


POP de aici se extrage
(Valoarea registrului SP
crete dup o operaie POP)

SS*16 + valoarea iniial a registrului SP


Adrese mari

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

2o. Instruciuni pentru ncrcarea adreselor


Exist patru instruciuni pentru ncrcarea adresei unui operand (nume, variabil, expresie):
MOV R16, OFFSET operand
; LEA - Load Effective Address
LEA R16, operand
; LDS - Load Data Segment register
LDS R16, operand
; LES - Load Extra Segment register
LES R16, operand
a) Ca efect al execuiei instruciunii:
lea
R16, operand
se ncarc n registrul R16, adresa relativ (efectiv) a operandului plasat n segmentul curent de date
care apare n instruciune. Aceast instruciune este mai puternic dect instruciunea
mov R16, OFFSET operand
deoarece permite i utilizarea unor registre de baz i index n formarea adresei.
Exemple:
nume DB
100
lea
bx, nume
;
ncarc BX cu adresa de offset a operandului nume
Aceast instruciune este echivalent cu instruciunea:
mov bx, OFFSET nume
Instruciunea:
mov ax, OFFSET table[si]
nu conduce la un rezultat corect, pe cnd instruciunea:
lea
ax, table[si]
are ca efect ncrcarea n AX a offsetului operandului table + si.
b) Ca efect al execuiei instruciunilor:
lds
les

R16, operand ; R16 <-- (EA+1,EA); DS <-- (EA+3,EA+2)


R16, operand ; R16 <-- (EA+1,EA); ES <-- (EA+3,EA+2)

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.

3o. Instruciuni pentru transferul valorilor indicatorilor de condiie


LAHF
a)
; Load AH from Flags
ncarc n registrul AH octetul inferior al registrului F = (Fhigh,Flow),

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

c) Instruciunea PUSHF (PUSH Flags) salveaz n stiv valorile indicatorilor de condiie:


SP <--- SP - 2; (SP + 1) <--- Fhigh, (SP ) <--- Flow.
d) Instruciunea POPF (POP Flags) reface din stiv valorile indicatorilor de condiie:
Flow <--- (SP), Fhigh <--- (SP + 1); SP <--- SP + 2.

Observaie: Instruciunile LAHF i PUSHF nu afecteaz indicatorii de condiie, iar instruciunea


SAHF nu afecteaza flagurile TF, IF, DF i OF.
2. Instruciuni pentru poziionarea indicatorilor de condiie
n aceast categorie se ncadreaz instruciunile:
CLC
; Clear Carry Flag
STC
; Set Carry Flag
CMC
STD
CLD
STI
CLI

; Complement Carry Flag


; Set Direction Flag
; Clear Direction Flag
; Set Interrupt Flag
; Clear Interrupt Flag

(CF = 0)
(CF = 1)

(CF = CF )
(DF = 1)
(DF = 0)
(IF = 1); Activeaz sistemul de ntreruperi
(IF = 0); Dezactiveaz sistemul de ntreruperi

3. Grupul instruciunilor aritmetice


3.1. Aritmetica binar

3.1.1. Adunarea i scderea binar


Instruciunile pentru adunarea i scderea binar sunt urmtoarele:
ADD DST, SRC
; (DST) <--- (DST) + (SRC)
ADC DST, SRC
; (DST) <--- (DST) + (SRC) + (CF)
SUB DST, SRC
; (DST) <--- (DST) - (SRC)
SBB DST, SRC
; (DST) <--- (DST) - (SRC) - (CF)
Pentru instruciunile ADD i ADC sunt permise urmtoarele tipuri de operanzi:
; R8 <--- R8 + R8 | + CF
add | adc
R 8 , R8
; R8 <--- R8 + M8 | + CF
add | adc
R 8 , M8
; M8 <--- M8 + R8 | + CF
add | adc
M8 , R 8
2 - 16

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.

3.1.2. Instruciuni pentru extinderea semnului operandului


Pentru "ajustarea" lungimii operanzilor (cu semn) se utilizeaz dou instruciuni pentru
extinderea semnului operandului, astfel:
a)
CBW
; Convert Byte to Word
Realizeaz conversia octetului cu semn coninut n registrul AL, n cuvntul cu semn
coninut n registrul AX prin extinderea bitului de semn al registrului AL la toi biii registrului AH,
astfel: dac AL7 = 0, atunci AH = 00h, iar dac AL7 = 1, atunci AH = ffh.
2 - 17

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
;

3.1.2. Alte instruciuni ce au legatur cu adunarea i scderea binar


a) Instruciuni de incrementare i decrementare
INC DST ; INCrement
(DST) <---- (DST) + 1
Se adun 1 la coninutul singurului operand, rezultatul depunndu-se napoi n operand.
DEC DST ; DECrement
(DST) <---- (DST) - 1
Se scade 1 din coninutul singurului operand, rezultatul depunndu-se napoi n operand.
Forme de utilizare:
inc | dec
R
; Se incrementeaz | decrementeaz coninutul registrului general R
; unde R poate fi R8 sau R16
inc | dec
M
; Se incrementeaz | decrementeaz coninutul locaiei de memorie
; adresat prin M, unde M poate fi M8 sau M16.
Indicatorii afectai sunt: AF, PF, SF, ZF, OF.
Exemple:
inc
cx
inc
mem_byte[bx]
inc
alpha[bx][si]
dec
cx
2 - 18

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

(DST) < (SRC)

;
;
;
;

3.1.3. Inmulirea i mprirea binar


Exist urmtoarele instruciuni de nmulire i mprire binar:
MUL SRC
; MULtiply accumulator by register or memory, unsigned
Coninutul operandului surs SRC pe 8 sau 16 bii este nmulit cu coninutul registrului AL
respectiv AX, rezultatul pe 16, respectiv 32 bii fiind depus n AX, respectiv n perechea (DX, AX).
Operanzii sunt considerai numere fr semn. Forme de utilizare:
a)

Exemple:

; (AH, AL) <--- AL * R8


; (AH, AL) <--- AL * M8
; (DX, AX) <--- AX * R16
; (DX, AX) <--- AX * M16

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:

180 10 in reprezentare fara semn


AL = 0B4h =
76 10 in reprezentare cu semn
BL = 11h = 1710 n ambele reprezentri
2 - 20

Dup execuia instruciunii MUL BL se obine


AX = (AH,AL) = 0BF4h = 306010 = 180 17.
Dup execuia instruciunii IMUL BL se obine
AX = (AH,AL) = 0FAF4h = -129210 = -76 17.
Cum AH = 0FAh 0FFh rezult c CF = OF = 1.
Menionm c operaiile pentru numere cu semn se fac n complement fa de doi. Astfel, se
calculeaz mai nti complementul fa de doi al numrului 0B4h i se obine 4Ch. Se execut 4Ch
11h i se obine 50Ch. Se calculeaz complementul fa de 2 al lui 50Ch i rezult 0FAF4h =
-129210.
Dup execuia instruciunilor MUL i IMUL, valorile flagurilor SF, ZF, AF i PF sunt
nedefinite.
Instruciunilor MUL i IMUL se pot utiliza i pentru a efectua calcule n multipl precizie.
DIV SRC
; DIVide, unsigned
Operandul demprit, adic coninutul registrului AX pe 16 bii sau al perechii (DX, AX)
pe 32 bii se mparte la coninutul operandului surs SRC pe 8, respectiv 16 bii, ctul depunndu-se
n registrului AL pe 8 bii, respectiv n AX pe 16 bii, iar restul n registrul AH pe 8 bii, respectiv
n DX pe 16 bii. Operanzii sunt considerai numere fr semn. Forme de utilizare:
c)

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:

Instruciunile de nmulire i mprire sunt cele mai lente instruciuni executate de


microprocesoarele I8086/I8088. Din acest motiv, ori de cte ori este posibil, este de preferat
nlocuirea acestor operaii prin secvene echivalente care s foloseasc numai operaii de adunare i
de deplasare.

2 - 21

3.2. Aritmetica BCD

3.2.1. Aritmetica BCD mpachetat


Reprezentarea n cod BCD a numerelor ntregi presupune utilizarea unei codificri pe 4 bii
a fiecrei cifre zecimale. Reprezentarea BCD mpachetat realizeaz depunerea a dou cifre
zecimale ntr-un acelai octet, fiecare grup de 4 bii ce codific o cifr numindu-se tetrad. Cum
toate operaiile realizate de ALU-procesor se fac n binar, obinerea unui rezultat BCD corect se
face efectund anumite ajustri asupra rezultatului. Ajustrile se fac dup efectuarea operaiilor
respective. Instruciunile de ajustare sunt urmtoarele:
a)

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

Rezultatul 59 este cel corect deoarece dup adunarea cifrei 6, indicatorul AF = 0.


a2)

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.

b) Scdere n format BCD


b1)
34 = 0011 | 0100 29 = 0010 | 1001
-------------------0? = 0000 | 1011 (AF = 1)
6 = 0000 | 0110 (corecia)
-------------------5 = 0000 | 0101 (AF = 0)
Rezultatul 5 este corect deoarece dup scderea cifrei 6, indicatorul AF = 0.
b2)
34 = 0011 | 0100 30 = 0011 | 0000
-------------------4 = 0000 | 0100
(AF = 0)
Rezultatul 4 obinut anterior este corect deoarece dup scderea cifrei 6, indicatorul AF = 1.
c) Fie BCD1 i BCD2 dou numere ce conin cte 4 cifre zecimale reprezentate n cod BCD.
Urmtoarea secven calculeaz BCD1 + BCD2 i depune rezultatul n BCD3. (Reamintim c cifra
zecimal m.p.s. se memoreaz la adresa cea mai mic).
...........
clc
mov al, BYTE PTR BCD1
add
al, BYTE PTR BCD2
daa
mov BYTE PTR BCD3, al
mov al, BYTE PTR BCD1+1
adc
al, BYTE PTR BCD2+1
daa
mov BYTE PTR BCD3+1, al

3.2.2. Aritmetica BCD nempachetat


O alt reprezentare a numerelor dect cea binar i n cod BCD mpachetat este
reprezentarea n cod BCD nempachetat (despachetat), coninnd numai o cifr pe octet. Cifr este
coninut n cei mai puin semnificativi 4 bii ai octetului, restul biilor neinfluennd valoarea
numrului reprezentat. Cel mai uzual exemplu de reprezentare n cod BCD nempachetat este codul
ASCII n care, pentru reprezentarea cifrelor, cei mai semnificativi 4 bii au valoarea 0011b. La
efectuarea operaiilor de adunare, scdere, nmulire i mprire cu operanzi n format BCD
despachetat (n cod ASCII) sunt necesare urmtoarele corecii, astfel:
a)

AAA

; ASCII Adjust after Addition


2 - 23

Instruciunea realizeaz corecia zecimal a rezultatului obinut, n registrul AL, dup


adunarea 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
}
b)

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

al, BYTE PTR UP3

sbb
aas
mov

al, BYTE PTR UP3+1

al,dl

dh, al

; C.m.p.s. cifr a lui UP1+UP2 n AL


; C.m.s. cifr a lui UP1+UP2 n DL
;
; C.m.p.s. cifr a lui UP1+UP2-UP3 n AL
; C.m.s. cifr a lui UP1+UP2 n AL
; C.m.p.s. cifr a lui UP1+UP2-UP3 n DL
;
; C.m.s. cifr a lui UP1+UP2-UP3 n AL
; C.m.s. cifr a lui UP1+UP2-UP3 n DH

Deoarece se lucreaz implicit cu registrul AL, se observ c la fiecare pas se trateaz cte o
singur cifr.

2 - 25

4. Grupul instruciunilor de salt


Instruciunile de salt se mpart n dou categorii: instruciuni de salt necondiionat i
instruciuni de salt condiionat.
4.1. Instruciuni de salt necondiionat
Exist urmtoarele instruciuni de salt necondiionat:
a) Intra-segment
1.
JMP SHORT [PTR] etichet
; Salt direct scurt intra-segment
2.
JMP etichet
; Salt direct intra-segment apropiat (etichet este
; definit n interiorul segmentului curent ca NEAR)
JMP NEAR PTR etichet
; Salt direct apropiat intra-segment
; Salt indirect intra-segment la adresa de offset coninut n registrul R16
3.
JMP R16
4.
JMP WORD PTR operand
; Salt indirect intra-segment la adresa de offset
; specificat prin contextul lui operand
Exemplu:
jmp WORD PTR [bx] [di] ;
jmp TABLE [bx]
;
Observaie: Dac eticheta la care se face referirea se gsete textual nainte de instruciunea de salt,
atunci asamblorul "tie" s genereze corect o instruciune scurt. n cazul n care eticheta la care se
face referirea se gsete textual dup instruciunea de salt este necesar specificarea explicit a
formei scurte de salt:
alfa: mov ax, 5
--------------jmp alfa
--------------jmp SHORT beta
beta: add
ax, cx
b) Inter-segment
1.

JMP

2.

JMP

3.

JMP

Exemplu:

; Salt direct ndeprtat (n alt segment) la operatorul etichet


; (eticheta a fost definit ca FAR (instruciunea ocup 5 octei))
FAR PTR
etichet
; Salt direct inter-segment la operatorul etichet
; (etichet a fost definit ca NEAR n segmentul n
; care se face saltul)
DWORD PTR operand
; Salt indirect inter-segment, adresa de salt
; (SEGMENT:OFFSET), fiind specificat prin
; coninutul lui operand
jmp DWORD PTR [bx] ;

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

instruciunea CMP execut o scdere a celor dou numere (DST)-(SRC), fr depunerea


rezultatului, dar cu modificarea corespunztoare a fanioanelor de condiie conform operaiei
efectuate. n a doua etap, instruciunea de salt condiionat, testeaz condiia specificat (bistabilul
de condiie), Fig. 4.1, efectund saltul numai n situaia n care condiia este adevrat, n caz
contrar trecnd la instruciunea urmtoare.
Observaie: Toate instruciunile de salt condiionat au lungimea de 2 octei, primul octet fiind codul
operaiei, iar cel de-al doilea, un deplasament de 8 bii reprezentat n complement fa de 2.
NU

Condiie ndeplinit ?

Execut instruciunea urmtoare


IP <--- IP +2

DA
Se execut
saltul
IP <--- IP + DEPL

DEPL8 [-128, +127]


Fig. 4.1.

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

; Jump if below / not above nor equal / carry (CF = 1)


; Jump if below or equal / not above (CF ZF) = 1
2 - 27

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

Exist urmtoarele instruciuni de buclare:


1.

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

n continuare sunt prezentate cteva exemple de utilizare a instruciunilor prezentate.


Exemplul 1. Urmtoarea secven de program adun coninutul a M cuvinte din memorie plasate
ncepnd de la adresa ARRAY i depune rezultatul n variabila TOTAL.
mov cx, M
; n CX se introduce numrul cuvintelor de adunat
mov ax, 0
mov si, ax
START_LOOP:
add
ax, ARRAY[si]
add
si, 2
loop START_LOOP
mov TOTAL, ax
Exemplul 2. Suma a n octei plasai n memorie la adresa sir
sir
DB
3, 5, 9, -10, 7, -11, 20
n
EQU ($ - sir) / TYPE sir
; TYPE operand - precizeaz numrul de octei
; ai tipului variabilei operand
rez
DB
?
.....................
xor
al, al
; AL = 0
mov cx, n
; CX <--- n
xor
si, si
; SI = 0
repeta:
add
al, sir[si]
inc
si
LOOP repeta
mov suma, al
Exemplul 3. Un exemplu n care apare necesitatea testrii a 2 condiii naintea repetrii buclei l
reprezint cutarea unui element ntr-un vector.
Presupunem c ASCII_SIR reprezint un ir de caractere. Se pune problema cutrii unui
blanc (spaiu) n acest ir. Dac nu se gsete nici un blanc, se execut salt la eticheta NU_GASIT.
Lungimea irului este dat prin variabila L. Secvena de program este urmtoarea:
ASCII_SIR DB
'Acesta este un sir'
L
EQU $ - sir
contor1
DB
0
contor2
DB
?
........................
mov cx, L
mov si, -1
mov al, ' ' ; n AL se introduce codul ASCII al blancului
NEXT:
inc
si
cmp al, ASCII_SIR[si]
loopne NEXT
jcxz NU_GASIT
GASIT:
inc
contor1
jmp NEXT
NU_GASIT: mov contor2, 0

2 - 30

5. Grupul instruciunilor logice


5.1. Instruciuni logice
Microprocesorul I8086/I8088 poate realiza cinci instruciuni logice: NOT, AND, OR, XOR
i TEST.
a) Instruciunea:
NOT DST
; Logical NOT
_____
realizeaz negarea logic (complementul fa de 1) al operandului DST (DST <--- DST ). Forme de
utilizare:
_
not
R
; R <--- R_ unde R poate fi R8 sau R16
not
M
; M <--- M unde M poate fi M8 sau M16
Instruciunea nu afecteaz fanioanele de condiie.
b) Instruciunile
AND DST, SRC
OR DST, SRC
XOR DST, SRC

; (DST) <--- (DST) (SRC)


; (DST) <--- (DST) (SRC)
; (DST) <--- (DST) (SRC)

; 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

Observaie: Dup execuia instruciunilor AND, OR, XOR, ntotdeauna: CF = 0 , OF = 0. Ali


indicatori afectai: SF, ZF, PF. Indicatorul AF este nedefinit.
c) Instruciunea:
TEST DST, SRC

; DST SRC;

TEST

combin proprietile instruciunilor AND i CMP, astfel: ca i o instruciune AND, TEST


realizeaz operaia logic SI ntre biii corespunztori ai sursei SRC i destinaiei DST, fr
nscrierea rezultatului; ca i o instruciune CMP, TEST poziioneaz n mod corespunztor
rezultatului obinut bistabilii de condiie, cu excepia flagurilor CF i OF care se poziioneaz pe 0.
Cel mai des, instruciunile logice se utilizeaz pentru setarea, resetarea (tergerea),
complementarea sau testarea selectiv ai unor bii ai operandului destinaie n funcie de forma
operandului surs. n astfel de operaii, operandul surs se numete masc, iar operaia se numete
operaie de mascare.
Setarea (punerea pe 1) selectiv a unor bii se face cu instruciunea OR, resetarea (punerea
pe 0) selectiv a unor bii se face cu instruciunea AND, iar complementarea selectiv se
realizeaz cu XOR.
Testarea selectiv a unor bii se realizeaz cu instruciunea TEST.
2 - 31

Exemplu: Urmtoarea secven de program realizeaz un salt la etichetele TASK1, respectiv


TASK2 sau TASK3, funcie de valoarea biilor registrului AX, n urmtoarele condiii:
a) Dac biii 1 i 14 sau 7 i 9 sunt setai, salt la TASK1;
b) Dac nu se face saltul la TASK1 i biii 3 sau 4 sunt setai, salt la TASK3;
c) Altfel, salt la TASK2.

AX

15 14 13 12 11 10 9

5 4

Secvena de program este urmtoarea:

TASK2:

TASK1:

TASK3:

not
ax
test
ax, 4002h
jz
TASK1
test
ax, 0280h
jz
TASK1
not
ax
test
ax, 0018h
jnz
TASK3
----------------------------------------------------------------------------------------------------------------------------------------------------------

; Se neag AX, deci i biii 1 i 14 i 7 i 9


; Se testeaz dac biii 1 i 14 au valoarea 1
; Dac da, salt La TASK1
; Se testeaz dac biii 7 i 9 au valoarea 1
; Dac da, salt La TASK1
; Se revine la valoarea iniial a lui AX
; Se testeaz dac biii 3 sau 4 au valoarea 1
; Dac da, salt La 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

; Deplasare logic stnga a operandului DST cu 1 poziii


; Deplasare logic stnga a operandului DST cu (CL) poziii

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

; Deplasare logic dreapta a operandului DST cu 1 poziii


; Deplasare logic dreapta a operandului DST cu (CL) poziii

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

; Rotire la stnga prin carry a operandului DST cu 1 poziii


; Rotire la stnga prin carry a operandului DST cu (CL) poziii
2 - 33

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

Shift arithmetic left

Shift arithmetic right

Rotate left with carry

CF

Rotate right with carry

Rotate through carry left

LSB

LSB

Shift logical left

Shift logical right

LSB

MSB

MSB

LSB

MSB

MSB

f) ROR

LSB

MSB

MSB

d) SAR

e) ROL

MSB

CF

Rotate through carry right

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

Exemplul 2. Varianta care utilizeaza primitiva movs este urmatoarea:

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.

CMPS DST, SRC


; Compare Strings
CMPSB (CMPSW) DST, SRC
Compar un octet (o pereche de octei) din irul destinaie DST adresat prin ES:DI cu
octetul (perechea de octei) din irul surs SRC adresat prin DS:SI, cu actualizarea corespunztoare
a registrelor SI i DI. Comparaia se realizeaz prin scderea octetului (cuvntului) surs din octetul
(cuvntul) destinaie, fr nscrierea rezultatului, dar cu poziionarea indicatorilor de condiie
conform rezultatului obinut. Coninutul celor dou iruri nu se modific.
Exemplul 4.
DATA
SEGMENT
2 - 37

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

O rutin de ntrerupere este asemntoare unei proceduri n sensul c dup execuia ei se


revine n programul ntrerupt la instruciunea imediat urmtoare celei ntrerupte. Modalitatea de
declanare a unei rutine de ntrerupere este n general diferit de apelul unei proceduri, existnd
ns, pentru anumite clase de ntreruperi i similitudini (la microprocesoarele 8086/88 exist
aproape o similitudine perfect ntre apelul procedurilor ndeprtate i instruciunile de ntrerupere).
Ca element comun notm necesitatea salvrii contextului programului ntrerupt (cuvnt de stare
program - PSW, numrtor de program, registre generale) la intrarea n rutina de ntrerupere.
Deoarece anumite ntreruperi sunt iniiate de evenimente externe procesorului, asincrone n raport
cu programul aflat n execuie, acesta nu le poate transmite nici un fel de parametri, comunicaiile
de date putnd avea loc numai utiliznd variabile direct accesibile ambelor secvene de program:
secvena curent executabil i rutina de ntrerupere.
Aciunile ce rezult n urma apariiei unei ntreruperi i care determin transferul controlului
rutinei de ntrerupere poart numele de secven de ntrerupere. Secvena de ntrerupere specific
microprocesoarelor 8086/88 este urmtoarea:
1. Se salveaz valorile curente ale PSW, CS i IP n stiv;
2. Se ncarc perechea de registre CS:IP dintr-un pointer determinat pe baza unei valori
calculat folosind tipul ntreruperii, i anume, dac n este tipul ntreruperii, valoarea calculat este
4*n. Pointerul ce conine noile valori ale registrelor CS i IP se numete vector de ntrerupere;
3. Se terg flagurile IF si TF.
Noile coninuturi ale registrelor CS i IP determin adresa de nceput a rutinei de
ntrerupere.
Tipul ntreruperii este un numr ntreg n gama 0...255. Adresa vectorului de ntrerupere
rezult prin nmulirea tipului ntreruperii cu 4. Primele 5 tipuri de ntrerupere, i anume 0, 1, 2, 3 i
4, au semnificaii speciale predefinite:
a. tipul 0 este utilizat pentru tratarea erorii de mprire la zero. Dac se realizeaz o
mprire la zero se declaneaz automat o ntrerupere cu tipul 0. O astfel de situaie poate apare ori
de cte ori, dup executarea unei instruciuni idiv sau div, ctul are o depire de format, indiferent
de valoarea flagului IF;
b. tipul 1 este utilizat pentru executarea programelor n regim "pas cu pas". Dac flagul TF
este setat se va declana automat o ntrerupere cu tipul 1 la sfritul fiecrei instruciuni executate
de procesor;
c. tipul 2 este utilizat de ctre ntreruperea nemascabil. ntreruperea nemascabil este o
ntrerupere extern care poate apare indiferent de starea flagului IF.
d. tipul 3 este rezervat unei instruciuni speciale de ntrerupere cu lungimea de un octet cu
codul 0cc16. Aceast instruciune este utilizat pentru implementarea facilitii de executare a unui
program cu puncte de oprire (breakpoint) din cadrul programelor depanatoare (debugger).
e. tipul 4 este utilizat pentru tratarea depirilor. Dac se execut o instruciune into cnd
flagul OF este setat, se va declana o ntrerupere cu tipul 4.
Instruciunile prin care se pot provoca prin program ntreruperi se numesc instruciuni de
ntrerupere. Aceste instruciuni sunt urmtoarele:
Instruciunea
INT n
unde n este un numr ntreg permite generarea unor ntreruperi software. Numrul n din
instruciune reprezint numrul nivelului de ntrerupere asociat semnalului de ntrerupere generat.
Sunt posibile 256 nivele de ntrerupere cuprinse ntre 0 i 255. Pentru fiecare ntrerupere exist o
procedur special de tratare a acesteia. Efectul instruciunii INT n const n salvarea n stiv a
registrului indicatorilor de condiie F, a coninutului registrelor CS i IP, resetarea indicatorilor TF
2 - 42

i IF i efectuarea saltului la adresa procedurii de tratare a ntreruperii, adres memorat pe 4 octei


la adresa corespunztoare nivelului de ntrerupere. Adresa asociat unui nivel de ntrerupere se
obine nmulind cu 4 numrul n al nivelului de ntrerupere. Adresa de segment pentru adresa
asociat unui nivel de ntrerupere este zero. Simbolic, cele spuse mai sus se scriu sub urmtoarea
form:
SP <----- SP - 2
(SP +1, SP) <----- F ; IF, TF <--- 0
SP <----- SP - 2
(SP +1, SP) <----- CS
SP <----- SP - 2
(SP +1, SP) <----- IP
IP <----- (4 * n)
CS <----- (4 * n +2)
Adresele procedurilor de tratare a ntreruerilor sunt continute ntr-un tabel cu 256 de intrri, fiecare
intrare fiind pe 4 octei. Tabelul ncepe la adresa de memorie 0000:0000h, conform Fig. 8.1.

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

pregtete s treac la subrutina de tratare a ntreruperii recepionate. Pentru nceput, procesorul


salveaz n stiv toate informaiile importante despre taskul su (valorile curente ale indicatorilor de
condiie i ale indicatorilor de stare, valorile curente ale registrelor CS i IP), apoi va prelua de la
dispozitivul (elementul) extern tipul ntreruperii i va trece la subrutina de tratare a acesteia. Orice
subrutin de tratare a unei ntreruperi se termin cu instruciunea IRET.
Dac procesorul primete o ntrerupere pe pinul NMI atunci, indiferent de valoarea lui IF,
procesorul va executa aceleai operaii ca i la o ntrerupere pe pinul INTR, cu singura deosebire c
nu mai este nevoie s se precizeze tipul ntreruperii deoarece, n aceast situaie, se genereaz o
ntrerupere de tipul 2.
8.1. Interfaa limbaj de asamblare - Sistem de operare DOS
Rutinele pe care sistemul de operare DOS le utilizeaz pentru gestiunea resurselor
calculatorului pot fi apelate din programele scrise n limbaj de asamblare. Aceste rutine se mai
numesc apeluri sistem (system calls). Utilizarea apelurilor sistem de ctre programele de aplicaie
permite obinerea de programe independente de maina fizic, garantndu-se compatibilitatea
acestora cu versiunile superioare ale sistemului de operare DOS.
Instruciunile de ntrerupere cu tipurile 20h, ..., 3Fh sunt rezervate apelurilor sistem.
Majoritatea apelurilor sistem sunt grupate la ntreruperea cu tipul 21h. Aceste apeluri sunt
cunoscute sub numele de funcii sistem. Pentru executarea unui apel sistem se procedeaz astfel:
- se transfer parametrii apelului n registrele procesorului. Parametrii mpreun cu
registrele corespunztoare sunt specifici fiecrui apel n parte;
- se execut instruciunea int cu tipul corespunztor apelului respectiv.
Pentru executarea unei funcii sistem se procedeaz astfel:
- se transfer parametrii funciei n registre;
- se transfer numrul funciei n registrul ah;
- se transfer un cod suplimentar, dac acest lucru este cerut de funcia respectiv, n
registrul al;
- se execut instruciunea int 21h.
Majoritatea funciilor sistem seteaz flagul CF dac a aprut o eroare, codul de eroare fiind
returnat n registrul AX.
Principalele funcii sistem pot fi grupate n urmtoarele categorii:
a. Funcii pentru operaiile de I/E standard, specifice urmtoarelor dispozitive de I/E:
consol, imprimant, interfa serial. Dac un program folosete pentru implementarea operaiilor
de I/E aceste funcii, intrarea respectiv ieirea sa pot fi redirectate. Dintre aceste funcii ne referim
la urmtoarele:
- Funcia 01h: aceast funcie citete un caracter de la intrarea standard, pe care l trimite n
ecou la ieirea standard. Dac caracterul citit este CTRL-C, se execut int 23h. La apel (ah)=01h, i
dup execuie (al)=codul ASCII al caracterului citit.
- Funcia 02h: aceast funcie scrie un caracter la ieirea standard. Dac se tasteaz
CTRL-C, se execut int 23h. La apel (ah)=02h, (dl)=codul ASCII al caracterului care trebuie scris.
- Funcia 07h: aceast funcie citete un caracter de la intrarea standard. Caracterul citit nu
este trimis n ecou la ieirea standard, i nu se efectueaz nici un test pentru CTRL-C. La apel
(ah)=07h i dup execuie (al)=codul ASCII al caracterului citit.
- Funcia 09h: aceast funcie realizeaz afiarea unui ir de caractere la ieirea standard,
irul de caractere fiind terminat cu '$'. Caracterul '$' nu se afieaz. La apel (ah)=09h,
DS:DX=adresa de nceput a irului de caractere respectiv.
- Functia 0Ah: aceasta funcie realizeaz citirea unui ir de caractere de la intrarea standard.
La apel (ah)=0Ah, DS:DX=adresa unei zone tampon cu urmtoarea structur:
2 - 44

-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

incep: mov ax, DATA


mov ds, ax
mov ax, STIVA
mov ss, ax
mov sp, OFFSET virf
lea
dx, cerere
mov ah,09h
int
21h
mov ah, 07h
int
21h
cmp al, 0
jz
cod_extins
lea
bx,sir
call
conv
lea
dx,mesaj1
mov ah,09h
int
21h
jmp
afis
cod_extins: mov ah,07h
int
21h
lea
bx,sir
call
conv
lea
dx,mesaj2
mov ah,09h
int
21h
afis:
lea
dx,sir
mov ah,09h
int
21h
mov ax,4c00h
int
21h
COD
ENDS
END start

; Se afieaz mesajul care cere tastarea unei taste

; Se citete o tasta
; Se testeaz dac este tast funcional
; Se determin codul tastei
; Se afieaz mesaj1

; Se citete codul extins


; Se determin codul extins
; Se afieaz mesaj2

; Se afieaz codul tastei

b. Funcii pentru gestiunea memoriei


Sistemul de operare DOS ine evidena blocurilor de memorie alocate prin scrierea la
nceputul fiecruia a unei nregistrri, numit bloc de control al memoriei (Memory Control
Block, MCB) ce conine informaii referitoare la dimensiunea blocului, n numr de paragrafe (1
paragraf=16 octei) i un pointer la urmtorul bloc, dac exist. Dintre funciile pentru gestiunea
memoriei prezentm pe urmtoarele:
- Funcia 48h: prin aceast funcie, programul aflat n execuie poate cere alocarea unei
cantiti de memorie specificat n numr de paragrafe. La apel AH=48h, BX=numrul de paragrafe
cerute. Dac la retur CF=1, nseamn ca a aprut o eroare, codul de eroare fiind specificat n
registrul AX, astfel: dac AX=7 nseamn c s-a alterat un MCB, iar dac AX=8 nseamn c nu
exist suficient memorie pentru alocare. n registrul BX se obine numrul de paragrafe
disponibile. Dac la retur CF=0, nseamn c alocarea s-a efectuat cu succes, n registrul AX
ntorcndu-se adresa de segment a zonei de memorie alocat.
- Funcia 49h: aceast funcie elibereaz un bloc de memorie alocat anterior cu functia 48h.
La apel AH=49h, ES=adresa de segment a blocului respectiv. Dac la retur CF=1 nseamn c a
aparut o eroare, codul de eroare fiind specificat n registrul AX, astfel: dac AX=7 nseamn
2 - 46

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

; Se calculeaz numrul de paragrafe necesare pentru a fi alocate


xor dx, dx
mov ax, n
; AX = 7000h
mov cx,10h
div
cx
; Dup mprire, AX va conine numrul de paragrafe al zonei de memorie
cmp ax, 0
jz
aloc
inc
ax
aloc: mov bx, ax
; Se efectueaz alocarea
mov ah, 48h
int
21h
jnc
ok
mov ah, 09h
; Alocare euat
lea
dx, a2
int
21h
jmp gata
ok: mov segm, ax
; Alocare efectuat cu succes
mov ah, 09h
lea
dx, a1
int
21h
cont: mov es, segm
; Se umple blocul alocat
xor
bx, bx
mov cx, n
mov dl, cnst
; DL = 88h
trans: mov es:[bx], dl
inc
bx
loop trans
; Se dezaloc blocul alocat anterior
mov ah, 49h
int
21h
mov ah, 09h
lea
dx, d
int
21h
gata: mov ax, 4c00h
int
21h
ultima_instr:
COD
ENDS
END start
c. Funcii BIOS pentru controlul ceasului de timp real (INT 1AH)
Pentru ceasul de timp real, BIOS-ul conine dou proceduri: una pentru tratarea
ntreruperilor provenite de la ceasul de timp real i alta accesibil utilizatorilor pentru controlul
ceasului de timp real. Procedura de tratare a ntreruperilor provenite de la ceasul de timp real este
apelat de aproximativ 18,21 ori pe secund. La fiecare apel al procedurii se incrementeaz un
contor format din 4 octei a crui adresa este 40H:6CH. Contorul memoreaz numrul de treceri
prin procedur de la ora 00:00:00. De asemenea, aceast procedur verific dac contorul a ajuns la
echivalentul a 24 ore. n acest ultim caz, contorul este reiniializat la 0 i la adresa 40H:70H se
memoreaz valoarea 1 (n mod normal, valoarea acestui octet este 0). Pentru fiecare apel al acestei
proceduri se va apela ntreruperea software INT 1Ch.
2 - 48

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:

Funciile 2 7 sunt funcii specifice sistemelor de tip AT, astfel:

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

Definirea i utilizarea segmentelor logice


Segmentul logic (numit pe scurt segment) este cea mai mic unitate relocabil a unui program.
Relocabilitatea este proprietatea unui program obiect de a putea fi link-editat i fcut executabil prin plasarea
sa la orice adres de nceput n memoria principal.
Un segment fizic (numit i cadru) n memoria lui I8086/I8088 const dintr-un grup de locaii
adiacente de dimensiune 64 Koctei, cu adresa absolut de nceput multiplu de 16.
La un moment dat microprocesorul poate sa fac acces la patru segmente logice:
- segmentul de cod, curent
accesibil prin CS;
- segmentul de date, curent
accesibil prin DS;
- segmentul de date, suplimentar
accesibil prin ES;
- segmentul de stiv
accesibil prin SS.
Aceste segmente logice pot s corespund la patru segmente fizice distincte, dar pot s existe i coincidene
i/sau suprapuneri pariale ntre aceste segmente.
Definirea unui segment se face sub forma:
nume_segment SEGMENT
Corpul segmentului
nume_segment ENDS
unde nume_segment este numele asociat segmentului, care nu poate fi utilizat n program cu o alt
semnificaie. Acestui nume i se asociaz o valoare i anume adresa de segment (16 bii) corespunztoare
poziiei segmentului n memorie.
Structura unui segment de date este urmtoarea:
nume_segment SEGMENT
Directive de alocare memorie
nume_segment ENDS
Structura unui segment de cod este urmtoarea:
nume_segment SEGMENT
Instruciuni i directive
nume_segment ENDS
Directivele i instruciunile cuprinse ntre directivele SEGMENT i ENDS se consider c fac parte din
segmentul respectiv.
Structura unui program format din dou segmente de date i un segment de cod este urmtoarea:
data_seg1
SEGMENT
; nceputul segmentului de date data_seg1
. . . . Directive
data_seg1
ENDS
; Sfritul segmentului data_seg1

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.

Observaie: Deoarece directiva ASSUME nu ncarc adresele de segment n registrele de segment


corespunztoare, pentru toate registrele de segment, cu excepia lui CS, acest lucru se face n mod explicit de
ctre programator, ca n exemplul urmtor:
code_seg
SEGMENT
ASSUME CS : code_seg, DS : data_seg1, ES : data_seg2
start:
mov ax, data_seg1 ; ncrcarea registrului DS cu
mov ds, ax
; adresa de baz a segmentului data_seg1
mov ax, data_seg2 ; ncrcarea registrului ES cu
mov es, ax
; adresa de baz a segmentului data_seg2
code_seg
ENDS
END start
Vom prezenta n continuare un exemplu de referire la date n segmentul de cod:
data1
SEGMENT
; nceputul segmentului de date data1
alfa
dw
0
beta
dw
0
data1
ENDS
; Sfritul segmentului data1

data2
gama
delta

data2

SEGMENT
dw
0
dw
0
ENDS

; nceputul segmentului de date data2

; Sfritul segmentului data2

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

2. Tipul de combinare COMMON face


posibil crearea unor zone de date ce pot fi accesate n
comun de mai multe module. Exemplu:
; MODUL
SURSA1
Data
SEGMENT
COMMON
.................
.................
.................
Data
ENDS
Code
SEGMENT
PUBLIC
.................
.................
.................
Code
ENDS
; MODUL
SURSA2
Data
SEGMENT
COMMON
.................
.................
.................
Data
ENDS
Code
SEGMENT
PUBLIC
.................
.................
.................
Code
ENDS

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.

Utilizarea grupurilor de segmente. Directiva GROUP


Un grup de segmente poate s fie adresat utiliznd un singur registru de segment, cu condiia ca
suma lungimilor segmentelor s nu depeasc 64 Koctei. Adresarea se realizeaz cu pseudoinstruciunea
GROUP a crei form este:
nume_grup
GROUP
lista_nume_segmente
unde nume_grup este numele grupului de segmente, iar lista_nume_segmente este o list de nume de
segmente, separate prin virgul.
Exemplu:
cseg1 SEGMENT
.....................
proc1 PROC
.........
proc1 ENDP
.....................
cseg1 ENDS
cseg2 SEGMENT
.....................

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

; Se definete grupul de segmente de date

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.

Accesul la numele externe


n cazul legrii mai multor module obiect trebuie s existe posibilitatea ca anumite module s refere
date definite n alte module.
- Dac un identificator (de variabil sau etichet) este definit i folosit (referit) n acelai modul de
program, el se numete local sau intern modulului respectiv.
- Dac un identificator nu este definit ci numai referit ntr-un anumit modul, dar este definit ntr-unul
din modulele de program cu care acesta se leag, el se numete global sau extern relativ la modulul respectiv.
Pentru un program format dintr-un singur modul obiect, toi identificatorii trebuie s fie locali
modulului respectiv. Pentru un program format din mai multe module, asamblorul i link-editorul trebuie
informai despre identificatorii definii extern i referii de un anumit modul, ct i despre identificatorii
definii intern i fcui accesibili altor module. Pentru aceasta, fiecare modul va conine 2 liste:
1. Lista identificatorilor definii extern i referii n modulul respectiv (Pentru fiecare identificator
trebuie specificat i tipul acestuia). Declararea identificatorilor externi se face cu directiva EXTRN a crei
sintax este:
nume_identif : tip [, ...]
EXTRN

2 - 54

unde nume_identif este identificatorul definit n exteriorul modulului curent, iar:


tip = BYTE, WORD, DWORD, STRUC, RECORD, PROC - pentru variabile;
tip = NEAR, FAR sau PROC - pentru etichete sau proceduri;
tip = ABS - pentru constante.
2. Lista identificatorilor definii intern care sunt fcui disponibili altor module se declar cu
directiva PUBLIC a crei sintax este:
PUBLIC
nume_identif [, ...]
unde nume_identif este identificatorul definit n modulul curent ca variabil sau etichet (inclusiv numele de
proceduri).
Exemplul 1. Se prezint un program mprit pe dou module surs: salut i afis. Modulul salut este
modulul de iniializare al programului. Execuia va ncepe de la eticheta start din modulul salut. Modulul
afis conine procedura afis care este apelat din modulul salut.
Modulul salut se prezint astfel:

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

Modulul afis se prezint astfel:


TITLE
afis
EXTRN lung : ABS
.MODEL SMALL
.DATA
EXTRN mesaj : BYTE
.CODE
PUBLIC afis
afis
PROC
mov cx, lung
lea
dx, mesaj
mov ah, 40h
int
21h
ret
afis
ENDP
END
Pentru crearea unui program executabil din aceste dou module, fiecare modul va fi asamblat separat astfel:
TASM salut
TASM afis
Apoi se vor edita legturile pentru cele dou module astfel:
TLINK salut afis
Rezultatul este obinerea fiierului salut.exe.

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

; Fiierul param.inc care se include n program are structura


; de mai jos

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

a) Apel direct intrasegment

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

b) Apel indirect intrasegment


CALL R16
unde R16 este un registru pe 16 bii, cu excepia registrelor de segment.
SP <----- SP - 2
(SP+1, SP) <----- IP
IP <----- R16
Exemplu:
call
BX
CALL M16
unde M16 este coninutul unei locaii de memorie pe 16 bii.
SP <----- SP - 2
(SP+1, SP) <----- IP
IP <----- (EA+1, EA)
Exemplu:
call
WORD PTR [bx][si]

2.

a) Apel direct intersegment

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.

b) Apel indirect intersegment


CALL M32
Se realizeaz salt intersegment la adresa precizat prin cei 4 octei plasai n memorie la adresa
specificat prin operandul M32. Se execut operaiile:
SP <----- SP - 2
(SP+1, SP) <----- CS
SP <----- SP - 2
(SP+1, SP) <----- IP
IP <----- (EA+1, EA)
CS <----- (EA+3, EA+2)
Exemplu:
call
DWORD PTR [bx]
Pentru microprocesoarele I8086/I8088, instruciunile pentru revenirea n programul apelant sunt
urmtoarele:

a) Revenire intrasegment
RET

(Return)
IP <----- (SP+1, SP)
SP <----- SP + 2
Instruciunea reface din stiv coninutul indicatorului (numrtorului) de instruciuni IP.

b) Revenire intrasegment cu descrcarea stivei (cu POP)


RET EXP**
(Return)
unde EXP este o expresie constant care se evalueaz la o valoare ce se poate exprima printr-un numr pe
16 bii. Se realizeaz operaiile:
IP <----- (SP+1, SP)
SP <----- SP + 2
SP <----- SP + EXP**
Exemplu:
ret
8
Instruciunea reface din stiv coninutul indicatorului (numrtorului) de instruciuni IP i descarc
stiva cu nc 8 octei.
**

c) Revenire intersegment
RET
Se realizeaz operaiile:

(Return)

IP <----- (SP+1, SP)


SP <----- SP + 2
CS <----- (SP+1, SP)
SP <----- SP + 2
Instruciunea reface din stiv coninutul indicatorului (numrtorului) de instruciuni IP, precum i al
registrului segment CS.
Observaie: Tipul lui RET, intrasegment sau intersegment, rezult din tipul celui mai recent CALL.

b) Revenire intersegment cu descrcarea stivei (cu POP)


RET EXP**
(Return)
unde EXP este o expresie constant care se evalueaz la o valoare ce se poate exprima printr-un numr pe
16 bii. Se realizeaz operaiile:
IP <----- (SP+1, SP)
SP <----- SP + 2
CS <----- (SP+1, SP)
SP <----- SP + 2
SP <----- SP + EXP**
ret
20
Exemplu:
**

2 - 60

Instruciunea reface din stiv coninutul indicatorului (numrtorului) de instruciuni IP i al


registrului de segment CS, dup care descarc stiva cu nc 20 octei.

Comunicarea parametrilor procedurilor


Exist 2 modaliti de transfer de parametri ctre o procedur: 1) transfer prin valoare; 2) transfer
prin adres. Aceast clasificare are n vedere ceea ce se transmite procedurii relativ la un parametru i anume
valoarea, n primul caz, respectiv adresa, n cel de-al doilea caz. De asemenea, n cadrul ambelor tipuri de
transfer de mai sus putem avea mai multe situaii n funcie de locaiile efective utilizate pentru transfer.
Acestea pot fi:
a) registrele procesorului;
b) locaii "cunoscute" de memorie att de ctre secvena apelant ct i de ctre secvena apelat;
c) stiva procesorului.
Pe lng aceste 3 situaii mai exist o tehnic des folosit: utilizarea blocurilor sau tabelelor de parametri. n
aceast situaie, procedurii i se poate transmite fie blocul de parametri respectivi, fie adresa blocului de
parametri.

Transferul parametrilor prin registru


Exemplu: Calculul sumei elementelor unui vector organizat pe cuvinte, cunoscndu-se adresa de
nceput a vectorului i numrul su de componente. Considerm c BX conine adresa de nceput a
vectorului, CX - numrul de componente ale vectorului, iar suma rezultat este coninut de AX.
DATA
SEGMENT
VECTOR
dw
10 DUP (0102h)
NR_ELEM
equ
$ - VECTOR
SUMA
dw
?
DATA
ENDS
COD
start:

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

; Procedura pentru calculul sumei elementelor


; AX = 0
; SI = 0
; Suma se calculeaz n AX
; Se trece la elementul urmtor

start

Transferul parametrilor prin locaii cunoscute de memorie


Procedura anterioar poate fi rescris astfel nct s adune ntotdeauna primele NR_ELEM elemente
ale vectorului VECTOR i s ntoarc rezultatul n variabila SUMA.
DATA

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

Transferul parametrilor prin stiv


Pentru acelai exemplu prezentat mai sus, presupunem c procedurii i se transmit: adresa de nceput
a vectorului, adresa numrului de elemente i adresa rezultatului. Secvena de program va arta astfel:
Param_seg
VECTOR
NR_ELEM
SUMA
Param_seg

SEGMENT
dw
10 DUP (0102h)
dw
$ - VECTOR
dw
?
ENDS

Stack_seg

SEGMENT
dw
100 DUP (?)
LABELWORD
ENDS

VIRF
Stack_seg
Code
START:

; Vrful stivei este de tip WORD

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

; Se ncarc registrul SS corespunxtor


; directivei ASSUME
; Vrful stivei se ncarc n SP
; Adresa relativ a vectorului VECTOR
; se salveaz n stiv
; Adresa relativ a numrului de
; elemente se salveaz n stiv
; Adresa relativ a rezultatului
; se salveaz n stiv
; Apel procedur adun

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

; Se salveaz n stiv vechiul coninut al lui BP


; Registrul BP se ncarc cu valoarea lui SP
; Se salveaz coninutul registrelor AX, CX, SI, DI

; ncarc n SI adresa de nceput a vectorului


; ncarc n DI adresa numrului de elemente
; ncarc n AX numrul de octei ai vectorului

; ncarc n CX numrul de elemente ale vectorului


; ncarc n DI adresa rezultatului
; AX = 0
; Suma elementelor se face n AX

; Rezultatul se depune n variabila SUMA


; Se reface coninutul registrelor DI, SI, CX, AX

; Se descarc stiva cu 6 octei

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.

Utilizarea blocurilor (tabelelor) de parametri


Aceast metod const n construcia unei tabele ce conine parametri ce trebuie transmii procedurii.
n acest caz procedurii i se transmite adresa tabelei.
Relum exemplul de mai sus referitor la calculul sumei elementelor unui vector, de data aceasta
utiliznd un tabel al parametrilor notat TABEL a crei adres este introdus n registrul BX.
Prog_seg
VECTOR
NR_ELEM
SUMA
TABEL
VIRF
START:

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

bx, OFFSET TABEL ; ncarc n BX adresa de nceput a tabelei TABEL


si, [bx]
; ncarc n SI primul element al tabelei (adresa de
; nceput a vectorului VECTOR)
di, [bx+2]
; ncarc n DI adresa numrului de elemente
ax, [di]
; ncarc n AX numrul de octei al vectorului
cl, TYPE VECTOR
; CL = 2
cl
ah, ah
; AH = 0
cx, ax
; ncarc n CX numrul de elemente ale vectorului
di, [bx+4]
; ncarc n DI adresa rezultatului
ax, ax
; AX = 0
ax, [si]
; Suma elementeloe se face n AX
si, 2
REPET
[di], ax
; Rezultatul se depune n variabila SUMA
di
; Se reface coninutul registrelor DI, SI, CX, AX
si
cx
ax

mov
mov
mov
div
xor
mov
mov
xor
add
add
loop
mov
pop
pop
pop
pop
ret
ENDP
ENDS
END START

2 - 65

Cap. 3. Programarea sistematic a aplicaiilor de supraveghere i conducere n


timp real a proceselor industriale
Un sistem de calcul pentru conducerea unui proces reprezint o unitate dialectic ntre
componenta hardware a sa, cea care definete configuraia sistemului, i componenta sa software,
care constituie totalitatea programelor sistemului. Programele implementate pe un astfel de sistem
de calcul se mpart n dou mari categorii:
a) programe de sistem;
b) programe de utilizator sau de aplicaie.
Programele de sistem - sunt programe care au un caracter universal i sunt parte
component a unui anumit tip de calculator, independent de procesul pe care-l va conduce. Acest
ansamblu de programe formeaz ceea ce se numete sistemul de operare al calculatorului i are
rolul de a asigura executarea corect a sarcinilor sale. O funcie foarte important a SO este aceea
de a asigura interfaa ntre calculator i utilizator, altfel spus el este interpretul cerinelor
utilizatorului exprimate ntr-un limbaj adecvat, cerine care trebuie satisfcute cu ajutorul
instruciunilor main prin planificarea adecvat a componentelor hardware (HW) a sistemului de
calcul (SC).
Natura funciilor, precum i modul n care acestea sunt realizate, determin atributele care
caracterizeaz i departajeaz sistemele de operare.
Sistemele de calcul destinate conducerii proceselor industriale trebuie s posede n mod
necesar SO n timp real cu faciliti multitasking. Privit prin prisma utilizatorului i a programelor
de aplicaie, ansamblul de programe al acestui tip de SO poate fi mprit n dou categorii:
- programe necesare n faza de pregtire, elaborare i testare a programelor de aplicaie
(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.
b) Programele de utilizator (de aplicaie sau de conducere), n opoziie cu programele de
sistem, au un caracter specific, funcie de proces, ele fiind o imagine a ceea ce se ntmpl n
proces.
O particularitate esenial a ansamblului programe de sistem - programe de aplicaie const
n aceea c acestea trebuie s realizeze atributele de timp real, adic s precizeze cu exactitate locul
i timpul desfurrii evenimentelor din procesul condus. Pentru programarea sistemelor de calcul
care s rspund acestor cerine se folosesc dou tehnici de baz:
1. Utilizarea mecanismului de ntreruperi al microprocesorului i a ceasului de timp real,
problemele specifice timpului real fiind rezolvate de la caz la caz prin tehnici mai mult sau puin
unitare i sistematice. Acest procedeu este mai puin accesibil unui utilizator obinuit necesitnd un
efort mai mare precum i cunotinte fine de programare n limbajul microprocesorului. Metoda are
ns avantajul c programul, odat pus la punct, ofer un optim din punct de vedere al eficienei i
al timpului de rspuns.
2. Utiliznd facilitile multitasking ale unui program special creat, numit EXECUTIV de
timp real implementat pe echipament n acest scop. Acest al doilea procedeu este mai avantajos
pentru utilizator din punct de vedere al programrii. Utilizatorul are posibilitatea s realizeze
cerinele de timp real ale aplicaiei utiliznd serviciile pe care le poate oferi acest EXECUTIV,
servicii care apar n programul utilizatorului sub forma unor apeluri de subrutine (instruciuni
3-1

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

2. Scrierea i organizarea executivului astfel nct s fie compatibil cu conceptul de


echipament virtual. Aceasta presupune organizarea lui pe dou categorii de module SW (software)
avnd urmtoarele caracteristici:
- o prim categorie de module nu trebuie s conin nimic legat de structura concret a
vreunui echipament fizic, adic s fie independent de echipament, avnd deci o portabilitate de
100%;
- a doua categorie de module pe care o vom numi "interfaa ntre echipamentul virtual i
echipamentul real" depinde de echipament i formeaz o biblioteca ce conine o serie de proceduri
specifice, purtnd nume dedicate.
n felul acesta, odat scris EXECUTIVUL i puse la punct interfeele cu diferitele
echipamente reale, utilizatorul i scrie programul de aplicaie pe un sistem de dezvoltare utiliznd
serviciile executivului i procedurile de interfa aferente acestui sistem. Dup scrierea, depanarea
i testarea programului, schimbnd interfaa se va obine aplicaia destinat echipamentului fizic
real (int). Comutarea de la o interfa la alta se realizeaz link-editnd programul cu o bibliotec
sau alta, funcie de situaie, programul nu sufer nici o modificare, procedurile din interfa avnd,
aa cum am mai spus, nume dedicate.
Din cele de mai sus rezult urmtoarea arhitectur a programului de aplicaie:

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

- subrutin de programare a circuitului 8253 (ceasul de timp real);


- subrutina de programare a circuitului 8251 (USART - comunicaii asincrone seriale);
- subrutin de selecie a canalului analogic de intrare i declanare a conversiei analog numerice;
- funcie de preluare a valorii de la convertorul analog-numeric n urma unei ntreruperi de
tip EOC (End Of Convertion);
- subrutin pentru ieiri numerice;
- subrutin pentru ieiri analogice (transmise prin intermediul convertorului numericanalogic);
- subrutin pentru tratarea intrrilor numerice.
Pe baza celor spuse mai sus, programarea sistemic a unei aplicaii de supraveghere i/sau
conducere n timp real a unui proces presupune parcurgerea urmtoarelor etape:
- scrierea EXECUTIVULUI de timp real compatibil cu conceptul de echipament virtual;
- scrierea "interfeelor" pentru clasa de echipamente avut n vedere;
- descompunerea n taskuri a programului de aplicaie avnd n vedere ca taskurile
componente s fie disjuncte sau s interacioneze ct mai slab;
- programarea pe sisteme de dezvoltare a aplicaiei (descompus n taskuri) utiliznd
principiile programrii paralele i serviciile EXECUTIVULUI de timp real;
- depanarea i testarea n mediu simulat a programului astfel obinut;
- link-editarea programului cu interfaa corespunztoare echipamentului real;
- implementarea aplicaiei pe echipamentul real.
Primele dou etape, dei necesit un efort de programare considerabil, se parcurg o singur
dat, rezultatele putnd fi folosite n toate aplicaiile ulterioare destinate unei anumite clase de
echipamente.
Urmtoarele dou etape par, la prima vedere, c trebuie complet dezvoltate, n mod specific,
pentru fiecare aplicaie n parte. Dar, i n aceste cazuri, datorit descompunerii programelor n
taskuri, pot fi refolosite, de la o aplicaie la alta, o serie de produse program reprezentnd taskuri
comune mai multor aplicaii (taskuri de achiziie i conversie de date din proces, taskuri de reglare
etc.). Se obine astfel, i la acest nivel, posibilitatea de tipizare i refolosire a unor produse program,
ceea ce va uura i va reduce substanial activitatea de programare a unei aplicaii.
De asemenea, procednd n aceast manier, programarea unei aplicaii poate fi nceput de
un programator sau de un grup de programatori i poate fi modificat i dezvoltat fr probleme de
alt grup de programatori care sunt familiarizai ns cu metodologia de programare prezentat mai
sus. n cazul realizrii unei aplicaii dup concepii mai mult sau mai puin particulare i
nesistematice, acest deziderat este, n general, foarte greu de realizat. n cele ce urmeaz, dup
prezentarea unor probleme specifice sistemelor de operare n timp real, va fi prezentat modalitatea
de proiectare i scriere a unui EXECUTIV n timp real.

3-4

Cap.4. Sisteme de operare n timp real


Un sistem de operare este o colecie organizat de programe numite programe de sistem, care:
a) realizeaz o interfa ntre utilizator i sistemul de calcul extinznd setul de operaii executate de
calculator, minimiznd efortul de programare a calculatorului i optimiznd interaciunea om-calculator;
b) gestioneaz resursele calculatorului, n sensul optimizrii utilizrii lor.
n funcie de complexitatea sistemului de calcul, programele de sistem se numesc:
- program monitor;
- program executiv;
- program de comand;
- sistem de operare.
n general, sistemele de calcul mici i, n special, cele dedicate dispun doar de un monitor care
asigur un minim de servicii utilizatorului, cum ar fi: vizualizarea coninutului memoriei, modificarea
coninutului memoriei RAM, vizualizarea coninutului registrelor i a indicatorilor de stare (condiie) precum
i modificarea valorilor lor, compararea unor zone de memorie etc.
Sistemele de calcul complexe lucreaz sub comanda unui sistem de operare.
4.1. Funciile unui S.O.
Principalele funcii asigurate de S.O. actuale sunt:
4.1.1. Funcia de asisten a utilizatorului. Obiectivele urmrite sunt:
a) Furnizarea unui limbaj de comand care permite introducerea de ctre utilizator a unor parametri
i opiuni pentru utilizarea resurselor fizice i logice ale sistemului. Realizarea acestei funciuni se face cu
ajutorul unui interpreter de comenzi.
b) Furnizarea unor programe (editoare de legturi) care realizeaz legarea diferitelor module ale unui
program sau a mai multor programe de utilizator i a unor subrutine din biblioteci de programe ntr-un singur
program executabil. Aceasta permite o mare flexibilitate n programare, pentru c, diversele module ale
programului pot fi iniial scrise n limbaje diferite, care s asigure o programare optim pentru modulul
respectiv.
c) Existena unor sisteme de gestiune a bibliotecilor de programe destinate nscrierii, pstrrii,
actualizrii i eliminrii programelor prezente;
d) Furnizarea unui set de macroinstruciuni care s permit utilizatorului folosirea n programele
proprii a unor funcii specifice S.O. (de exemplu subrutine de lucru cu dispozitivele de I/E).
e) Furnizarea unor programe utilitare pentru editarea programelor de utilizator i pentru manipularea
informaiei prezente sub form de fiiere, programe de copiere a fiierelor etc.
f) Furnizarea unui limbaj de control de tip conversaional, de dialog ntre operator i sistem. De
obicei, S.O. au un limbaj de comand de tip cu autodocumentare datorit unor puternice funcii HELP pe
care le au implementate.
4.1.2 Funcia de asisten a execuiei. S.O. trebuie sa permit:
a) Izolarea logic a dispozitivelor defecte i asigurarea condiiilor pentru o eventual execuie a
lucrrilor cu ajutorul resurselor rmase utilizabile.
b) Testarea automat i diagnosticarea defectelor.
c) Afiarea automat a informaiei de stare.
S.O. sunt dinamice, n sensul c, n permanen pot fi adugate noi funcii sau rescrise programele ce
realizeaz funcii deja implementate.
4.1.3 Funcia de gestiune. Principala sarcin a unui S.O. este aceea de gestiune a resurselor
sistemului de calcul: unitatea central, memoria principal (intern), perifericele de I/E, bibliotecile i
fiierele de date. Programele pentru gestiune ale unui S.O. pot fi mprite n 4 mari categorii:
1) Funcia de gestiune a memoriei, cu urmtoarele atribute:

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

2 - Suport de execuie a programelor


3 - Suport de pregtire a programelor
Fig. 4.2.

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.

Taskul reprezint un program n form executabil compus dintr-o succesiune de instruciuni


executate secvenial i care realizeaz de obicei o anumit funcie.
Dac un task este ncrcat i executat n orice zon a memoriei principale spunem c taskul este
relocabil. Fiecrui task i se asociaz un indicator de importan numit prioritate. Alocarea prioritii poate fi
fix sau dinamic. n cazul prioritilor fixe, nseamn c, unui task i se aloc, n faza de proiectare a
aplicaiei, o prioritate i c aceasta nu poate fi modificat indiferent de evoluia ulterioar a procesului, pe
cnd n cazul alocrii dinamice a prioritii, prioritatea unui task se poate modifica pe baza anumitor criterii
prestabilite n funcie de evenimentele ce au loc n proces. Alocarea dinamic a prioritii este realizat de
S.O., iar dezavantajul acestui procedeu l constituie complexitatea sporit a gestiunii lucrrilor (taskurilor).
Taskurile sunt activate n funcie de prioritile lor de o component a S.O. numit PLANIFICATOR
(SCHEDULER)
Rutinele (ROUTINES) sunt uniti mai mici de program destinate tratrii rapide a unor evenimente.
Sunt activate direct de S.O. la detectarea producerii unor evenimente n procesul industrial. Detectarea
acestor evenimente se realizeaz de regul prin intermediul sistemului de ntreruperi al sistemului de calcul.
Subrutinele (SUBROUTINES) sunt cele mai mici uniti de program apelate de taskuri. Acestea pot
fi: dedicate, adic specifice unui singur task sau comune, situaie n care pot fi apelate de mai multe taskuri
sau rutine. Spre deosebire de taskuri care sunt ntreruptibile, subrutinele nu sunt ntreruptibile, adic nu se
accept ntreruperea activitii unei subrutine pentru a trece la execuia unui alt task. Acest lucru se datorete
faptului c, n general, subrutinele implic un timp de rspuns foarte mic, critic sau, altfel spus, sunt asociate
unor evenimente critice.
Exist i aa numitele subrutine reentrante disponibile mai multor taskuri i care pot fi ntrerupte
deoarece nu sunt asociate unor evenimente critice.
Vom spune c dou taskuri sunt paralele sau concurente dac prima instruciune a unui task
demareaz nainte ca ultima instruciune a celuilalt task s fi fost completat.

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

Presupunem c variabila CONTOR = 15 i aceast valoare este ncrcat n acumulator. Considerm


c T2 tiprete valoarea 15 i face CONTOR = 0. n continuare, taskul T1 adun 1 la coninutul
acumulatorului i memoreaz rezultatul 16 n CONTOR. Rezult deci c au fost raportate 15 evenimente, iar
variabila CONTOR = 16 i nu 0 cum ar fi trebuit s fie n mod normal.
Exemplul 3: Se consider 2 taskuri T1 i T2 care scriu fiecare cte un mesaj pe consola operatorului
(display), folosind poziionarea direct a cursorului n cte o poziie (linie, coloan) a consolei.
Task T1
Poziioneaz cursor n (L1,C1)
Scrie MESAJ 1

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.

Gestiunea memoriei n sistemele cu monoprogramare


n astfel de sisteme, la un moment dat, n memoria intern este ncrcat i se execut un singur task,
celelalte taskuri aflndu-se pe suportul de memorie extern (disc magnetic). n principiu, memoria operativ
este mprit n trei zone distincte, Fig. 4.3.

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.

Gestiunea memoriei n sistemele cu multiprogramare


Multiprogramarea a fost introdus pentru creterea gradului de utilizare a procesorului prin
exploatarea paralelismumui ntre activitatea procesorului i activitatea dispozitivelor de intrare- ieire.
Multiprogramarea presupune existena simultan n memoria intern a mai multor taskuri i execuia lor
paralel prin mecanismul multitasking. Comutarea ntre taskuri se realizeaz sub controlul SO n funcie de
prioritile taskurilor i de evenimentele ce au loc n proces. Existena mai multor programe n memoria
operativ presupune mprirea acesteia n zone distincte numite partiii sau regiuni. Situaia alocrii
memoriei la un moment dat, ntr-un sistem cu multiprogramare, se poate reprezenta ca n Fig. 4.4.

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.

Gestiune memoriei operative prin paginare


Dac se renun la cerina ca o partiie s fie contigu i se prevd dispozitive hardware necesare, se
obine o soluie la fragmentarea memoriei i anume gestiunea memoriei prin paginare. Conform acestei
metode, spaiul de adresare al fiecrui program se consider divizat n pri egale numite pagini; de
asemenea, MO se consider divizat n zone de aceeai dimensiune numite blocuri de memorie sau
cadre-pagin. Fiecrui program (task) i se aloc un numr ntrg de astfel de blocuri. Alegerea dimensiunii
blocului este o problem de optimizare. Dac blocurile sunt prea lungi, se simplific activitatea de gestiune,
dar poate apare fenomenul de utilizare neraional a memoriei. Dac blocurile sunt prea mici, eventualul
ctig de memorie este pltit prin complexitatea tabelelor de pagin i a programelor de gestiune a memoriei.
4.7. Gestiunea proceselor (taskurilor) i a procesorului
Se tie c procesorul sau, mai general, unitatea central reprezint principla resurs a oricrui
calculator. Orice program (task) destinat prelucrrii datelor apeleaz la serviciile procesorului.
Analizm cazul unui sistem de calcul monoprocesor. n aceast situaie, n cazul multiprogramrii, la
un moment dat, mai multe taskuri din componena unui program pot solicita resursele unitii centrale. Apar,
deci, conflicte pentru utilizarea procesorului.
Din punct de vedere al organizrii funcionale interne a unui calculator numeric, unui task i
corespunde un proces. Fiecare proces are asociate o serie de resurse care i condiioneaz desfurarea i este

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.

Secven de program de iniializare

Fig. 4.6.

Secven de program care realizeaz


funcia pentru care a fost creat taskul
Directiv (apel de servicii ctre EXECUTIV )
i abandonare procesor

4 - 14

Se execut
ciclic, n
bucl infinit

Cap.5. Interacinea taskurilor concurente


5.1. Consideraii generale
Exploatarea avantajelor aduse de considerarea unei aplicaii ca fiind compus din mai multe
taskuri ce se execut n paralel sau concurent impune, aa cum a rezultat i din exemplele
prezentate n capitolul anterior, folosirea unor mecanisme care s asigure interaciunea corect a
taskurilor pentru ca programul n ansamblu s aib evoluia dorit. Dening P. (n Operating Systems
Theory) a artat c interaciunea taskurilor poate fi redus la trei tipuri de operaii multitasking:
comunicarea ntre taskuri, sincronizarea taskurilor i excluderea mutual a taskurilor.
Comunicarea ntre taskuri este operaia multitasking prin care se permite taskurilor s
schimbe date ntre ele. Datele comune (utilizate de mai multe taskuri) sunt memorate n memoria
intern a calculatorului n anumite zone declarate ca zone comune (pentru datele comune) i la care
vor avea acces toate taskurile. Deoarece zonele de date comune organizate n memoria intern au o
capacitate mic i limiteaz la un volum mic datele comune, n cazul unui volum mare de date,
acestea se organizeaz n fiiere plasate pe un suport de memorie extern (de obicei disc magnetic).
Majoritatea sistemelor de operare actuale ofer un sistem de lucru cu fiierele prin intermediul unui
SGF (sistem de gestiune a fiierelor). Dezavantajul acestei metode este legat de timpii relativ mari
pentru accesarea datelor din fiiere, dar metoda este utilizat datorit capacitii mari de memorare
a acestor sisteme.
Sincronizarea este operaia multitasking care asigur ealonarea corect a execuiei
taskurilor n timp sau, altfel spus, care stabilete o relaie de ordine ntre instruciunile executate de
acestea, independent de vitezele relative ale lor.
Scopul unei metode de sincronizare este de a oferi unui task Ti aflat n execuie mijloacele
care s-i permit, n primul rnd, s blocheze un alt task activ Tj sau s se blocheze el nsui n
ateptarea producerii unui eveniment extern sau expirrii unui interval de timp i, n al doilea rnd,
s deblocheze un task Tk cruia s-i transmit eventual i unele informaii. n evoluia lor dou sau
mai multe taskuri se pot sincroniza fie n funcie de o condiie de timp, fie n funcie de un
eveniment exterior. Mai exact, n cadrul unei aplicaii, se poate ntlni situaia ca un task Tk pentru
a-i putea continua execuia s fie nevoit s atepte trecerea unui anumit interval de timp sau
realizarea unui eveniment din proces, eveniment controlat de regul de un alt task Ti. n cazul
sincronizrii pe o condiie de timp, taskul Tk se va bloca pn la expirarea intervalului de timp
menionat dup care va trece n starea READY i i va putea continua execuia. n cazul
sincronizrii pe un eveniment exterior, taskul Tk se va bloca dac evenimentul nu a avut loc. De
regul, acest eveniment este supravegheat de un alt task Ti care va debloca taskul Tk n momentul
n care evenimentul s-a ndeplinit.
Operaiile de sincronizare pot fi:
- explicite (directe), caz n care un task acioneaz direct asupra altui task, primitivele de
blocare i deblocare trebuind s fie astfel concepute nct s accepte ca parametru numele taskului
asupra cruia se acioneaz;
- implicite (indirecte), caz n care un task acioneaz asupra altui task prin declanarea unor
mecanisme intermediare; primitivele de blocare i deblocare nu mai folosesc explicit numele
taskului asupra cruia se acioneaz, ci folosesc o serie de variabile special-create n acest scop
(semafoare, variabile eveniment etc.).
Restriciile care determin sincronizarea taskurilor pot fi concentrate sub forma:
- operaia A nu se poate executa naintea trecerii intervalului de timp T ;
- operaia A nu se poate executa naintea operaiei B.
5-1

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

Observaie: Menionm c, semafoarele binare sunt suficiente pentru rezolvarea operaiilor


multitasking menionate, astfel nct n continuare se vor face referiri numai la acestea.
Pentru semafoarele binare, primitivele P i V au urmtoarea structur:
Primitiva P(SEM):
dac v(SEM) = 0 atunci
q(SEM) Ti

/* Blocheaz taskul Ti, adic taskul care a lansat primitiva, */


/* introducndu-l n coada de ateptare a semaforului q(SEM) */

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 dependent


de eveniment

Secven de program
Figura 5.4.

pe un eveniment exterior este prezentat n Figura 5.4.


Precizm c acest procedeu devine ineficient n cazul unor taskuri sincronizate pe mai multe
evenimente externe. De asemenea, prin intermediul acestor variabile (semafoare binare), nu este
posibil realizarea sincronizrii taskurilor pe o condiie de timp. Semafoarele rmn ns foarte
eficiente n rezolvarea problemei seciunii critice.

5-4

5.3. Utilizarea variabilelor eveniment pentru sincronizarea indirect i excluderea mutual


a taskurilor
Variabilele tip eveniment sunt variabile logice speciale, partajate care pot fi manipulate
numai cu ajutorul unor primitive special-compuse n acest scop. Aceste variabile pot fi declarate
prin program sau pot fi parte constituent a EXECUTIVULUI, caz n care acestea se cunosc i pot
fi numai apelate prin program.
Operaiile posibile asociate unei variabile eveniment sunt, de regul, DECLANAREA
provocat de un task supraveghetor i ATEPTAREA i/sau CONSUMAREA (sau ambele),
executate de un task a crei execuie este condiionat de realizarea respectivului eveniment.
Efectul acestor operaii depinde de natura evenimentului. n acest sens se definesc evenimente
nememorate i evenimente memorate. n cazul evenimentelor nememorate, o condiie esenial
pentru ca acestea s fie exploatate const n aceea ca sosirea lor s fie ateptat. Astfel, dac unul
sau mai multe taskuri a cror execuie depinde de un astfel de eveniment se afl, n momentul
sosirii evenimentului, n starea BLOCKED, ele vor fi trecute imediat n starea READY. Altfel,
declanarea evenimentului rmne fr efect i, n plus, el este pierdut. Justificarea unui astfel de
mod de tratare se explic prin faptul c n anumite aplicaii, anumite evenimente sunt semnificative
numai n anumite momente ale derulrii procesului i, n cosecin, dac nu sunt ateptate acestea
nu mai prezint nici un interes.
Evenimentul memorat este obinut prin extensia celui nememorat i este reprezentat
printr-o variabil logic notat "EV" care poate lua valorile FALS (asociat cu valoarea 0) sau
ADEVRAT (asociat cu valoarea 1), indicnd cele dou alternative posibile: nedeclanarea,
respectiv declanarea acestui eveniment.
Cnd un task ajunge ntr-un punct n care continuarea execuiei lui este condiionat de
sosirea unui eveniment asociat cu variabila EV, el se va bloca numai dac evenimentul ateptat nu
s-a produs (EV = FALS). Sosirea evenimentului (EV = ADEVRAT) provoac trecerea taskului
care l atepta n starea READY. Acum este necesar exprimarea faptului c respectivul eveniment
a fost consumat. Consumarea sau anularea unui eveniment se face prin atribuirea variabilei EV a
valorii FALS.
De regul, n aplicaiile de conducere a proceselor se opereaz cu conceptul de eveniment
memorat, primitivele care pot aciona asupra variabilelor eveniment asociate fiind:
ATEAPT(expresie logic format cu variabile eveniment) : blocheaz taskul pn cnd
expresia logic coninnd una sau mai multe variabile eveniment capt valoarea ADEVRAT.
DECLANAZ(EV) : face ca variabila eveniment EV s capete valoarea ADEVRAT i
are semnificaia c evenimentul asociat cu aceast variabil logic a avut loc.
CONSUM(EV) : face ca variabila eveniment menionat EV s capete valoarea FALS i
are semnificaia c evenimentul asociat cu aceast variabil logic s-a consumat.
Valoarea iniial a unei variabile eveniment este FALS. Variabilele eveniment sunt diferite
de semafoare i prin aceea c primitiva ATEAPT( ) nu le modific valoarea.
Variabilele tip eveniment sunt adecvate pentru sincronizarea taskurilor n funcie de
evenimente.
Exemplul 5.3. Structura programelor a dou taskuri T1 i T2 sincronizate pe un eveniment
exterior cruia i se asociaz variabila eveniment EV este prezentat n Figura 5.5.
Taskul T2 trebuie s conin dup directiva ATEAPT(EV) directiva CONSUM(EV)
care semnific fapul c evenimentul a fost luat n considerare i care va permite o nou ateptare
din partea taskului T2 pe acelai eveniment, n cazul funcionrii celor dou taskuri n bucl
infinit. De asemenea, taskul T1 trebuie s aib posibilitatea de a da controlul taskului T2 imediat
5-5

Taskul T1

Taskul T2
Secven de program
independent de eveniment

Secven de program destinat


supravegherii evenimentului
Evenimentul
a avut loc

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

Variabilele tip eveniment pot fi utilizate i n realizarea operaiilor multitasking de


excludere mutual. Pentru evitarea accesului simultan a dou sau mai multe taskuri la o resurs
partajat, acesteia i se asociaz o variabil eveniment EVM creia i se atribuie iniial valoarea
ADEVRAT. Directiva DECLANAZ(EVM) simuleaz primitiva V (de la semafoare), iar
ansamblul de directive ATEAPT(EVM) urmat imediat de CONSUM(EVM) poate simula
primitiva P, dac secvena se execut nentreruptibil, ceea ce nu este greu de realizat. Structura a
dou taskuri T1 i T2 n situaia de excludere mutual este prezentat n Figura 5.7.
Task T1

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

5.4. Sincronizarea taskurilor pe o condiie de timp. Reprogramarea execuiei taskurilor


Pentru realizarea sincronizrii taskurilor pe o condiie de timp se pot crea trei tipuri de
directive:
1. ATEAPT( interval de timp t )
2. MARCHEAZ( interval de timp t, variabil eveniment EV )
3. REPROGRAMEAZ( numr (nume) task NRTASK, interval de timp t )
1. Primitiva ATEAPT( t) are efect numai asupra taskului care a lansat-o, presupunnd
din partea EXECUTIVULUI urmtoarele aciuni nentreruptibile:
- nscriera valorii t ntr-un contor local aferent taskului;
- blocarea taskului pn la expirarea intervalului de timp t;
- decrementarea contorului cu o cuant de timp la fiecare ntrerupere dat de ceasul de timp
real;
- trecerea taskului n starea READY la anularea contorului i declararea de eveniment
semnificativ.
Din punct de vedere al evoluiei programului, dac taskul lucreaz n bucl infinit, modul
de sincronizare realizat de aceast directiv este prezentat n Figura 5.7.
t

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

Interval de timp de ateptare


Interval de timp de execuie a taskului
Figura 5.8.
Utiliznd directiva ATEAPT( t) o astfel de evoluie se poate obine introducnd n
aplicaie un task suplimentar numit task planificator i utiliznd o variabil eveniment EVS avnd
valoarea iniial FALS. Structura celor dou taskuri (planificator i reprogramat) este
5-8

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

Interval de timp de ateptare a


taskului REPROGRAMAT
Interval de timp de execuie a
taskului REPROGRAMAT
Interval de timp de reprogramare
Figura 5.10.
Dei se pierde un interval de timp t la pornirea aplicaiei (momentul 0) i dei nu se
cunoate exact momentul intrrii n execuie a taskului i nici durata execuiei sale, evoluia este
satisfctoare dac suntem siguri c execuia taskului REPROGRAMAT are loc n intervalul de
timp t , adic < t .
2. Primitiva MARCHEAZ ( t, EV) dei are efect tot numai asupra taskului care o
lanseaz, prezint avantaje i faciliti n privina realizrii sincronizrii dorite conform diagramei
din Figura 5.8. Aceast primitiv presupune efectuarea din partea EXECUTIVULUI a urmtoarelor
aciuni nentreruptibile:
- nscriera valorii t ntr-un contor local aferent taskului;
- tergerea variabilei eveniment EV (EV devine FALS);
- decrementarea contorului cu o cuant de timp la fiecare ntrerupere dat de ceasul de timp
real;
- setarea variabilei eveniment EV (EV devine ADEVRAT) la anularea contorului i
declararea de eveniment semnificativ.
De remarcat este faptul c n urma apelrii acestei directive, taskul nu se blocheaz, ci i va
continua execuia pn va ntlni i va lansa directiva ATEAPT(EV). Dac n acest moment
intervalul de timp t nu expirase, taskul se va bloca pn la expirarea acestui interval de timp, cnd
variabila eveniment EV va fi setat i taskul va trece n starea READY.
5-9

Task REPROGRAMAT
Secven de iniializare

MARCHEAZ ( t, EV )

Structura programului unui task reprogramat prin


intermediul acestei directive este prezentat n
Figura 5.11, iar diagrama de lucru este cea din
Figura 5.8.
Avantajul acestei structuri este acela c nu mai este
nevoie de un task suplimentar, ca n cazul anterior,
i nu se mai pierde primul interval de
reprogramare.

Secven de program
executat ciclic
ATEAPT (EV)

Figura 5.11

3. Primitiva REPROGRAMEAZ (NRTASK, t ) are efect asupra taskului al crui numr


sau nume este specificat ca parametru n directiv. Acest task poate fi chiar taskul care apeleaz
directiva sau oricare alt task component al aplicaiei. n cazul n care taskul menionat n directiv
este chiar taskul apelant, sincronizarea funcionrii se realizeaz conform schemei din Fig. 5.7, iar
cnd taskul menionat este altul dect taskul apelant, sincronizarea funcionrii se realizeaz
conform schemei din Fig. 5.10. Acest din urm caz presupune existena fie a unui task suplimentar
care s efectueze reprogramarea tuturor taskurilor constituente ale aplicaiei, sau reprogramarea s
se fac n secvena de iniializare a taskului (care se execut o singur dat la pornire). Activitatea
EXECUTIVULUI n urma apelrii acestei directive este urmtoarea:
- trece taskul specificat ntr-o tabel de ceas aferent unitii de timp asociate intervalului de
timp t ;
- ncarc valoarea t ntr-un contor inclus n aceeai tabel;
- blocheaz taskul pn la expirarea intervalului de timp t;
- decrementeaz contorul cu o cuant de timp la fiecare ntrerupere dat de ceasul de timp
real;
- trece taskul specificat n starea READY la anularea contorului, renscrie valoarea t n
contor i declar eveniment semnificativ.
Structura programului unui task reprogramat prin intermediul acestei directive este
prezentat n Fig. 5.12, iar diagrama de lucru este cea din Fig. 5.10.

Task pentru iniializare


i programare

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

5.5. Comunicarea ntre taskuri


n cazul n care excluderea mutual i sincronizarrea taskurilor se realizeaz prin
intermediul semafoarelor i a variabilelor eveniment, cel mai eficient mod de a rezolva problema
comunicrii ntre taskuri const n utilizarea unei zone de memorie accesibil tuturor taskurilor care
coopereaz, numit zon comun. Aceast zon este structurat n funcie de natura informaiilor
schimbate i de regulile care guverneaz comunicarea propriu-zis. Datele comune schimbate ntre
taskuri poart denumirea general de mesaje. Ele sunt transmise de un task numit task
PRODUCTOR i destinate unui alt task numit task CONSUMATOR, care fie c le ateapt, fie
c le va gsi n momentul n care are nevoie de ele.
n procesul de comunicare prin intermediul zonelor comune, pot apare dou situaii:

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 )

Depune mesajul n zona comun


(seciune critic)

Extrage mesajul din zona comun


(Seciune critic)
V (ZC)

V (ZC )

Secven de program dependent


de mesaj

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

Directiva TRANSMITE( ) este lansat din taskul productor TASKPROD i presupune


executarea urmtoarelor aciuni din partea EXECUTIVULUI:
- setarea variabilei eveniment EV (EV capt valoarea ADEVRAT);
- depunerea mesajului (de regul de lungime fix) i a numelui sau numrului taskului
cruia i este destinat acest mesaj (TASKCONS) la o adres MESAJ ntr-o zon de memorie de
regul alocat dinamic.
Directiva RECEPTIONEAZ( ) lansat din taskul consumator TASKCONS testeaz dac
la adresa MESAJ este nscris numele sau numrul su i dac da, preia mesajul transmis, iar dac
nu, evoluia programului, n general, nu mai poate fi controlat. De aceea, pentru o funcionare
corect a comunicrii ntre taskuri prin intermediul acestor directive, trebuie realizate urmtoarele
deziderate:
- taskul productor TASKPROD transmite un mesaj taskului consumator TASKCONS i nu
trebuie s-i mai transmit un alt mesaj pn nu se asigur c acest task a preluat mesajul (adic pn
nu i se confirm recepionarea lui);
- taskul consumator TASKCONS trebuie s atepte mesajul transmis de taskul productor
TASKPROD, dac acesta nu a fost nc transmis, i s confirme consumarea lui pentru a permite
taskului productor s-i transmit un nou mesaj.
Sincronizarea comunicrii celor dou taskuri se realizeaz cu ajutorul variabilelor
eveniment. Cum, de obicei, n orice problem de transmisie-recepie mesaje este necesar i o
sincronizare a comunicrii cu o condiie de timp, n Fig. 5.14 este prezentat structura celor dou
taskuri care comunic prin intermediul celor dou directive TRANSMITE i RECEPTIONEAZ i
unde sincronizarea cu timpul se realizeaz prin intermediul unei directive tip
REPROGRAMEAZ(NRTASK, t).
Variabilele de sincronizare EV1 i EV2 au valoarea iniial FALS. n felul acesta taskul
consumator TASKCONS ateapt de fiecare dat pe variabila EV1 pn cnd taskul productor
TASKPROD i transmite mesajul, la expirarea intervalului de timp t. n continuare, taskul
productor ateapt pe variabila eveniment EV2 pn i sosete confirmarea (adic variabila EV2
capt valoarea ADEVRAT) c taskul consumator a preluat mesajul i este capabil s primeasc
un nou mesaj.
Observaie: Dup cum s-a mai artat, directiva REPROGRAMEAZ putea fi lansat i
dintr-un alt task, eventual un task de iniializare.
Task consumator - TASKCONS

Task productor - TASKPROD


Secven de iniializare

Secven de iniializare

REPROGRAMEAZ(TASKPROD, t )

ATEAPT (EV1)

Secven de construire a mesajului

CONSUM (EV1)
SEND(EV1,TASKCONS,MESAJ)
RECEIVE(TASKPROD, MESAJ)
ATEAPT (EV2)
CONSUM (EV2)

Secven dependent de mesaj

DECLANAZ (EV2)

EXIT
Figura 5.14
5 - 12

5.6. Realizarea operaiillor multitasking prin intermediul mesajelor i cutiilor potale


Acest mod de realizare a operaiillor multitasking a fost creat de Hoare n anul 1972.
Mesajul reprezint un anumit volum de informaii, de regul cu structur fix, care trebuie
transmis de la un task ctre alt task n procesul interaciunii lor. Taskul care a transmis un mesaj,
trebuind s-i continue execuia, face necesar memorarea mesajului pn ce acesta va fi
recepionat de cellalt task. Zona din memorie unde sunt nscrise informaiile necesare pentru
transmisia i recepia corect a mesajelor poart denumirea de cutie potal (mailbox).
n cadrul acestui mecanism, mesajele sunt manevrate prin intermediul a dou directive:
- TRANSMITE(adres cutie potal, adres mesaj);
(SEND)
- RECEPIONEAZ(adres cutie potal, interval de timp t).
(RECEIVE)
Dac n directiva RECEPIONEAZ, intervalul de timp t este nul, atunci taskul care
apeleaz aceast directiv se va bloca pn la sosirea mesajului la cutia potal specificat. Dac
intervalul de timp este nenul (t 0), atunci taskul se va bloca fie pn la sosirea mesajului, fie
pn la expirarea intervalului de timp t. O alt particularitate a mecanismului const n aceea c
mesajele transmise de un task nu se nscriu unele peste celelalte, ci formeaz o coad de mesaje.
De asemenea, dac mai multe taskuri solicit un mesaj de la o cutie potal la care mesajul nc
nu a sosit, taskurile formeaz i ele o coad de ateptare de tip FIFO. Astfel, dac un mesaj este
transmis la o cutie potal la care ateapt mai multe taskuri, el va fi preluat de primul task din
coada de ateptare la cutie. Dac un task sosete la o cutie potal la care ateapt mai multe
mesaje, taskul va primi primul mesaj din coada de mesaje.
Prin intermediul mesajelor i cutiilor potale, operaiile multitasking permit o tratare
unitar. Astfel, schema de sincronizare a dou taskuri pe un eveniment exterior este prezentat n
Fig. 5.15.
Task T1 (planificator)
Secven de iniializare

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

Realizare funcie task


dependent de eveniment

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

- ateapt pe o cutie potal C2, un mesaj rspuns MES_RSP de la taskul T2 care


specific faptul c acest task este funcional;
- transmite prin cutia potal C1 mesajul de sincronizare MES_SINCR taskului T2 care
va permite intrarea acestuia n execuie;
- revine n ateptarea mesajului pe cutia potal CX.
Observaie: La pornire, taskul planificator T1, n secvena de iniializare, trebuie s transmit un
mesaj rspuns MES_RSP n cutia potal C2 pentru a-i putea continua execuia (taskul T2
neexecutndu-se niciodat nu a putut s depun nici un MES_RSP n cutia potal C2 chiar
dac acesta este funcional).
Taskul T2 are i el, n general, o structur ciclic bine determinat:
- ateapt pe cutia potal C1 mesajul de sincronizare de la taskul T1 pentru a-i putea
continua execuia;
- transmite, prin cutia potal C2, taskului T1 mesajul rspuns care confirm c taskul T2
este funcional i deci va putea primi un nou mesaj;
- execut secvena de instruciuni care realizeaz funcia pentru care a fost creat taskul;
- revine n ateptare pe mesajul de sincronizare de la taskul T1.
Procedeul de mai sus poate fi utilizat i n cazul reprogramrii execuiei taskului T2 cu un
interval de timp predefinit t, obinndu-se astfel o sincronizare pe o condiie de timp de tipul
celei din Fig. 5.16.
t

Timp

Interval de timp de ateptare a taskului T2


Interval de timp de execuie a taskului T2
Interval de timp de reprogramare a
taskului T2
Figura 5.16.
n acest caz, taskul T1 va atepta pe cutia potal goal CX intervalul de timp t
specificat n directiva RECEIVE. Evident, n cutia potal CX nefiind nici un mesaj, taskul T1 va
trebui s atepte intervalul de timp t dup care i va putea continua execuia i deci va
determina intrarea n execuie a taskului T2. Schema de sincronizare a taskului T2 pe o condiie
de timp este prezentat n Fig.5.17.
Pentru realizarea excluderii mutuale ntre dou sau mai multe taskuri se folosete o cutie
potal CEM n care este depus un mesaj simbolic MEM. Fiecare task, nainte de a intra n
propria seciune critic este obligat s extrag mesajul din aceast cutie potal i s-l depun
napoi la prsirea seciunii critice. n caz c un task Tj care solicit intrarea n seciunea critic
constat c n cutia potal CEM nu exist mesajul, aceasta semnific faptul c un alt task Ti se
afl n seciunea critic a programului su i taskul solicitant Tj este pus s atepte pn cnd
taskul Ti iese din seciunea sa critic depunnd mesajul MEM napoi n CEM. n felul acesta,
suntem siguri c nu poate avea loc accesul simultan (execuia mutual) a dou sau mai multe
taskuri la una i aceeai resurs. Schema de excludere mutual ntre dou sau mai multe taskuri
este dat n Figura 5.18.

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

Realizare funcie task


dependent de eveniment

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)

SEND (CEM, MEM)


Secven de program

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

SEND (C2, MES-RSP)

Figura 5.19

Observaie: Un volum mai mare de date se transmite prin intermediul zonelor comune.

Utilizarea conceptului de MONITOR pentru realizarea operaiilor multitasking


Conceptul de MONITOR reprezint procedeul cel mai modern de rezolvare a operaiilor
multitasking. El poate fi gndit ca o "mprejmuire" n interiorul creia sunt incluse toate datele
critice (date care se schimb ntre taskuri). "mprejmuirea" are o serie de "pori", fiecare "poart"
corespunznd unei proceduri speciale de program numit ENTRY (ACCES) declarat i
construit n structura de MONITOR. Orice task care solicit accesul la datele critice sau la o
resurs partajat, trebuie s apeleze n prealabil o astfel de procedur.
Executivul S.O. este astfel conceput nct unui singur task i numai unuia singur i se
permite accesul, la un moment dat, n interiorul monitorului, ceea ce asigura implicit situaia de
excludere mutual i comunicare ntre taskuri prin zone de date comune.
Pentru realizarea sincronizrii se folosesc 2 directive WAIT i SIGNAL care acioneaz
asupra unor variabile logice speciale numite variabile de tip condiie.
Dac continuarea execuiei unui task T1 este dependent, la un moment dat, de o anumit
condiie (expirarea unui interval de timp sau producerea unui eveniment exterior), taskul T1 este
introdus n MONITOR printr-o procedur ENTRY i, la momentul critic al execuiei, va executa
directiva WAIT (C) unde C este variabila de tip condiie asociat. Dac condiia C nu a fost
ndeplinit, executarea acestei directive va bloca taskul i l va elimina din MONITOR,
punndu-l ntr-o coad de ateptare pn la ndeplinirea condiiei C. Dac ntre timp un alt task
T2, intrnd n MONITOR, gsete condiia C satisfcut, va fi pus s execute directiva
SIGNAL(C) care are ca efect eliminarea taskului T2 din MONITOR i rentoarcerea taskului T1
(n general, a primului task care ateapta pe condiia C) care i va continua execuia. n felul
acesta, toate operaiile multitasking se realizeaz n mod unitar i comod din punct de vedere al
programatorului.
Conceptul de MONITOR st la baza EXECUTIVELOR sistemelor de operare care permit
implementarea limbajului PASCAL-CONCURENT.
5 - 16

Utilizarea conceptului de RENDEZVOUS pentru realizarea operaiilor multitasking


Acest concept a fost introdus odat cu limbajul ADA, permind (alturi de alte faciliti
specifice) realizarea operaiilor multitasking direct n limbaje de nivel nalt.
Conceptul de RENDEZVOUS poate fi privit ca o combinare a operaiilor de sincronizare
i de comunicare ntre taskuri.
Presupunem 2 taskuri care lucreaz independent i care la un moment dat trebuie s se
sincronizeze pentru a schimba date, dup care i vor continua execuia. Sincronizarea n scopul
comunicrii de date ntre taskuri a primit n ADA numele de RENDEZVOUS.
Fie 2 taskuri T1 si T2 care trebuie sincronizate n scopul unui schimb de date.
Taskul T1
T2 NUME(list parametri)

Taskul T2
ACCEPT NUME(list parametri)
do;
.....
end;

Taskul T1 conine o construcie similar unui apel de procedur, specificnd ns i


numele taskului cu care se va sincroniza (T2); apelul de procedur poate conine o list de
parametri actuali. n taskul T2 se folosete un bloc special (instruciune) numit ACCEPT, similar
declarrii unei proceduri.
Blocul ACCEPT conine o secven de instruciuni marcat de cuvintele cheie do i end.
Cele dou puncte specificate se numesc, n taskul T1 - punct de RENDEZVOUS, iar n
taskul T2 - punct de sincronizare.
Cnd T1 ajunge n punctul de RENDEZVOUS, ateapt ca T2 s ajung n punctul de
sincronizare; similar, dac T2 ajunge n punctul de sincronizare, ateapt ca T1 s ajung n
punctul de RENDEZVOUS, realizndu-se astfel sincronizarea celor 2 taskuri.
n acest moment, se execut o aciune similar apelului ntre proceduri. Taskul T1 este
blocat, iar instruciunile cuprinse n blocul ACCEPT se execut ca o procedur, implicnd deci i
un transfer de parametri ntre cele dou taskuri.
Dup execuia instruciunii ACCEPT, cele dou taskuri i continu execuia n mod
independent.

5 - 17

6. EXECUTIV N TIMP REAL DESTINAT CONDUCERII CU CALCULATOR


A PROCESELOR INSUDTRIALE
6.1. Prezentare general
Scrierea unui EXECUTIV multitasking n timp real destinat administrrii software (SW) a
unei aplicaii de conducere, are rolul de a degreva programatorul de unele activiti de rutin,
comune tuturor aplicaiilor cu opiuni de timp real, permind concentrarea ateniei acestuia
exclusiv asupra organizrii i structurrii aplicaiei i asupra scrierii programelor specifice. n acest
capitol se va prezenta structura unui astfel de EXECUTIV n timp real dedicat aplicaiilor de
conducere a proceselor industriale cu microcalculator de proces.
Schema bloc a acestui EXECUTIV este prezentat n Figura 6.1.

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)

Lista de date pentru


ceasul de timp real

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)

(?IRUN condit. din subrut.


de tratare a ntr. de la ceas)
?RUN(neconditionat)
+ ?CLEF

Expirare condiie de timp

Figura 6.2.

NEINSTALAT

?INS

OPRIT

pe un eveniment
exterior

pe o condiie
de timp

BLOCAT

Intrerupere sau ?DECLR

?EXIT

?CAN

?SETF + ?WAIT

?EXC

?ABORT

Planificatorul de taskuri funcie de prioriti

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

Directivele ?INS / ?IINS


- Sunt directive explicite de "instalare" a taskurilor folosite la comunicarea unor informaii
despre task ctre planificator;
- Parametri:
- intrare:
(AX) - nivel de prioritate al taskului;
(DX) - adresa de start a taskului;
(BP) - adresa bazei stivei asociate taskului.
- ieire:
- Directivele nu declar eveniment semnificativ.
Structura directivei ?IINS este prezentat n Figura 6.5.
Directiva ?SCINI
- Este o directiv explicit de iniializare, care umple cu zero ntreaga zon de date sistem
(aflat ntre modulul FRAM = nceputul zonei de date sistem i modulul LRAM = sfritul zonei de
date sistem);
- Reseteaz toate flagurile;
- Dezactiveaz sistemul de ntreruperi;
- Instaleaz pe ultimul nivel de prioritate considerat, taskul WAITSYS care este trecut n
starea gata de execuie;
- Nu necesit parametri;
- Nu declar eveniment semnificativ.
Directiva ?DECLR
- Directiv att explicit ct i implicit care are ca efect declararea unui eveniment
semnificativ n sistem. n urma apelarii acestei directive de ctre taskul aflat n execuie, controlul
se transfer planificatorului de taskuri care va baleia lista de taskuri i va aduce n execuie taskul
gata de execuie cu prioritatea cea mai mare;
6-5

? 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

Zona registrelor din stiv este iniializat cu zero


Marcheaz n stiv adresa de start a taskului
CF = 0
Figura 6.5

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

- Lansarea planificatorului este precedat de directiva ?MONI care salveaz n stiv


informaiile despre task coninute n registre, necesare n cazul relurii execuiei taskului.

?SC
Adresa de nceput a listei de taskuri

DA

Task OPRIT?

NU

(00h n octul de stare al casetei ?)


Task GATA DE EXEC ?
(0FFh n octetul de stare
al casetei taskului ?)

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

Trece taskul n starea READY

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

Taskul se afl n substarea


OPRIT
(cod 00h n octetul de
stare al casetei) ?
NU
CF = 0
RET

RET
Figura 6.7

Directivele ?ABORT / ?IABORT


- Sunt directive explicite de trecere forat a unui task (altul dect taskul apelant) n
substarea OPRIT;
- Directivele vor nscrie n octetul de stare al casetei taskului codul 00h;
- Parametri: la apelul acestor directive, registrul AL trebuie s conin nivel de prioritate al
taskului ce trebuie terminat forat;
- Directiva declar eveniment semnificativ doar n prima variant ?ABORT, asemntor
schemei din Figura 6.7.a, pe cnd varianta ?IABORT returneaz controlul taskului apelant;
- Directiva ?IABORT calculeaz, pe baza nivelului de prioritate specificat, adresa casetei
taskului (ce se cere a fi terminat forat) i nscrie n octetul de stare al acestei casete codul 00h
corespunztor substrii OPRIT.

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

- Parametru: la apelul acestor directive, registrul AL


trebuie s conin numrul flagului care va fi citit;
- Starea flagului este comunicat prin poziionarea
indicatorului CF astfel:
CF = 0 - flag resetat;
CF = 1 - flag setat;
- Nu declar eveniment semnificativ;
- Structura directivei este artat n Figura 6.8.
Figura 6.8

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

Definirea unor macroinstruciuni specifice nucleului executivului

Macroinstruciuni pentru instalarea unui task


INS macro
NIVEL, START, STIVA
; NIVEL - nivelul de prioritate al taskului
; START - adresa de nceput a taskului
; STIVA - adresa bazei stivei asociate taskului
mov ax, NIVEL
mov dx, START
mov bp, STIVA
call
?INS
endm
IINS

macro
NIVEL, START, STIVA
mov ax, NIVEL
mov dx, START
mov bp, STIVA
call
?IINS
endm
Observaie: Macroinstruciunea IINS poate fi apelat din ntreruperi

Macroinstruciuni pentru trecerea unui task n starea READY


RUN macro
NIVEL
mov al, NIVEL
call
?RUN
endm
Observaie: Macroinstruciunea RUN declar eveniment semnificativ
IRUN macro
NIVEL
mov al, NIVEL
call
?IRUN
endm
Observaie: Macroinstruciunea IRUN nu declar eveniment semnificativ

Macroinstruciuni pentru declararea unui eveniment semnificativ


DECLR

macro
call
?DECLR
endm

Macroinstruciuni pentru setarea unui flag


SETF macro
FLAG
; FLAG - flagul pentru sincronizare sau pentru excludere mutual
mov al, FLAG
call
?SETF
endm
Observaie: Macroinstruciunea SETF declar eveniment semnificativ
ISETF macro
FLAG
mov al, FLAG
call
?ISETF
6 - 11

endm
Observaie: Macroinstruciunea ISETF nu declar eveniment semnificativ

Macroinstruciuni pentru resetarea unui flag


CLEF macro
FLAG
mov al, FLAG
call
?CLEF
endm
Observaie: Macroinstruciunea CLEF declar eveniment semnificativ
ICLEF macro FLAG
mov al, FLAG
call
?ICLEF
endm
Observaie: Macroinstruciunea ICLEF nu declar eveniment semnificativ

Macroinstruciuni pentru blocarea unui task pe un flag


WAIT macro FLAG
mov al, FLAG
call
?WAIT
endm
Observaie: Macroinstruciunea WAIT declar eveniment semnificativ

Macroinstruciuni pentru terminarea logic (normal) a unui task


EXIT macro
call
?EXIT
endm
Observaie: Macroinstruciunea EXIT declar eveniment semnificativ
Exemplul1. Activarea unui task din alt task
Se consider 2 taskuri TA i TB care afieaz anumite mesaje pe display. Considerm c
afiarea pe display se face prin intermediul unei subrutine CO care nu lucreaz n ntreruperi.
Taskul TA este instalat pe nivelul 2 de prioritate i activat prin comenzi de la tastatur. Taskul TA
instaleaz, la rndul su, taskul TB pe nivelul 1 de prioritate i l activeaz, dup care tiprete un
mesaj pe display. n continuare, taskul TA apeleaz directiva ?DECLR, deci declar eveniment
semnificativ. Planificatorul de taskuri ?SC preia acum controlul i trece n execuie taskul TB care
tiprete un mesaj pe display i apoi apeleaz directiva ?EXIT (care declar eveniment
semnificativ). Planificatorul d acum controlul taskului TA care i continu execuia afind al
doilea mesaj pe display i apoi i ncheie execuia prin directiva ?EXIT.
Structura programului care implementeaz cele dou taskuri este urmtoarea:
EXTRN
AFIS
TB
equ
ADR1
STIVAB
equ
ADR2
TA: IINS 1, TB, STIVAB
IRUN 1

; TB reprezint adresa de start a taskului TB


; STIVAB reprezint adresa bazei stivei asociate taskului TB
; Macroinstruciunea IINS instaleaz taskul TB pe nivelul 1
; de prioritate
; Macroinstruciunea IRUN trece n starea READY taskul
; TB instalat pe nivelul 1, fr s declare eveniment
; semnificativ
6 - 12

mov si, OFFSET mesaj1a


call
AFIS
DECLR
; Macroinstruciunea DECLR declar eveniment
; semnificativ. Aceast directiv ntrerupe taskul TA,
; salveaz cu ?MONI coninutul registrelor
; microprocesorului i transfer controlul planificatorului
; de taskuri care va baleia lista de taskuri i va aduce n
; execuie taskul GATA DE EXECUIE cu prioritatea cea
; mai mare (n cazul nostru, taskul TB)
mov si, OFFSET mesaj2a
call
AFIS
EXIT
; Macroinstruciune pentru terminarea logic (normal) a
; taskului TA care declar eveniment semnificativ (dup
; execuie transfer controlul planificatorului de taskuri
; ?SC)
TB: mov si, OFFSET mesaj1b
call
AFIS
EXIT
mesaj1a
db
CR, LF, 'Task TA activ ...', $
mesaj2a
db
CR, LF, 'Task TA activ din nou ...', $
mesaj1b
db
CR, LF, 'Task TB activ ...', $
CR
equ
odh
LF
equ
0ah
; Subrutina pentru afiare
AFIS: mov dl, [si]
cmp dl, '$'
jz
FIN
inc
si
mov ah, 2
int
21h
jmp AFIS
FIN: ret
end
Dup execuia acestui program, pe ecran se vor afia urmtoarele mesaje:
Task TA activ ...
Task TB activ ...
Task TA activ din nou ...
Se observ c dei taskul TB este mai prioritar, el nu primete controlul dect la declararea
unui eveniment semnificativ (n urma apelului directivei ?DECLR).
Dac taskul TB ar fi fost instalat pe un nivel mai puin prioritar dect TA, de exemplu 3,
atunci, la declararea evenimentului semnificativ, s-ar fi dat controlul tot lui TA, deci ordinea
mesajelor afiate ar fi fost:
Task TA activ ...
Task TA activ din nou ...
Task TB activ ...
S presupunem acum c nivele de prioritate alese sunt TA --> 2, TB --> 1, dar c n loc de
directiva ?IRUN, n taskul TA se folosete directiva ?RUN care, spre deosebire de ?IRUN, declar
6 - 13

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

si, OFFSET mesaj2


AFIS
GENERARE
BUFT2, bx
si, OFFSET mesaj3
AFIS
FLG

; Directiva salveaz n stiv starea taskului T1, apoi


; transfer controlul planificatorului de taskuri.
; ncarc BX cu datele de la adresa (BUFT2+1, BUFT2)
; PRELUCRARE este o subrutin extern destinat
; prelucrrii datelor preluate din BUFT2
; Afieaz mesajul mesaj2
; Terminare normal a taskului T1
; GENERARE este o subrutin extern destinat generrii
; unor date care vor fi depuse n BUFT2
; Afieaz mesajul mesaj3
; Macroinstruciunea CLEF reseteaz flagul FLG,
; semnalnd astfel taskului T1 c datele sunt disponibile i
; d controlul planificatorului de taskuri

mov si, OFFSET mesaj4


call
AFIS
; Afieaz mesajul mesaj4
EXIT
; Terminare normal a taskului T2
mesaj1
db
CR, LF, 'Task T1: Atept date ...', $
mesaj2
db
CR, LF, 'Task T1: Am preluat datele ...', $
mesaj3
db
CR, LF, 'Task T2: Date disponibile ...', $
mesaj4
db
CR, LF, 'Task T2: Exit ...', $
CR
equ
odh
LF
equ
0ah
FLG
equ
32
; Subrutina pentru afiare
AFIS: mov dl, [si]
cmp dl, '$'
jz
FIN
inc
si
mov ah, 2
int
21h
jmp AFIS
FIN: ret
end
Acest program funcioneaz astfel: Taskul T1 intr n execuie, afieaz mesajul mesaj1 i
gsind flagul FLG setat se blocheaz. n acest moment se d controlul taskului T2 (deoarece
directiva ?WAIT declar eveniment semnificativ) care pregtete datele i le depune n bufferul
BUFT2, afieaz apoi mesajul mesaj3, dup care, prin ?CLEF, reseteaz flagul FLG cu declarare de
eveniment semnificativ. Planificatorul analizeaz starea taskului T1 (mai prioritar) i l gsete
blocat pe fagul FLG, dar ntruct acesta fusese ters n taskul T2, taskul T1 va fi trecut n READY
i va primi controlul. Acesta va continua din punctul n care a fost ntrerupt (blocat). Astfel, T1
preia i prelucreaz datele, afieaz apoi mesajul mesaj2 i i ncheie execuia. Se d apoi controlul
taskului T2 care afieaz mesajul mesaj4 dup care i ncheie execuia. Rezult c succesiunea
mesajelor afiate pe ecran va fi:
Task T1: Atept date ...
Task T2: Date disponibile ...
Task T1: Am preluat datele ...
Task T2: Exit ...
6 - 15

MODULUL DE GESTIUNE A TIMPULUI - TIMEMS


Aa cum se tie, n conducerea proceselor variabila timp are unul dintre cele mai importante
roluri. Funcionarea n timp real a sistemelor de conducere este legat de posibilitatea de a msura
timpul astronomic, adic timpul scurs ntre 2 evenimente precum i de existena unor semnale care
s marcheze intervale de timp de durat prestabilit. n cadrul EXECUTIVULUI realizat, toate
aceste faciliti sunt nglobate n modulul de gestiune a timpului. Modulul posed o zona proprie de
date care conine:
contoarele generale pentru fraciunile de timp considerate i anume:
- tacturi de ceas - a cror durat este funcie de perioada ceasului de timp real a
echipamentului stabilit la programarea dispozitivului 8253, n modulul de gestiune a ntreruperilor;
- secunde;
- minute;
- ore;
- zile;
- luni;
- ani;
cinci liste pentru ateptare care sunt compuse din mai multe casete organizate pe
principiul "listelor nlnuite", adic primul octet al fiecrei casete dintr-o list indic partea LOW a
adresei de offset a urmtoarei casete din aceeai list. Pentru a indica sfritul unei liste, ultima
caset din fiecare list va conine codul 0FFh n locul adresei (datele sunt plasate n aceeai pagin
de memorie i este imposibil ca o caset s nceap la o adres cu partea LOW avnd aceast
valoare). Capetele celor 5 liste de ateptare se pstreaz n 5 locaii speciale.
O caset din aceste liste conine 4 octei, iar numrul casetelor se definete la generarea
sistemului, o aceeai caset putnd trece n mod dinamic dintr-o list n alta n timpul execuiei
programului.
Cele 5 liste de ateptare conin:
- lista 1 - casete libere;
- lista 2 - casete aferente taskurilor n ateptare pe tacturi de ceas;
- lista 3 - casete aferente taskurilor n ateptare pe secunde;
- lista 4 - casete aferente taskurilor n ateptare pe minute;
- lista 5 - casete aferente taskurilor n ateptare pe ore.
Modul de organizare a zonei de date aferente modului de gestiune a timpului este prezentat
n Fig. 6.19.
La iniializarea modulului, toate casetele sunt incluse n lista 1 (lista casetelor libere), listele
2 - 5 fiind goale. Introducerea unui task n mecanismul de reprogramare implic nscrierea unor
informaii n prima caseta liber i trecerea acestei casete din lista de casete libere n lista de
ateptare pe unitatea de msur corespunztoare. Structura i coninutul unei casete este prezentat
n Fig. 6.20.
ntreruperile sosite de la ceas produc actualizarea contoarelor. Atunci cnd un contor
general este incrementat, se face i o baleiere a listei de ateptare anexate, decrementnd contoarele
locale incluse n casetele acestei liste. n momentul cnd un contor local al unei casete ajunge la
zero, este rencrcat cu valoarea iniial (valoarea de reprogramare) coninut n octetul urmtor al
casetei, dup care taskul al crui numr este specificat n octetul 4 al casetei (Fig. 6.20) este trecut
n starea READY n mod "condiionat". Astfel, dac un task nu se termin n intervalul de
reprogramare specificat, se ateapt sfritul su logic, prin apelarea din task a directivei ?EXIT
care l va trece n substarea OPRIT. Reprogramarea execuiei lui se va face la iniializarea primului
interval de timp de dup terminarea lui logic.
6 - 16

Contor tacturi
de ceas
Contor secunde
Contor minute

Contor ore
Contor zile

Adresa de nlnuire
(partea LOW a adresei de

CONTOARE
GENERALE

Octet 1

offset a urmtoarei casete

Contor luni
Contor ani

din aceeai list)

Cap list 1
Cap list 2
Cap list 3

Valoare contor local


(se decrementeaz funcie

Octet 2

de ntreruperile de la ceas)

Cap list 4
Cap list 5

Valoare iniial (fix)


(Intervalul de reprogramare)
CASETA 1

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

Durata de execuie a taskului


Figura 6.21

(b)

Interval de timp
de ateptare

Timp

Precizm c contoarele pentru timpul astronomic pot fi scrise i citite de programele


utilizatorului.
Directivele modulului de gestiune a timpului
Modulul de gestiune a timpului, ca i celelalte module ale EXECUTIVULUI, ofer o serie
de directive ce pot fi apelate n programele utilizatorului n vederea conducerii n timp real a
procesului. Dintre acestea menionm:
6 - 17

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

Momentul apelului directivei


2
0

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

Momentul apelului directivei


5
10
8
3

13

15

Interval de timp
de ateptare

Contor
general
secunde

Interval de timp execuie a taskului


Prima valoare a contorului local
b) mod NESINCRONIZAT
Figura 6.22
Dac valoarea contorului general pentru secunde este (n momentul apelului directivei)
egal cu 3 secunde, se va nscrie n locaia a 2-a casetei valoarea 5 - 3 = 2, deci prima execuie a
taskului va avea loc peste 2 secunde, deci ca i cum reprogramarea cu 5 secunde ar fi avut loc cnd
contorul general secunde era zero.
6 - 19

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

Exist caset liber ?

CF = 1

Selecteaz unitatea de msur


din registrul (CL)
Insereaz caseta n lista anexat
unitii de msur specificate
DA

Mod SINCRONIZAT ?
NU

Calculeaz valoarea
primului interval de
reprogramare i o nscrie
n contorul local al casetei

Pune n contorul local al casetei


valoarea intervalului de
reprogramare

Scrie n caset valoarea iniial (fix)


a intervalului de reprogramare i
nivelul de prioritate al taskului
CF = 0
RET
Figura 6.23

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

Se cerceteaz prima caset din list

DA

Numrul taskului coincide


cu cel menionat n caset?

NU

Pune caseta n lista


casetelor libere

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

Incrementeaz contor general - tacturi de ceas


CRUN
NU

Contorul tacturi de ceas are valoarea maxim ?


DA
Contorul general tacturi de ceas este adus la zero
Incrementeaz contor general - secunde
CRUN

NU

Contorul secunde are valoarea 60 ?


DA
Contorul secunde este adus la zero
Incrementeaz contor general - minute
CRUN
..
.
Incrementeaz contor general luni

NU

Contor general luni are valoarea maxim ?


DA
Contor general luni capt valoarea 1
Incrementeaz contor general - ani

NU

Contor general ani are valoarea 100 ?


DA
Contor general ani e adus la zero

?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

Citete valoarea de reiniializare din caset


i o reintroduce n contorul local
Citete nivelul de prioritate al taskului
din caset i l introduce n registrul AL

?IRUN
Se trece la caseta urmtoare
Figura 6.26.

6 - 23

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