Sursa: Radu Lupsa, UBB Cluj-Napoca (Documentatie veche, 2!" http:##$$$%cs%u&&cluj%ro#'rlupsa#edu#ac#doc# (ai intai, cum scriem un pro)ram in lim&aj de asam&lare* +ro)ramul se va scrie intr-un ,isier te-t cu e-tensia asm% Un e-emplu minimal: arit1.asm DATA segment a db 20 ; 20 = 14h b db 16 ; 16 = 10h c db 30h ; 48 = 30h s_ab db 0 ; aici vom pne a!b s_abc db 0 ; aici vom pne a!b!c _DATA ends _T"#T segment assme cs$_T"#T assme ds$_DATA start$ ; de aici incepe e%ectia program&i mov a%' _DATA ; incarcam in ds adresa de segment a segment&i mov ds' a% ; de date. ( ptem )ace direct *mov ds' _DATA ; n are operan+i compatibi&i *vom vedea mai ; tar+i de ce. ; de aici incepe program& propri,+is mov a&' a add a&' b mov s_ab' a& ; a&=s_ab=a!b add a&' c mov s_abc' a& ; a&=s_abc=a!b!c ; terminam e%ectia program&i mov a%' 4-00h int 21h _T"#T ends _.TA-/ segment stac0 db 100 dp*23 _.TA-/ ends end start ; aici marcam pnct& d intrare in progrm .............. +entru /compilare/ veti da comen0ile tasm 4+i nume urmata de t&in0 4v nume Important! !% Numele pro)ramului se va da ,ara e-tensie% 2% 1-ecuta&ilele tasm si t&in0 se )asesc in acelasi loc cu mediul 2ur&o +ascal sau Borland C33 Re0ultatul celor doua comen0i de mai sus este un pro)ram e-ecuta&il (.e%e"% Depanarea pro)ramelor scrise in asam&lare (si pentru inceput, chiar urmarirea e-ecutiei lor" se ,ace cu ajutorul pro)ramului 2ur&o De&u))er% Comanda este: td nume Urmarirea pro)ramului cu 2ur&o De&u))er se va ,ace in ,ereastra C+U (se deschide din meniul 4ie$5C+U"% 6ici avem continutul re)istrilor si ,la)urilor procesorului pro)ramul ce se e-ecuta% 6cesta este pre0entat atat in lim&aj de asam&lare cat si direct in cod masina (adica, octet cu octet, continutul memoriei" continutul se)mentului de date (in he-a" continutul stivei +utem po0itiona 0ona vi0i&ila din pro)ram, 0ona de date si stiva ,olosind comanda Go to din meniul local al ,erestrei (meniul activat cu Alt-F10"% De asemenea, putem a,la sau modi,ica valoarea unei varia&ile, ,olosind ,ereastra de dialo) Evaluate/Modify (deschisa cu Ctrl-F4" Exercitii !% 7enerati pro)ram e-ecuta&il din sursa pre0entata in aceasta pa)ina 2% Urmariti pas cu pas e-ecutia pro)ramului (in 2ur&o De&u))er"% Urmariti continutul re)istrelor a% si ip in acest timp% 8% 2ot in e-ecutia pas cu pas a pro)ramului, urmariti continutul se)mentului de date% +entru aceasta, activati (cu Shift-sageata jos" 0ona de date a ,erestrei C+U, activatati meniul local (Alt-F10" si dati comanda Go to% 9n ,ereastra ce se deschide, dati ds$0% Urmariti primii octeti din se)mentul de date pe parcursul e-ecutiei pro)ramului% :% +o0itionati a,isarea 0onei de date pe cs$0 Comparati cu ceea ce se a,isea0a in 0ona de cod% ;% (odi,icati pro)ramul in asa ,el incat varia&ilele sa ,ie repre0entate pe !< &iti si initiali0ati-le cu valori mai mari (de ordinul !"% Repetati e-ercitiile !-:% <% 6celasi lucru acum (e-ercitiile !-:" pentru pro)ramul arit2.asm% Ce )reseala o&servati* Corectati-o% _DATA segment a dd 400 b dd 100000 c d5 61130 s_ab dd 0 ; aici vom pne a!b s_abc dd 0 ; aici vom pne a!b!c _DATA ends _T"#T segment start$ ; de aici incepe e%ectia program&i mov b%' _DATA ; incarcam in ds adresa de segment a segment&i mov ds' b% ; de date. ( ptem )ace direct *mov ds' _DATA ; n are operan+i compatibi&i *vom vedea mai ; tar+i de ce. ; de aici incepe program& propri,+is mov c%' 5ord ptr a add c%' 5ord ptr b add b%' 5ord ptr b!2 mov 5ord ptr s_ab' c% mov 5ord ptr s_ab!2' b% ; b%$c%=s_ab=a!b mov a%' c c5d add c%' a% adc b%' d% mov 5ord ptr s_abc' b% ; b%$c%=s_abc=a!b!c mov 5ord ptr s_abc!2' c% ; terminam e%ectia program&i mov a%' 4-00h int 21h _T"#T ends _.TA-/ segment stac0 db 100 dp*23 _.TA-/ ends end start ; aici marcam pnct& d intrare in progrm Evaluarea expresiilor aritmetice 9nstructiuni ,olosite (a se vedea Norton 7uide pentru detalii": mov, add, sb, cb5, c5d, adc, sbb, m&, im&, div, idiv% Re)istrii de = &iti: ah, a&, bh, b&, ch, c&, dh, d&% Re)istrii de !< &iti: a%, b%, c%, d%, si, di% Atentie! Re)istrul a% este ,ormat prin ju-tapunerea re)istrilor ah si a&% 6sta inseamna ca modi,icarea continutului unuia din re)istrii ah sau a& conduce la modi,icarea &itilor corespun0atori din a% si reciproc% De e-emplu, in urma instructiunilor mov a&' 10 ;10 = 0Ah mov ah' 1 re)istrul a% va contine valoarea 2<< (!6h"% Declaratii de date: db (! octet . = &iti", d5 (2 octeti . !< &iti", dd (: octeti . 82 &iti"% Adunari si scaderi +utem ,olosi oricare dintre re)istrii numiti mai sus, precum si varia&ile au-iliare% 1-emplu: sa se evalue0e e-presia r!a"#$-!%"d$-!e"&0$ unde toate veria&ilele sunt repre0entate pe !< &iti cu semn% 'e(olvare Date: a d5 1000 b d5 100 c d5 20 d d5 300 e d5 ,300 r d5 2 Cod: mov a%' a add a%' b ; a% = a!b mov si' c add si' d ; si = c!d sb a%' si ; a% = *a!b3 , *c!d3 mov si' e add si' 20 ; si = e!20 sb a%' si ; a% = *a!b3 , *c!d3 ,*e!203 mov r' a% Aritmetica pe 32 de biti Daca avem de adunat#sca0ut numere repre0entate pe 82 de &iti (sau mai multi", nu avem instructiune de adunare#scadere corespun0atoare% 9n scopul e,ectuarii operatiei, vom aduna cate o /,elie/ de !< &iti o data% 6st,el, vom aduna cei !< &iti mai putin semni,icativi din cei doi operan0i, apoi vom aduna cei !< &iti mai semni,icativi din cei doi operan0i impreuna cu transportul de la /,elia/ anterioara% > a doua pro&lema ce apare este ,aptul ca nu putem trans,era 82 de &iti o data% ?ie urmatorul e-emplu: sa se calcule0e ra"#, unde r, a si & sunt repre0entate pe 82 de &iti% 'e(olvare Date: a dd 1000000 b dd 100000 r dd 2 Cod: mov a%' 5ord ptr a mov d%' 5ord ptr a !2 add a%' 5ord ptr b adc d%' 5ord ptr b!2 mov 5ord ptr r' a% mov 5ord ptr r!2' d% Constructii ,olosite: 5ord ptr a desemnea0a un o&iect din memorie, de 2 octeti (5ord" de la adresa lui a (ptr a"% 6cestia sunt de ,apt cei mai putin semni,icativi !< &iti din componenta lui a% 5ord ptr a!2 desemnea0a un o&iect din memorie, tot de 2 octeti (5ord" de la adresa e)ala cu adresa lui a plus 2 (ptr a !2"% 6cestia sunt octetii al treilea si al patrulea din componenta lui a, adica cei mai semni,icativi !< &iti% instructiunea add are ca e,ect retinerea transportului in &ista&ilul C? (carr@ ,la)"% instructiunea adc aduna oeran0ii plus valoarea lui C?% De asemenea, noul transport )enerat in urma adunarii este scris in C?% Exercitii !% Calculati suma ra"#, adunand doar cate = &iti o data% 2% Calculati ra"#-%-&0, r, a,& si c ,iind repre0entate pe 82 de &iti cu semn% Conversii de lungime Daca operan0ii pentru adunare si scadere nu au lun)imile e)ale este necesara modi,icarea lun)imii repre0entarii cel putin pentru unul dintre ei% Lun)irea repre0entarii pentru intre)ii cu semn se ,ace cu ajutorul instructiunilor cb5 si c5d% Lun)irea repre0entarilor pentru numere ,ara semn se ,ace prin completare cu 0erouri% Exemple !% ra-#, r si a ,iind repre0entate pe !< de &iti cu semn, iar & pe = &iti cu semn 'e(olvare Date: a d5 2000 b db ,4 r d5 2 Cod: mov a&' b cb5 ; a% = b mov si' a sb si' a% ; si = a,b mov r' si 2% ra"#, r si & ,iind pe !< &iti ,ara semn, iar a pe = &iti ,ara semn% 'e(olvare Date: a d5 2000 b db 4 r d5 2 Cod: mov a&' b mov ah' 0 ; a% = b add a%' b ; a% = a!b mov r' a% Exercitii !% Calculati ra"#-%, unde r si & sunt pe 82 de &iti cu semn, a este pe !< &iti cu semn, iar c este pe = &iti cu semn% 2% Ca la e-ercitiul precedent, dar numerele sunt repre0entate ,ara semn% Inmultiri si impartiri 2re&uie avute in vedere restrictiile de lun)ime, re)istrii speci,ici pentru unii operan0i, precum si di,erenta intre instructiunile pentru numere repre0entate cu semn (im& si idiv" si ,ara semn (m& si div"% Exemplu Sa se evalue0e r!a-#)%$/d, unde a, #, %, d, r vor ,i repre0entate pe !< &iti cu semn% 'e(olvare Date a d5 1000 b d5 ,100 c d5 30000 d d5 10000 r d5 2 Cod mov a%' b im& c ; d%$a% = b6c mov b%' d% mov c%' a% ; b%$c% = b6c ' avem nevoie de d%$a% pt. conversia &i a mov a%' a c5d ; d%$a% = a sb a%' c% sbb d%' b% ; d%$a% = a,b6c idiv d ; a% = *a,b6c34d mov r' a% Instructiuni conditionale 9n lim&ajul de asam&lare nu avem instructiuni conditionale sau &ucle structurate% 6cestea tre&uie deci simulate ,olosind instructiuni )en goto sau if *** goto% Saltul neconditionat se ,ace prin instructiunea 7mp% Sinta-a este 7mp eti%heta% 1,ectul este ca urmatoarea instructiune e-ecutata este cea care urmea0a punctului marcat prin eticheta% 1ticheta are sinta-a: eti%heta$ (numele urmat de caracterul doua-puncte"% 1-ista instructiuni de salt conditionat% Conditia este intotdeauna ,ormulata in termeni de valorile &ista&ililor de conditie (,la)s"% ?la)urile se comporta ca niste re)istrii de un &it% De re)ula, instructiunile aritmetice si lo)ice le modi,icaA celelalte instructiuni nu le modi,ica% Atentie: instructiunile inc si dec, desi aritmetice, nu modi,ica ,la)urile% 6st,el, o instructiune de salt conditionat tre&uie in principiu sa urme0e dupa o instructiune aritmetica sau lo)ica care setea0a ,la)-urile% 2ipuri de teste: !% 2est de 0ero: toate operatiile aritmetice si lo)ice actuali0ea0a valoarea lui B? (0ero ,la)"% 6st,el, 7+ va e,ectua saltul daca re0ultatul operatiei aritmetice anterioare a ,ost e)al cu % 2% 2est de depasire: pentru adunare si scadere cu numere repre0entate ,ara semn, avem depasire daca si nuai daca avem transport#imprumut% 6st,el, testul de depasire se va ,ace cu instructiunea 7c (ne)ata 7nc"% La aritmetica in cod complementar, depasirea este semnalata de >? (>ver,lo$ ?la)", instructiunea de salt ,iind 7o 8% Comparatia: se incepe cu o operatie de scadere (sb" sau scaderea ,ara memorarea restului (cmp"% Starea ,la)urilor C? si B? (la operan0i ,ara semn" sau S? si B? (la cele cu semn" permit sa a,lam daca desca0utul a ,ost mai mare, e)al sau mai mic decat sca0atorul% +entru operan0i ,ara semn, instructiunile de salt conditionat ,olosite sunt 7b, 7a, 7e, 7ne, 7be, 7ae +entru operan0i cu semn, instructiunile de salt conditionat ,olosite sunt 7&, 7g, 7e, 7ne, 7&e, 7ge% Exercitii !% Calculati e-presia ra"#-%, numerele ,iind repre0entate pe !< &iti ,ara semn, testand eventualele depasiri% 9ntr-o varia&ila de tip &@te puneti daca nu au ,ost depasiri si ! daca au ,ost% 'e(olvare Codul: mov a%' a add a%' b 7c depasire sb a%' c 7c depasire mov r' a% mov a&' 0 mov dep' 0 7mp )ina& depasire$ mov a&' 1 mov dep' a& )ina&$ 2% Calculati cel mai mare divi0or comun a doua numere date% 'e(olvare 8% 6,lati numarul de divi0ori ai unui numar dat .. Tablouri eclararea tablourilor 4aria&ilele se declara prin sinta-a: +nume, db5d55dd valoare C' valoare %%%D Numele este optional% Daca dam o sin)ura valoare, varia&ila este simpla% Daca dam mai multe valori, varia&ila este de ,apt de tip ta&lou% 6sta inseamna ca: asam&lorul re0erva cate !, 2 sau : octeti (in ,unctie de declarare, db, d5, respectiv dd" pentru ,iecare valoare data% 6cestia sunt re0ervati unul dupa altul, ,ara spatii% acestia sunt initiali0ati cu valorile date numele, daca este pre0ent, desemnea0a intotdeauna adresa de inceput a 0onei de memorie% +rin urmare, prin acel nume se poate re,eri direct doar primul element% +entru restul este necesar sa calculam adresa de inceput a elementului dorit% 4aria&ilele de tip db pot ,i initiali0ate cu un caracter sau sir de caractere date intre caractere apostro,% 4aria&ilele de orice tip pot ,i initiali0ate cu constructia numar dp *valoare3 aceasta ,iind echivalenta cu un sir de lun)ime numar de valori identice cu valoare% 6ceste constructii pot ,i com&inate% Exemple a d5 10' 13' 16' 3000 ; tab&o de 4 cvinte *8 octeti3 c ; va&ori&e initia&e date b db 8Te%t8' 10' 13 ; tab&o de 6 octeti c db 84' 101' 120' 116' 10' 13 ; tab&o de 6 octeti' avand ace&asi ; contint ca si b d dd 100 dp *13 ; tab&o de 100 db&,cvinte *400 octeti3 de ; va&oare 1. 9rim& octet' a& cinci&ea' a& noa&ea ; si asa mai departe *din 4 in 43 a va&oarea 1' ; cei&a&ti 0 e d5 10 dp *23 ; 10 cvinte *100 octeti3 c va&oare initia&a ; nepreci+ata 9n toate ca0urile, numele dat varia&ilelor este de ,apt o eticheta asociata adresei de inceput a varia&ilei% !olosirea tablourilor 9n toate instructiunile in care putem da ca operand o locatie de memorie putem pune si un element dintr-un ta&lou% De ,apt, operandul este locatia de memorie de la adresa data in instructiune (daca operandul este o varia&ila simpla, adresa este de o&icei o constantaA daca operandul este un element dintr-un ta&lou, adresa se calculea0a ca adresa de inceput plus inde-ul inmultit cu dimensiunea elementului (inde-ul ,iind considerat de la "% 6dresa poate ,i data ca: o constanta valoarea unuia din re)isrtii si, di, b%, bp, plus eventual o constanta suma dintre: si sau di, b% sau bp, si eventual o constanta Constanta este de o&icei adresa unei etichete% Exemple !% Se cere insumarea elementelor unui ta&lou 'e(olvare 1 'e(olvare & 6ici numarul elementelor este calculat pornind de la di,erenta intre adresa ta&loului si adresa o&iectului situat in memorie imediat dupa 'e(olvare - 6ici tinem minte direct adresa elementului curent, in loc de inde-% 2% Sa se )enere0e repre0entarea 0ecimala a unui numar dat% 'e(olvare Exercitii !% Sa se scrie un pro)ram care construieste o)linditul unui sir de caractere 2% Sa se inverse0e un sir de caractere (adica la ,el ca in pro&lema precedenta, dar re0ultatul se )enerea0a in aceeasi varia&ila (se scrie peste"% 8% Se da repre0entarea 0ecimala a unui numar% Sa se calcule0e numarul% "peratii pe biti Uneori avem nevoie sa testam sau sa modi,icam doar valoarea unui sin)ur &it din cadrul unui octet, sau in )eneral sa e,ectuam anumite operatii doar asupra unora dintre &itii unui octet% 9n acest scop avem urmatoarele operatii: and, or, %or, not, e,ectuea0a operatia lo)ica corespun0atoare la nivel de &it, intre opearn0i (la and, or si %or, ,iecare &it din re0ultat este re0ultatul operatiei respective intre &itii de acel ran) din operan0i"% test este un and care nu scrie re0ultatul in operandul destinatie ci doar actuali0ea0a ,la)urile (analo) cu cmp ,ata de sb" sh&, shr, sar, ro&, ror, rc&, rcr deplasea0a &itii din primul operand (care tre&uie sa ,ie re)istru sau locatie de memorie"% 6l doilea operand poate ,i o constanta sau valoarea din re)istrul c&% not are un operand de tip re)istru sau locatie de memorie si inversea0a toti &itii din operand% Exemple !% Se cere o&tinerea aceluiasi e,ect ca cel al operatiei cb5% 'e(olvare test a&' 10000000b ; re+&tat& va )i 0 daca bit& de semn este 0 7+ po+itiv ; daca a7ngem aici' nmar& este negativ mov ah' 0::h 7mp )ina& po+itiv$ mov ah'0 )ina&$ 2% Se da o varia&ila, a, de tip $ord% Se cere sa se numere &itii de !% 'e(olvare 1 4om scoate unul cate unul &itii din a- mov a%' a mov d%' 0 ; in d% vom nmara bitii mov c%' 0 ; nr. de iteratii e)ectate bc&a$ shr a%' 1 ; -:=bit& ce& mai ptin semni)icativ din a% adc d%' 0 ; d%$=d%!-: add c%' 1 cmp c%' 16 7b bc&a 'e(olvare & 4om i0ola de ,iecare data cate un &it din a mov a%' 1 ; a% va avea n singr bit 1 care va parcrge toate ce&e 16 ; po+itii mov c%' 0 ; nr. de iteratii mov d%' 0 ; nr. de biti 1 bc&a$ test a' a% 7+ +ero add d%' 1 +ero$ add c%' 1 cmp c%' 16 7b bc&a 8% Repre0entarea BCD a unui numar se ,ace plecand de la repre0entarea numarului in &a0a ! si alocand cate : &iti pentru ,ecare ci,ra 0ecimala (in acest ,el, un octet va contine cate doua ci,re 0ecimale% De e-emplu, numarul 2E! se poate repre0enta in ,ormat BCD pe 2 octeti in modul urmator: 00000010 10010001 Se cere un pro)ram care sa e,ectue0e conversia intre repre0entarea ca sir de ci,re 0ecimale si repre0entarea BCD 'e(olvare Date: sir_ci)re db 8162348 bcd db *bcd,sir_ci)re!1342 dp *23 Codul: mov a%' bcd,sir_ci)re mov d%' 0 mov b%' 2 div b% mov c%' a% ; c%=nr. de perechi de ci)re mov si' o))set sir_ci)re ; si = adresa ci)rei crente mov di' o))set bcd ; di=adresa perechii crente cmp d%' 0 7e par ; daca nr. de ci)re +ecima&e este impar' prima o tratam specia& mov a&' b;te ptr <si= sb a&' 808 mov b;te ptr <di=' a& inc si inc di par$ cmp c%' 0 7e )ina& mov ah' b;te ptr <si= inc si mov a&' b;te ptr <si= inc si sb ah' 808 sb a&' 808 ; avem acm ci)re&e in ah si a&. Trebie adse ambe&e in a&' cea din ; ah va ocpa primii 4 biti din a& sh& ah' 4 or a&' ah mov b;te ptr <di=' a& inc di dec c% 7mp par )ina&$ "bservatii !% > metoda de a pune valoarea intr-un re)istru este sa se ,aca .or cu el insusi (e-emplu %or a%' a% pune in a%"% 2% sh& si shr pot ,i ,olosite pentru inmultirea, repspectiv impartirea la 2% De e-emplu, sh& a%' 1 inmulteste cu 2 valoarea din a%% Cum se imparte la 2 un numar repre0entat cu semn* 8% Spunem ca i(olam anumiti &itii dintr-un operand daca punem o vaoare ,i-ata (de o&icei " in toti ceilalti &iti% 6ceasta se ,ace prin and intre operand si o vaoare, numita mas%a, ce are ! pe po0itiile de i0oat si in rest% Exercitii !% Sa se veri,ice daca un numar repre0enat pe !< &iti cu semn poate ,i repre0entat pe = &iti cu semn 2% ?ie doua varia&ile, a si #, de tip $ord% Sa se inlocuiasca &itii 2%%; din a cu &itii %%8 din # 8% Se da un numar in epre0entare BCD, Sa se calcule0e repre0entarea &inara (o&snuita" .......