Sunteți pe pagina 1din 13

Programarea in

limbaj de asamblare - introducere


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+
=======

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