Sunteți pe pagina 1din 13

Programarea in

limbaj de asamblare - introducere


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"
.......

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