Sunteți pe pagina 1din 71

Cuprins

Cuprins....................................................................................................................................................................................1 Introducere..............................................................................................................................................................................2 Reprezentri interne ale datelor. Definirea i iniializarea datelor n limbaj de asamblare ....................................................3 Etapele de elaborare a unui program n limbaj de asamblare. Afiarea unui ir de caractere la consol............................10 Moduri de adresare a operanzilor n limbaj de asamblare. Introducerea i afiarea unui ir prin intermediul funciilor 09h i 0Ah(ntreruperea 21h)..............................................................................................................................................14 Instruciuni de transfer. Introducerea i afiarea unui ir prin intemediul funciilor 3Fh i 40h(ntreruperea 21h)..............21 Fiiere executabile. Introducerea i afiarea unui simbol la consol....................................................................................25 Instruciuni de comparare i de salt ......................................................................................................................................33 Instruciuni aritmetice...........................................................................................................................................................39 Proceduri. Cicluri..................................................................................................................................................................47 Prelucrarea tablourilor simbolice unidimensionale...............................................................................................................53 Macrodefiniii. Tablouri numerice ......................................................................................................................................58 Tipuri de date complexe: structuri i nregistrri..................................................................................................................65

Lista instruciunilor Funcii DOS Bibliografie

Introducere Limbajul de asamblare este unul dintre cele mai vechi limbaje de programare. Cu toate acestea limbajul de asamblare este incorporat i n cele mai noi compilatoare. Codul de asamblare este foarte apropiat de codul executabil al programelor, asamblorul avnd rolul de a codifica instruciunile din limbaj de asamblare n cod main. n prezent, limbajul de asamblare este din ce n ce mai puin folosit n scrierea programelor, deoarece compilatoarele de ultima generaie au funciile cele mai folosite de programatori deja scrise i optimizate n limbaj de asamblare incluse n biblioteci. Limbajul de asamblare ofer un ir de avantaje: viteza foarte mare de execuie a programelor (unele programe scrise si optimizate n asamblare au viteza de execuie pana la 5-10 de ori mai mare dect cele scrise n C sau Pascal), mrimea codului executabil este foarte mica, ajuta utilizatorul sa neleag mai bine cum funcioneaz microprocesorul i s scrie programe eficiente i n limbaje de nivel nalt. Dezavantaje ar fi c un program scris n limbaj de asamblare: nu este portabil; este mai greu de scris i ia mai mult timp dect un program scris n limbajele de nivel nalt; este mai greu de depanat. Compilatoare din prezent permit programatorului s scrie anumite pari de cod sau subprograme n limbaj de asamblare, astfel nct programatorul s poat scrie n limbaj de asamblare doar partea de program care se executa de cele mai multe ori, programul rulnd astfel mult mai rapid. ndrumarul de laborator este destinat studenilor anului I al specializrii Informatic, Informatic Aplicat i Management Informaional care studiaz disciplina programarea n limbaj de asamblare. Prin prisma ndrumarului de fa ce include 12 lucrri de laborator studenii i vor forma deprinderi practice n ceea ce privete programarea n limbaj de asamblare. Fiecare lucrare conine cte un breviar teoretic, aplicaii orientative i lista sarcinilor la tema dat.
2

Reprezentri interne ale datelor. Definirea i iniializarea datelor n limbaj de asamblare Obiectivele lucrrii Aceast lucrare de laborator are ca scop nsuirea de ctre studeni a noiunilor de baz referitoare la: sistemele de numeraie binar, octal i hexazecimal; reprezentarea numerelor n calculator; nsuirea modului de utilizare a tipurilor de date n diferite aplicaii n limbaj de asamblare. Breviar teoretic Unitatea minim de msurare a informaiei se numete i BIT (BInary digiT), adic una din cele dou cifre binare 0 sau 1. Bitul reprezint atomul informaiei, nivelul de la care informaia nu mai poate fi descompus. Biii se grupeaz cate 8 i formeaz un byte sau un octet. Un ir de cifre binare reprezint toat informaia manipulat de calculator. Cu cei 8 bii (8 cifre binare) care formeaz octetul se poate construi un cod, care permite 28 combinaii diferite intre ele, adic 256 combinaii. Aceste combinaii sunt suficiente pentru a prezenta literele mari i mici, cifrele, semnele speciale, comenzile, semnalele, rspunsurile. Octetul poate s conin o liter (A, a, , Z, z), o cifr (0,1,2,.,9), un semn special (*.@,/,:,;,>,), un semnal (semnal sonor,), o comand (retur de car la sfritul liniei de text, ). Cu aceti octei se va construi informaia: texte, numere, imagini grafice, sunete, etc. Octetul este o unitate de msur a informaiei. Pentru msurarea diferitelor cantiti de informaie se pot folosi multiplii octetului. Unitile de informaie folosesc ca factor de multiplicare 210=1024: 1Koctet = 1024 octei = 210 octei 1Moctet = 1024 Koctei = 220 octei 1Goctet = 1024 Moctei = 230 octei Sisteme de numeraie Un sistem de numeraie este constituit din totalitatea regulilor de reprezentare a numerelor cu ajutorul anumitor simboluri denumite cifre. Pentru orice sistem de numeraie, numrul semnelor distincte pentru cifrele sistemului este egal cu baza (b). Deci pentru baza b=2 (numere scrise n binar) semnele
3

vor fi cifrele 0 i 1. Pentru baza b=16 (hexazecimal) semnele vor fi 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Se observ c pentru numerele scrise ntr-o baz mai mare dect baza 10 (zecimal) se folosesc i alte simboluri (litere) pe lng cifrele obinuite din baza 10. Astfel, n cazul numerelor scrise n hexazecimal, literele A,B,C,D,E,F au ca i valori asociate 10,11,12,13,14,15. Pentru a face uor distincie ntre numerele scrise ntr-o anumit baz, la sfritul numrului se mai scrie o liter ce simbolizeaz baza, de exemplu: B - binar (baza 2), Q - n octal (baza 8), D- zecimal (baza 10), H- hexazecimal (baza 16) De regul numerele scrise n baza 10 nu trebuie neaprat s fie urmate de simbolul D, pentru c aceast baz se consider implicit. Dac se d un numr scris ntr-o baz oarecare b sub forma parte ntreag i parte zecimal: Nr(b) = Cn Cn-1 Cn-2 C2 C1 C0 , D1 D2 D3 , atunci valoarea sa n baza 10 va fi: Nr(10) = Cn*bn +C n-1*bn-1++C2*b2+C1*b1+C0*b0+D1*b-1+D2*b2+D3*b3+... Exemple Exemple de numere binare: 11b, 1100011b. Dezvoltarea acestor numere dup puterile bazei este: 11b =1*21+1*20 =3; 11100011b = 1*27+1*26+1*25+0*24+0*23+0*22+1*21+1*20= 227. Exemple de numere octale: 11q, 210q Dezvoltarea acestor numere dup puterile bazei este : 11q = 1*81+1*80 = 9; 210q =2*82+1*81+0*80 =136; Exemple de numere hexazecimale: 11h, CA0h Dezvoltarea acestor numere dup puterile bazei este : 11h = 1*161+1*160 =17; 0CA0h= C*162+A*161+0*160= 3232 Reprezentarea numerelor naturale n calculator

Calculatoarele actuale utilizeaz sistemul de numeraie binar. Reprezentarea numerelor N={0, 1, 2, ...} se realizeaz pe un numr fix de poziii binare 8, 16, 32, 64. Pe n poziii binare pot fi reprezentate numerele naturale din intervalul [0; 2n-1]. De exemplu, reprezentarea numrului 67 pe 8 poziii binare const n transformarea acestui numr prin puterile lui 2. Reprezentarea numerelor ntregi n calculator nu exist posibilitatea introducerii directe a semnelor + i - , ataate numerelor pozitive i negative. Reprezentarea semnului s pentru numrul x se face cu ajutorul unei cifre binare, denumit cifr semn, aezat n poziia n-1,( bitul superior) . Pentru x>0, s=0, iar pentru x<0, s=1 Numerele cu semn se reprezint cel mai des n sistem binar codificat care ofer anumite avantaje n executarea operaiilor aritmetice cu numere algebrice. Se cunosc trei moduri de reprezentare, denumite coduri binare pentru numere algebrice. Cod direct (codul mrime i semn). Scrierea unui numr n acest cod este foarte simpl: n cifra semn se scrie 0, dac numrul este pozitiv, i 1, dac numrul este negativ; n partea de valoare se nscrie numrul n sistemul binar obinuit. Intervalul posibil admis de reprezentare este [ -2n-1 + 1, 2n-1 -1]. Codul invers. Pentru numerele pozitive scrierea n cod invers este identic cu cea din codul direct. Dac numrul este negativ: 1): se scrie ca i cum ar fi pozitiv; 2): se inverseaz fiecare cifr binar, 1 devine 0 i 0 devine 1- de aici i denumirea de cod invers. Pe n poziii binare n cod invers pot fi reprezentate numere ntregi din intervalul [-2n-1+1; 2n-1-1]. Codul complementar. n acest cod numerele pozitive au acelai reprezentare ca i n codul direct i codul invers. Dac numrul este negativ, se scrie codul invers , apoi se adun 1 la cifra de pe poziia binar zero. De exemplu reprezentarea numrului -65 n cod complementar. +65 = 01000001b 10111110b 10111111b
5

n cod direct n cod invers n cod complementar

Codul complementar este utilizat n marea majoritate a calculatoarelor datorit facilitilor pe care le ofer la efectuarea operaiilor aritmetice i uurinei cu care se face verificarea rezultatelor. n acest cod pe n poziii binare pot fi reprezentate numere ntregi din intervalul [ -2 n-1 , 2n-1 -1]. Tipuri de date BYTE (1 octet). Acest tip de date ocup 1 octet i poate fi reprezentat att n memoria intern, ct i ntr-un registru de 8 bii al procesorului. Interpretrile tipului byte pot fi: ntreg pe 8 bii cu sau fr semn; caracter ASCII. Directiva pentru definirea datelor de acest tip este DB (Define Byte). WORD (2 octei). Acest tip de date ocup 2 octei i poate fi reprezentat att n memoria intern, ct i ntr-un registru de 16 bii al procesorului. Interpretrile tipului word pot fi: ntreg pe 16 bii cu sau fr semn; secven de dou caractere ASCII; adres de memorie de 16 bii. Directiva pentru definirea datelor de acest tip este DW (Define Word). Partea mai puin semnificativ este memorat la adrese mai mici. De exemplu dac presupunem ntregul 1234H la adresa 1000H, atunci octetul 34H se va gsi la adresa 1000H, iar octetul 12H la adresa 1001H. Similar, se memoreaz i secvenele de dou caractere ASCII. DOUBLE-WORD (4 octei). Acest tip de date ocup 4 octei i poate fi reprezentat att n memoria intern, ct i ntr-o pereche de registre de 16 bii sau ntrun registru de 32 de bii (la procesoarele de 32 de bii). Interpretrile tipului dword pot fi: ntreg pe 32 de bii cu sau fr semn; numr real n simpl precizie; adres de memorie de 32 de bii. Directiva pentru definirea datelor de acest tip este DD (Define Double-Word). Valorile mai puin semnificative se memoreaz la adrese mici. n cazul adreselor pe 32 de bii, adresa de segment este memorat la adrese mari, iar deplasamentul (offset-ul), la adrese mici. QUAD-WORD (8 octei). Acest tip de date ocup 8 octei i poate fi reprezentat att n memoria intern ct i ntr-o pereche de registre de 32 de bii (numai la procesoarele de 32 de bii). Interpretrile tipului qword pot fi: ntreg pe 64 de bii cu

sau fr semn; numr real n dubl precizie. Directiva pentru definirea datelor de acest tip este DQ (Define Quad-Word). TEN-BYTES (10 octei). Acest tip de date ocup 10 octei i poate fi reprezentat att n memoria intern, ct i ntr-unul din registrele coprocesoarelor matematice. Interpretrile tipului tbyte pot fi: numr ntreg reprezentat ca secven de cifre BCD (mpachetate), cu semn memorat explicit; numr real n precizie extins. Directiva pentru definirea datelor de acest tip este DT (Define Ten-Bytes). Forma general a unei definiii de date este : <nume> <directiva> <lista_de_valori > Sau <nume> <directiva> <numr> dup (expresie) n care <nume> este identificatorul asociat definiiei respective, iar <lista_de_valori> este lista valorilor iniiale, care poate cuprinde: constante numerice (absolute sau simbolice); simbolul ?, adres, adic un nume de variabil sau de etichet (se folosete la DW i DD); un ir ASCII. Expresia poate fi: constant numeric; list de valori; simbolul ?. Semnificaia simbolului ? este locaie neiniializat, iar cea a operatorului DUP, repetarea de un numr de ori a expresiei din parantez. Considerm urmtoarele definiii: var_a db 2 dup (0, 3 dup (1) ) var_b db 1, 2, 3, ?, ? adr_n dw var_a adr_f dd vax_d Exemplu Fie dat urmtoarea consecutivitate de operatori m1 m2 m3 m4 db db dw dd 4,5,1,6 xzyqw 12 dup(?) 345h, 234h ; rezerv 4*1=4 octei ;rezerv 5*1=5 octei ;rezerv 12*2=24 octei ;rezerv 2*24=8 octei ;echivalent cu var_a db 0,1,1,1,0,1,1,1

Numrul octeilor rezervai pentru aceast consecutivitate de operatori este 41, iar adresa locaiei m3 este 0009 (m1 0000, m2 0004, m4 0021).
7

Sarcini de lucru 1. 1) 5) 9) 13) Transformai n sistemul binar, octal i hexazecimal numerele zecimale: 42; 31; 113 2) 46; 35; 119 3) 49;30;103 45; 81; 89, 6) 66; 25; 110 7) 19;53; 101 12; 38; 118 10) 17; 63; 128 11) 34; 50; 107 11; 43; 67 14) 13; 69; 88 15) 14;70; 99 2. Transformai n sistemul binar numerele hexazecimale 4) 8) 12) 16) 29; 37; 97; 21; 87; 98. 28; 45; 130. 15; 72; 100

1) A45; 12; 56B 2) 7C; 72EB; 31DB 3) 34A; 6AB; 9AD 4) 2B9; 6F1; 81B 5) 1EF3; 5AB; 46F 6) 3EB; 4D8;A61 7) 5AB; 79F;AB8 8) 7CD; 2A1; B53 9) A56; 5E9; CDE 10) 6A3; 9D0; 8BE 11) 9A; 4DE; EF7 12) 10B; 87F; CD9. 13) 3B8; DE1; BAE 14) BC; 7F9; 78A 15) AB; 8E4; C17 16) 38E; 9C7; B89 3. Determinai reprezentarea numerelor naturale 5, 32, 40, 65, 202 n MO. 1) 00101011; 2) 11110010; 3) 10000101; 4) 00011101; 00100110; 01101010; 11100010; 11111001; 01110011 11111100; 11001011 00111101 5) 01100001; 6) 00110110; 7) 00011101; 8) 00011100; 01101110; 00111011; 01010110; 01001100; 11110011 10001100 10110010 01101110 9) 11100100; 10) 11010010; 11) 11100010; 12) 10101001; 01011100; 01001100; 10100001; 11010101; 11000001 11000111 10001110 111001100 13) 00001111; 14) 11100000 15) 10100101; 16) 11100111; 10100101; 11111000; 01101100; 01100101; 10010001 01000011 11100001 10110010; 4. Reprezentai n cod complementar pe 8 poziii binare urmtoarele numere: 1) 5) 9) 13) 1) a db bdb c dw ddd 3) a b c d db db dw dd Salut,10,13 -16,-20,13h, 2 dup (0) 62, 34, -15 456C9h, 4567 45,16,76,-6 abcd 15 dup(0),3,3 345h -42;-31; -113 2) -46;-35; -119 3) -49;-30;-103 -52;-41; -93 6) -66;-25;-110 7) -19;-53-101 -12;-38; -118 10) -17;-63;-128 11) -34; -50;-107 -11;-43; -67 14) -13;-69;-88 15) -14;-70;-99 5. Fie dat urmtoarea consecutivitate de operatori: 2) a b c d 4) a b c d
8

4) 8) 12) 16)

-29;-37; -97; -21;-87; -98. -28;-45; -130. -15;-72;-100

dd db db dw dd db db dw

2, 24 aaa, -8, 23h, 11101b 6 dup (0), 45, 6 -7, 4Dh, 8 dup(0) 92, 45h,90,-54,-67 10 dup($), 10, 13 amdto,10,13,$ 5 dup (?),7,-80h

5) a b c d 7) a b c d 9) a b c d 11) a b c d 13) a b c d 15) a b c d db db dw dd dd db db dw 45,16 5 dup (?),10,13,$ 55 dup(0) 34567h db 35,53 db 10 dup ( ),10,13,$ dw 5 dup(0) dd 555h db db dw dd lucrarea_1,10,13 2 dup (0) 38, -15,78,41,12 678EFh, 3489, 456

6) a b c d 8) a b c d 10) a b c d 12) a b c d

db db dd dw db db dw dw db db db dw db db dw dd

12, 24,sss ab, -8, 23h 6 dup (0), 45 -7, 5 dup(0) 34, 6,3,-8,-2 Hello, $ 6 dup (0), $, 10, 13 -68, 46h, 7 dup(0) 76, 87, 92, 45h 20 dup($), 10, 13 qwert 10 dup (0) 73,74,75,77,78,-67 15 dup (?), 10,13 5 dup( ), $ 777h

78, 34, 67 Rezultat, $, 16 dup (0), $, 10, 13 -68, 46h, 7 dup(0)

14) db 24,76,-56 a db testul_nr_2,13,10 db abc, 11101b b db -18,-22,18h, 2 dup (0) dd 45, 4 dup(?) c dw 81, -16,44,18 dw 4 dup(0),8,3 d dd 568ABh 16) dd 87, 45h,-9 a db Matematica,10,13 db 10 dup(?) b db 10,20h, 2 dup (0) db test_1$ c dw 60, 30, -10,-20,-50 dw 4 dup (0),2,7 d dd 56789Bh a) determinai ci octei va rezerva aceast consecutivitate de operatori; b) determinai adresa locaiei de memorie c.

Etapele de elaborare a unui program n limbaj de asamblare. Afiarea unui ir de caractere la consol Obiectivele lucrrii Lucrarea urmrete familiarizarea studenilor cu posibilitile de scriere a unui program, structura unui program i de asemenea acumularea deprinderilor de elaborare a unor programe simple. Breviar teoretic Etapele de elaborare a unui program 1. 2. 3. 4. Elaborarea fiierului surs. Asamblarea fiierului surs (obinerea codului obiect). Editarea de legturi(obinerea fiierului executabil). Depanarea programului.

Textul unui program se scrie n unul sau mai multe fiiere n format ASCII. Denumirile fiierelor i a extensiilor lor pot fi arbitrare, ns fiierele ce conin modulul principal este binevenit sa aib extensia *.asm, iar fiierele suplimentare ce conin descrierea constantelor, tipuri noi, biblioteci de funcii extensia *.inc. Fiierul surs este necesar de a fi transformat n comenzi binare care pot fi prelucrate de ctre microprocesor. Aceast posibilitate ne este oferit de programe numite asambloare. Dup asamblare se obin fiierele obiect ce au extensia *.obj. Asamblarea poate fi efectuat prin intermediul compilatoarelor masm al firmei Microsoft sau tasm al firmei Borland. n cazul cnd un program conine mai multe module, procesul de elaborare a unui program include i editarea de legturi. Legtura modulelor obiect se efectueaz cu unul din programele link al firmei Microsoft sau tlink al firmei Borland. n rezultat se va obine un fiier executabil cu extensia *.exe sau *.com. De exemplu, fie c fiierele surs au denumirile prog1.asm i myLib.inc. n acest caz asamblarea i editarea de legturi poate fi executat de urmtoarele comenzi: Asamblare Editarea de legturi Microsoft Masm prog1.asm Masm myLib.inc Link prog1.obj
10

Borland Tasm prog1.asm Tasm myLib.inc Tlink prog1.obj

Link myLib.obj Structura general a unui program

Tlink myLib.obj

Un rnd n limbajul de asamblare poate conine patru cmpuri: [eticheta:] operator [cmpul operanzilor] [;comentarii] Este necesar numai cmpul operatorului. Eticheta este utilizat pentru a indica adresa instruciunii i atribuie un nume simbolic primului bait din memorie n care va fi nregistrat echivalentul binar al instruciunii . O etichet poate conine: - literele alfabetului englez A .. Z,(Asamblorul nu face diferene dintre literele majuscule i minuscule); - cifrele 0 .. 9; - simboluri speciale: '?', '.'(numai primul simbol), '@'(a rond), '$', '_'. Primul simbol poate fi o liter sau unul din simbolurile speciale. Lungimea maximal a etichetei este de 31 simboluri. Cmpul operatorului conine numele instruciunii, de ex. mov instruciune de transfer, add instruciune de adunare. Operanzii definesc: valorile iniiale ale datelor sau elementele asupra crora are loc aciunea. De exemplu, instruciunea mov ax, 4 transfer n registrul ax valoarea 4. n cmpul operanzilor pot fi unul sau doi operanzi. Operanzii sunt delimitai prin virgul. n instruciunile cu doi operanzi primul din ei reprezint destinaia, al doilea sursa. Sursa nu se schimba (cu excepia unor instruciuni), iar destinaia se schimb aproape ntotdeauna. Comentariile se ncep cu simbolul ';' i se scriu n orice loc n program. Toate simbolurile din dreapta simbolului ';' pn la sfritul rndului asamblorul le ignoreaz. nregistrrile de tipul analogic. Mai jos sunt prezentate exemple de program ca modele recomandate de prezentare a programelor pentru asambloarele masm i tasm. Structura unui program n stil masm
11

mov ah, 9 i MOV AH, 9 sunt analizate de asamblor

.model small

;directiva de descriere a modelului de memorie ;programul are tipul de memorie small un segment de cod ;i un segment de date ;iniializarea segmentului de stiv ;iniializarea segmentului de date ;definirea datelor ;iniializarea segmentului de cod ;aici pot fi incluse subprogramele i datele care trebuie ;amplasate n segmentul de cod ;nceputul programului ;textul programului ;directiva de finisare a programului

.stack 100 .data .code .startup end

Structura unui program n stil tasm sstack segment para stack stack ; definirea segmentului de stiv db 100 dup (?) ; spaiu pentru stiv, nu mai puin de 32 cuvinte sstack ends ; sfritul segmentului de stiv sdata segment sdata ends para data ; definirea segmentului de date ; definirea datelor prin directive de definire ; sfritul segmentului de date ; definirea segmentului de cod ; indic asamblorului c segmentul scode va fi ;legat de registrul de segment cs, iar segmentul ;sdata cu registrul de segment ds. ; text subprogramelor i datelor care sunt necesare ; de amplasat n segmentul de cod ; punctul de intrare n program ; textul programului ; sfritul segmentului de cod ; directiva de finisare a programului

scode segment para code assume cs:scode,ds:sdata start: scode ends end start

Directivele de definire a segmentelor mpart programul surs n segmente. ntr-un program n limbaj de asamblare pot fi definite patru tipuri de segmente: segmentul de date, utilizat pentru alocarea variabilelor globale i constantelor; segmentul de stiv, utilizat pentru pstrarea datelor temporare i a adreselor de revenire din subprograme segmentul de cod, utilizat pentru codul programului i de asemenea pentru subprograme i date
12

segmentul pentru date suplimentare. Registrul de segment DS trebuie s conin adresa segmentului n care sunt definite datele. Acest registru poate fi iniializat astfel: mov ax, @data mov ds, ax sau mov ax, sdata mov ds, ax Sarcini de lucru Studiai structura unui program Assembler i cerinele de baz fa de program. 2. Elaborai programul ce afieaz la consol irul Hello World n stilurile masm i tasm. a) Definii n segmentul de date prin directiva db irul Hello World,10,13,$ hi db Hello World,10,13,$ b) Iniializai registrul de segment ds c) Afiai irul la consol prin intermediul funciei 9 ( ntreruperea 21h) mov ah, 9 ;numrul funciei se ncarc ntotdeauna n registrul ah mov dx, offset hi ;n registrul dx se ncarc adesa de nceput a irului int 21h ;apel de ntrerupere d) Finisai programul prin intermediul funciei 4Ch ( ntreruperea 21h ) mov ah, 4ch int 21h 3. Editai programul n orice editor de texte i salvai-l pe disc. Asamblai fiierul surs i construii fiierul executabil. 4. Analizai structura listingul-ui. De ex. fiierul myLab1.LST (fiierul surs are denumirea myLab1.asm) se obine n rezultatul aciunii comenzii tasm myLab1.asm,, Tiprii listing-ul programului i studiai structura lui.
1.

; masm

; tasm

13

Moduri de adresare a operanzilor n limbaj de asamblare. Introducerea i afiarea unui ir prin intermediul funciilor 09h i 0Ah(ntreruperea 21h) Obiectivele lucrrii Aceast lucrare urmrete formarea abilitilor n elaborarea programelor i8088 i depanarea datele crora sunt introduse de la tastatur prin afiarea rezultatului la consol, familiarizarea cu modurile de adresare a operanzilor MP programelor. Breviar teoretic Moduri de adresare a operanzilor Microprocesorul (MP) poate utiliza diferite moduri de adresare a operanzilor. Asamblorul determin modul de adresare n baza formatului operandului din program. Pot fi distinse apte moduri de adresare: adresare prin registru; adresare imediat; adresare direct; adresare indirect (prin registre); adresare bazat; adresare indexat; adresare bazat i indexat. Cele mai simple sunt primele dou moduri deoarece MP n acest caz obine valoare a operandului dintr-un registru sau nemijlocit din instruciune. Celelalte moduri de adresare MP trebuie s calculeze adresa locaiei de memorie, ulterior s extrag din ea valoarea operandului. n adresarea prin registru MP extrage valoarea operandului din registru sau ncarc valoarea operandului n registru. De exemplu: mov ax,cx bii. De exemplu: mov cx,500 ; ncarc n registrul cx valoarea 500 Pentru descrierea urmtoarelor moduri de adresare vom defini noiunea de adres efectiv i adres de segment. Prin adres de segment vom nelege adresa de nceput a segmentului n care se gsete operandul i prin adresa efectiv - nelegem deplasamentul operandului n ; valoarea registrului cx se ncarc n registrul ax Al doilea operand n adresarea imediat poate fi o constant pe 8 bii sau 16

14

cadrul segmentului respectiv. Adresa de segment i adresa efectiva formeaz adresa fizica. Adresa de segment este furnizata de cele 4 registre de segment. Adresa efectiv n adresarea direct este o parte component a instruciunii. De exemplu: mov ax,table ;ncarc n registrul ax valoarea locaiei ;de memorie cu eticheta table Remarcm c partea mai puin semnificativ a unui cuvnt este memorat la adrese mai mici, adic dac adresa table conine valoarea AA, iar adresa table+1 valoarea BB, atunci n urma execuiei instruciunii de mai sus registrul ax va avea valoarea BBAA. Adresa efectiv a operandului n cazul adresrii indirecte prin registru se conine n registrul de baz bx, registrul bp sau n unul din registrele index di, si. Operanzii sunt inclui n paranteze ptrate. De exemplu: mov ax,[bx] ;ncarc n registrul ax valoarea locaiei de memorie ;adresa efectiv a creia se afl n registrul bx Pentru a ncrca deplasamentul locaiei table n registrul bx poate fi utilizat operatorul offset. De exemplu: mov bx,offset table ; ncarc deplasamentul locaiei table n registrul bx Acest mod este util n acele cazuri cnd este nevoie de a accesa o consecutivitate de locaii ncepnd cu adresa dat. n cazul adresrii bazate adresa efectiv se calculeaz prin sumarea coninutului registrului bx sau bp i a unui deplasament msurat n octei. De ex. urmtoarele comenzi execut una i aceeai aciune: mov ax,[bx]+4 mov ax,[bx+4] mov ax,4[bx] ; ncarc n registrul ax valoarea locaiei de memorie de la ; adresa indicat ; de registrul bx plus patru octei

n cazul adresrii indexate adresa efectiv se calculeaz prin sumarea unuia din registrele index si sau di i eventual a unui deplasament. Aceast adresare poate fi
15

utilizat la accesarea elementelor unui tablou cnd deplasamentul indic nceputul tabloului, iar registrul indice - un element. De exemplu: mov di, 2 mov al,table[di] ;ncarc n registrul al elementul de pe poziia trei ;al tabloului table. n cazul adresrii bazate i indexate adresa efectiv se calculeaz prin sumarea coninutului registrului bx i si sau di, i eventual a unui deplasament. Aceast adresare este util atunci cnd se cere accesarea elementelor unui tablou bidimensional unde registrul bx conine adresa de nceput al tabloului, iar valoarea deplasamentului i a registrului index determin deplasamentul pe coloan i linie. De exemplu: mov ax,[bx+2+di] mov ax,[bx+2][di] mov ax,[bx][di+2] Adresa efectiv de segment se calculeaz fa de registrul de segment ds n toate modurile de adresare( n afar de cazul cnd e folosit registrul bp pentru care este utilizat registrul ss). Pentru modificarea registrelor de segment folosite implicit poate fi utilizat prefixarea segmentului. De ex. mov es:[bx], dx ;valoarea registrului dx se transfer n locaia de memorie din ;segmentul es cu deplasamentul indicat de registrul bx. Introducerea i afiarea unui ir Pentru introducerea unui ir de la tastatur prin intermediul funciei 0Ah (ntreruperea 21h) spaiul de memorie trebuie definit ntr-un mod special: 1 bait 1 bait Buffer pentru introducerea simbolurilor Primul bait conine un numr egal cu dimensiunea buffer-ului pentru introducerea simbolurilor. Al doilea bait va conine numrul simbolurilor introduse. Simbolurile introduse se vor pstra n buffer ncepnd cu al treilea bait al spaiului de memorie definit. Deci, definirea spaiului de memorie pentru introducerea unui ir din 10 simboluri poate fi efectuat astfel:
16

sir

db

11, ?, 11 dup(?)

Lungimea irului i a buffer-ului se definesc cu un bait mai mult deoarece un bait este necesar pentru pstrarea codului 0dh codul tastei Enter. Pentru un acces mai facil la fiecare domeniu descris, definirea poate fi divizat n trei pri: MaxLength db CurrentLehgth Buffer db 11 db ;semnul ? semnific c valoarea locaiei ;de memorie 11 DUP(?) ;nu este definit ;numrul funciei se ncarc n registrul ah ;n dx se ncarc adresa de nceput a spaiului ;de memorie definit pentru introducerea datelor ;sau mov dx, offset MaxLength n al doilea ;apelul ntreruperii ?

Apelul funciei 0Ah se efectueaz astfel: mov ah, 0ah mov dx, offset sir caz int 21h Afiarea unui ir prin intermediul funciei 09h necesit definirea unei vriabile de tip db, de exemplu: a db Salut!$ mov ah, 9 lea dx, a int 21h ; semnul $ indic sfritul zonei de afiare ;numrul funciei se ncarc n registrul ah ;adresa de nceput a locaiei ce definete irul se ncarc n ;registrul dx sau mov dx, offset a ;numrul ntreruperii iar realizarea afirii se efectueaz cu ajutorul urmtoarelor instruciuni:

Exemplu S se scrie un program n limbajul de asamblare care introduce un ir s1 de la tastatur, copiaz primul i ultimul simbol n irul s2 i afieaz la consol ambele iruri. ... message db enter the string:, 10, 13, $ ;mesaj ;urmtoarele 3 rnduri definesc spaiul ;de memorie pentru introducerea unui ;ir de la tastatur prin intermediul
17

maxlength db

11

curlength db s1 db introduse s2 db

? 11 dup(?) 3 DUP(?)

;funciei 10 ( ntreruperea 21h) ;lungimea maximal a lungimii irului, ;ultimul simbol va fi simbolul cu codul 13 ;(codul tastei Enter) ;numrul simbolurilor introduse fr codul Enter ;buffer-ul n care vor fi amplasate datele ;doi baii pentru simboluri i unul pentru ;simbolul $ indicator pentru sfritul irului ;codurile tastei Enter

new_line db 10,13,$ ... ;afiarea irului message ... ;introducerea irului s1 ... mov al, s1 ;copiaz primul simbol din s1 n irul s2 mov s2, al ;prin intermediul registrului al mov bl, curlength ;n bx- numrul simbolurilor introduse mov bh, 0 mov al, s1 [bx 1] ;copiaz ultimul simbol din s1 n s2 mov s2 + 1,al ;pe a doua poziie prin al mov s2 +2, $ ;$ la sfritul irului s2 mov s1[bx], $ ;simbolul Enter se schimb n $ ;afiarea s1 la consol ;afiarea new_line la consol ;afiarea s2 la consol ;afiarea new_line la consol ;sfrit de program ....

Sarcini S se scrie un program n limbaj de asamblare conform variantelor de mai jos. S se depaneze programul prin debugger-ul TD. S se efectueze trasarea pas cu pas imprimnd la fiecare pas valoarea segmentului de date. S se analizeze modificrile registrului ip i a segmentului de date pas cu pas n execuia programului.

18

1. S se introduc un ir cu lungimea de 10 simboluri. S se copieze din irul s1 n irul s2 simbolurile de pe poziiile 2, 4 i 6. S se afieze la consol ambele iruri. 2. S se introduc un ir cu lungimea de 10 simboluri. S se copieze din irul s1 n irul s2 simbolurile de pe poziiile 10, 5 i 2. S se afieze la consol ambele iruri. 3. S se introduc un ir cu lungimea de 10 simboluri. S se copieze din irul s1 n irul s2 fiecare al treilea simbol s1. S se afieze la consol ambele iruri. 4. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 toate simbolurile de pe poziie impar. S se afieze la consol ambele iruri. 5. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 toate simbolurile de pe poziie par. S se afieze la consol ambele iruri. 6. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 ultimile rei simboluri. S se afieze la consol ambele iruri. 7. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 primele trei simboluri. S se afieze la consol ambele iruri. 8. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 primele trei simboluri n ordine invers. S se afieze la consol ambele iruri. 9. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 ultimile trei simboluri n ordine invers. S se afieze la consol ambele iruri. 10. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 ultimul simbol de trei ori. S se afieze la consol ambele iruri. 11. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 penultimul simbol de trei ori urmat de primul. S se afieze la consol ambele iruri. 12. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 al cincilea simbol de dou ori i al doilea de trei ori. S se afieze la consol ambele iruri. 13. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 primele trei simboluri de dou ori. S se afieze la consol ambele iruri. 14. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 al doilea, al patrulea simbol de trei ori consecutiv. S se afieze la consol ambele iruri.
19

15. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 simbolul al noulea de trei ori urmat de al doilea de dou ori. S se afieze la consol ambele iruri. 16. S se introduc un ir cu lungimea de cel puin 10 simboluri. S se copieze din irul s1 n irul s2 ultimul i penultimul de trei ori. S se afieze la consol ambele iruri.

20

Instruciuni de transfer. Introducerea i afiarea unui ir prin intemediul funciilor 3Fh i 40h(ntreruperea 21h) Obiectivele lucrrii Familiarizarea cu funciile de intrare/ieire, nsuirea modului de utilizare al unor instruciuni de transfer, formarea abilitilor de executare i depanare a programelor folosind depanatoare interactive. Breviar teoretic Instruciuni de transfer a datelor Instruciuni de transfer a datelor realizeaz schimbul de date ntre registre, locaii de memorie. Instruciunea mov Transfer: - bait sau cuvnt din registru n registru sau din registru n locaie de memorie i invers; - o valoare imediat ntr-un registru sau locaie de memorie. Sintaxa: Exemple: mov ax , table mov table , ax mov cl , 25 Incorect ar fi dac: sursa i destinaia ar fi ambele operanzi n memorie; ar fi folosite registrele flags i ip;

mov <destinaie>, <surs> ; transfer din memorie n registru ; transfer din registru n memorie ; transfer n registrul l valoarea 25

operanzii ar avea dimensiuni diferite;

registru cs ar aprea ca destinaie; ntr-un registru de segment ar fi transferate date imediate; operanzii ar fi simultan registre de segment. Instruciunea lea
21

Copiaz adresa efectiv a operandului (offset-ului n cadrul segmentului) n registrul general specificat. Sintaxa: Exemplu: lea bx,table[di] de ;memorie table+5 n segmentul, adresat ;de valoarea registrului ds Instruciunile push i pop Instruciunea push transfer n vrful stivei valoarea registrului sau locaiei de memorie cu dimensiunea de un cuvnt. Sintaxa: Exemple: push si push cs push table[bx][di] Instruciunea pop extrage cuvntul din vrful stivei i l transfer ntr-un registru sau locaie de memorie. Sintaxa: Exemplu: pop ax Prin vrf de stiv se subnelege locaia de memorie din segmentul de stiv, adresa relativ a creia este indicat de registrul sp. Registrul sp indic ntotdeauna adresa cuvntului introdus n stiv ultimul. Instruciunea push micoreaz valoarea lui sp cu 2, iar instruciunea pop mrete cu 2. Instruciunile pushf i popf Instruciunea pushf transfer n vrful stivei valoarea registrului de indicatori flags.
22

lea <registru>, <locaie de memorie> ;dac registrul di conine valoarea 5, atunci n ;registrul bx va fi transferat adresa efectiv a locaiei

push <surs>

pop <destinaie>

Sintaxa: de indicatori flags. Sintaxa:

pushf

Instruciunea popf extrage din vrful stivei un cuvnt i l transfer n registrul popf

Introducerea i afiarea unui ir. Funciile 3Fh i 40h Pentru introducerea unui ir de la tastatur prin funcia 3Fh este necesar de a descrie numai buffer-ul n care se vor pstra simbolurile introduse. Este necesar de reinut c n comparaie cu funcia 0Ah, funcia 3Fh salveaz nu un simbol, dar doi 0Ah i 0Dh codul integral al tastei ENTER, de aceea buffer-ul trebuie s fie cu 2 baii mai mare dect numrul simbolurilor introduse. Plus la toate acestea procesorul nu emite nici un semnal la umplerea buffer-ului i nici tastatura nu se blocheaz. Toate simbolurile introduse nimeresc iniial n buffer-ul de sistem intrare/ieire, apoi procesorul transfer numrul necesar de simboluri n zona de memorie alocat de ctre programator. Surplusul de simboluri rmn n buffer-ul de sistem. Ele vor fi extrase la apelul repetat al funciei de intrare ceea ce poate duce la o funcionare incorect a programului. De aceea programatorul trebuie s aib singur grij de numrul simbolurilor introduse. Exemple: fie buffer-ul definit astfel: sir db 12 dup(?) ;numrul funciei se pune n registrul ah ;adresa bufferul-ui se pune n registrul dx. ;poate fi nlocuit cu mov dx, offset sir ;n bx numr logic ;n cx numrul simbolurilor introduse + 2 pentru ;codul lui Enter ;apel de ntrerupere atunci apelul funciei 3fh se efectueaz n felul urmtor: mov ah, 3fh lea dx, sir mov bx, 0 mov cx, 12 int 21h

Dup execuia acestei funcii n registrul al se pstreaz numrul simbolurilor introduse plus doi pentru codul lui Enter, iar n ah numrul erorii. Funcia 40h afieaz un ir la consol. Apelul funciei se efectueaz astfel: mov ah, 40h ; numrul funciei se pune n registrul ah
23

lea mov mov int

dx, sir bx, 1 cx, 10 21h

; adresa buffer-ului se pune n registrul dx ; n bx numr logic ; n cx numrul simbolurilor ce trebuie afiate ;apel de ntrerupere. Parametru de ieire registru al ;ce conine numrul simbolurilor afiate

Sarcini de lucru 1. S se scrie un program (vezi lucrarea de laborator 3) folosind funciile 3fh i 40h de introducere de la tastatur i afiare la consol a unui ir. Simbolurile vor fi copiate prin intermediul stivei utiliznd instruciunile push i pop. 2. S se execute programul prin depanatorul TD. S se efectueze trasarea programului pas cu pas, tiprind la fiecare pas valoarea segmentului de date. S se analizeze modificrile indicatorului vrfului stivei sp, indicatorului de adrese segmentului de date la fiecare pas de execuie a programului. ip i a

24

Fiiere executabile. Introducerea i afiarea unui simbol la consol Obiectivele lucrrii Familiarizarea cu tipurile de fiiere executabile, nsuirea modului de formare a fiierelor executabile formarea abilitilor de utilizare a funciilor de introducere/afiare a unui simbol. Breviar teoretic Fiiere executabile Sunt posibile urmtoarele formate de fiiere executabile: *.exe, *.com, *.bat, *.cpl, *.scr, *.cmd. Vom analiza unele din ele. com programul este format dintr-un singur segment, deci codul i datele pot avea mpreun maxim 64Ko; din aceast cauz referirile se fac relativ la adresa de nceput de segment. Pentru elaborarea fiierelor de tip *.com se utilizeaz modelul de memorie de tip tiny. Pentru editarea de legturi este necesat parametrul /t. Programul surs trebuie s nceap cu pseudoinstruciunea ORG 100H pentru a rezerva spaiu de memorie pentru cod, stiv, date. Datele pot fi plasate oriunde n program, dar se recomand s fie plasate la nceput (trebuie avut mare grij s nu se execute din greeal zona cu date, adic s nu se omit instruciunea de salt peste zona de date, n caz contrar acestea vor fi interpretate ca instruciuni i rulate, rezultatul fiind altul dect cel ateptat). Nu este necesar iniializarea registrelor segment, ele fiind ncrcate cu valoarea comun din cs. Terminarea programului se poate face fie cu ret (n context near) fie cu apelul int 21h cu numrul funciei 4ch n registrul ah. Model pentru programele de tip *.com .model tiny .code org 100h start: jmp label label:
25

;nceputul fiierului com

;definire zonei de date

;instruciunile programului mov ah,4ch int 21h end start ;ieire n sistemul de operare

Elaborarea fiierului cu extensia *.com se efectueaz prin urmtorii pai(se presupune c fiierul surs are denumirea p.asm): tasm p.asm tlink/t p.asm Formatul exe - este un format de fiiere executabile cel mai des utilizat pentru sistemul de operare DOS. Programele executabile n acest format pot avea segmente multiple. Este formatul pentru programe de dimensiuni mari. Extensia lor implicit este *.exe. Programele pot fi orict de mari n limita memoriei disponibile. Pentru execuia corect, registrele DS, ES i SS trebuie s fie iniializate explicit de programator. Pentru elaborarea fiierelor de tip exe se utilizeaz modelul de memorie de tip small. Model pentru programe de tip exe este definit n lucrarea de laborator 2. Funcii de introducere/afiare a unui simbol (funciile 01h i 02h) Apelul funciei 01h pentru introducerea unui simbol intermediul ntreruperii 21h se efectueaz astfel: mov ah, 01h int 21h ;numrul funciei se ncarc n registrul ah ;apelul ntreruperii. Codul simbolului introdus se ;ncarc n registrul al Pentru pstrarea codului simbolului introdus este necesar de a salva coninutul registrului al ntr-o locaie de memorie de tip byte sau ntr-un alt registru cu dimensiunea byte Afiarea se efectueaz cu ajutorul funciei 02h astfel: mov ah, 02h mov dl, <cod> int 21h ;numrul funciei se ncarc n registrul ah ;codul simbolului ce trebuie afiat se ncarc n ;registrul dl ;apelul ntreruperii
26

de la tastatur prin

Exemplu n continuare vom soluiona urmtoarea problem: s se introduc un simbol de la tastatur. Simbolul introdus sa se memoreze ntr-o locaie de memorie definit, ulterior valoarea locaiei de memorie s se afieze la consol. .model small .stack .data s db ? ;definirea locaiei de memorie cu valoare neiniializat mes1 db Introduceti simbolul a1: $ mes2 db Ati introdus simbolul: , 10,13, $ .code ; iniializarea registrului ds ... ;afiarea primului mesaj mes1 ... mov ah, 1 ;introducerea simbolului int 21h ; n al codul simbolului introdus mov s,al ;salvarea codului simbolului introdus n locaia s ;afiarea mesajului al doilea mes2 ... mov ah, 2 ;afiarea la consol a simbolului introdus mov dl,s int 21h ; sfarit de program ... sau utiliznd modelul tiny i obinerea fiierului .com: .model tiny .code org 100h start: jmp m s db ? mes1 db "Introduceti un simbol: ",10,13,'$' mes2 db 10,13, "Simbolul introdus este:$ " m: ;afiarea primului mesaj mes1 ... mov ah, 1
27

int 21h mov s,al ;afiarea mesajului al doilea mes2 ... mov ah, 2 mov dl,s int 21h ; sfarit de program ... end start Sarcini de lucru Se vor studia exemplele prezentate. Se va scrie programul n format .com, se va asambla, link-edita i depana cu Turbo Debugger-ul urmrindu-se valoarea regitrilor i al memoriei. Se va rescrie programul n format .exe i se va depana.
1.

Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolurile a1, a2 irul s2 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s2: s2 Introduceti simbolul a1:a1 Introduceti simbolul a2: a2 Rezultatul obtinut s1a1bba2bbs2 (b spaiu liber) Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1 , a2, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s3: s3 Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Rezultatul obtinut: a1bbs2a2bbs1bbs3 (b spaiu liber)

2.

28

3.

4.

5.

6.

Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irurile s2,s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s2: s2 Introduceti simbolul a1:a1 Introduceti sirul s3: s3 Rezultatul obtinut s1bba1s1a1bbs2s3 (b spaiu liber) Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolurile a1 , a2, irul s2 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s2: s2 Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Rezultatul obtinut: a1bbs1bba2bbs1bb s2 (b spaiu liber) Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolurile a1, a2,a3, irurile s2,s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s2: s2 Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Introduceti simbolul a3: a3 Introduceti sirul s3: s3 Rezultatul obtinut s1a1bba3a2a2bbs2bbs3 (b spaiu liber) Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s3: s3 Introduceti simbolul a1: a1 Rezultatul obtinut: a1bbs2a1s1bbs3bba1 (b spaiu liber)

29

Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irul s2 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti sirul s2: s2 Rezultatul obtinut s1bba1s1bbs2bba1 (b spaiu liber) 8. Este definit irul s1. S se scrie un program assembler ce introduce de la tastatur simbolurile a1 , a2, irul s2 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Introduceti sirul s2: s2 Rezultatul obtinut: a2s1bbs1a1bbs2 (b spaiu liber) 9. Sunt definite irurile s1,s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1,a2, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1:a1 Introduceti simbolul a2:a2 Introduceti sirul s3: s3 Rezultatul obtinut s1a1bba2bbs2bbs3 (b spaiu liber) 10. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1, a2, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti sirul s3: s3 Introduceti simbolul a2: a2 Rezultatul obtinut: a1bbs2a2s1bbs3 (b spaiu liber) 11. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s3: s3
7. 30

Introduceti simbolul a1: a1 Rezultatul obtinut: a1bs2a1s1bbba1bs3 (b spaiu liber) 12. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1 i a2 i irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s3: s3 Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Rezultatul obtinut: s2bba2s1bs3ba1s3 (b spaiu liber) 13. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti sirul s3: s3 Rezultatul obtinut: s2ba1bs1bs3ba1bs1 (b spaiu liber) 14. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1,a2 irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti simbolul a2: a2 Introduceti sirul s3: s3 Rezultatul obtinut: s1ba2ba1bs2bs3ba1 (b spaiu liber) 15. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolul a1, irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti sirul s3: s3 Introduceti simbolul a1: a1 Rezultatul obtinut: a1bs2ba1s1bs3ba1ba1 (b spaiu liber) 16. Sunt definite irurile s1 i s2. S se scrie un program assembler ce introduce de la tastatur simbolurile a1,a2 irul s3 i afieaz concatenarea elementelor introduse n modul urmtor: Introduceti simbolul a1: a1 Introduceti sirul s3:
31

s3 Introduceti simbolul a2: a2 Rezultatul obtinut: a1bs2a1s3bbs1ba2 (b spaiu liber)

32

Instruciuni de comparare i de salt Obiectivele lucrrii Lucrarea se refer la familiarizarea cu instruciunile de salt, de comparare i moduri de utilizare ale lor. Breviar teoretic Instruciunea cmp Semnificaia instruciunii const n execuia unei scderi temporare (destinaie) - (surs), fr a se modifica vreun operand, dar cu poziionarea bistabililor de condiie. Sintaxa: cmp <destinaie> , <sursa> Afecteaz : af, cf, pf, sf, zf, of . Testnd bistabilii de condiie, putem deduce relaia dintre cei doi operanzi. De exemplu, instruciunea cmp ax, bx va provoca o scdere temporar (ax) - (bx). Dac zf = 1 nseamn c (ax) = (bx). Dac cf = 1 nseamn c la scdere a aprut un mprumut, deci (ax) < (bx), dac sunt considerate ca numere fr semn. Instruciunea cmp se folosete, de obicei, mpreun cu instruciuni de salt condiionat. Instruciunea de salt necondiionat jmp Sintaxa: jmp <inta> n care inta specific adresa de salt (punctul n care se va da controlul). Specificarea intei se poate face printr-o etichet sau printr-o expresie Etichetele au asociat un tip (near sau far) i pot fi:un nume de procedur; o etichet definit cu : (de tip near); o etichet definit cu directiva label. Exemple de etichete: m1: aici: urm: et3: label: far: gata: label: near: Exist trei tipuri de instruciuni jmp: short - adresa int este situat la o adres n domeniul [-128, +127] fa de adresa instruciunii jmp; near - adresa int este n acelai segment de cod cu instruciunea jmp;
33

far - adresa int poate fi n alt segment de cod fa de instruciunea jmp. Instruciuni de salt condiionat Sintaxa: jcc <inta> unde cc reprezint o condiie. Instruciunile din aceast categorie implementeaz salturi condiionate de valoarea unor bistabili de condiie. Instruciunile de salt condiionat au urmtoarele caracteristici: toate instruciunile de salt condiionat sunt de tip short (deci directe), ceea ce nseamn c adresa int trebuie s fie la o distan cuprins ntre -127 i +128 de octei fa de instruciunea de salt; exist mai multe mnemonice pentru aceeai instruciune; dac condiia nu este ndeplinit, saltul nu are loc, deci execuia continu cu instruciunea urmtoare ce urmeaz dup instruciunea de salt; exist instruciuni att pe condiia direct, ct i pe condiia negat; bistabilii de condiie nu sunt afectai. Instruciunile de salt condiionat se utilizeaz dup o instruciune care modific bistabilii de condiie. Cea mai des ntlnit situaie este instruciunea de comparaie cmp. Reinem urmtoarele reguli: La comparaii cu semn, folosim ,,greater i ,,less La comparaii fr semn, folosim ,,above i ,,bellow
Mnemonica instruciunii je, jz jl, jnge jle, jng jb, jnae, jc jbe, jna jp, jpe jo js jne, jnz jnl, jge jne, jg jnb, jae, jnc Condiie de salt zf=1 sf of sf of sau zf=1 cf=1 cf=1 sau zf=1 pf=1 of=1 sf=1 zf=0 sf=of sf=of sau zf=0 cf=0
34

Interpretare zero, equal Less, Not Greater or Equal Less or Equal, Not Greater Below, Not Above or Equal, Carry Below or Equal, Not Above Parity, Parity Even Overflow Sign Not Zero. Not Eaual Not Less, Greater or Equal Not Less or Equal, Greater Not Below, Above or Equal, Not Carry

jnbe, ja jnp, jpo jno jns

cf=0 sau zf=0 pf=0 of=0 sf=0

Not Below or Equal, Above Not Parity, Parity Odd Not Overflow Not Sign

Exemplu:

S se scrie un program assembler care verific dac simbolul introdus de

la tastatur este una din literele p sau t i s se afieze echivalentul lui majuscul, n caz contrar s se afieze mesajul false. Introduceti un simbol: t T sau Introduceti un simbol: s false Simbolul introdus este pstrat n locaia de memorie var de tip byte: ... mov ah, 1 ;introducerea simbolului de la tastatur int 21h mov var, al ;salvm n variabila var simbolul introdus cmp var, p ;compar simbolul introdus cu simbolul p je m1 ;salt la eticheta m1 dac e p cmp var, t ;n caz contrar se compar cu simbolul t jne m2 ;dac nu e t atunci salt la eticheta m2 m1: sub var, 20h ;dac e p sau t se reface din minuscul n majuscul mov ah, 2 ;i se afieaz la consol mov dl, var int 21h jmp sfarsit ;salt necondiionat la ieirea din program m2: ;afiarea mesajului false sfarsit: ... Sarcini de lucru S se scrie un program assembler care verific dac simbolul introdus de la tastatur este o liter majuscul i s se afieze echivalentul lui minuscul, n caz contrar s se afieze mesajul eroare. De exemplu: Introduceti un simbol:A a sau Introduceti un simbol: b eroare S se scrie un program assembler care verific dac simbolul introdus de la tastatur este un semn aritmetic(+,-,*,/) s se afieze mesajul true, n caz contrar s se afieze mesajul false.
35

De exemplu:

1.

2.

3.

4.

5.

6.

7.

Introduceti un simbol: * true sau Introduceti un simbol: b false S se scrie un program assembler care verific dac simbolul introdus de la tastatur este o cifr s se afieze simbolul !, n caz contrar s se afieze mesajul eroare. De exemplu: Introduceti un simbol: 5 ! sau Introduceti un simbol:( eroare S se scrie un program assembler care verific dac codul simbolului introdus de la tastatur se afl n intervalul [97..122] mesajul true, n caz contrar s se afieze mesajul false. De exemplu: Introduceti un simbol: t true sau Introduceti un simbol: 2 eroare S se scrie un program assembler care verific dac simbolul introdus de la tastatur este o liter minuscul i s se afieze echivalentul lui majuscul, n caz contrar s se afieze mesajul Eroare. Simbolul introdus nu este o liter minuscul.. De exemplu: Introduceti un simbol: r R sau Introduceti un simbol: 6 Eroare. Simbolul introdus nu este o liter minuscul. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este un unul din semnele (,),[,],{,} s se afieze mesajul true, n caz contrar s se afieze mesajul false. De exemplu: Introduceti un simbol: ) true sau Introduceti un simbol: k false S se scrie un program assembler care verific dac simbolul introdus de la tastatur este o vocal s se afieze mesajul ok, n caz contrar s se afieze mesajul error. De exemplu: Introduceti un simbol: e ok sau Introduceti un simbol: m error
36

De exemplu:

S se scrie un program assembler care verific dac simbolul introdus de la tastatur este o consoan s se afieze mesajul ok, n caz contrar s se afieze mesajul error. De exemplu: Introduceti un simbol: f ok sau Introduceti un simbol: 4 error 9. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este una din literele a, b, c sau d afieze mesajul true, n caz contrar s se afieze mesajul false. De exemplu: Introduceti un simbol:b true sau Introduceti un simbol:l false 10. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este una din literele X, Y, Z sau W afieze mesajul true, n caz contrar s se afieze mesajul false. De exemplu: Introduceti un simbol:X true sau Introduceti un simbol:L false 11. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este una din cifrele impare 1, 3, 5, 7, 9 s se afieze mesajul ok, n caz contrar s se afieze mesajul error. De exemplu: Introduceti un simbol:3 ok sau Introduceti un simbol:M error 12. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este una din cifrele pare 2, 4, 6, 8 s se afieze mesajul ok, n caz contrar s se afieze mesajul error. De exemplu: Introduceti un simbol:6 ok sau Introduceti un simbol:5 error 13. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este unul din semnele $ sau @ s se afieze mesajul bine, n caz contrar s se afieze mesajul eroare. De exemplu: Introduceti un simbol: $
8. 37

bine sau Introduceti un simbol: 4 eroare 14. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este unul din simbolurile j,k,f,g s se afieze analogul majuscul, n caz contrar s se afieze mesajul eroare. De exemplu: Introduceti un simbol: k K sau Introduceti un simbol: t eroare 15. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este unul din simbolurile A,C,D,E s se afieze mesajul Ok, n caz contrar s se afieze mesajul error. De exemplu: Introduceti un simbol: D Ok sau Introduceti un simbol: a error 16. S se scrie un program assembler care verific dac simbolul introdus de la tastatur este unul din simbolurile <,=,>,? s se afieze True respectiv, n caz contrar s se afieze mesajul False. De exemplu: Introduceti un simbol: = True sau Introduceti un simbol: ! False

38

Instruciuni aritmetice Obiectivele lucrrii Prezentarea instruciunilor aritmetice folosite n limbajul de asamblare, familiarizarea cu aceste instruciuni i nsuirea modului de utilizare al instruciuni n programe. Breviar teoretic Instruciuni aritmetice Instruciunea add Semnificaia instruciuni: nsumeaz cei doi operanzi, iar rezultatul este depus n operandul destinaie Sintaxa: Exemple: add ax, [bx] ;adun elementul indicat de registrul bx cu valoarea ;registrului ax i rezultatul l depune n registrul ax add ax, 10 ;adun 10 cu valoarea din registrul ax i depune rezultatul n ;registrul ax add bh, lm ;adun coninutul locaiei de memorie lm cu valoarea ;registrului bh i depune rezultatul n registrul bh Instruciunea inc Semnificaia instruciuni: adaug valoarea 1 la operandul destinaie, iar rezultatul este depus n operandul destinaie. Sintaxa: inc <destinaie> Exemple: inc cx inc [bx] inc lm ;valoarea din registrul cx este incrementat cu 1 ;valoarea locaiei de memorie indicat de registrul bx ;este incrementat cu 1 ;valoarea locaiei de memorie lm este incrementat cu 1 add <destinaie>,<surs> acestor

Instruciunea sub Semnificaia instruciuni: din operandul destinaie se scade operandul surs, iar rezultatul este depus n operandul destinaie. Sintaxa: Exemple:
39

sub <destinaie> , <surs>

sub ax, [bx]

sub ax, 10 sub bh, lm

;scade valoarea locaiei de memorie indicat de registrul bx ;din valoarea registrului ax i rezultatul l depune n ;registrul ax ;scade 10 din valoarea registrului ax i depune rezultatul ;n registrul ax ;scade coninutul locaiei de memorie lm din valoarea ;registrului bh i depune rezultatul n registrul bh

Instruciunea dec Semnificaia instruciuni: scade valoarea 1 din operandul destinaie, iar rezultatul este depus n operandul destinaie. Sintaxa: Exemple: dec cx dec [bx] dec lm ;valoarea din registrul cx este decrementat cu 1 ;valoarea locaiei de memorie indicat de registrul bx ;este decrementat cu 1 ;valoarea locaiei de memorie lm este decrementat cu 1 dec <destinaie>

Instruciunea neg Semnificaia instruciuni: din valoarea 0 se scade coninutul destinaiei, iar rezultatul este depus tot n operandul destinaie. Sintaxa: Exemple: neg cx neg [bx] neg lm ;este schimbat semnul valorii registrului cx ;este schimbat semnul valorii indicat de registrul bx ;este schimbat semnul valorii locaiei de memorie lm neg <destinaie>

Schimbarea semnului poate conduce uneori la aceeai valoare, n cazul depirii domeniului admisibil. De exemplu, secvena: mov al, -128 neg al va lsa registrul al neschimbat (80H), deoarece 128 i -128 au aceeai reprezentare intern. Instruciunea mul
40

Semnificaia instruciuni: efectueaz o nmulire fr semn. Operandul surs este nmulit cu operandul acumulator. Dac sursa este un octet, atunci ea este sursa este un nmulit cu registrul al i rezultatul este depus n registrul ax. Dac ax. Sintaxa: Exemple: mul cl mul [bx] mul lm ;este nmulit al cu cl, iar rezultatul este depus n registrul ax ;este nmulit valoarea indicat de registrul bx cu ax, ;iar rezultatul este depus n dx:ax ;n dependen de dimensiunea locaiei de memorie lm mul <surs>

cuvnt, atunci ea este nmulit cu registrul ax i rezultatul este depus n regitrii dx i

Instruciunea imul Semnificaia instruciuni: similar instruciunii mul. Deosebirea este c operaia de nmulire se face considernd operanzii numere cu semn. Sintaxa: imul <surs> mprirea presupune c dempritul este pe o lungime dubl dect mpritorul. Prin mprire se obin ctul i restul, de lungime egal cu a mpritorului. Instruciunea div Semnificaia instruciuni: efectueaz o mprire fr semn. Acumulatorul i (eventual) extensia sunt mprite la operandul surs. Dac sursa este un octet, atunci coninutul registrului ax este mprit la operandul surs, iar ctul este depus n registrul al i restul n registrul ah. Dac sursa este un cuvnt valoarea regitrilor dx:ax se mparte la surs, iar ctul este depus n registrul ax i restul n dx. Sintaxa: Exemple: div cl div lm Instruciunea idiv
41

div <surs> ;este mprit valoarea registrului ax la valoarea registrului cl, ;iar ctul este depus n al, restul n ah ;n dependen de dimensiunea locaiei de memorie lm

Semnificaia instruciuni: similar cu instruciunea DIV. Deosebirea este c operaia de mprire se face considernd operanzii numere cu semn. Sintaxa: idiv <surs> mprirea poate conduce la depiri. n situaia n care ctul rezult mai mare dect valoarea maxim reprezentat pe 8, respectiv 16 bii, sau dac mpritorul este 0, rezultatele sunt nedefinite i se genereaz o ntrerupere soft pe nivelul 0 (Divide Overflow - Depire la mprire). De exemplu, n secvena: mov ax, 1000 mov bl,2 div bl ctul ar trebui s fie 500, valoare care nu se poate reprezenta pe un octet. ntreruperea oprete de obicei programul executabil i afieaz un mesaj de eroare la consol. De exemplu, n secvena: mov ax, 400 mov bl, 2 idiv bl ctul ar trebui s rezulte 200, valoare care nu se poate reprezenta ca numr cu semn pe un octet. Ca atare, va aprea o ntrerupere. Instruciunea cbw Semnificaia instruciuni: daca (al7) = 0, atunci (ah) 0, n caz contrar (ah) 1, adic se extinde bitul de semn din al la ntreg registrul ah. Sintaxa: cbw Instruciunea cwd Semnificaia instruciuni: daca (ax15) = 0, atunci (dx) 0, n caz contrar (dx) 1, adic se extinde bitul de semn din ax la ntreg registrul dx. Sintaxa: cwd Deoarece limbajul assembler nu posed mijloarce de afiare i introducere a numerilor este necesar de a crea secvene de program ce transform informaia
42

simbolic n informaie numeric. Un exemplu de astfel de secven este descris n continuare: .data s db 6 dup( ), $ .code ..... mov ax, <numar> push ax mov si, 10 mov di, 5 mov dx,0 cmp ax, 0 jge m neg ax div si add dl, 30h mov s[di], dl xor dx,dx dec di cmp ax, 0 jne m pop ax cmp ax,0 jge m1 mov s[di], - mov ah,9 lea dx, s int 21h ;numrul este cu semn sau fr semn ;pstrarea valorii iniiale a registrului ax ;numrul se va mpari consecutiv la 10 ;poziionarea pe ultima poziie a irului n care ;va fi pus rezultatul ;dx=0 deoarece dx:ax/si ;verific semnul numrului ;salt la m dac numrul este pozitiv ;daca numrul e negativ se ia valoarea absoluta ;dx:ax/10 ;restul se afl n registrul dl i se transform cifra n simbol ;codurile cifrelor se pun n ir de la dreapta la stnga ;dx=0 ;poziionare pe baitul din stnga ;verific dac sunt transformate toate simbolurile ;mprirea la 10 are loc pn cnd ax nu e 0 ;se extrage din stiva valoarea iniial a registrului ax ;verific semnul numrului iniial ;daca numarul a fost negativ se pune - n faa numrului ;afisarea numarului ca informaie simbolic ;variabila ce definete un ir de 6 caractere iniializate ;cu codul spaiului liber

m:

m1:

43

Exemplu S se calculeze valoarea expresiei ((120+15)/5-12)*16 (valorile variabilelor sunt definite n textul surs) .data a db 120 b db 15 c db 5 d db 12 e db 16 .code ... mov al,a ;al=120 add al, b ;al=120+15 mov ah, 0 div c ;al=(120+15)/5 sub al, d ;al=(120+15)/5-12 mov ah,0 mul e ;ax=((120+15)/5-12)*16 ... Urmtoarea secven de program realizeaz introducerea unui numr de la tastatur: ... .data n dw 0 ;locaie de memorie n care va fi pstrat numrul introdus mult10 dw 1 ;puterile lui 10 ten dw 10 sir db 8 dup (?) .code ... mov ah, 3fh ;introducerea numrului mov bx, 0 ;corect pe doi octei lea dx, sir int 21h ;ax conine numrul simbolurilor introduse +2 (Enter) mov di,ax sub di,3 ;di - indicele ultimei cifre a: mov al, sir[di] ;se pune elementul n al ( iniial - codul ultimei cifre) sub al, 30h ;se transform simbolul n cifr mov ah, 0 ;deoarece numrul este mai mare ca 0
44

m3: m4:

mul dec add mov mul mov cmp jne cmp je mov sub mov mul add jmp neg ...

mult10 di n, ax ax, ten mult10 mult10, ax di,0 a sir[di],'-' m3 al, sir[di] al, 30h ah, 0 mult10 n,ax m4 n

;se nmulete cu 100 =1 ;poziionare pe penultimul ;n=c0*100 +c1*101 + ;n ax valoarea 10 ;n locatia de memorie mult10 - puterile lui 10 ;dac nu e indicele primul simbol introdus ;se compara primul simbol al irului cu semnul '-' ;dac e '-' salt la m3, adic numrul este negativ ;n caz contrar se nmulete cu 10 la puterea ordinara ;ultimul element din ir se transform n cifr

;n locaia de memorie n numrul pozitiv introdus ;n locaia de memorie n numrul negativ introdus

Sarcini de lucru a. Calcularea valorii unei expresii variabilele crora sunt numere fr semn definite n program 1. (170-16)/2+12*5 2. (45-(23-2)*2)/7 3. 80+(45-5)*3+45/9 4. 34*2-(15+9)/3 5. (21+7)/14-4*5 6. (81-60)/7+3*7 7. (17+16)/3+12*5 8. (7+(23-2)*2)/7 9. 8+(14-5)*3+45/5 10.24*3-(45+18)/3 11.(41-20)/3-4+3*5 12.(46+10)/2-10*5 13.(87-16+7)/3-16*5 14.(83-20)/3+4-3*5 15.30+(45-5+2)/3+2*3 16.90-(41-5)*3/6
45

b. Calcularea valorii unei expresii valorile variabilelor crora sunt introduse de la tastatur 1. ( a + b + c) / a * c a - define byte, b, c, d - define word
2. (a + b / c) * d 3. (10 * a 2 * b) * c d 4. a / b + c * d /( c + b) 5. 10 * a /( a + b +10 * b /( c + d ) 6. 60 * a + b * d + c * (a b) 7. (a + b) / c + d * a c 8. c (a + b) /( a c) + c * d 9. ( a * b + c * d ) / d 10. (a * c + b * d ) * c 11. (a * b * c + c * d ) / d 12. ( a * b c * d ) * ( a + b) 13. a * c * (a + b) d 14. d * b + c * a /( a + b) 15. 25 * a + 13 * b d * c 16. a * c (a + b) / c * d

a, b, c - define byte, a, b - define byte, b, c, d - define byte, a, b, c - define byte, a, b a d a, d b a, b c c, b - define byte, - define byte, - define byte, - define byte, - define byte, - define byte, - define byte, - define byte,

d c, d a d c, d b, c, d b, c, a b, c c a, c,d c, d d b, a, d a, d a

- define word - define word - define word - define word - define word - define word - define word - define word - define word - define word - define word - define word - define word - define word - define word

a, b, d - define byte,

a, b, c - define byte,

c, b, d - define byte,

46

Proceduri. Cicluri Obiectivele lucrrii Lucrarea urmrete nsuirea principiilor de baz a funcionrii microprocesorului i memoriei n timpul rulrii ciclurilor, acumularea abilitilor de utilizare a instruciunilor de organizare a ciclurilor, acumularea cunotinelor i cunoaterea particularitilor de prelucrarea a datelor, instruciunilor, modurilor de adresare a datelor la organizarea ciclurilor, nsuirea principiilor de funcionare a memoriei i microprocesorului n execuia salturilor ntr-un segment i ntre segmente(apel de procedur) i de asemenea particularitile de utilizare a stivei n rularea apelurilor de subprograme. Breviar teoretic Instruciuni de organizare a ciclurilor Ciclurile sunt folosite pentru repetarea multipl a uneia sau mai multe instruciuni sau proceduri. Ciclurile pot fi generate utiliznd instruciunile de salt condiionat sau necondiionat cercetate n lucrarea de laborator N6, dar i prin intermediul unor instruciuni speciale, formatul crora este reprezentat m tabelul de mai jos: Denumirea Condiia de control instruciunii sintaxa instruciunii Cicleaz loop label (ecx/ cx) <> 0 Cicleaz ct timp e 0 sau loopz/ label (ecx/ cx) <> 0 zf = 1 e egal Cicleaz ct timp nu e 0 loopnz/ loopne label (ecx/ cx) <> 0 zf=0 sau nu e egal Salt dup cx jcxz label (ecx/ cx) = 0 Tabel 1. Formatul instruciunilor de organizare a ciclurilor Instruciunea loop i extensiile ei permit organizarea ciclurilor compatibile cu ciclurile for din limbajele de programare de nivel nalt. Excepie face instruciunea jcxz, care nu modific ecx/cx, restul instruciunilor la rulare efectueaz scderea unei uniti din ecx/cx, ulterior dac se satisface condiia de control, eip/ip se majoreaz cu un deplasament de 8 bii cu semn, n caz contrar ip nu se modific i programul ruleaz n continuare.
47

Mnemonica

Instruciunile de ciclare pot transfera controlul la o locaie (int) aflat n intervalul [-128,127] de octei fa de ele, deci realizeaz numai transferuri de tip short. Aceste instruciuni nu modific nici un indicator. Apel de procedur Procedura - reprezint un set de instruciuni utilizate pentru soluionarea unei probleme concrete i are posibilitatea de a obine dirijarea dintr-un punct de apel al unei probleme de nivel mult mai nalt i redarea dirijrii exact n acel loc. Procedurile se definesc n textul surs dup ablonul: nume_proc proc [ far|near] . ret nume_proc endp unde nume_proc este numele procedurii, iar parametrii far sau near (opionali) indic tipul procedurii. Procedurile sunt de dou tipuri: far i near. O procedur far poate fi apelat i din alte segmente de cod dect cel n care este definit, pe cnd o procedur near poate fi apelat numai din segmentul de cod n care este definit. Dac se omit parametrii far sau near, tipul procedurii este dedus din directivele simplificate de definire a segmentelor (modelul de memorie folosit). O procedur poate fi scris n orice parte de program, ns este necesar ca s nu se execute ntmpltor fiindc n aa caz procesorul va executa instruciunile procedurii ca parte component a programului principal. Procedura poate fi scris:
1.

;corpul procedurii

La nceput de program (pn la prima instruciune); c_s segment assume cs:c_s pr1 proc near ret
48

p1 endp begin: end begin


2.

;nceput de program

La sfrit de program (dup ieirea standard din program); c_s segment assume cs:c_s begin: mov ah, 4ch int 21h ret p1 endp c_s ends end begin n interiorul programului principal sau altei proceduri (este necesar de a utiliza instruciunea de salt necondiionat jmp); c_s segment assume cs:c_s begin: jmp m1 p1 proc near ret p1 endp m1:
49

;finisare de program i transmiterea dirijrii SO

p1 proc near

3.

mov ah, 4ch int 21h c_s ends end begin


4.

; finisare de program i transmiterea dirijrii SO

n alt modul. Instruciunea call (Apel de procedur)realizeaz apelul procedurii, salvnd n

stiv contorul program curent. n timpul execuiei acestei instruciuni are loc transmiterea dirijrii la adresa cu numele procedurii. Poate avea una din formele: call nume_proc call far ptr nume_proc call near ptr nume_proc n primul caz, tipul apelului este dedus din tipul procedurii, iar n celelalte, este specificat explicit (far sau near). Tipul apelului trebuie s coincid cu tipul procedurii i cu tipul instruciunilor Return din interiorul procedurii, altfel se ajunge la funcionri defectuoase ale programului. Instruciunea ret (Return) provoac revenirea n programul apelant. Putem scrie o instruciune Return explicit, n formele retn (Return Near) sau retf (Return Far), sau ret pur i simplu, caz n care tipul instruciunii Return este dedus din tipul procedurii (far sau near). Este important de reinut c instruciunile call i ret sunt instruciuni pereche: ele salveaz, respectiv refac adresa de revenire. Pentru ca mecanismul de apel/revenire s funcioneze corect, trebuie ndeplinite condiiile: tipul instruciunii call i tipul instruciunii ret trebuie s coincid (far sau near); registrul sp din momentul execuiei instruciunii ret s aib aceeai valoare ca la intrarea n procedur (sa indice adresa de revenire); adresa de revenire salvat n stiv s nu fi fost modificat de ctre procedur. ncrcarea unora din cele trei condiii de mai sus constituie o eroare frecvent de
50

programare. n astfel de cazuri, funcionarea programului este compromis, deoarece se plaseaz n cs i/sau ip o adres incorect, unde probabil nici nu exist vreun program cu sens. Acest tip de eroare se numete ,,execuie de date, adic procesorul ajunge s execute nu instruciuni cu sens (definite intr-un segment de cod), ci o zon oarecare de memorie (date). Recunoaterea acestei erori este destul de uoar: se blocheaz tastatura, pe ecranul calculatorului apar tot felul de caractere ciudate, difuzorul ncepe s iuie etc. Singura soluie este n acest caz un reset general al calculatorului. Exemplu S se scrie un program ce calculeaz valoarea urmtoarei expresii y= i +16
i =5 10

;5+6+7+8+9+10+16 mov cx,6 mov bx, 0 mov ax,5 m: add bx,ax inc ax loop m add bx, 16 Sarcini de lucru Se va studia exemplul prezentat.

;numrul iteraiilor (10-5+1) ;acumulator pentru rezultat ;valoarea iniial i=5 ;bx=5+6+ ;incrementarea indicelui i ;dac numrul iteraiilor este mai mare ca zero ;salt la eticheta m ;adunm 16 la suma obinut

Se va scrie un program ce calculeaz valoarea urmtoarei expresii folosind proceduri:


1.
15 4

y= i * 6
i =1 7

9.

y= i %2
1

2. y= i 2
i =1

10.y=

i * 2
1

51

3.

y= i %3
i =5 10

17

11.y= 12.y= 13.y= 14.y= 15.y= 16.y=

i + 4
1

i*2 4. y=
i = 8 20

i + 7
1

5.

y= i / 2
i =0 15

i + i / 2
i =5 20 i =3 17

20

i +2 6. y=
i = 1 5

i%2 + i (2 * (i 2))
10 i =2

7.

i *i y=
i = 5 5 1

i =3

8. y= i + 2

((i +1) / 3)

52

Prelucrarea tablourilor simbolice unidimensionale Obiectivele lucrrii Lucrarea urmrete familiarizarea studenilor cu operaiile cu iruri pe bii. Breviar teoretic Instruciunile pe iruri pot opera asupra unor iruri de maxim 64Ko. Instruciunile pot fi precedate de un prefix care permite repetarea lor de ctre partea de hardware, permind prelucrarea rapid a irurilor lungi. O instruciune pe iruri poate avea operand destinaie, operand surs sau amndoi operanzii. Implicit, irul surs se afl n segmentul de date curent. Folosind un prefix de segment, se poate specifica alt segment pentru irul surs. Pentru operandul destinaie, implicit se consider extrasegmentul curent. nainte de nceputul execuiei operaiei se verific tipul de elemente al irului (octei sau cuvinte). Registrul SI (registrul surs index) este folosit ca deplasament pentru a adresa elementul curent al irului surs, iar coninutul registrului DI (registrul destinaie index) este folosit ca deplasament al elementului curent n irul destinaie. Aceste registre trebuie iniializate pentru a adresa irurile sursa/destinaie nainte de execuia instruciunilor lds, les, lea. Instruciunile pe iruri actualizeaz automat registrele SI, DI nainte de prelucrarea urmtorului element al irului. n funcie de valoarea indicatorului de direcie df, registrele de index se autoincrementeaz (df=0) sau se autodecrementeaz (df=1). Dac elementele irului sunt octei, si i di sunt modificai cu 1 dup fiecare operaie sau cu 2 dac elementele sunt cuvinte. Dac se utilizeaz prefixul de repetare, contorul pentru numrul de repetri este inut n registru cx. Dup fiecare instruciune, cx va fi decrementat cu 1. Dac cx=1, instruciunea pe iruri nu se va mai executa i se pred controlul instruciunii urmtoare.

53

Expresiile rep, repe, repz, repne i repnz Expresiile rep, repe, repz, repne, repnz (REPeat, REPeat while Equal, REPeat while Zero, REPeat while Not Equal, REPeat while Not Zero) sunt mnemonice folosite pentru dou forme ale octetului de prefix ale instruciunilor pe iruri. Sunt utilizate mnemonice diferite pentru a mri claritatea programului. Expresia rep este folosit mpreun cu instruciunile movs i stos i este interpretat c repet pan la sfritul irului (cx diferit de 0). Expresiile repe i repz sunt identice i sunt folosite cu instruciunile cmps i scas. n acest caz interpretarea se face cat timp indicatorul zf este poziionat la 1. Expresiile repne i repnz sunt identice, cu deosebirea c repetarea se face ct timp indicatorul zf este poziionat la 0. Instruciunile cu repetare sunt ntreruptibile. Procesorul va recunoate o ntrerupere naintea prelucrrii unui nou element al irului. Instruciunea cld Instruciunea cld (CLear Direction flag) poziioneaz indicatorul de direcie (df) la 0 pentru ca instruciunile pe iruri s autoincrementeze registrele index si i/sau di. Instruciunea cld nu afecteaz ceilali indicatori. Sintaxa: cld Instruciunea std Instruciunea std (SeT Direction flag) poziioneaz indicatorul de direcie (df) la 1 pentru ca instruciunile pe iruri s autodecrementeze registrele index si i/sau di. Instruciunea std nu afecteaz ceilali indicatori. Sintaxa: std Instruciunea movs Instruciunea movs (MOVe String) transfer un octet sau un cuvnt din irul surs (adresat de si) n irul destinaie (adresat de di) i actualizeaz si i di s adreseze urmtorul element al irului. n cazul n care se utilizeaz i un prefix de repetare, instruciunea movs poate fi folosit pentru mutarea unor blocuri de memorie. Sintaxa: movs <ir_destinaie>, <ir_surs>
54

In cazul n care utilizm instruciunea MOVS, asamblorul este cel care detecteaz tipul operanzilor angajai n operaiunea de transfer. Pot fi utilizate i instruciunile fr operanzi movsb, movsw care specific respectiv transfer pe octet , pe cuvnt. Instruciunea cmps Instruciunea cmps (CoMPare String) scade cuvntul (sau octetul) destinaie, adresat de di, din cuvntul (sau octetul) surs, adresat de si. Instruciunea cmps afecteaz indicatorii dar nu altereaz nici un operand i actualizeaz si i di s adreseze urmtorul element. Utilizat mpreun cu prefixele de repetare condiionate, se poate executa pan cnd este satisfcut o anumit condiie. Sintaxa: cmps <ir_destinaie>,< ir_sursa> cmpsb ;comparare pe un octet cmpsw ;comparare pe un cuvnt Instruciunea scas Instruciunea scas (SCAn String) scade elementul din irul destinaie (octet sau cuvnt) adresat de di din coninutul registrului al sau ax, actualizeaz indicatorii, dar nu modific coninutul celor doi operanzi. n urma instruciunii este modificat i di pentru a adresa urmtorul element al irului i sunt actualizai indicatorii af, cf, of, pf, sf, zf pentru a reflecta relaia dintre elementul irului i al (sau ax). Instruciunea scas poate fi utilizat cu prefixele de repetare condiionate pentru a compara elementele irului cu al (sau ax) pan cnd este satisfcut o anumit condiie. Sintaxa: scas ir_sursa scasb scasw Instruciunea lods Instruciunea lods (LOad String) transfer un element (octet sau cuvnt) al irului surs, adresat de si, n registrul al (sau ax) i actualizeaz registrul si pentru a adresa urmtorul element al irului. n cazul instruciunii lods nu are rost folosirea prefixelor de repetare pentru a ncrca registrul al (sau ax) succesiv deoarece se
55

;cutare pe octet ;cutare pe cuvnt

pstreaz de fapt doar ultima valoare. Sintaxa: lods <ir_sursa > lodsb lodsw Instruciunea stos Instruciunea stos (STOre String) transfer un octet sau un cuvnt din registrul al n elementul irului destinaie, adresat de di, i actualizeaz di s adreseze urmtorul element. Utiliznd prefixele de repetare aceast instruciune se poate folosi pentru iniializarea unui ir cu o valoare constant. Sintaxa: stos <ir_destinaie > stosb stosw ;transfer pe octet ;transfer pe cuvnt ;transfer pe octet ;transfer pe cuvnt

Exemplu S se efectueze o comparare lexicografic a dou iruri introduse de la tastatur. S se afieze mesajul Yes, dac irurile coincid i No n caz contrar. .data str1 db 100 dup(?) ;alocarea memoriei pentru primul sir str2 db 100 dup('$') ;alocarea memoriei pentru al doilea sir len1 dw ? len2 dw ? ... .code mov ax,@data ;iniializarea registrelor ds i es mov ds,ax mov es,ax ;introducerea irurilor ;lungimile irurilor introduse sunt pstrate n locaiile de memorie len1 i len2 ... lea di,str2 ;n di adresa irului surs lea si,str1 ;n si adresa irului destinaie ... ;introducerea irului cu ajutorul funcieii 3fh cld ;direcia prelucrrii irului de la stnga la dreapta mov cx, len1
56

cmp cx,len2 ;comparm lungimile irurilor jne no ;dac lungimile nu coincid , salt la eticheta no repe cmpsb ;compararea irurilor jne no ;dac nu coincid , salt la eticheta no ;afiarea mesajului Yes jmp finish no: ; afiarea mesajului No finish: Sarcini de lucru S se nlocuiasc toate literele A cu . 2. S se determine dac irul introdus este un numr ntreg. 3. S se gseasc primul simbol * i s se nlocuiasc cu simbolul #. 4. S se gseasc ultimul simbol ? i s se nlocuiasc cu simbolul !. 5. S se calculeze numrul cuvintelor (cuvintele sunt separate printr-un spaiu). 6. S se elimine spaiile libere de prisos. 7. S se gseasc cuvintele mai lungi dect numrul dat (cuvintele sunt separate printr-un spaiu liber). 8. S se gseasc poziia ultimei virgule i s se nlocuiasc cu primul simbol din ir diferit de spaiu liber. 9. Pentru toate cuvintele ce au terminaia ing s se nlocuiasc cu terminaia ed (cuvintele sunt separate printr-un spaiu liber). 10. S se inlocuiasc toate simbolurile , predecesoare primului simbol + cu simbolul *. 11. S se determine numrul apariiei fiecrei litere ntr-un ir. 12. S se inlocuiasc fiecare punct . cu trei puncte . 13. S se gseasc toate cuvintele n care litera a se ntlnete mai mult de dou ori (cuvintele sunt separate printr-un spaiu liber). 14. S se gseasc toate cuvintele cu lungimea mai mic dect 7 (cuvintele sunt separate printr-un spaiu liber). 15. S se determine dac cuvintele unei propoziii sunt aranjate n ordine alfabetic (cuvintele sunt separate printr-un spaiu liber). 16. S se determine dac cuvntul urmtor ncepe cu ultima liter a cuvntului precedent (cuvintele sunt separate printr-un spaiu liber).
1.

57

Macrodefiniii. Tablouri numerice Obiectivele lucrrii Aceast lucrare are ca scop familiarizarea cu princiipiile de descriere a macroinstruciunilor, nsuirea tehnicii de utilizare a macroinstruciunilor i nsuirea tehnologiilor de prelucrare a tablourilor numerice Breviar teoretic Macrodefiniii Unul dinte mijloacele puternice ale limbajului assembler sunt macrodefiniiile. Macrodefiniie se numete secvena de program cu un nume i care se asambleaz de fiecare dat, cnd asamblorul ntlnete acest nume n program. Macrodefiniia se ncepe cu directiva macro i se termin cu endm. De exemplu: fie descris macrodefiniia putspace, ce afieaz pe ecran simbolul * . putspace macro mov ah,1 mov dl, * int 21h

endm n program cuvntul putspace poate fi folosit ca o instruciune i asamblorul va nlocui fiecare astfel de cuvnt cu cele trei instruciuni ce alctuiesc textul macrodefiniiei. Macrodefiniiile pot avea i parametri, deaceia ndependen de situaie codul introdus va fi puin diferit, de exemplu: change_var macro push push pop pop var1, var2 var1 var2 var1 var2

endm Acum change_var poate fi utilizat pentru schimbarea valorilor a dou locaii de memorie. O alt unealt n descrierea macroinstruciunilor este utilizarea directivelor de asamblare condiionat. Ca exemplu s desciem
58

macrodefiniia de nmulire a

registrului ax cu un numr i dac numrul reprezint puterile lui 2, atunci nmulirea se va efectua prin intermediul unei instruciuni mult mai rapide dect mul, i anume shl - deplasare la stnga. fast_mul if shl elseif shl elseif shl elseif shl else mov mul endif endm Aceast macrodefiniie poate fi scris folofind proprietile deosebite ale instruciunii lea, instruciuni de deplasare i adunare, ns i n aa mod este destul de voluminoas. Problema poate fi soluionat folosind un alt mijloc utilizat n macrodefiniii, i anume blocurile repetitive. fast_mul_1 macronumber i=1 while i le number and i ne 0 if number eq i rept number shl ax,1 endm i=0 else i=i*2 endif endm
59

macro number number eq 2 ax, 1 ;nmulirea cu 2 number eq 4 ax, 2 ; nmulirea cu 4 number eq 8 ax, 3 ; nmulirea cu 8 ... ;analogic pn la: number eq 32768 ax, 15 ; nmulirea cu 32768 dx, number dx ;nmulirea cu numrul care nu reprezint ;puterile lui doi

;pn cnd i number i i 0 ;dac i = number ;nmulirea ax cu 2number ;cu un number ori ;dac nmulirea a fost efectuat, ;anulm i ;dac i number ;obtinem urmtoarea putere a lui doi

if i ne 0 mov dx, number mul dx endif endm Tablouri numerice

; nmulirea cu numrul care nu reprezint ; puterile lui doi

Prin definiie prin tablou nelegem un tip de date structurat ce const dintr-un oarecare numr de elmente de acelai tip. Descrierea i iniializarea tabloului ntr-un program
1.

Elementele tabloului sunt descrise n cmpul de date i sunt separate prin virgul. De exemplu, descrierea tabloului din cinci elemente dimensiunea fiecruia egal cu doi octei este: mas1 dw 1, 2, 3, 4, 5 Utilizare operatorului dup. De exemplu descrierea tabloului din zece elemente dimensiunea fiecruia egal cu doi octei este: mas2 dw 10 dup (?) ;numrul iteraiilor n cx ;indicele elementului iniial n si ;valoarea primului element al tabloului ;nregistrarea elementului n tablou ;trecerea la urmtoarea poziie a tabloului ;incrementarea ax ;urmtoarea iteraie Iniializarea elementelor ntr-un ciclu: mov mov mov mov inc inc loop cx, 5 si, 0 ax,1 mas2[si], ax si ax go

2.

3.

go:

Accesarea elementelor unui tabloului Elementele unui tablou sunt situate n memoria unui calculator n mod succesiv. Pentru a localiza un element este necesar ca s fie adugat unindice la numele tabloului. Indicii unui tablou n limbajul assembler sunt simple adrese. Enumerarea elementelor unui tablou se ncepe de la zero. De exemplu, fie dat urmtorul tablou: mas dw 5, 3, 7, 1, 2
60

Pentru a scrie secvena de program care pune al treilea element cu valoarea - 7 n registru dx, este necesar ca la adresa de baz s adugm deplasamentul 4. mov mov si,4 dx, mas[si]

n general, pentru obinerea adresei unui element din tablou este necesar ca la adresa de nceput (de baz) a tabloului s se adauge produsul dintre indicele elementului i dimensiunea elementului tabloului: baza + indice *dimensiune_element Posibilitatea scalrii a aprut n procesoarele Intel, ncepnd cu modelul i486. Astfel accesul poate fi descris actfel: mov mov si,2 dx, mas[si*2]

Scalarea este efectiv numai atunci, numai cnd dimensiunea unui tablou este 2, 4 sau 8. Dac dimensiunea este alta, atunci accesul se face n mod obinuit. Operaii tipice cu tablouri S analizm un exemplu. ntr-un tablou cu date de tip word s se efectueze compararea elementelor cu zero i s se afieze mesajul corespunztor: .model puts mov lea int endm putch mov mov int endm prolog mov mov endm epilog small macro ah, 9 dx, s 21h macro ah, 2 dl, c 21h macro ax, @data ds, ax macro s ;afiarea unui ir pe ecran

;afiarea unui simbol pe ecran

;iniializarea registrului ds

;ieirea standard din program


61

mov ah, 4ch int 21h endm .stack 64 .data ;nceputul segmentului de date ;textele mesajelor mes1 db Nu este egal cu zero!, 0ah, 0dh, $ mes2 db Este egal cu zero!, 10, 13, $ mes3 db 0ah, 0dh, Elementul $ mas dw 5, 3, 0, 7, 1, 0, 0, 2 ;elementele tabloului .code .486 main: prolog xor ax, ax prepare: mov cx, 8 mov esi, 0 compare: puts mes3 mov dx, si or dl, 30h putch dl mov cmp je not_equal: puts jmp equal: puts next: inc dx, mas[esi*2] dx, 0 equal mes1 next mes2 esi ;anulm ax ;n cx numrul elementelor, numrul iteraiilor ;indicele n esi ;afiarea mesajului pe ecran

;directiva ce permite scalarea i accesarea ;registrelor pe 32 bii

;transformarea cifrei n simbol ;afiarea valorii indicelui ;elementul tabloului n dx ;compararea dx cu 0 ;salt dac egal ; afiarea mesajului pe ecran

;afiarea mesajului pe ecran ;indicele urmtorului element


62

dec cx jcxz exit jmp compare exit: end epilog main

;decrementare cx ;dac cx = 0 salt la exit ;dac cx 0 urmtoarea iteraie

Sarcini de lucru Fie v[m] un tablou numeric unidimensional. S se calculeze numrul elementelor pozitive i numrul elementelor negative 2. Fie A o matrice numeric de dimensiune m n. S se creeze un vector de dimensiune m format din elementele minimale a fiecrei linii. 3. Fie A o matrice numeric de dimensiune m n. S se creeze un vector de dimensiune n format din elementele maximale a fiecrei coloane. 4. Fie A o matrice numeric de dimensiune m n. S se gseasc elementele minimale a fiecrei linii i s se amplaseze n prima coloan, iar elementele primei coloane n locul elementelor minimale. 5. Fie A o matrice numeric de dimensiune m n. S se gseasc elementele maximale a fiecrei coloane i s se amplaseze n prima linie, iar elementele primei liniii n locul elementelor maximale. 6. Fie v[m] un tablou numeric unidimensional. S se calculeze numrul apariieii elementului maximal. 7. Fie A o matrice de dimensiune m n. S se determine indicele k pentru care linia k coincide cu coloana k. 8. Fie A o matrice numeric de dimensiune m n. S se determine coloana din elemente mai mici egale ca modul dect numrul a dat. 9. Fie v[m] un tablou numeric unidimensional. S se gseasc elementul minimal dintrte cele pozitive i elementul maximal dintre cele negative. 10. Fie A o matrice de dimensiune m n. S se construiasc vectorul v elementele cruia sunt calculate dup formula: vi=ai,0+ai,n-1, unde i=0,1,,m1. 11. Fie A o matrice de dimensiune m n. S se construiasc vectorul v elementele cruia sunt calculate dup formula: vj=a0,j+am-1,j, unde j=0,1,,n1 12. Fie A o matrice numeric de dimensiune n n. S se construiasc un vector v elementele cruia reprezint suma elementelor fiecrei linii. 13. Fie A o matrice numeric de dimensiune n n. S se construiasc un vector v elementele cruia reprezint suma elementelor fiecrei coloane.
1. 63

14. Fie

A o matrice numeric de dimensiune n n. S se creeze matricea B de dimensiune n n elementele creia sunt determinate de regulile Bi,j= 1
0, dac ai , j > 0 n caz contrar

15. Fie

A o matrice numeric de dimensiune m n i vectorul v de dimensiunea n. S se nmuleasc matricea A cu vectorul v. 16. Fie A i B dou matrici numerice de dimensiune n n. S se nmuleasc matricea A matricea B.

64

Tipuri de date complexe: structuri i nregistrri Obiectivele lucrrii Aceast lucrare are ca scop familiarizarea i nsuirea descrierii tipurilor de date complexe, nsuirea posibilitilor a variabilelor de acest tip i formarea abilitilor de utilizare a lor Breviar teoretic Structuri Formatul unei structuri: <nume_struct> struc ;descrierea cmpurilor (succesiune de directive de definire a datelor, ;pot fi i valori iniiale) <nume_struct> De exemplu: worker struc name db 30 dup (" ") sex db "m" position db 30 dup (" ") age db 2 dup (" ") standing db 2 dup (" ") salary db 4 dup (" ") birthdate db 8 dup (" ") worker ends ;informaie despre colaborator ;nume, prenume ;sexul ;funcia ;vrsta ;stajiu ;salariul n lei ;ziua de natere ends

Denumirile cmpurilor trebuie s fie unice n cadrul unui fiier surs. Pentru alocarea i iniializarea de structuri se utilizeaz urmtoarea form: <nume_var> <nume_struct> <lista _valori> unde nume_var este un identificator de variabil a structurii date, iar lista _valori este lista valorilor iniiale a valorilor elementelor structurii separate prin virgule. Dac lista este completat parial, atunci toate cmpurile structurii pentru variabila dat se iniializeaz cu valorile definite iniial. Cmpurile ce vor lua valori iniiale din structur se completeaz cu virgule. Dac nu sunt definite valori iniiale este necesar de a indica paranteze triunghiulare < >.
65

Exemple: ;toate cmpurile sunt definite sotr1 worker <"Josan Natalia", 'f', 'programist', '30', '10', '1680', '27.10.58'> ;cmpul sexul este iniializat cu valoarea iniial sotr2 worker sotr3 worker <"Stepanov Iurii ", , 'inginer', '38', '20', '1750', '01.01.58'> <> ;toate cmpurile sunt iniializate cu valorile definite iniial Accesarea elementelor unei structuri Pentru a accesa un cmp al unei variabile de tip structur se folosete operatorul .: adresa_var.nume_cmp_struct unde adresa_var este un identificator al unei variabile de tip structur sau o adres ce indic aceast zon de memorie, iar nume_cmp_struct este un nume de cmp din structur. Exemplu: mov al, sotrl.age nregistrri Descrierea unei nregistrri are urmtoarea form sintactic: <nume_inreg> record <descrierea_elementelor> De exemplu rec record i1:1, i2:2=i1, i3:1, i4:2=11, i5:2=00 sau rec record { i1:1 i2:2=11 i3:1 i4:2=11 i5:2=00 } Dup semnul = se situiaz un numr cu valoare implicit reprezentat n form binar. S definim un exemplar de nregistrare
66

;n registru al valoarea cmpului age (variabila sotr1)

rec record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00 flag rec ? ;semnul ? este folosit n cazul cnd cmpurile ;nu trebuie iniializate Valorile implicite pot fi accepte astfel: rec record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00 flag rec <> ;acceptarea valorilor implicite Modificarea valorii cmpului i2 se realizeaz astfel: rec record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00 flag rec <,10,> ;modificarea i2 Folosind parantezele figurate poate fi efectuat iniializarea cmpurilor alese. Cmpurile valorile crora nu trebuie modificate pot fi ignorate: rec record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00 flag rec {i2=10} ;modificarea i2, fr evidenierea ordinii celorlalte ;componente ale inregistrrii Accesarea elementelor unei nregistrri Operatorul width se folosete pentru a determina dimensiunea cmpului unei nregistrri sau dimensiunea total a unei nregistrri: width <nume_cmp_nregistrare> valoarea operatorului va indica dimensiunea cmpului nregistrrii; width <nume_exemplar_nregistrare> sau width <nume_tip_nregistrare> valoarea operatorului va indica dimensiunea nregistrrii. De exemplu: mov al, width i2 mov ax, width rec Operatorul mask se folosete pentru localizarea biilor unui cmp al nregistrrii. De exemplu: mov ax, mask i3 Reprezentarea lui ax este urmtoarea: i1 i2 i3 i4 i5 0 0 1 0 00
67

0 0 Pentru evidenierea unui element al unei nregistrri este necesar de a realiza urmtorii pai:
1. 2. 3. 4.

S se ncarce nregistrarea ntr-un registru. S se obin masca elementului corespunztor prin intermediul mask. S se localizeze biii n registru folosind masca i instruciunea and. S se deplaseze biii elementului spre biii inferiori ai registrului folosind instruciune shr. Numrul contorului pentru deplasare se obine folosind numele elementului nregistrrii.

n rezultatul acestor aciuni elementul nregistrrii va fi localizar la nceputul registrului i pot fi efectuate diferite aciuni asupra lui. Localizarea cmpului n nregistrare se realizeaz astfel: 1. S se deplaseze la stnga toi biii elementului nregistrrii, folosind numele elementului nregistrrii n calitate de contor.
2.

S se pregteasc nregistrarea iniial pentru inserarea elementului anulnd biii din locul elementului folosind instruciunea and i masca inversat a elementului. S se iniializeze valoarea registrului cu nregistrarea iniial cu ajutorul instruciunii or.

3.

4. .model small .stack 256 rec record i1:1,i2:2=11.i3:1,i4:2=11,i5:2=00 .data flag rec <> .code main: ; i4 mov al, rec ; flag al mov bl, mask i4 ; bl i4 and al, bl ; i4
68

shr al, width i5 ; i5 ; i4 shl al, width i5 ; i4 mov bl, [flag] ; flag bl mov cl, mask i4 ; cl i4 notcl ; and bl, cl ; i4 or bl, al ; rec i4 mov [flag], bl ; flag SETFIELD : SETFIELD __ , _ GETFIELD : GETFIELD __ _, : .model small .stack 256 rec record 11:1,12:2=11,13:1,14:2=11,15:2=00 .data flag rec <> .code main: mov ax,@data ; ds mov ds, ax ; mov mov setfield xor getfield al, flag bl,3 i5 al, bl bl,bl i5 bl, al ; flag al ; 3 bl ; i5 3 bl ; bl ; bl i5
69

mov setfield

bl, 1 i4 al, bl

; 1 bl ; i4 1 bl

70

TABELUL CODURILOR ASCII

71

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