Documente Academic
Documente Profesional
Documente Cultură
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.
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
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.
10
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 =
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 =
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
16
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
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
;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
28
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
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.
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
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
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
;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
;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
;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