Sunteți pe pagina 1din 51

Cuprins

1. Introducere ............................................................................................................ 2. Caracteristici ale limbajelor de programare ................................................. 3. Definirea problemei ............................................................................................. 4. Alegerea structurilor i tipurilor de date utilizate ..................................... 5. Construirea algoritmilor i a schemelor logice .............................................. 6. Proiectarea structurii produsului software ................................................... 7. Textul surs al programului ............................................................................... 8. Crearea documentaiei aferente produsului program ................................. 9. Testare i implementare ..................................................................................... 10. Analiz cantitativ i calitativ ....................................................................... 11. Concluzii ................................................................................................................. Anexa 1 ........................................................................................................................ Anexa 2 ........................................................................................................................ Anexa 3 ........................................................................................................................ Bibliografie .................................................................................................................

3 5 7 10 11 16 18 28 31 35 37 39 48 49 51

1. Introducere
Disciplina LIMBAJE DE ASAMBLARE are ca obiectiv prezentarea limbajului de asamblare si modului de utilizare a acestuia n diferite aplicaii. Limbajul de asamblare permite nelegerea la nivel de amnunt a ceea ce se ntmpla n realitate ntr-un calculator. Familiarizarea cu un asemenea limbaj este mai mult dect benenefic pentru un programator, contribuind la eficiena programelor dezvoltate indiferent de limbajul utilizat. Exist mai multe motive pentru care programarea n limbaj de asamblare este necesar. Codul executabil generat din programe scrise n limbaje de asmblare ASM se execut n general foarte rapid. Unele module de program trebuie implementate n ASM datorit acestei viteze de lucru. Uneori, o parte a unui program este scris ntr-un limbaj de nivel nalt, iar modulele critice sunt scrise ca proceduri ASM, apelate la rndul lor de modulele de nivel nalt. Exist situaii n care este nevoie de acces direct la dispozitivele de intrare/ieire sau la locaii fizice de memorie, iar aceste operaii nu pot fi executate n unele limbaje de nivel nalt. De exemplu, la calculatoare personale, programele TSR i rutinele de tratare a ntreruperilor sunt aproape totdeauna scrise n ASM. Pe scurt, limbajul de asamblare ofer viteze de execuie i acces la hardware care nu pot fi disponibile (cel mai adesea) n limbaje de nivel nalt. Un alt aspect important este cel al dezvoltrii de programe pentru echipamente dedicate. Nu toate programele executabile sunt destinate calculatoarelor de uz general. Dezvoltarea masiv a microprocesoarelor a fcut ca acestea s controleze n prezent funcionarea celor mai diverse dispozitive tehnice, de la carduri bancare pn la echipamente de control industrial sau pentru comanda avioanelor. De asemenea exist i un puternic rol formativ al programrii n limbaj de asamblare. Un programator nu ajunge niciodata la un nivel superior, dac nu trece prin dezvoltarea de programe ASM. Programatorul care cunoate principiile de realizare a limbajelor de asamblare va trece cu uurin de la utilizarea corect a unui limbaj la altul, dei aparin unor generaii diferite. Limbajul de asamblare definete operaii elementare, iar programatorul gestioneaz toate resursele programului. Exist posibilitatea de a construi secvene de instruciuni i de a urmri din aproape n aproape prelucrrile i rezultatele corecte sau eronate. Pentru fiecare rezultat exist posibilitatea de a descrie

mecanismul de realizare i de a identifica adevratele cauze care duc la erori. Pe parcursul pregtirii sunt predate cursuri i se efectueaz lucrri practice, iar n final trebuie elaborat un proiect care condiioneaz intrarea n examen. Proiectul are ca obiectiv realizarea unei aplicaii care permite studentului din anul trei de la Specializarea Informatic Economic, Facultatea de Cibernetic, Statistic i Informatic Economic s nsueasc i s utilizeze n mod eficient limbajul de asamblare n soluionarea problemei alese. Pentru a elabora proiectul se parcurg urmtorii pai: se definete problema de realizat; se construiete modelul care st la baza efecturii calculelor; se identific datele care sunt folosite pentru rezolvarea problemei; se elaboreaz structura produsului software; se stabilesc proprietile pe care trebuie s le ndeplineasc datele; se elaboreaz schemele logice; se scriu module de program care se asambleaz; se testeaz produsele software; se procedeaz la implementare. Acest ghid furnizeaz att elemente privind tehnologia de elaborare a proiectului, ct i modaliti rezolvare a problemelor i de analiz a rezultatelor. Ghidul se ncheie cu o list orientativ de proiecte propuse, care se constituie ntr-un punct de plecare la definirea i realizarea aplicaiei, individualizate la nivelul fiecrui student. Autorii sunt recunosctori tuturor celor care prin sugestii i observaii contribuie la mbuntirea ediiei viitoare a acestui ghid. Autorii.

2. Caracteristici ale limbajelor de asamblare


n cadrul unui proiect la disciplina Limbaje de Asamblare problema de soluionat este aleas de student. O problem se deosebete de alta prin nivelul de complexitate, nivel care se regsete prin dimensiunea produsului software, exprimat ca numr de linii surs. La rezolvarea problemei trebuie s se in cont de caracteristicile limbajelor de asamblare. Limbajele de programare evoluate posed implementare la nivel de compilatoare, care realizeaz: alocri automate de memorie pentru operanzii utilizai, dar nedefinii n program; iniializri la definire a operanzilor; semnalarea neconcordanelor ntre natura operanzilor sau a incompatibilitilor, cu efectuarea coreciilor celor mai probabile sau prin eliminarea de instruciuni din secven; conversiile necesare pentru a asigura gradul de omogenitate necesar al prelucrrilor. Limbajele de asamblare presupun existena la dispoziia programatorului a tuturor resurselor sistemului de calcul. Acest lucru nseamn c programatorul este obligat: s defineasc n program toi operanzii; s iniializeze toate zonele de memorie; s asigure omogenitatea operanzilor n vederea efecturii corecte a operaiilor de calcul. n programele scrise n limbaj de asamblare se execut exact operaiile pentru care exist instruciuni. Dac un operand nu este definit dar este utilizat, asamblorul semnaleaz acest eveniment ca fiind major i nu va proceda la trecerea la etapele ulterioare asamblrii. Dac un operand nu a fost iniializat, se va lucra cu coninutul existent al zonei de memorie. Simplitatea programului asamblor nu permite analiza corelaiilor dintre instruciuni n aa fel nct s semnalizeze c se folosesc variabile neiniializate. De asemenea n programele scrise n limbaj de asamblare se afl instruciuni dispuse una dup alta, care formeaz secvene lineare. Apariiile instruciunilor de salt ntrerup caracterul liniar al programelor. 5

Limbajele de programare sunt structurate n definiri de tipuri de operanzi i referiri de operanzi n vederea prelucrrii. Contextul de prelucrare ncepe cu definirea operanzilor. ntre modul de definire i modul de utilizare exist restricii pe care programatorul trebuie s le respecte. Orice program folosete operanzi i operatori. Limbajul de asamblare permite structurarea distinct, pe segmente a datelor, stivei i a codului executabil. Mai mult, exist posibilitatea de a defini o variabil oriunde n segmente i de a o referi cu semnificaia pe care contextul (cod instruciune, poziie n lista de operanzi) l d. n limbajele de asamblare sunt definite modaliti variate de referire a operanzilor (adresare direct, indirect, indexat, bazat etc.). Octei sunt pui n coresponden cu identificatorii i cu etichete. ntruct o instruciune efectueaz o operaie simpl i instruciunile se organizeaz n secvene, programul scris n limbajul de asamblare este vzut ca secvene i nu ca expresii. Mai mult, limitele de poziionare a instruciunilor n secvene reduc gradul de compactare a programelor.

3. Definirea problemei
Se dorete evidenierea migrri populaiei pentru un numr dat de judee. Se dorete calculul pentru fiecare jude n parte a unor indicatori care s evidenieze migraia populaiei. Numrul judeelor este limitat la 5 iar numele judeelor se preia dintr-un masiv sau fiier sau se citete de la tastatur. Datele de iere se memoreaz ntr-un fiier text i pentru fiecare jude se afieaz n valoare absolut numrul populaiei care a emigrat, imigrat i sporul nregistrat numrul populaiei de la nceputul perioadei de calcul plus numrul imigranilor minus numrul emigranilor. Se ia n considerare o singur perioada de calcul. n primul rnd se stabilesc ieirile. Acestea sunt: sub forma unui numr; sub forma unui ir de numere; sub forma unui tabel; sub forma mai multor tabele cu structuri diferite; sub form de fiiere; sub form grafic. Preciznd exemple de control ce conin valori numerice se procedeaz la clasificarea situaiilor frecvent ntlnite i la identificarea excepiilor. Toate acestea trebuie s fie regsite n tabele de date, ntruct la testare programul folosete exclusiv datele din aceste tabele. Pentru a vedea cum programul execut transformrile necesare asupra datelor de intrare se testeaz toate variantele care exist n aceste tabele de date. Pe baza datelor introduse se obin conform algoritmului o serie de rezultate care sunt confruntate apoi cu rezultatele produse de program. n al doilea rnd, se stabilesc date iniiale, ceea ce se furnizeaz ca intrri de ctre program. Se stabilesc modaliti de obinere (msurtori, documente primare, alte surse ce furnizeaz date). n al treilea rnd, se stabilesc formulele de calcul, care sunt, de regul, sub forma:

S = xi ;
i

S = xi p i ;
i

De asemenea , se impun condiii pentru includerea elementelor n formule:

S = xi
i xi > 0

sau

S = xi
i xi < 0

Este important s se stabileasc: numrul de componente; variabilele, modul de regrupare. Trebuie vzut dac toate ieirile (rezultatele) se obin folosind toate datele de intrare. Exist urmtoarele situaii care se ntlnesc n definirea problemei:

Problem bine definit. Rezultatele se obin din date. intrri: ieiri: formul: n, x1, x2, ..., xn x x=

x
i =1

Problem subdefinit. Se doresc multe rezultate i nu sunt suficiente date de intrare. intrri: ieiri: formul: lipsesc: n, x1, x2, ..., xn x x=

x
i =1

fi

n f1,f2, ..., fn 8

Problem supradefinit. Se gsesc mai multe date de intrare, i nu sunt folosite. intrri: ieiri: formul: se gsesc n plus: n, x1, x2, ..., xn f1,f2, ..., fn y1,y2, ..., yn x x=

x
i =1

fi

n y1,y2, ..., yn

Situaia n care problema este bine definit este ideal. n cazul n care problema este subdefinit se adaug date de intrare, iar n cazul n care problema este supradefinit se pot terge date de intrare sau aduga rezultate. Pentru o nelegere mai bun a problemei se consider un caz practic. Fie lista judeelor memorate ntr-un tabel n modul urmtor: Tabel 1. Exemplu de lista judeelor utilizate n program. Denumire jude/Prescurtare Ilfov (IF) Constana (CT) Galai (GL) Cluj (CJ) Timi (TM) Cod zecimal 0 1 2 3 4 Cod hexazecimal 00 01 02 03 04

n tabelul 2 sunt prezentate datele cu care se opereaz n calculul indicatorilor care evideniaz migraia populaiei.

4. Alegerea structurilor i tipurilor de date utilizate


Se ine cont c se opereaz cu date privind migraia populaiei i atunci majoritatea datelor de intrare i ieire se abstractizeaz n masive uni i bi-dimensionale precum i a fiierelor binare i text. Se efectueaz alegerea tipurilor de date utilizate n program. Este evident c deoarece se lucreaz cu numr de populaie, matricele care memoreaz dinamica populaiei la o anumit perioada de timp vor avea elemente de tip ntreg. Mai mult se vor elabora programe pentru procesoare standard (Intel, AMD) de PC-uri i deci se vor folosi limbajele de asamblare puse la dispoziie de acestea, adic se vor folosi tipurile de date pe care acestea le recunosc. Pentru numere ntregi alegerea tipului de date se face astfel: dac numerele aparin intervalului [-128, +127] sau [0, 255], se alege memorarea pe un octet (1 byte), folosinduse descriptorul db (define byte); dac numerele aparin intervalului [-32768, +32767] sau [0, 65535], se alege memorarea pe doi octei (2 bytes 1 cuvnt), folosindu-se descriptorul dw (define word); dac numerele aparin intervalului [-231-1, +231-1] sau [0, 232-1], se alege memorarea pe patru octei (4 bytes 2 cuvinte), folosindu-se descriptorul dd (define double [word]); dac numerele aparin intervalului [-263-1, +263-1] sau [0, 264-1], se alege memorarea pe opt octei (8 bytes 4 cuvinte), folosindu-se descriptorul dq (define quad [word]); n mod normal, operaiile se efectueaz pe maximum 16 bii. Pentru lucru cu valori mai mari, se folosesc registrele extinse, pe 32 de bii. n acest caz pentru c valorile se refer la numrul populaiei din cteva judee valori de maxim cteva zeci de milioane se alege folosirea tipului de date pe patru octei, folosind descriptorul dd i se va lucra cu registrele extinse ale microprocesorului.

10

5. Construirea algoritmilor i a schemelor logice


Se memoreaz ntr-un vector de cinci elemente prescurtrile judeelor. Fiecare element din vector are 2 octei pentru a memora prescurtrile. De exemplu pentru cinci judee: Ilfov, Constana, Galai, Cluj, Timi se memoreaz n vector (vectjud) astfel: vectjud[0] = IF, vectjud[1] = CT, vectjud[2] = GL, vectjud[3] = CJ, vectjud[4] = TM. Pentru o perioad dat perioad fix de un an se memoreaz ntr-o matrice date despre populaia din cele 5 judee n modul urmtor se reconstruiete Tabelul 2 dar valorile memorate sunt n hexazecimal pe patru octei adic 8 cifre hexazecimale: Tabel 3. Exemplu de date privind migraia populaiei date reprezentare hexazecimal. Jude/ Jude 00 (IF) 00 01 02 03 04

01 (CT)

02 (GL)

03 (CJ)

04 (TM)

00 20 16 E6 00 00 7D 00 00 00 88 B8 00 00 4E 20 00 00 52 08

00 00 00 00 C3 03 50 E8 00 00 06 00 41 0F 90 A0 00 00 00 05 2E E1 E0 2F 00 00 00 00 06 1B A4 BC 00 00 00 00 00 00 78 69

00 00 07 D0 00 00 00 32 00 00 00 00 00 05 57 5A 00 00 00 D2

00 00 06 A4 00 00 00 64 00 00 00 78 00 00 2A F8 00 05 8A 70 11

Interpretarea tabelului 3 este identic cu intrepretarea tabelului 2. Trebuie efectuate calculele anumitor indicatori pentru a evidenia migraia populaiei: Indicator 1: numrul maxim de emigrani dintr-un anumit jude, se calculeaz ca maximul elementelor de pe linia matricei mai puin elementul de pe diagonala principal; IND1i = max (matrdate[i ][ j ]) , unde i {0,4} , i j i i
j{0 , 4}

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND14 = max (matrdate[4][ j ]) = 21.000 = 00005208.
j{0 , 4}

Indicator 2: numrul minim de emigrani dintr-un anumit jude, se calculeaz ca minimul elementelor de pe linia matricei mai puin elementul de pe diagonala principal; IND2i = min (matrdate[i ][ j ]) , unde i {0,4} , i j i i
j{0 , 4}

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND24 = min (matrdate[4][ j ]) = 105 = 00000069.
j{0 , 4}

Indicator 3: numrul maxim de imigrani ntr-un anumit jude, se calculeaz ca maximul elementelor de pe coloana matricei mai puin elementul de pe diagonala principal; IND3j = max (matrdate[i ][ j ]) , unde j {0,4} , i j i j
i{0 , 4}

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND34 = max (matrdate[i ][4]) = 11.000 = 00002AF8.
i{0 , 4}

12

Indicator 4: numrul minim de imigrani ntr-un anumit jude, se calculeaz ca minimul elementelor de pe coloana matricei mai puin elementul de pe diagonala principal; IND4j = min (matrdate[i ][ j ]) , unde j {0,4} , i j i j
i{0 , 4}

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND44 = min (matrdate[i ][4]) = 11.000 = 00002AF8.
i{0 , 4}

Indicator 5: numrul total de emigrani dintr-un anumit jude, se calculeaz ca suma elementelor de pe linia matricei mai puin elementul de pe diagonala principal; IND5i =

(matrdate[i][ j ]) ,
j =0

unde

i {0,4} ,

i j i i

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND54 =

(matrdate[4][ j ]) = 21.435 = 000053BB.


j =0

Indicator 6: numrul total de imigrani ntr-un anumit jude, se calculeaz ca suma elementelor de pe coloana matricei mai puin elementul de pe diagonala principal; IND6j =

(matrdate[i][ j ]) ,
i =0

unde

i {0,4} ,

i j i j

reprezint judeul pentru se calculeaz indicatorul iar matrdate este matricea n care sunt memorate datele din tabelul 3. De exemplu pentru judeul 04 (TM) IND64 =

(matrdate[i][4]) = 12.920 = 00003278.


i =0

Indicator 7: numrul populaiei rmase la sfritul perioadei statistice n respectivul jude, se calculeaza ca
13

elementul de pe diagonala principal corespunztor judeului pentru care se calculeaz indicatorul plus Indicatorul 6 pentru judeul respectiv minus Indicator 5 pentru acelai jude. IND7i = matrdate[i][i] + IND6i IND5i. De exemplu pentru judeul 04 adic i=4, IND74 = matrdate[4][4] + (12920 21435) = 363120 8515 = 354605 = 0005692D. Cei apte indicatori de mai sus sunt indicatori ce se calculeaz fiecrui jude n parte, urmtori patru indicatori sunt indicatori agregai i medii ce sunt corespunztori tuturor judeelor. Astfel se calculeaz: Indicator 8: maximul total al emigranilor i este maximul dintre toi cei 5 (cte judee sunt) indicatori Indicator 1; IND8 = max( IND1i ) , unde i {0,4} .
i

Indicator 9: minimul total al emigranilor i este minimul dintre toi cei 5 (cte judee sunt) indicatori Indicator 2. IND9= min ( IND2 i ) , unde i {0,4} .
i

Indicator 10: maximul total al imigranilor i este maximul dintre toi cei 5 (cte judee sunt) indicatori Indicator 3; IND10 = max( IND3 i ) , unde i {0,4} .
i

Indicator 11: minimul total al imigranilor i este minimul dintre toi cei 5 (cte judee sunt) indicatori Indicator 4. IND11 = min ( IND4 i ) , unde i {0,4} .
i

Indicator 12: numrul total de emigrani din toate judeele i este suma tuturor celor 5 indicatori Indicator 5; IND12 = IND5 i , unde i {0,4} .
i

Indicator 13: numrul total de imigrani ctre toate judeele i este suma tuturor celor 5 indicatori Indicator 6; IND13 = IND6 i , unde i {0,4} .
i

Indicator 14: numrul mediu de emigrani din toate judeele i este valoarea Indicatorului 12 mprit la 5, cte judee sunt luate n calcul; IND14 = IND12/5;
14

Indicator 15: numrul mediu de imigrani ctre toate judeele i este valoarea Indicatorului 13 mprit la 5, cte judee sunt luate n calcul. IND15 = IND13/5;

Trebuie avut n vedere c pentru calculul indicatorului 14 i 15 se vor folosi variabile reale i proceduri specifice de afiare variabilelor reale. Problema modului de afiare i preluare a numerelor reale este des ntlnit n folosirea limbajelor de asamblare iar pentru rezolvarea ei n capitolul urmtor se vor elabora biblioteci proceduri sau macrodefiniii. n continuare se prezint schema logic a programului:
START Preluare date de la tastatur sau din fiere; Construire matrice emigrare/imigrare; Calcul indicatori statistici Apel proceduri sau macrodefiniii

Afiare indicatori

STOP

Figura 1: Schema logic general a programului. Aceasta este schema logic general a programului, ea fiind detaliat la nivelul fiecrei proceduri sau macrodefiniii n parte.

15

6. Proiectarea structurii produsului software


Se consider c este nevoie s se lucreze ct mai modularizat. Se construiesc trei librrii de proceduri i macrodefiniii. Unele librrii sunt doar de macrodefiniii i aceleai librrii sunt construite i numai din proceduri. Se face acest lucru n vederea comparrii performanelor programului n cazul n care folosete macrodefiniii i n cazul n care folosete doar proceduri. Structura celor trei librrii fiind urmtoarea: bibliotec de proceduri pentru conversia real-ASCII i alte proceduri utile n calculul indicatorilor statistici; bibliotec de proceduri pentru lucru cu fiiere folosind intreruperea 21h, aceeai bibliotec fiind rescris i cu ajutorul macrodefiniiilor; bibliotec de proceduri folosit pentru afiarea irurilor de carctere i preluarea de date de la tastatur, formatare ecran. Opional se construiete i o bibliotec de macrodefiniii sau proceduri pentru afiarea meniului text sau grafic precum i o bibliotec pentru validarea datelor de intrare. Codul surs pentru crearea i utilizarea meniului este coninut n programul principal. Pentru fiecare procedur sau macrodefiniie din oricare bilbliotec se poate construi o schem logic i explica n detaliu dar fiind multe asemenea construcii, acestea sunt explicate mpreun cu codul surs aferent n anexele acestui material. Deci structura produsului software elaborat pentru rezolvarea problemei este urmtoarea: trei biblioteci de macrodefiniii i proceduri i un program principal din care se apeleaz funciile din cele trei librrii. Se creeaz o structur arborescent a programului pentru a observa structura sa modular n Figura 2:

16

Program Principal (MAIN)

Introducere date (INTRD)

Efectuare Calcule (CALC)

Afisare rezultate (AFISR)

Indicatori individuali (CALCF)

Indicatori agregati (CALCG)

Figura 2: Structura arborescent a programului. Apelul procedurilor sau macrodefiniiilor din aceste librrii se face dintr-un program principal, program ce va fi prezentat parial n Capitolul 7 al acestei lucrri. Codul surs n limbaj de asamblare al bibliotecilor de macrodefiniii i proceduri se afl n Anexa 1 a prezentului material.

17

7. Textul surs al programului


Dup parcurgerea tuturor pailor anteriori se va trece la scrierea codului surs a programului. Se includ bibliotecile cu macrodefiniii care sunt folosite n program:
include FMacro.mac include IO.mac

apoi se trece la scrierea propriu-zis a codului. Programul este mprit n trei segmente, segmentul de stiv, de date i de cod. n segmentul de cod se observ 2 mari poriuni, o poriune n care se implementeaz o parte din procedurile folosite i o parte n care este codul meniului i apelul macrodefiniiilor i procedurilor necesare calcului indicatorilor. Sunt prezentate poriuni din segmentul de stiv i date:
.model large .stack 1024 .data vectjud dw 5 dup ('IF','CT','GL','CJ','TM') ;definire vector de judete-doar 5 matrdate dw 5 dup (5 dup (0)) ;definire matrice de date, in varianta ;extinsa este de dd (elemente de patru octeti) vecttemp dd 6 dup(1) ;vector temporar pentru sumele de pe linii si de pe ;coloane CRLF db 13,10,'$' sir_inc1 db '[1]Preluare date tastatura',10,13,'$' sir_inc2 db '[2]Preluare date din fisier',10,13,'$' sir_calc db '[3]Calcul indicatori statistici',10, 13,'$' sir_afis db '[4]Afisare/Salvare indicatori',10,13,'$' sir_ies db '[5] IESIRE',10,13,'$' sir_opt db '-->$' sir_temp db 7 dup(0),'$' cod dw 0 numef db 'D:\Cristian\School\Articole\GhidPr~1\ghid\matr01.txt ','$'

i dw 5

18

j dw 5 col dw 5

Se observ c n segmentul de date se declar structura n care se rein numele judeelor cu care se opereaz. Pentru viitoarele versiuni ale programului datorit faptului c nu se va cunoate numrul de judee cu care se va opera aceast structur nu va mai fi un masiv unidimensional ci o list simplu sau dublu nlnuit. Matricea n care se rein datele cu care se opereaz matrdate dac se opereaz cu date de dimensiuni foarte mari poate avea alt tip mai cuprinztor. Apoi sunt declarate variabile contor sau iruri de caractere care vor fi utilizate n afiarea meniurilor. n continuare se prezint poriuni din segmentul de cod.
.code ;;;;Sectiune proceduri ;Procedura pentru efectuarea sumei pe linii din matrice ;Imaginea stivei inainte de apel trebuie sa fie ;distanta fata de BP in bytes ;adresa mica col 0 ; i 2 ; j 4 ; mat 6 FAR ; vect 10 FAR ;i->numarul efectiv de linii al matricei ;j->numarul de coloane al matricei ;REZULTAT: [vects+i*4]=suma elementelor de pe linia i ;[vects]->de tip double dd ;[adr]->inseamna continutul de la adresa adr sum_lin1 proc far push bp mov bp,sp add bp,6 push SI push DI push AX push BX push CX push DX push ES mov AX,2 mul word ptr [bp+2] mov word ptr [bp+2],AX

19

;pentru ca se lucreaza pe word mov AX,2 mul word ptr [bp+4] mov word ptr [bp+4],AX ;pentru ca se lucreaza pe word mov SI,0 ;initializare contor i linnextSI: mov DI,0 ;initializare contor j ;se pune in BX offset vector rezultate mov BX,[BP+10] ;se pune in BX segment vector rezultate mov ES,[BP+12] mov AX,0 add BX,SI add BX,SI ;pentru ca vectorul e dd mov ES:[BX],AX ;initializare valoare rezultat pe linia i linnextDI: mov AX,SI mul word ptr [BP] ;i*col add AX,DI ;AX=i*Col+j mov BX,[BP+6] mov ES,[BP+8] add BX,AX mov AX,ES:[BX] ;de abia acum se acceseaza a[i][j] mov CX,0 mov BX,[BP+10] mov ES,[BP+12] mov BX,SI mov BX,SI add ES:[BX],AX adc ES:[BX+2],CX add di,2 cmp DI,[BP+4] jne linnextDI add SI,2 cmp SI,[BP+2] jne linnextSI ;restaurare registri pop ES pop DX

20

pop CX pop BX pop AX pop DI pop SI pop BP retf 14 sum_lin1 endp

;Procedura pentru efectuarea sumei pe coloane din matrice ;Imaginea stivei inainte de apel trebuie sa fie ;distanta fata de BP in bytes ;adresa mica col 0 ; i 2 ; j 4 ; mat 6 FAR ; vect 10 FAR ;i->numarul efectiv de linii al matricei ;j->numarul de coloane al matricei ;REZULTAT: [vects+i*4]=suma elementelor de pe linia i ;[vects]->de tip double dd ;[adr]->inseamna continutul de la adresa adr sum_col1 proc far push bp mov bp,sp add bp,6 push SI push DI push AX push BX push CX push DX push ES mov AX,2 mul word ptr [bp+2] mov word ptr [bp+2],AX ;pentru ca se lucreaza pe word mov AX,2 mul word ptr [bp+4] mov word ptr [bp+4],AX ;pentru ca se lucreaza pe word mov DI,0 ;initializare contor i colnextDI:

21

mov SI,0 ;initializare contor j mov BX,[BP+10] ;se pune in BX offset vector rezultate mov ES,[BP+12] ;se pune in BX segment vector rezultate mov AX,0 add BX,DI add BX,DI ;pentru ca vectorul e dd mov ES:[BX],AX ;initializare valoare rezultat pe linia i colnextSI: mov AX,SI mul word ptr [BP] ;i*col add AX,DI ;AX=i*Col+j mov BX,[BP+6] mov ES,[BP+8] add BX,AX mov AX,ES:[BX] ;de abia acum se acceseaza a[i][j] mov CX,0 mov BX,[BP+10] mov ES,[BP+12] mov BX,DI mov BX,DI add ES:[BX],AX adc ES:[BX+2],CX add SI,2 cmp SI,[BP+2] jne colnextSI add DI,2 cmp DI,[BP+4] jne colnextDI ;restaurare registri pop ES pop DX pop CX pop BX pop AX pop DI pop SI pop BP retf 14 sum_col1 endp ;Procedura pentru citirea unei matrice dintr-un fisier ;Imaginea stivei inainte de apel trebuie sa fie

22

;distanta fata de BP in bytes ;adresa mica col 0 ; i 2 ; j 4 ; mat 6 NEAR ; nume 8 NEAR ; cod 10 NEAR ;i->numarul efectiv de linii al matricei ;j->numarul de coloane al matricei; nume=numele ;fisierului; cod=0 nici o eroare ;REZULTAT: [vects+i*4]=suma elementelor de pe linia i ;[vects]->de tip double dd ;[adr]->inseamna continutul de la adresa adr fis_read proc far push bp mov bp,sp add bp,4 push SI push DI push BX push CX push DX mov DX,[BP+8] mov AH,3Dh mov AL,0 int 21h mov cx,ax ;handlerul pentru fisier jnc TMP1rerr ;eroare la deschidere jmp rerr TMP1rerr: mov AH,3fh ;citire i mov BX,CX mov DX,[BP+2] ;offset i mov CX,2 int 21h jnc TMP2rerr jmp rerr TMP2rerr: mov CX,BX helpi: mov BX,DX ;offset i mov byte ptr [BX+1],0 ;byte-ul superior este 0 mov AH,3Fh ;citire j mov BX,CX mov DX,[BP+4] ;offset j mov CX,2

23

int 21h jc rerr mov CX,BX helpj: mov BX,DX ;offset j mov byte ptr [BX+1],0 ;byte-ul superior este 0 mov AX,2 mov BX,[BP+2] ;offset i mul word ptr [bx] mov word ptr [bx],AX ;pentru ca se lucreaza pe word mov AX,2 mov BX,[BP+4] mul word ptr [bx] ;offset j mov word ptr [bx],AX ;pentru ca se lucreaza pe word mov SI,0 rfisnextSI: mov DI,0 rfisnextDI: mov AX,SI mul word ptr [bp] ;i*Col mov BX,[bp+6] ;i*Col+j;adresa matrice add DX,BX ;a[i][j] ;citire din fisier mov BX,CX mov AH,3Fh mov CX,2 int 21h mov CX,BX jc rerr add DI,2 mov BX,[BP+4] cmp DI,[BX] jne rfisnextDI add SI,2 mov BX,[bp+2] cmp SI,[BX] jne rfisnextSI mov DX,0 ;necesar la impartire mov BX,[BP+2] mov AX,[BX] mov CX,2 div CX ;offfset j

;offset i

;offset i

24

mov [BX],AX ;restaurare valoare a lui i mov bx,[bp+10] ;offset cod mov AX,0 mov [BX],AX ;nici o eroare cod = 0 mov AH,3Eh ;inchidere fisier mov BX,CX int 21h jc rerr jmp rfisSF rerr: mov BX,[BP+10] ;se pune codul de eroare mov [BX],AX rfisSF: ;restaurare registri pop DX pop CX pop BX pop DI pop SI pop BP retn 12 fis_read endp start: ;MAIN mov AX,@data mov DS, AX ;;Sectiune cod - meniu meniu: StergeEcran afis sir_inc1 afis sir_inc2 afis sir_calc afis sir_afis afis sir_ies afis sir_opt mov AH, 01h int 21h cmp AL,'1' jne Pas1 jmp Opt1 Pas1: cmp AL,'2'

25

jne Pas2 jmp Opt2 Pas2: cmp AL,'3' jne Pas3 jmp Opt3 Pas3: cmp AL,'4' jne Pas4 jmp Opt4 Pas4: cmp AL,'5' jne Pas5 jmp exit_dos Pas5: ;s-a tastat altceva jmp meniu ;optiunile ;S-a ales optiunea 1 Opt1: ;se citesc 25 de elemente ale matricei push offset cod push offset numef push offset matrdate push offset i push offset j push offset col call fis_read cmp cod,0 jne exit_dos End_Opt1: jmp meniu ;S-a ales optiunea 2 Opt2: End_Opt2: jmp meniu ;S-a ales optiunea 3 Opt3: End_Opt3: jmp meniu ;S-a ales optiunea 4 Opt4: End_Opt4:

26

jmp meniu exit_dos: mov AX, 4C00h int 21h end start

Segmentul de cod este divizat n dou mari pri: o parte n care se descriu procedurile folosite i o parte n care aceste proceduri sunt apelate. De asemenea urmrind codul surs de la eticheta start MAIN eniul poate fi folosit n orice program doar c trebuie schimbate irurile de caractere care sunt folosite pentru afiare. Aceste modificri au loc n segmentul de date. Se observ c n codul surs prezentat n acest capitol este redat doar scheletul programului principal, apelator adic meniul i funcia de ncrcare date din fiier. Apelul macrodefiniiilor i procedurilor pentru calculul indicatorilor se face n mod similar doar c trebuie tiut foarte bine numrul de parametri i ce parametri se transmit modulelor de calcul. Programul surs are multe comentarii astfel nct dac cineva dorete s extind facilitile oferite de acest program s poat face acest lucru ntr-un mod facil.

27

8. Crearea documentaei aferente produsului program


Documentaia unui produs program trebuie s conin: manualul de utilizare, datele de test incluse in documentaia de teste i implementare i documentarea n amnunt a codului surs i explicarea macrodefiniiilor i procedurilor care sunt folosite i puse la dipoziie pentru dezvoltarile ulterioare. Documentarea produsului este foarte important din mai multe puncte de vedere. Din punct de vedere dezvoltare-scalabilitate este foarte important ca ceilali dezvoltatori s neleag foarte bine fiecare macrodefiniie sau procedur pentru a crete gradul de reutilizare al codului. Din punct de vedere al beneficiarului este foarte important manualul de utilizare n care sunt explicate toate amnuntele din perspectiva interfeei. Este explicat interfaa grafic cu utilizatorul, modul de configurare a anumitor fiiere i de setare a mediului de lucru. Chiar dac interfaa om-calculator este una intuitiv i prietenoas documentarea pentru client este important. Acest manual de utilizare nu trebuie s fie foarte tehnic dect cnd aplicaia se adreseaz unor specialiti. Documentarea macrodefiniiilor, procedurilor, modulelor de program i programelor trebuie fcut dac programul are posibiliti de extindere. Astfel se evit folosirea eronat a unor proceduri folosind parametri incoreci sau fiind nevoie de rescrierea acelei poriuni de cod care nu este neleas, deoarece nu a fost documentat. Aa cum l limbajele evoluate exist programe care genereaz automat fiierele eferente fiecrei poriuni de program de exemplu javadoc din Java Development Kit. Deci se poate stabili o convenie ca de exemplu comentariile de procedur s fie de 3 caractere ; succesive. Apoi dac este parametru de intrare se scrie n codul surs param urmat de spaiu i numele parametrului de intrare, iar dac este parametrul de ieire, se procedeaz la fel ca mai sus numai c se mai adaug un semn distinct @ n fa. De exemplu, la macrodefiniia de tergere un fiier forma general este urmtoarea:

28

Macrodefiniie pentru tergerea unui fiier

Salvare regitrii

Prelucrri

Restaurare regitri

Figura 3: Schema general a macrodefiniiei pentru tergerea unui fiier. Pentru generarea automat a documentaiei cu ajutorul unui program creat de utilizator se vor scrie comentariile n urmtorul mod:
;;;Macrodefinitie pentru stergere fisier ;;;param NumeF: sir ASCIIZ ce contine numele fisierului ;;;@param Rez: rezultatul operatiei: 0 succes, altfel codul de ;;;eroare StergeFisier MACRO NumeF, Rez local NOK, Iesire push AX push DX push DS mov AH, 41h lea DX, NumeF int 21h jc NOK mov Rez, 0 jmp Iesire NOK: mov Rez, AX Iesire: pop DS pop DX pop AX ENDM

Apoi cu ajutorul unui program special care tie convenia stabilit, acest fiier se pot genera pagini HTML n care vor fi prezentate toate comentariile conform unui standard. Dup acest tip de manual se urmrete mult mai uor tipul de parametri care trebuiesc folosii n proceduri i macrodefiniii, modul de apel i uureaz mult munca de dezvoltare a noilor programe care utilizeaz module din acest program.
29

Pentru programul de fa se elaboreaz manual de utilizare care conine inclusiv date de test i manualul n care este prezentat fiecare procedur sau macrodefiniie cu tipul parametrilor de intrare, parametrilor de ieire i a codurilor de eroare utilizate. Dac aceast munc de documentare sar face manual i nu automat pe baza comentariilor introduse de programatori, productivitatea dezvoltrii programelor ar scdea considerabil.

30

9. Testare i implementare
Se iau toate datele de test. Mai ntai se consider cazurile extreme. De exemplu nu poate exista pe diagonala principal elemente cu valoarea 0. Se convine de asemenea ca s nu se utilizeze numere negative n matrice, dei acestea ar putea avea o interpretare, se folosete convenia conform creia pe linie sunt exprimate emigrrile de populaie iar pe coloane imigrrile. Programul se scrie n limbaj de asamblare specific procesoarelor Intel i AMD i se ruleaz pe PC-uri. Compilatoarele cu care s-a testat sunt TASM (Borland) i MASM (Microsoft). La documentaia n care se includ informaii privind implementarea trebuie specificai pai care trebuiesc a fi urmai pentru obinerea programului final. Se scrie codul surs ntr-un fiier text. De exemplu, dac se scrie un program care evalueaz o expresie cu cinci operanzi (x=a*b-c/d+e) vor trebui urmrii pai: se caut fiierul ce conine codul surs pentru evaluarea acestei expresii; se compileaz codul surs; n cazul n care nu apare nici o eroare se trece la pasul urmtor, dac apar erori se reia primul pas; se link-editez codul obiect al programului i n caz c nu apar erori se obine programul executabil. Codul surs a programului de mai sus se regsete n Anexa 2 a prezentului material. Este de preferat ca notaiile folosite n documente de analiz/proiectare i n caietul de sarcini s se respecte i n program. Pe programul din Anexa 2 se explic pas cu pas ce se ntmpl cu regitri microprocesorului, memoria, indicatori de condiie, etc. n figura 4 este prezentat fereastra TurboDebugger-ului imediat ce este ncrcat programul.

31

Figura 4: Turbo Debugger imediat dupa incrcarea programului. Acest program este lansat deobicei cu comanda td n MS-DOS prompt iar primul parametru din linia de comand n mod uzual este fiierul executabil rezultat la pai anteriori. Se observ c ecranul este mprit n mai multe regiuni: Regiunea din stnga sus conine codul programului. Se observ c numele variabilelor au fost nlocuite cu numere, care reprezint deplasamentele (offset) n cadrul segmentului de date. Regiunea din stnga jos prezint coninutul segmentului de date. Se apas click dreapta cu mouse-ul pe acea zon i se selecteaz opiunea Go to.... Se insereaz DS:000E, adic deplasamentul 000E n cadrul segmentului de date. Se observ c n stnga jos n figura 4 sunt octei exact n ordinea declarrii n program adic a este 04, b este 02, c este 06 i aa mai departe. Regiunea din dreapta sus conine registrele procesorului i indicatorii de condiie (registru de flags). Aici se urmresc efectele diferitelor instruciuni precum mov. Regiunea din dreapta jos prezint coninutul segmentului de stiv; n acest caz nu s-a folosit stiva, deci coninutul acestei zone este nedefinit. Pentru a rula pas cu pas programul se apas tasta F7. De fiecare dat se urmresc toate modificrile care au loc. Coninutul registrului AX la fiecare pas al execuiei programului este prezentat n tabelul 4:
32

Tabel 4: Coninutul registrului AX la rularea programului pas cu pas


Instruciunea Coninut AX (hexa) 0C6E 0C6E 0C04 Observaii

mov AX,@data mov DS,AX mov AL,a mul b mov t1,AL xor AX,AX mov AL,c div d mov t2,AL mov AL,t1 sub AL,t2 add AL,e mov x,AL mov AH,4c int 21h

0008 0008 0000 0006 0002 0002 0008 0006 000F 000F 4C0F 4C0F

AX=@data DS=AX AL=04, AH rmne 0C, IP devine 0008 AX=4*2=8 t1=AL AX=0, iar flags: Z=1, P=1 AL=06 dar AH=00 AL=6 div 3=2;AH=6 mod 3=0 t2=AL AL=t1 AL=AL-2=8-2=6 AL=AL+9=6+9=0F X=AL AH=4C;AL=0F Ieire

n figura 5 este prezentat fereastra programului td chiar dup ce s-a pus rezultatul expresiei n x.

Figura 5: Starea regitrilor nainte de terminarea programului.


33

Se observ c registrul AX are valoarea 15 adic 0F, dar i variabila x are tot valoarea 15 la adresa DS:0015. Cu ct acest pas de testare i implementare este efectuat ct mai consecvent i corect cu att erorile care pot aprea la utilizarea programului pot fi mai mici. Mai mult cu ajutorul programului TurboDebugger se depisteaz deseori cauzele unei erori care dac nu ar fi fost acest program ar fi creat multe probleme echipei de dezvoltare.

34

10. Analiz cantitativ i calitativ


Cea mai la ndemn analiz este cea cantitativ. Prima dat se masoar n octei mrimea fiierelor surs. Apoi se msoar dimensiunea codurilor obiect, i apoi cele executabile. Urmtorul pas al analizei este viteza de execuie a anumitor poriuni din program. Dac programul este modularizat atunci se calculeaz viteza de execuie n secunde a unui modul pe diverse date de intrare. Dac se consider datele de intrare din tabelul 2 atunci rezult urmtoarele rezultate: Tabel 5: Analiz cantitativ asupra unor programe assembler Indicatori Program simplu de evaluare expresie aritmetic Program calcul migraie populaie cu librrii ce conin macrodefiniii Program calcul migraie populaie cu librrii ce conin proceduri 8200 Observaii

Marime cod surs (n bytes) Mrime cod obiect (n bytes) Mrime cod executabil (n bytes) Timp de execuie (sec)

697 8226

295 2804

1302

Este mult mai util calcularea numrului de linii surs deoarece la mrimea fiierului surs intr i comentariile Primul program nu conine nici o macrodefiniie sau procedur.

563 3100 1 2

1510 3
Doar pe modul de calculeaz primul indicator

35

Este evident din datele nregistrate c tipul de aplicaie este decisiv n alegerea de a lucra cu biblioteci de macrodefiniii sau biblioteci de proceduri. De exemplu la o aplicaie n care timpul este critic, eventual este vorba despre o aplicaie n timp real, dar memoria nu are limitri serioase atunci se va opta pentru dezvoltarea de aplicaii care folosesc macrodefiniii. Dac din contr spaiul ocupat de codul executabil trebuie s fie mic iar timpul de rspuns nu este restrictiv atunci se va opta pentru dezvoltarea de programe utiliznd biblioteci de proceduri. La calculatoarele personale la aplicaii de dimensiuni medii rareori se pune problema de spaiu de memorare a codului executabil. Dar exist acum foarte multe dispozitive neconvenionale (smart-card-uri, procesoare de telefoane mobile i echipamente de comunicaii) au nevoie de aplicaii n timp real care s ocupe i puin memorie. Atunci se caut un grad de optim de mbinare a bibliotecilor uzitate, adic se vor folosi biblioteci de macrodefiniii n modulele critice din punct de vedere timp de execuie, iar n modulele critice din punct de vedere spaiu de stocare se vor utiliza biblioteci de proceduri. Considerentele calitative se resfrng n mod direct asupra indicatorilor cantitativi. De exemplu calitatea programrii, adic optimizarea codului scris implic obinerea unui cod executabil cu numr optim de cicluri main. Acest lucru are influen direct asupra timpului de execuie a programului. Deci evident timpul de execuie a programului va scdea, dar mrimea codului executabil poate fi mai mare deoarece instruciunile cu cicluri main mai puine pot ocupa mai muli octei. Aceste lucruri depind foarte mult i de asamblorul folosit.

36

11. Concluzii
n rezolvarea problemelor este foarte important analiza problemei. Dac n perioada de analiz exist erori care nu sunt tratate n momentul n care apar modificri asupra algoritmului pot rezulta ieiri ale programului care nu mai pot fi controlate. Numrul de erori este de obicei proporional cu dimensiunea problemei de rezolvat, iar pentru a evita astfel de euri se modularizeaz ct mai mult programul. Alegerea tipul de date utilizat n rezolvarea programului este foarte important. Depinde de foarte muli factori limbajul de programare sau asamblare care se folosete, tipul de main sau procesor pe care se lucreaz, compatibilitatea cu versiunile precedente i trebuie avut n vedere scalabilitatea programului, posibilitatea lui de extindere. De exemplu, dac pentru un program utilizat ntr-o instituie bancara se poate folosi tipul de date pe 8 octei (dq) pentru memorarea sumelor de bani, n momentul n care mai apar filiale i programul trebuie implementat i n acele filiale sumele cu care se opereaz fiind mult mai mari atunci este avantajos a se alege nc din perioada de analiz posibilitatea de lucra cu numere memorate ca iruri de caractere iar operaiile aritmetice i logice s fie executate simulat. Un alt lucru important este structurarea programului n module ct mai independente pentru a putea fi dezvoltat n echip. n acest sens programul se structureaz arborescent iar nodurile arborelui sunt fie modulele care trebuiesc implementate fie funciile pe care trebuie s le ndeplineasc programul. Specificaiile elaborate de programator sau echipa de dezvoltare trebuie s fie concise i clare. Ele trebuie s conin exemple de test. Aceste exemple de multe ori nu sunt suficiente iar pentru creterea performanelor dezvoltatorului de programe se recurge la urmtoarea strategie: Productorul lanseaz produsul n variant beta; Produsul software este dat unui numr limitat de utilizatori pentru a fi testat; Programul este testat cu datele de test ale utilizatorului pe cazuri reale dar rezultatele trebuie nscrise ntr-un tabel cu un anumit format; Conform rezultatelor colectate de la acei utilizatori care au testat produsul utilizatori au folosit programul gratuit dar au realizat implicit i trestarea produsului produsul
37

software este lansat n varianta final. Tabelele de teste au un format standard n care sunt cuprinse informaii ca: tipul de main i procesor pe care s-a testat programul, data, cu ce date de test s-au obinut ieirile respective, durata execuiei, dac se intr n ciclare infinit, etc. Programatorul trebuie s respecte nite reguli, convenii i standarde pentru a evita scrierea de cod redundant i care conine erori. De exmplu o convenie folosit poate fi ca orice macrodefiniie sau procedur s depun codul de eroare n registrul AX iar dac AX este 0 atunci operaia s-a executat cu succes iar dac nu este 0 atunci va conine un cod de eroare, codurile de eroare fiind comune pentru toat echipa de dezvoltare. O alt regul este ca transmiterea parametrilor n procedur s se fac numai pe stiv. Pot fi stabilite convenii chiar i pentru scrierea codului surs, de exemplu regitrii fiind scrii cu liter mare. Dac se lucreaz n echip acest mod de abordare este esenial, fiind necesar o coeren n dezvoltarea produsului.

38

Anexa 1

1. Bibliotec de macrodefiniii (FileMacro.mac) pentru lucru cu fiiere:


;Macrodefinitie pentru creare fisier ;Parametrii de intrare: ; NumeF: sir ASCIIZ ce contine numele fisierului ; Atrib: atribute de creare ale noului fisier: ; 0 fisier normal ; 1 fisier protejat la scriere ; 2 fisier ascuns ; 4 fisier de sistem ;Parametrii de iesire: ; Handler: indicator de fisier returnat sau -1 la ;eroare ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare CreeazaFisier MACRO NumeF, Atrib, Handler, Rez local NOK, Iesire push AX push CX push DX push DS mov AH, 3Ch mov CX, Atrib lea DX, NumeF int 21h jc NOK mov Handler, AX mov Rez, 0 jmp Iesire NOK: mov Handler, -1 mov Rez, AX Iesire: pop DS pop DX pop CX pop AX ENDM ;Macrodefinitie pentru deschidere fisier

39

;Parametrii de intrare: ; NumeF: sir ASCIIZ ce contine numele fisierului ; Acces: tipul de acces: ; 0 citire ; 1 scriere ; 2 citire/scriere ;Parametrii de iesire: ; Handler: indicator de fisier returnat sau -1 la ;eroare ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare DeschideFisier MACRO NumeF, Acces, Handler, Rez local NOK, Iesire push AX push DX push DS mov AH, 3Dh mov CX, Acces lea DX, NumeF int 21h jc NOK mov Handler, AX mov Rez, 0 jmp Iesire NOK: mov Handler, -1 mov Rez, AX Iesire: pop DS pop DX pop AX ENDM ;Macrodefinitie pentru inchidere fisier ;Parametrii de intrare: ; Handler: identificatorul de fiier returnat de ;funcia de creare/deschidere ;Parametrii de iesire: ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare InchidereFisier MACRO Handler, Rez local NOK, Iesire push AX push BX mov AH, 3Eh mov BX, Handler int 21h jc NOK

40

mov Rez, 0 jmp Iesire NOK: mov Rez, AX Iesire: pop BX pop AX ENDM ;Macrodefinitie pentru scriere in fisier ;Parametrii de intrare: ; Handler: identificatorul de fisier returnat de ;functia de creare/deschidere ; Buffer: zona de memorie din care se vor scrie ;datele citite ; OctetiDeScris: numarul de octeti de scris ;Parametrii de iesire: ; OctetiScrisi: numarul de octeti scrisi ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare ScrieInFisier MACRO Handler, Buffer, OctetiDeScris, OctetiScrisi, Rez local NOK, Iesire push AX push BX push CX push DX mov AH, 40h mov BX, Handler lea DX, Buffer mov CX, OctetiDeScris int 21h jc NOK mov OctetiScrisi, AX mov Rez, 0 jmp Iesire NOK: mov Rez, AX Iesire: pop DX pop CX pop BX pop AX ENDM ;Macrodefinitie pentru citire din fisier ;Parametrii de intrare:

41

;Handler: identificatorul de fisier returnat de functia de ;creare/deschidere ;Buffer: zona de memorie in care se vor scrie datele citite ; OctetiDeScris: numarul de octeti de citit ;Parametrii de iesire: ; OctetiScrisi: numarul de octeti scrisi ;Rez: rezultatul operatiei: 0 succes, altfel codul ;de ;eroare CitesteDinFisier MACRO Handler, Buffer, OctetiDeCitit, OctetiCititi, Rez local NOK, Iesire push AX push BX push CX push DX mov AH, 3Fh mov BX, Handler lea DX, Buffer mov CX, OctetiDeCitit int 21h jc NOK mov OctetiCititi, AX mov Rez, 0 jmp Iesire NOK: mov Rez, AX Iesire: pop DX pop CX pop BX pop AX ENDM ;Macrodefinitie pentru stergere fisier ;Parametrii de intrare: ; NumeF: sir ASCIIZ ce contine numele fisierului ;Parametrii de iesire: ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare StergeFisier MACRO NumeF, Rez local NOK, Iesire push AX push DX push DS mov AH, 41h lea DX, NumeF int 21h jc NOK

42

mov Rez, 0 jmp Iesire NOK: mov Rez, AX Iesire: pop DS pop DX pop AX ENDM ;Macrodefinitie pentru pozitionare in fisier ;Parametrii de intrare: ; Handler: identificatorul de fisier returnat de ;functia de creare/deschidere ; Pozitie: numarul de octeti fata de punctul de ;referinta (inceput, curent, sfarsit) ; From: punctul de referinta: ; 0 fata de inceputul fisierului ; 1 fata de pozitia curenta in fisier ; 2 fata de sfarsitul fisierului ;Parametrii de iesire: ; PozCrt: noua pozitie in fisier ; Rez: rezultatul operatiei: 0 succes, altfel codul ;de eroare PozitionareInFisier MACRO Handler, Pozitie, From, PozCrt, Rez local NOK, Iesire push AX push BX push CX push DX mov AH, 42h mov AL, From mov BX, Handler mov DX, word ptr Pozitie[0] mov CX, word ptr Pozitie[1] int 21h jc NOK mov word ptr Pozitie[0], AX mov word ptr Pozitie[1], DX mov Rez, 0 jmp Iesire NOK: mov Handler, -1 mov Rez, AX Iesire: pop DX pop CX

43

pop BX pop AX ENDM

2. Biblioteca de macrodefinitii (IO.mac) pentru lucru cu siruri de caractere:


;Macrodefinitie pentru stergerea ecranului StergeEcran MACRO push AX mov AL,02h mov AH,00h int 10h pop AX ENDM ;Macrodefinitie pentru ;tastatura citc MACRO car push AX mov AH,01h int 21h mov car,AL pop AX ENDM citirea unui caracter de la

;Macrodefinitie pentru citirea unui sir de caractere de ;max. 20 caractere de la tastatura cit MACRO buf local et1, et2 push AX push CX push BX lea BX, buf mov CX,20 xor SI,SI et1: jcxz et2 mov AH,01h int 21h cmp AL,13h je et2 mov AH,0 mov BX[SI],AX dec CX inc SI jmp et1

44

ENDM

et2: mov mov mov int mov mov int pop BX pop CX pop Ax

BX[SI], word ptr $ DL,13 AH,02h 21h DL,10 AH,02h 21h

;Macrodefinitie pentru citirea unui sir de numere ;citirea se opreste cand se introduce orice altceva decat ;un numar citsn MACRO sir local etr, et1 push DS push BX push AX push DX lea BX, sir etr: mov AH,08h int 21h cmp AL,'9' jg et1 cmp AL,'0' jb et1 mov [BX],AL mov DL,AL mov AH,02h int 21h inc BX jmp etr et1: mov byte ptr[BX],'$' mov DL,13 mov AH,02h int 21h mov DL,10 mov AH,02h int 21h pop DX pop AX pop BX pop DS

45

ENDM ;Macrodefinitie pentru afisarea unui sir de caractere afis MACRO sir local etr, et1 push DS push DX push AX lea DX, sir mov AH,09h int 21h pop AX pop DX pop DS ENDM ;Macrodefinitie pentru conversie ASCII-binar ;parametri numar:DB, num:DD, baza:DW ;numrul se afl n AX - EAX atoi MACRO numar,num,baza local etsf, rev push DS push SI push EAX push EBX lea SI,numar xor EAX,EAX xor EBX,EBX rev: mov BL,[SI] cmp BL,$ jz etsf sub BL,30h mul baza add EAX,EBX inc SI jmp rev etsf: mov num, EAX pop EBX pop EAX pop SI pop DS ENDM

46

;Macrodefinitie pentru conversie binar-ASCII ;si afisare ;parametri numarul este preluat din nr DD afisn MACRO nr,baza local rel,etc,etsf push BP push SP push EAX push EDX mov BP,SP mov EAX,nr rel: xor DX,DX or EAX,0 jz etc div baza add EDX,30h push EDX jmp rel etc: cmp BP,SP jz etfs pop EDX mov AH,02h int 21h jmp etc etsf: mov num, EAX pop BX pop AX pop SI pop DS ENDM

47

Anexa 2

;Program de evaluare a expresiei matematice x=a*b-c/d+e


.model small .data a db 4 b db 2 c db 6 d db 3 e db 9 t1 db ? t2 db ? x db ? .code start: mov mov mov mul mov xor mov div mov mov sub add mov mov int end start ;definire model de memorie ;definire segment de date ;definire variabile

;definire rezultate ;definire segment de cod ;etichet de nceput ax,@data ;initializare segment de date ds,ax al,a ;al=a b ;al=al*b t1,al ;t1=a1 ax,ax ; ax=0 al,c ;al=c d ;al=al div d t2,al ;t2=al al,t1 ;al=t1 al,t2 ;al=a1-t2 al,e ;al=al+e x,al ;x=al ah,4Ch ;4Ch cod serviciu 21h ;apel intrerupere DOS ;sfarsit program

48

Anexa 3
Probleme propuse pentru realizarea proiectelor la disciplina limbaje de asamblare. Indicele sintetic al preurilor de tip Paasche. Calculul indicatorului static ritm Masa monetar Calculul productuivitii medii zilnice la nivelul unei ntreprinderi Calculul estimatorului A din ecuaia de regresie Calcularea procentului de modificare a produciei fizice totale Calculul fondului de timp calendaristic Profitul mediu la 1 leu cifr de afaceri Nivelul mediu al productivitii muncii la nivelul economiei naionale 10. Calculul ritmului ncasrilor lunare 11. Impactul taxelor pe cantitate asupra restriciei de buget 12. Calculul mediei i dispersiei dintr-o serie de date 13. Calculul duratei medii a zilei de lucru la nivelul unei ntreprinderi 14. Calculul ratei rentabilitii resurselor consumate 15. Calculul indicelui de lichiditate 16. Calculul indicilor de tip LasPeyres i Paasche pentru analiza modificrii valorii vnzrilor sub influena factorilor preul i cantitatea 17. Calculul salariului mediu 18. Ctigul potenial al titlurilor financiare 19. Indicele produciei valorice 20. Productivitatea marginal 21. Calculul salariului net 22. Calculul suprafeei totale de depozitare 23. Lucru cu structuri dinamice de date liste, arbori. 24. Calcularea indicelui de pre la consumatori 25. Efectul de substituie i efectul de venit de tip Slutsky 26. Calculul cotei de pia 27. Calculul rtmului modificrilor relative 28. Calculul rezultatului exerciiului contabil al unei firme prin contul de profit i pierdere 1. 2. 3. 4. 5. 6. 7. 8. 9.
49

29. Realizare repartiiilor bazate pe generarea secvenelor de numere aleatoare cu densitate de probabilitate f n probleme de simulare economic 30. Calculul abaterii individuale

50

Bibliografie
[ATHA92] [IVAN96] [IVAN97] [IVAN98] [IVAN98a] Irina Athanasiu, Alexandru Panoiu, Microprocesoarele 8086, 286, 386, Editura Teora, Bucureti, 1992. Ion Ivan, Cristian Codreanu, Optimizarea programelor assembler, ASE Departamentul de Informatic Economic, Bucureti, 1996. Ion Ivan, Designul limbajelor de asamblare, revista Informatic Economic, Nr.1/1997, Bucureti. Ion Ivan, Cristian Codreanu, Optimizarea programelor assembler, revista Informatic Economic, Nr.6/1998, Bucureti. Ion Ivan, Marian Drdal, Gabriel utac, Valentin Dragomir, Referirea datelor n structuri complexe prin proceduri assembler, revista Informatic Economic, vol. III, Nr.7/1998, Bucureti. Ion Ivan, Adrian Licuriceanu, Sebastian Teaciuc, Gheorghe Lupu, Aplicaii orientate obiect n limbaje de asamblare, Studii i cercetri de calcul economic i cibernetic economic, Nr.3/1999, Bucureti. Ion Ivan, Paul Pocatilu, Doru Cazan, Practica dezvoltrii software n limbaje de asamblare, Editura Economic, Bucureti 2002. Ion Ivan, Paul Pocatilu, Marius Popa, Cristian Toma, Semntura electronic i securitatea datelor n comerul electronic, revista Informatic Economic, vol. VI, Nr.3/2002, Bucureti. Gheorghe Musc, Programare n limbaj de asamblare, Editura Teora, Bucureti 1997. Dan Somnea, Vldu Teodor, Programarea n assembler, Editura Tehnic, Bucureti 1992.

[IVAN99]

[IVAN02] [IVAN02a]

[MUSC97] [SOMN92]

51

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