Mai intai, cum scriem un program in limbaj de asamblare? Programul se va scrie intr-un fisier text cu extensia asm. Un exemplu 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 ============== Pentru "compilare" veti da comenile tasm 4+i nume urmata de t&in0 4v nume Important! !. "umele programului se va da fara extensie. #. $xecutabilele tasm si t&in0 se gasesc in acelasi loc cu mediul %urbo Pascal sau &orland '(( )eultatul celor doua comeni de mai sus este un program executabil *.e%e+. ,epanarea programelor scrise in asamblare *si pentru inceput, c-iar urmarirea executiei lor+ se face cu ajutorul programului %urbo ,ebugger. 'omanda este: td nume Urmarirea programului cu %urbo ,ebugger se va face in fereastra 'PU *se desc-ide din meniul .ie/0'PU+. 1ici avem continutul registrilor si flagurilor procesorului programul ce se executa. 1cesta este preentat atat in limbaj de asamblare cat si direct in cod masina *adica, octet cu octet, continutul memoriei+ continutul segmentului de date *in -exa+ continutul stivei Putem poitiona ona viibila din program, ona de date si stiva folosind comanda Go to din meniul local al ferestrei *meniul activat cu Alt-F10+. ,e asemenea, putem afla sau modifica valoarea unei variabile, folosind fereastra de dialog Evaluate/Modify *desc-isa cu Ctrl-F4+ Exercitii !. 2enerati program executabil din sursa preentata in aceasta pagina #. Urmariti pas cu pas executia programului *in %urbo ,ebugger+. Urmariti continutul registrelor a% si ip in acest timp. 3. %ot in executia pas cu pas a programului, urmariti continutul segmentului de date. Pentru aceasta, activati *cu Shift-sageata jos+ ona de date a ferestrei 'PU, activatati meniul local *Alt-F10+ si dati comanda Go to. 4n fereastra ce se desc-ide, dati ds$0. Urmariti primii octeti din segmentul de date pe parcursul executiei programului. 5. Poitionati afisarea onei de date pe cs$0 'omparati cu ceea ce se afiseaa in ona de cod. 6. Modificati programul in asa fel incat variabilele sa fie repreentate pe !7 biti si initialiati-le cu valori mai mari *de ordinul !888+. )epetati exercitiile !-5. 7. 1celasi lucru acum *exercitiile !-5+ pentru programul arit2.asm. 'e greseala observati? 'orectati-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 4nstructiuni folosite *a se vedea "orton 2uide pentru detalii+: mov, add, sb, cb5, c5d, adc, sbb, m&, im&, div, idiv. )egistrii de 9 biti: ah, a&, bh, b&, ch, c&, dh, d&. )egistrii de !7 biti: a%, b%, c%, d%, si, di. Atentie! )egistrul a% este format prin juxtapunerea registrilor ah si a&. 1sta inseamna ca modificarea continutului unuia din registrii ah sau a& conduce la modificarea bitilor corespunatori din a% si reciproc. ,e exemplu, in urma instructiunilor mov a&' 10 ;10 = 0Ah mov ah' 1 registrul a% va contine valoarea #77 *8!81-+. ,eclaratii de date: db *! octet = 9 biti+, d5 *# octeti = !7 biti+, dd *5 octeti = 3# biti+. Adunari si scaderi Putem folosi oricare dintre registrii numiti mai sus, precum si variabile auxiliare. $xemplu: sa se evaluee expresia r!a"#$-!%"d$-!e"&0$ unde toate veriabilele sunt repreentate pe !7 biti cu semn. 'e(olvare ,ate: a d5 1000 b d5 100 c d5 20 d d5 300 e d5 ,300 r d5 2 'od: 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 ,aca avem de adunat:scaut numere repreentate pe 3# de biti *sau mai multi+, nu avem instructiune de adunare:scadere corespunatoare. 4n scopul efectuarii operatiei, vom aduna cate o "felie" de !7 biti o data. 1stfel, vom aduna cei !7 biti mai putin semnificativi din cei doi operani, apoi vom aduna cei !7 biti mai semnificativi din cei doi operani impreuna cu transportul de la "felia" anterioara. ; a doua problema ce apare este faptul ca nu putem transfera 3# de biti o data. <ie urmatorul exemplu: sa se calculee ra"#, unde r, a si b sunt repreentate pe 3# de biti. 'e(olvare ,ate: a dd 1000000 b dd 100000 r dd 2 'od: 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% 'onstructii folosite: 5ord ptr a desemneaa un obiect din memorie, de # octeti *5ord+ de la adresa lui a *ptr a+. 1cestia sunt de fapt cei mai putin semnificativi !7 biti din componenta lui a. 5ord ptr a!2 desemneaa un obiect din memorie, tot de # octeti *5ord+ de la adresa egala cu adresa lui a plus # *ptr a !2+. 1cestia sunt octetii al treilea si al patrulea din componenta lui a, adica cei mai semnificativi !7 biti. instructiunea add are ca efect retinerea transportului in bistabilul '< *carr= flag+. instructiunea adc aduna oeranii plus valoarea lui '<. ,e asemenea, noul transport generat in urma adunarii este scris in '<. Exercitii !. 'alculati suma ra"#, adunand doar cate 9 biti o data. #. 'alculati ra"#-%-&0, r, a,b si c fiind repreentate pe 3# de biti cu semn. Conversii de lungime ,aca operanii pentru adunare si scadere nu au lungimile egale este necesara modificarea lungimii repreentarii cel putin pentru unul dintre ei. >ungirea repreentarii pentru intregii cu semn se face cu ajutorul instructiunilor cb5 si c5d. >ungirea repreentarilor pentru numere fara semn se face prin completare cu erouri. Exemple !. ra-#, r si a fiind repreentate pe !7 de biti cu semn, iar b pe 9 biti cu semn 'e(olvare ,ate: a d5 2000 b db ,4 r d5 2 'od: mov a&' b cb5 ; a% = b mov si' a sb si' a% ; si = a,b mov r' si #. ra"#, r si b fiind pe !7 biti fara semn, iar a pe 9 biti fara semn. 'e(olvare ,ate: a d5 2000 b db 4 r d5 2 'od: mov a&' b mov ah' 0 ; a% = b add a%' b ; a% = a!b mov r' a% Exercitii !. 'alculati ra"#-%, unde r si b sunt pe 3# de biti cu semn, a este pe !7 biti cu semn, iar c este pe 9 biti cu semn. #. 'a la exercitiul precedent, dar numerele sunt repreentate fara semn. Inmultiri si impartiri %rebuie avute in vedere restrictiile de lungime, registrii specifici pentru unii operani, precum si diferenta intre instructiunile pentru numere repreentate cu semn *im& si idiv+ si fara semn *m& si div+. Exemplu ?a se evaluee r!a-#)%$/d, unde a, #, %, d, r vor fi repreentate pe !7 biti cu semn. 'e(olvare ,ate a d5 1000 b d5 ,100 c d5 30000 d d5 10000 r d5 2 'od 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 4n limbajul de asamblare nu avem instructiuni conditionale sau bucle structurate. 1cestea trebuie deci simulate folosind instructiuni gen goto sau if *** goto. ?altul neconditionat se face prin instructiunea 7mp. ?intaxa este 7mp eti%heta. $fectul este ca urmatoarea instructiune executata este cea care urmeaa punctului marcat prin etic-eta. $tic-eta are sintaxa: eti%heta$ *numele urmat de caracterul doua-puncte+. $xista instructiuni de salt conditionat. 'onditia este intotdeauna formulata in termeni de valorile bistabililor de conditie *flags+. <lagurile se comporta ca niste registrii de un bit. ,e regula, instructiunile aritmetice si logice le modifica@ celelalte instructiuni nu le modifica. Atentie: instructiunile inc si dec, desi aritmetice, nu modifica flagurile. 1stfel, o instructiune de salt conditionat trebuie in principiu sa urmee dupa o instructiune aritmetica sau logica care seteaa flag-urile. %ipuri de teste: !. %est de ero: toate operatiile aritmetice si logice actualieaa valoarea lui A< *ero flag+. 1stfel, 7+ va efectua saltul daca reultatul operatiei aritmetice anterioare a fost egal cu 8. #. %est de depasire: pentru adunare si scadere cu numere repreentate fara semn, avem depasire daca si nuai daca avem transport:imprumut. 1stfel, testul de depasire se va face cu instructiunea 7c *negata 7nc+. >a aritmetica in cod complementar, depasirea este semnalata de ;< *;verflo/ <lag+, instructiunea de salt fiind 7o 3. 'omparatia: se incepe cu o operatie de scadere *sb+ sau scaderea fara memorarea restului *cmp+. ?tarea flagurilor '< si A< *la operani fara semn+ sau ?< si A< *la cele cu semn+ permit sa aflam daca descautul a fost mai mare, egal sau mai mic decat scaatorul. Pentru operani fara semn, instructiunile de salt conditionat folosite sunt 7b, 7a, 7e, 7ne, 7be, 7ae Pentru operani cu semn, instructiunile de salt conditionat folosite sunt 7&, 7g, 7e, 7ne, 7&e, 7ge. Exercitii !. 'alculati expresia ra"#-%, numerele fiind repreentate pe !7 biti fara semn, testand eventualele depasiri. 4ntr-o variabila de tip b=te puneti 8 daca nu au fost depasiri si ! daca au fost. 'e(olvare 'odul: 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&$ #. 'alculati cel mai mare divior comun a doua numere date. 'e(olvare 3. 1flati numarul de diviori ai unui numar dat == Tablouri eclararea tablourilor .ariabilele se declara prin sintaxa: +nume, db0d50dd valoare B' valoare ...C "umele este optional. ,aca dam o singura valoare, variabila este simpla. ,aca dam mai multe valori, variabila este de fapt de tip tablou. 1sta inseamna ca: asamblorul reerva cate !, # sau 5 octeti *in functie de declarare, db, d5, respectiv dd+ pentru fiecare valoare data. 1cestia sunt reervati unul dupa altul, fara spatii. acestia sunt initialiati cu valorile date numele, daca este preent, desemneaa intotdeauna adresa de inceput a onei de memorie. Prin urmare, prin acel nume se poate referi direct doar primul element. Pentru restul este necesar sa calculam adresa de inceput a elementului dorit. .ariabilele de tip db pot fi initialiate cu un caracter sau sir de caractere date intre caractere apostrof. .ariabilele de orice tip pot fi initialiate cu constructia numar dp *valoare3 aceasta fiind ec-ivalenta cu un sir de lungime numar de valori identice cu valoare. 1ceste constructii pot fi combinate. 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 4n toate caurile, numele dat variabilelor este de fapt o etic-eta asociata adresei de inceput a variabilei. !olosirea tablourilor 4n toate instructiunile in care putem da ca operand o locatie de memorie putem pune si un element dintr-un tablou. ,e fapt, operandul este locatia de memorie de la adresa data in instructiune *daca operandul este o variabila simpla, adresa este de obicei o constanta@ daca operandul este un element dintr-un tablou, adresa se calculeaa ca adresa de inceput plus indexul inmultit cu dimensiunea elementului *indexul fiind considerat de la 8+. 1dresa poate fi data ca: o constanta valoarea unuia din regisrtii si, di, b%, bp, plus eventual o constanta suma dintre: si sau di, b% sau bp, si eventual o constanta 'onstanta este de obicei adresa unei etic-ete. Exemple !. ?e cere insumarea elementelor unui tablou 'e(olvare 1 'e(olvare & 1ici numarul elementelor este calculat pornind de la diferenta intre adresa tabloului si adresa obiectului situat in memorie imediat dupa 'e(olvare - 1ici tinem minte direct adresa elementului curent, in loc de index. #. ?a se generee repreentarea ecimala a unui numar dat. 'e(olvare Exercitii !. ?a se scrie un program care construieste oglinditul unui sir de caractere #. ?a se inversee un sir de caractere *adica la fel ca in problema precedenta, dar reultatul se genereaa in aceeasi variabila *se scrie peste+. 3. ?e da repreentarea ecimala a unui numar. ?a se calculee numarul. "peratii pe biti Uneori avem nevoie sa testam sau sa modificam doar valoarea unui singur bit din cadrul unui octet, sau in general sa efectuam anumite operatii doar asupra unora dintre bitii unui octet. 4n acest scop avem urmatoarele operatii: and, or, %or, not, efectueaa operatia logica corespunatoare la nivel de bit, intre opearni *la and, or si %or, fiecare bit din reultat este reultatul operatiei respective intre bitii de acel rang din operani+. test este un and care nu scrie reultatul in operandul destinatie ci doar actualieaa flagurile *analog cu cmp fata de sb+ sh&, shr, sar, ro&, ror, rc&, rcr deplaseaa bitii din primul operand *care trebuie sa fie registru sau locatie de memorie+. 1l doilea operand poate fi o constanta sau valoarea din registrul c&. not are un operand de tip registru sau locatie de memorie si inverseaa toti bitii din operand. Exemple !. ?e cere obtinerea aceluiasi efect 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&$ #. ?e da o variabila, a, de tip /ord. ?e cere sa se numere bitii de !. 'e(olvare 1 .om scoate unul cate unul bitii din ax 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 & .om iola de fiecare data cate un bit 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 3. )epreentarea &', a unui numar se face plecand de la repreentarea numarului in baa !8 si alocand cate 5 biti pentru fecare cifra ecimala *in acest fel, un octet va contine cate doua cifre ecimale. ,e exemplu, numarul #D! se poate repreenta in format &', pe # octeti in modul urmator: 00000010 10010001 ?e cere un program care sa efectuee conversia intre repreentarea ca sir de cifre ecimale si repreentarea &', 'e(olvare ,ate: sir_ci)re db 8162348 bcd db *bcd,sir_ci)re!1342 dp *23 'odul: 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 8 intr-un registru este sa se faca .or cu el insusi *exemplu %or a%' a% pune 8 in a%+. #. sh& si shr pot fi folosite pentru inmultirea, repspectiv impartirea la #. ,e exemplu, sh& a%' 1 inmulteste cu # valoarea din a%. 'um se imparte la # un numar repreentat cu semn? 3. ?punem ca i(olam anumiti bitii dintr-un operand daca punem o vaoare fixata *de obicei 8+ in toti ceilalti biti. 1ceasta se face prin and intre operand si o vaoare, numita mas%a, ce are ! pe poitiile de ioat si 8 in rest. Exercitii !. ?a se verifice daca un numar repreenat pe !7 biti cu semn poate fi repreentat pe 9 biti cu semn #. <ie doua variabile, a si #, de tip /ord. ?a se inlocuiasca bitii #..6 din a cu bitii 8..3 din # 3. ?e da un numar in epreentare &',, ?a se calculee repreentarea binara *obsnuita+ =======