Sunteți pe pagina 1din 19

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 Informaia elementar se mai 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 . Informaia, modelat i manipulat de calculator, va fi deci un ir de cifre binare. Reprezentarea sa se va face codificat. 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. Astfel, putem s privim octetul ca o molecul de informaie. Molecula 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 aceste molecule se va construi informaia: texte, numere, imagini grafice, sunete, . 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: 1Kbyte = 1 Koctet= 210 octei= 1024 octei 1Moctet = 210 octei= 1 Koctet= 1024 Koctei=220 octei 1Goctet =210 Moctei=220 Koctei ==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 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), Dzecimal (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. Exist i alte moduri de notare, cum ar fi scrierea la sfritul numrului n parantez a bazei, de exemplu: 100101001(2), sau 17A6B(16). 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 + + C 2 * b2 + C 1 * b1+ C 0 * b0 + D1 * b-1 + D2 * b 2 + D3 * b 3 + Exemple Exemple de numere binare:

11(2), 1100011(2)
Dezvoltarea acestor numere dup puterile bazei este :

11(2) =1*2 +1*2 =3; 11100011(2) = 1*27+1*26+1*25+0*24+0*23+0*22+1*21+1*20= 227.


1 0

Exemple de numere octale:

11(8), 210(8)
Dezvoltarea acestor numere dup puterile bazei este :

11(8) = 1*81+1*80 = 9; 210(8) =2*8 +1*8 +0*8 =136;


2 1 0

Exemple de numere hexazecimale:

11(16), CA0(16)
Dezvoltarea acestor numere dup puterile bazei este :

11(16) = 1*16 +1*16 =17; 2 1 0CA0(16)= C*16 +A*16 +0*160= 3232


Observm c un numr se poate reprezenta n mai multe moduri, n funcie de baza sistemului de numeraie ales. Astfel, numrul 12 din sistemul de numeraie zecimal va fi: 1100 - sistemul de numeraie binar, 14 - sistemul de numeraie octal, C - sistemul de numeraie hexazecimal. 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. 67= 64+2+1=26+21+20 deci pe poziiile unde avem 2 la putere vor vi uniti, iar pe celelalte poziii (unde nu avem 2 la putere) vor fi zerouri, adic (67)10=(01000011)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]. De exemplu, reprezentarea numerelor +55 i -55 pe 8 poziii binare este +55=(00110111)2 i -55=(10110111)2 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 [-2 n-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 =(01000001)2 (10111110) 2 n cod invers (10111111) 2 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 mici. 2

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 ntr-un 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 (offsetul), 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 Prima definiie este echivalent cu : var_a db 0, 1, 1, 1, 0, 1, 1, 1 Variabilele pot fi utilizate ca : variabile simple - var_a, var_b; variabile indexate - var_a [bx], var_b [2], ALFA [si][bx] In cazul variabilelor indexate, trebuie inut seama de tipul variabilei de baz. De exemplu, in urma definiiei tabloului : B dw 10 dup(?) expresiile indexate corecte din punct de vedere logic, care acceseaz elementele lui B, sunt B[0], B[2] etc. Din punct de vedere sintactic, putem scrie i : mov ax, B [1] dar aceast form va ncrca in AL partea high a primului cuvnt din tablou i in AH partea low a celui de-al doilea cuvnt din tabloul B. Exemplu Fie dat urmtoarea consecutivitate de operatori m1 db 4,5,1,6 ; 4 octei m2 db xzyqw ; 5 octei m3 dw 12 dup(?) ;24 octei m4 dd 345h, 234h ;8 octei Numrul octeilor rezervai pentru aceast consecutivitate de operatori este 41. Iar adresa locaiei m3 este 0009.

Sarcini de lucru 1. Transformai n sistemul binar, octal i hexazecimal numerele zecimale: 8; 29; 32; 41; 81; 89; 45; 28; 65; 40; 39; 37; 47; 49; 26,9. 2. Transformai n sistemul binar numerele hexazecimale: FFF; A45; 12C; 56B; 7C; 72EB; 31DB; 34A; 6AB; 9AD; 31EF; 5AAB; 214; 4CD; 89F; FE2. 3. Determinai reprezentarea numerelor naturale 94; 5; 41; 83; 38; 32; 40; 65; 20; 23; 9; 63; 96; 80; 64; 47 n MO. 4. Reprezentai n cod complementar pe 8 poziii binare urmtoarele numere:
1) 5) 9) 13) -42;-31; -113 -52;-41; -93 -12;-38; -118 -11;-43; -67 2) 6) 10) 14) -46;-35; -119 -66;-25;-110 -17;-63;-128 -13;-69;-88 3) 7) 11) 15) -49; -30;-103 -19;-53-101 -34; -50;-107 -14;-70;-99 4) 8) 12) 16) -29;-37; -97; -21;-87; -98. -28;-45; -130. -15;-72;-100

5. Fie dat urmtoarea consecutivitate de operatori:


1) a b c d 3) a b c d 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 db db db dw db db db dw db db db dw 45,16 5 dup (?),10,13,$ 55 dup(0) 34567h 12) 78, 34, 67 Rezultat, $, 16 dup (0), $, 10, 13 -68, 46h, 7 dup(0) 24,76,-56 abc, 11101b 45, 4 dup(?) 4 dup(0),8,3 87, 45h,-9 10 dup(?), test_1$ 4 dup (0),2,7 a b c d 14) a b c d 16) a b c d db db dw dd db db dw dd db db dw dd 73,74,75,77,78,-67 15 dup (?), 10,13 5 dup( ), $ 777h testul_nr_2,13,10 -18,-22,18h, 2 dup (0), 81, -16,44,18 568ABh Matematica,10,13 10,20h, 2 dup (0), 60, 30, -10,-20,-50 56789Bh db db dw dd 35,53 10 dup ( ), 10,13, $ 5 dup(0) 555h 10) a b c db db db 76, 87, 92, 45h 20 dup($), 10, 13 db db dw dd lucrarea_1,10,13 2 dup (0), 38, -15,78,41,12 678EFh, 3489, 456 8) a b c d db db dw dw 34, 6,3,-8,-2 Hello, $, 6 dup (0), $, 10, 13 -68, 46h, 7 dup(0) db db dw dd Salut,10,13 -16,-20,13h, 2 dup (0), 62, 34, -15 456C9h, 4567 6) a b c d db db dw dw 12, 24,sss ab, -8, 23h, 6 dup (0), 45 -7, 5 dup(0) db db dw dd 45,16,76,-6 abcd 15 dup(0),3,3 345h 4) a b c d db db db dw 92, 45h,90,-54,-67 10 dup($), 10, 13 amdto,10,13,$ 5 dup (?),7,-80h 2) a b c d db db db dw 2, 24 aaa, -8, 23h, 11101b 6 dup (0), 45, 6 -7, 4Dh, 8 dup(0)

dw

qwert 10 dup (0)

a) Determinai ci octei va rezerva aceast consecutivitate de operatori. b) Determinai adresa locaiei de memorie c. 4

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 a. Etapele de elaborare a unui program 1. Elaborarea fiierului surs. 2. Asamblarea fiierului surs (obinerea codului obiect). 3. Editarea de legturi(obinerea fiierului executabil). 4. 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 de 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 b. Microsoft Masm prog1.asm Masm myLib.inc Link prog1.obj Link myLib.obj Borland Tasm prog1.asm Tasm myLib.inc Tlink prog1.obj Tlink myLib.obj

Structura general a unui program 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 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.
5

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. Literele majuscule nu se deosebesc de cele minuscule. nregistrrile de tipul mov ah, 9 i MOV AH, 9 sunt analizate de asamblor 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 .model small .stack 100 .data .code .startup end ;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

Structura unui program n stil tasm sstack segment para stack stack db 100 dup (?) 32 cuvinte sstack ends sdata segment para data de definire sdata ends scode segment para code assume cs:scode,ds:sdata start: scode ends end start ; definirea segmentului de stiv ; spaiu pentru stiv, nu mai puin de ; sfritul segmentului de stiv ; definirea segmentului de date ; definirea datelor prin directive

; 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

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 - 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 ; masm mov ds, ax sau mov ax, sdata ; tasm mov ds, ax Sarcini de lucru 1. S se studieze structura unui program Assembler i cerinele de baz fa de program. 2. S se elaboreze programul ce afieaz la consol irul Hello World n stilurile masm i tasm. a) S se defineasc 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) S se afieze irul la consol prin intermediul funciei 9 ( ntreruperea 21h) mov ah, 9 mov dx, offset hi int 21h d) S se finiseze 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. Dac fiierul surs are denumirea myLab1.asm, atunci listing-ul programului poate fi obinut prin comanda: tasm myLab1.asm,, Fierul myLab1.LST este fiierul ce se va obine. 4. Analizai structura listingul-ui.

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 datele crora sunt introduse de la tastatur prin afiarea rezultatului la consol, familiarizarea cu modurile de adresare a operanzilor MP i8088 i depanarea programelor cu ajutorul debbug-erelor interactive. 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 ex., mov ax,cx ; coninutul registrului cx se ncarc n registrul ax Al doilea operand n adresarea imediat poate fi o constant pe 8 bii sau 16 bii. De ex., 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 cadrul segmentului respectiv. Adresa de segment i adresa efectiva formeaz adresa fizica conform urmtorului mecanism: 19 adresa de segment 15 Deplasament 19 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 ex., mov ax,table ; se ncarc coninutul locaiei de memorie cu eticheta table n registrul ax 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 ex., mov ax,[bx] ; se ncarc n registrul ax coninutul 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. 8 4 3 0 0 0 0 0 0 0

De ex., mov bx,offset table ; se 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 ; se ncarc n registrul ax coninutul locaiei de memorie de la adresa ; indicat mov ax,[bx+4]; ; de registrul bx plus patru octei mov ax,4[bx] 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 utilizat la accesarea elementelor unui tablou cnd deplasamentul indic nceputul tabloului, iar registrul indice - un element. De ex., 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 ex. 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(nafar 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 ; coninutul registrului dx se transfer n locaia de memorie din segmentul es cu deplasamentul indicat de registrul bx. 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: 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 11 CurrentLehgth db ? ;semnul ? semnific c valoarea locaiei de memorie Buffer db 11 DUP(?) ; nu este definit Apelul funcie 0Ah se efectueaz astfel: mov ah, 0ah ;numrul funciei se ncarc n registrul ah mov dx, offset sir ;n dx se ncarc adresa de nceput a spaiului de memorie definit ; pentru introducerea datelor sau ;mov dx, offset MaxLength n al doilea caz int 21h ; apelul ntreruperii

Exemplu S 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. sstack segment para stack stack db 100 dup(?) ;definirea segmentului de stiv sstack ends sdata segment para data ; definirea segmentului de date message db enter the string:, 10, 13, $ ;mesaj ;urmtoarele 3 rnduri definesc spaiul de memorie pentru introducerea unui ir de la tastatur prin ;intermediul funciei 10 ( ntreruperea 21h) maxlength db 11 ;lungimea maximal a lungimii irului, ;ultimul simbol va fi simbolul cu codul 13 ; (codul tastei Enter) curlength db ? ;numrul simbolurilor introduse fr codul Enter s1 db 11 dup(?) ;buffer-ul n care vor fi amplasate datele ; introduse s2 db 3 DUP(?) ;doi baii pentru simboluri i unul pentru simbolul ;$ indicator pentru sfritul irului new_line db 10,13,$ ;codurile tastei Enter sdata ends scode start: mov mov mov mov int mov lea int mov mov mov mov mov mov mov mov mov mov int mov mov int mov mov int ax, sdata ds, ax ah, 9 dx, offset message 21h ah, 0ah dx, maxlength 21h al, s1 s2, al bl, curlength bh, 0 al, s1 [bx 1] s2 + 1,al s2 +2, $ s1[bx], $ ah, 9 dx, offset s1 21h ah, 9 dx, offset new_line 21h ah, 9 dx, offset s2 21h ;iniializarea registrului ds ;afiarea mesajului segment para code assume ds:sdata, ss:sstack, cs:scode

;introducerea irului s1

;copiaz primul simbol din s1 n irul s2 ; prin intermediul registrului al ;n bx- numrul simbolurilor introduse ;copiaz ultimul simbol din s1 n s2 ;pe a doua poziie prin al ;$ la sfritul irului s2 ;simbolul Enter se schimb n $ ;afiarea ;s1 ;la consol ; afiarea ;new_line ; la consol ; afiarea :s2 ; la consol 10

mov mov int mov int ends end

ah, 9 dx, offset new_line 21h ah, 4ch 21h start

; afiarea ;new_line ; la consol

;sfrit de program ;sfritul segmentului de cod ;sfrit start

scode

Sarcini 1. S se scrie un program n limbaj de asamblare conform variantelor de mai jos. 2. S se depaneze programul prin debugger-ul TD. 3. S se efectueze trasarea pas cu pas imprimnd la fiecare pas coninutul segmentului de date. 4. S se analizeze modificrile registrului ip i a segmentului de date pas cu pas n execuia programului. Probleme propuse pentru rezolvare: 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 2 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 3 ori consecutiv. S se afieze la consol ambele iruri. 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.

11

Instruciuni de transfer. Introducerea i afiarea unui ir prin intermediul 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: mov <destinaie>, <surs> Exemple: mov ax , table ; transfer din memorie n registru mov table , ax ; transfer din registru n memorie mov cl , 25 ; transfer n registrul l valoarea 25 Incorect ar fi dac: sursa i destinaia ar fi ambele operanzi n memorie; ar fi folosite registrele flags i ip; 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 Copiaz adresa efectiv a operandului (offset-ului n cadrul segmentului) n registrul general specificat. Sintaxa: lea <registru>, <locaie de memorie> Exemplu: lea bx,table[di] ; dac registrul di conine valoarea 5, atunci n ; registrul bx va fi transferat adresa efectiv a locaiei de memorie ; table+5 n segmentul, adresat ; de valoarea registrului ds

Instruciunile push i pop

12

Instruciunea push transfer n vrful stivei coninutul registrului sau locaiei de memorie cu dimensiunea de un cuvnt. Sintaxa: push <surs> 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: pop <destinaie> 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. 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 coninutul registrului de indicatori flags. Sintaxa: pushf Instruciunea popf extrage din vrful stivei un cuvnt i l transfer n registrul de indicatori flags. Sintaxa: popf Funcia 3Fh 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 sir db 12 dup(?) Apelul funciei 3fh se efectueaz n felul urmtor: mov ah, 3fh ;numrul funciei se pune n registrul ah lea dx, sir ;adresa bufferul-ui se pune n registrul dx. ;poate fi nlocuit cu mov dx, offset sir mov bx, 0 ;n bx numr logic mov cx, 12 ;n cx numrul simbolurilor introduse + 2 pentru codul lui Enter int 21h ;apel de ntrerupere
13

Dup execuia acestei funcii n registrul ax se pstreaz numrul simbolurilor introduse plus doi pentru codul lui Enter. Funcia 40h afieaz un ir la consol. Apelul funciei se efectueaz astfel: mov ah, 40h ; numrul funciei se pune n registrul ah lea dx, sir ; adresa buffer-ului se pune n registrul dx mov bx, 1 ; n BX numr logic mov cx, 10 ; n cx numrul simbolurilor ce trebuie afiate int 21h ;apel de ntrerupere 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 coninutul segmentului de date. S se analizeze modificrile indicatorului vrfului stivei SP, indicatorului de adrese IP i a segmentului de date la fiecare pas de execuie a programului.

14

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 Programul surs trebuie s nceap cu pseudoinstruciunea ORG 100H pentru a rezerva spaiu de memorie pentru cod, stiva, 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 ah. Model pentru programele de tip .com .model tiny .code org 100h ; nceputul fiierului com start: jmp label ; definire zonei de date label: ;instruciunile programului mov ah,4ch int 21h ; ieire n sistemul de operare end start 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 exe - este formatul uzual pentru fiiere executabile sub 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. Model pentru programe de tip .EXE vezi n lucrarea de laborator 2. Funcii de introducere/afiare a unui simbol Apelul funciei 01h pentru introducerea unui simbol de la tastatur prin intermediul ntreruperii 21h se efectueaz astfel: mov ah, 01h ;numrul funciei se ncarc n registrul ah int 21h ;apelul ntreruperii, codul simbolului introdus se ncarc n ; registrul al Afiarea se efectueaz cu ajutorul funciei 02h astfel: mov ah, 02h ; numrul funciei se ncarc n registrul ah mov dl, <cod> ; codul simbolului ce trebuie afiat se ncarc n registrul dl
15

int 21h

; apelul ntreruperii

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 coninutul locaiei de memorie sa 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 mov ax,@data mov ds,ax ; iniializarea registrului ds mov ah,9 ;afiarea primului mesaj lea dx,mes1 int 21h mov ah, 1 ;introducerea simbolului int 21h ; n al codul simbolului introdus mov s,al ;salvarea codului simbolului introdus n locaia s mov ah,9 ;afiarea mesajului al doilea lea dx,mes2 int 21h mov ah, 2 ;afiarea la consol a simbolului introdus mov dl,s int 21h mov ah, 4ch ; sfarit de program int 21h end 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: mov ah,9 lea dx,mes1 int 21h mov ah, 1 int 21h mov s,al mov ah,9 lea dx,mes2 int 21h mov ah, 2 mov dl,s int 21h mov ah, 4ch
16

int 21h 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 coninutul regitrilor i al memoriei. Se va rescrie programul n format .EXE i se va depana.
1. Este definit irul

2.

3.

4.

5.

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) 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:
17

s3 Rezultatul obtinut s1a1bba3a2a2bbs2bbs3 (b spaiu liber) 6. 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) 7. 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 Introduceti simbolul a1: a1 Rezultatul obtinut: a1bs2a1s1bbba1bs3 (b spaiu liber)

18

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: s3 Introduceti simbolul a2: a2 Rezultatul obtinut: a1bs2a1s3bbs1ba2 (b spaiu liber)

19