Documente Academic
Documente Profesional
Documente Cultură
Obiective:
- alfabetul limbajului, identificatori, constante
- formatul general al unei instruciuni
- variabile
- directive de generare a datelor
- alte directive: LABEL, EQU, =, RADIX, END, EVEN, ORG
3.1. Alfabetul limbajului 3.1. Alfabetul limbajului
Mulimea de semne denumite simboluri care formeaz alfabetul limbajului este compus
din:
- literele mici si mari ale alfabetului englez
- cifrele zecimale ale sistemului de cifre arabe; 0,1,2,3,4,5,6,7,8,9.
- caractere speciale( de punctuaie): . , : ; ? ( ) _ - + / * etc.
Asamblorul nu face distincie ntre literele mici i literele mari.
Identificatori
Identificatorii sunt secvene de cel mult 31 caractere alfanumerice (litere i/sau cifre) i
unele caractere speciale (de exemplu liniua de subliniere) cu condiia ca acestea sa nceap cu o
liter sau cu un caracter special din categoria celor acceptate n formarea unui identificator.
Identificatorii sunt de doua tipuri: predefinii i definii de utilizator.
Identificatorii standard sau predefinii sunt cuvinte cheie utilizai pentru:
- nume de registre: ax, al, ah, eax, ds, fs, di, cs, sp, etc.
- nume de operatori: dup, seg, ptr, type, etc.
- nume de instruciuni: add, mov, xchg, dec, movs, etc
- nume de directive: db, dw, radix, org, assume, model, title, public, extrn, etc.
Identificatorii definii de utilizator se folosesc pentru:
- nume de variabile, operanzi, locaii de memorie, etichete - nume de variabile, operanzi, locaii de memorie, etichete
- nume de proceduri, structuri, segmente, macroinstruciuni.
Constante
Constantele sunt valori fixe care nu pot fi modificate n timpul execuiei programului.
Constantele pot fi numerice sau iruri de caractere, formate dup anumite reguli, crora li se
asociaz o valoare. Constantele numerice pot fi: ntregi sau reale. Constantele ntregi reprezint
numerele ntregi reprezentate n zecimal, binar, octal sau hexazecimal. O constant ntreag este
reprezentat n binar dac apare cu prefixul B, n octal dac este prefixat de litera O, n
hexazecimal dac este prefixat de litera H sau n zecimal dac este sau nu prefixat de litera D.
De exemplu:
- constanta 101101B este reprezentat n binar;
- constanta 1276O este reprezentat n octal;
- constantele 1473h, 0d3a4H sunt reprezentate n hexazecimal;
- constantele 1473, 1436 sunt reprezentate n zecimal
Observaie. Pentru a evita confuzia ntre constantele hexazecimale care ncep cu una din Observaie. Pentru a evita confuzia ntre constantele hexazecimale care ncep cu una din
cifrele hexazecimale A, B,C, D, E, F i identificatori, o asemenea constant hexazecimal va
ncepe cu cifra zero.
Utiliznd directiva RADIX se poate impune reprezentarea implicit a constantelor ntr-o
anumit baz. De exemplu:
.RADIX 2
mov bx, 10 ; (ax)=0002h
.RADIX 8
mov bx, 10 ; (ax)=0008h
.RADIX 10
mov bx, 10 ; (ax)=000ah
.RADIX 16
mov bx, 10 ; (ax)=0010h
Reprezentarea constantelor ntregi se pot face pe octet (8 bii) cuvnt (16 bii), dublu cuvnt (32
bii ) sau pe 64 bii.
Constantele ntregi pot fi codificate n BCD mpachetat sau nempachetat. Constantele zecimale
codificate binar mpachetat pot fi definite cu directiva dt pe 10 octei .
Constantele reale sunt reprezentate n virgul mobil pe 32, 64 sau 80 bii, dup tipul constantei:
dd, dq, respectiv dt.
irurile de caractere constau dintr-o succesiune de caractere incluse ntre apostrofuri. Dac
caracterul apostrof face parte din ir se dubleaz. De exemplu, daca irul de caractere este: azi
21.012005 se va scrie azi 21.012004. 21.012005 se va scrie azi 21.012004.
Formatul general al unei instruciuni
Formatul general al unei instruciuni este urmtorul:
<eticheta>: <mnemonica> <operanzi>; <comentarii>
unde:
a) Cmpul <eticheta>: este opional i poate conine o etichet care este nume simbolic, un
identificator cruia i se asociaz o valoare egal cu adresa primului octet al instruciunii. Prezena
acestui cmp este opionala. Dac acest cmp nu exist, nu se mai folosete caracterul delimitator
:
b) Cmpul <mnemonica>. Mnemonica este un ir de litere ce identific instruciunea
respectiv, sau clase de instruciuni creia aparine aceasta i reprezint numele instruciunii sau respectiv, sau clase de instruciuni creia aparine aceasta i reprezint numele instruciunii sau
directivei. Acest cmp este obligatoriu. De exemplu: MOV, INC, DEC, ADD.
c) Cmpul <operanzi>. Prezena i formatul acestui cmp depinde de tipul instruciunii. Acest
cmp poate lipsi, sau poate conine 1 operand sau 2 operanzi separai prin caracterul , (virgul).
Cnd exist 2 operanzi, primul este destinaia i al doilea surs. Operanzii pot fi i expresii ce
conin nume de registre, constante, identificatori i operatori.
d) Cmpul <comentariu>. Prezena acestui cmp este opionala. Daca lipsete, caracterul ;
este opional, astfel prezena acestuia este obligatorie. Acest cmp poate conine un mesaj
referitor la metoda folosit, instruciunea n cauz etc. Dac o linie este de comentariu aceasta va
ncepe cu caracterul punct i virgul.
Variabila este un nume simbolic, identificator asociat cu adresa primului octet al unei date.
Introducerea variabilelor n program se face utiliznd directive de generare de date ale
asamblorului ce in locul declaraiilor de variabile ntlnite n programarea n limbaje de nivel
nalt.
Directivele de generare si rezervare de date sunt:
- db (define byte), definete date de tip octet cu sau fr semn
- dw (define word), definete date pe 2 octei ce pot fi ntregi cu sau fr semn sau adrese
efective
- dd (define double word) definete pe 4 octei valori ntregi sau reale cu sau fr semn sau o
3.4. Variabile
- dd (define double word) definete pe 4 octei valori ntregi sau reale cu sau fr semn sau o
adres fizic
- dq (define quadword) definete pe 8 octei o valoare ntreag sau real cu sau fr semn
- dt (define ten bytes) definete pe 10 octei o valoare real sau o valoare zecimal
mpachetat
- df (define float) definete o valoare real pe 6 octei;
- dp (define pointer) referina specific pentru 386, reprezentat pe 6 octei( segmentul pe 2
octei iar offset-ul pe 4 octei)
Definirea si referirea etichetelor
Etichetele sunt identificatori (iruri de caractere) care permit identificarea unor locaii de
memorie, care pot fi locaii ale instruciunilor, operanzilor sau ale unor proceduri. Etichetele unor
instruciuni sau proceduri au trei atribuite: segment, offse (deplasament ) i poziionare (near sau
far ), iar pentru operanzi au atributul tip ( byte, word, dword, etc.)
Exemple
alfa: add ax,cx
cauta proc near
calcule proc far calcule proc far
. Directive de generare a datelor
n limbajele de asamblare 80x86 se poate opera cu anumite tipuri de date, recunoscute
de procesor, acesta dispunnd de directive (pseudoinstruciuni) specifice pentru definirea lor.
a)Byte(octet).
Acest tip de date ocupa 8 bii, adic un octet(byte). Informaia dintr-un octet poate fi: un
ntreg fr semn cuprins intre 0 si 225, un ntreg cu semn cuprins intre 128 si 127, sau un
caracter ASCII.
Definirea datelor de tip byte se face cu ajutorul directivei DB (Define Byte) care are
sintaxa:
[variabila] DB lista expresii [variabila] DB lista expresii
unde
- variabila, opionala, este un identificator asociat adresei efective a primului octet de
memorie generat, corespunztor primei expresii din lista de expresii
- lista-expresii cuprinde expresii constante (calculabile n momentul asamblrii) i separate
prin virgul.
Fie directivele:
alfa DB 65, 72h, 75o, 11011b, 15+22h, oach
DB -65, 'a', 'abc'
n memorie ncepnd de la adresa simbolica alfa, se va genera secvena de octei,
reprezentat n hexazecimal:
41 72 3d 1b 31 ac bf 61 61 62 63
alfa +0 +1 +2 +3 +4
Valoarea binar 11011b va fi generat la adresa alfa + 3.
b)WORD (cuvnt).
Un cuvnt ocup doi octei (16 bii) i poate fi reprezentat ntr-un registru de 16 bii sau n 2
octei consecutivi de memorie. Numerotarea biilor n cadrul unui cuvnt se face de la 0 la 15
(bitul 15 e bitul cel mai semnificativ al cuvntului, iar bitul 0 este bitul cel mai puin (bitul 15 e bitul cel mai semnificativ al cuvntului, iar bitul 0 este bitul cel mai puin
semnificativ), numerotarea se face de la dreapta la stnga:
Informaia memorat ntr-un cuvnt poate fi:
- un ntreg pe 16 bii cu semn (bitul 15 este bitul de semn), cuprins intre -2
15
si 2
15
1,
- un ntreg pe 16 bii fr semn, cuprins intre 0 si 2
16
1
- sau o adres de memorie de 16 bii.
Reprezentarea celor 2 octei ai cuvntului n memorie se face astfel nct octetul cel
mai puin semnificativ este memorat la adresa cea mai mic. De exemplu: dac valoarea 2345h
este memorat la adresa 2000h, atunci octetul 45h se va afla la adresa 2000h, iar octetul 23h la
adresa 2001h.
Generarea datelor de tip cuvnt se poate face folosind directiva de tip DW(Define
Word), a crei sintax este:
[variabila] DW lista de expresii
unde:
- variabila, opionala, este un identificator asociat adresei efective a primului cuvnt de
memorie generat, corespunztor primei expresii din lista de expresii.
- lista de expresii este o list de expresii constante separate prin virgula.
Fie secvena de directive:
beta DW 4567h, 0bc4ah, 1110111011b, 2476o
DW -7683, 7683, 'ab'
In memorie de la adresa beta se vor genera octeii:
67 45 4a bc bb 03 3e 05 fd e1 03 e1 62 61
beta +2 +4 +6 +8 +10 +12 +14
Constanta octal 2476o este generat de la adresa beta +6.
c) Double WORD (dublu cuvnt)
Un dublu cuvnt ocup 2 cuvinte sau 4 octei (32 bii) i poate fi reprezentat n memorie pe
4 octei consecutivi, ntr-o pereche de registre de 16 bii sau intr-un registru de 32 bii (la
procesoarele de 32 bii).
Informaia memorat ntr-un dublu cuvnt poate fi:
- un ntreg pe 32 bii, cu sau fr semn;
- un numr real n simpl precizie;
- sau o adres fizic de memorie de 32 bii.
Generarea datelor de tip dublu cuvnt se poate face folosind directiva DD (Define
Double Word), a crei sintax este:
[variabila] DD lista expresii
unde: unde:
- variabila, opional, este un identificator asociat adresei efective primului dublu cuvnt de
memorie generat corespunztor primei expresii din lista de expresii;
- lista de expresii este o list de expresii constante separate prin virgul.
Reprezentarea celor dou cuvinte a unui dublu cuvnt de memorie se face astfel nct
cuvntul cel mai puin semnificativ este memorat la adresa cea mai mic. De exemplu, dublul
cuvnt 12345678 h, aflat la adresa 2000h se memoreaz astfel: cuvntul 5678h se memoreaz la
adresa 2000h, iar cuvntul 1234h la adresa 2002h, adic adresa de segment este memorat la
adrese mari, iar deplasamentul (offsetul) la adrese mici.
Secvena de directive :
gama DD 12345678h, 1, -1
DD 1.0, -1.0
DD gama
presupunnd ca memorarea se face de la adresa 4512:3467 va conduce la generarea
urmtoarei secvene de octei:
78 56 34 12 01 00 00 00 ff ff ff ff 00 00 80 3f
gama +4 +8 +12 +16
00 00 80 Bf 67 34 12 45
gama+16 +20
Constanta reala -1.0 se asambleaz la adresa gama + 16.
d)QUAD WORD (8 octei)
Tipul Quad word (qword) ocup 8 octei i este reprezentat n memorie pe 64 bii sau ntr-
o pereche de registre de 32 bii (in cazul procesoarelor de 32 bii).
Informaia stocat ntr-un qword poate fi: un ntreg cu sau fr semn pe 64 bii, sau un
numr real in dubl precizie.
Generarea unor date de tip qword se face cu ajutorul directivei DQ (Define Quad
word), a crei sintaxa este:
[variabila] DQ lista de expresii
unde:
- variabila, opionala, este un identificator asociat adresei efective primului qword de
memorie generat corespunztor primei expresii din lista de expresii; memorie generat corespunztor primei expresii din lista de expresii;
- lista de expresii este o list de expresii constante separate prin virgul.
Reprezentarea n memorie a celor 8 octei ai unui qword se face astfel ncit octetul cel
mai puin semnificativ este memorat la adresa cea mai mic.
Fie secvena :
q DQ 2, -2, 2.5, -2.5
care va fi reprezentat n memorie astfel:
02 00 00 00 00 00 00 00 fe ff ff ff ff ff ff ff
00 00 00 00 00 00 04 40 00 00 00 00 00 00 04 c0
q +8 +16
+16 +24
Valoarea reala -2.5 este asamblat de la adresa q+24.
e)Ten Bytes
Valorile Ten byte (tbyte) ocup 10 octei consecutivi de memorie, sau unul din
registrele coprocesorului matematic.
Informaia stocat ntr-un tbyte poate fi: un numr ntreg reprezentat ca o secvena de
cifre BCD (format mpachetat) cu semn sau un numr real n precizie extins.
Generarea unor date de tip tbyte se face cu directiva DT (Define Ten Bytes) a crei format este:
[variabila] DT lista de expresii
unde:
- variabila, opionala, este un identificator asociat adresei efective primului tbyte de memorie
generat corespunztor primei expresii din lista de expresii;
- lista de expresii este o list de expresii constante separate prin virgul.
n format BCD mpachetat fiecare cifr zecimal se reprezint pe o tetrad (4 bii),
deci 2 cifre BCD pe octet. Un ntreg BCD se poate reprezenta cu maxim 19 cifre zecimale, care
ar ocupa 76 bii. Ultima tetrad aflata la adresa cea mai mare este destinat memorri semnului.
Semnul se memoreaz doar n bitul cel mai semnificativ al numrului, deci urmtorii 3 bii ai
tetradei ce conine semnul pot fi bii ai numrului. Astfel ntregii BCD pot fi cuprini ntre: tetradei ce conine semnul pot fi bii ai numrului. Astfel ntregii BCD pot fi cuprini ntre:
-79999 99999 99999 99999
i
+79999 99999 99999 99999
cifra cea mai semnificativ fiind reprezentat doar pe 3 bii.
Directiva:
tb DT 45671234567890123456, -45671234567890123456
va conduce la generarea urmtoarei secvene de octei:
56 34 12 90 78 56 34 12 67 45 56 34 12 90 78 56 34 12 67 c5
tb +10
Pentru exemplificarea utilizrii directivelor de generare de date, considerm urmtorul program:
model small
. stack 100h
data segment
alfa db 40+25,72h,75o,11011b,15+22h
db 0ach,-65,'a','abc' db 0ach,-65,'a','abc'
beta dw 4567h,0bc4ah,1110111011b,2476o
dw -7683,7683,'ab'
gama dd 12345678h,1,-1
dd 1.0,-1.0,-.23828125,0.0390625
gama1 dd gama
qw dq 2,-2,2.5,-2.5
t1 dt 8888888888777777777,-5555555555555555555
tb dt 45671234567890123456,-45671234567890123456
f dt 3345,-3345,1.0,-1.0
data ends
cod segment
assume cs:cod, ds:data
start: mov ax,data
mov ds,ax
cod ends
end start
Fiierul listing obinut (.lst) dup asamblare arat astfel:
Turbo Assembler Version 3.2 02/06/00 18:21:40 Page 1
tipur. ASM
1 0000 .model small
2 0000 .stack 100h 2 0000 .stack 100h
3 0000 data segment
4 0000 41 72 3D 1B 31 alfa db
40+25,72h,75o,11011b,15+22h
5 0005 AC BF 61 61 62 63 db 0ach,
-65,'a','abc'
6 000B 4567 BC4A 03BB 053E beta dw
4567h,0bc4ah,1110111011b,2476o
7 0013 E1FD 1E03 6162 dw -7683,7683,'ab'
8 0019 12345678 00000001+ gama dd
12345678h,1,-1
9 FFFFFFFF
10 0025 3F800000 BF800000+ dd 1.0,-
1.0,-.23828125,
0.0390625
11 BE740000 3D200000
12 0035 00000019sr gama1 dd
gama
13 0039 0000000000000002 + qw dq 2,-
2,2.5,-2.5
14 FFFFFFFFFFFFFFFE +
15 4004000000000000 +
16 C004000000000000
17 0059 08888888888777777777+ t1 dt
8888888888777777777, 8888888888777777777,
-5555555555555555555
185555555555555555
19006D 45671234567890123456+ tbdt 45671234567890123456,
-45671234567890123456
20 C5671234567890123456
21 0081 00000000000000003345+ f dt 3345,-
3345,1.0,-1.0
22 80000000000000003345+
23 3FFF8000000000000000+
24 BFFF8000000000000000
25 00A9 data ends
26
27 0000 cod segment
28 assume
cs:cod, ds:data
29 0000 B8 0000s start: mov ax,data
30 0003 8E D8 mov ds,ax
31 0005 cod ends
32 end start
Prima coloan reprezint numrul liniei din fiierul .lst. Coloana urmtoare reprezint adresa
relativ la coninutul registrului ds, adresa exprimat n hexazecimal pe 4 cifre hexa. Urmeaz
apoi coninutul cmpului de date corespunztor unei linii. Dac se continu pe linia urmtoare va
aparea semnul +. Valorile ntregi, negative se reprezint in complement fa de doi, iar cele reale
sunt reprezentate n virgul mobil.
Prezena caracterelor r i s n aceast zon indic faptul c este vorba despre o adres de
segment 0000h i deplasamentul 0015h, adic adresa relativ a variabilei gama.
La ntregii BCD de la variabilele t1, tb se poate observa semnul (bitul de semn).
In fiierul .lst nu apare poziia fizic a octeilor n memorie. Zona de memorie
corespunztoare modulului de date de mai sus arat astfel:
ds:0000 41 72 3D 1B 31 AC BF 61
ds:0008 61 62 63 67 45 4ABC BB
ds:0010 03 3E 05 FD E1 03 1E 62
ds:0018 61 78 56 34 12 01 00 00
ds:0020 00 FF FF FF FF 00 00 80
ds:0028 3F 00 00 80 BF 00 00 74
ds:0030 BE 00 00 20 3D 19 00 B0
ds:0038 5A 02 00 00 00 00 00 00
ds:0040 00 FF FF FF FF FF FF FF
ds:0048 FF 00 00 00 00 00 00 04
ds:0050 40 00 00 00 00 00 00 04
ds:0058 C0 77 77 77 77 77 87 85
ds:0060 88 88 08 55 55 55 55 55 ds:0060 88 88 08 55 55 55 55 55
ds:0068 55 55 55 55 85 56 34 12
ds:0070 90 78 56 34 12 67 45 56
ds:0078 34 12 90 78 56 34 12 67
ds:0080 C5 45 33 00 00 00 00 00
ds:0088 00 00 00 45 33 00 00 00
ds:0090 00 00 00 00 80 00 00 00
ds:0098 00 00 00 00 80 FF 3F 00
ds:00A0 00 00 00 00 00 00 80 FF
ds:00A8 BF 00 00 00 00 00 00 00
Prima coloana reprezint adresa fizic de memorie sub forma ds:xxx unde ds este registrul
segment de date, iar xxxxh reprezint ofsetul, adresa relativ din segmentul coninut n ds. n
continuare pe fiecare linie apar 8 octei de memorie.
Valoarea ntreag alfa = 65 = 40 + 25 = 41
16
reprezentat pe un octet prin 41h se afl la
adresa ds: 0000, iar 75o la adresa ds: 0002 sau alfa +2.
Cuvntul 4567h, aflat la adresa simbolic beta ocupa doi octei de la adresa ds: 000A astfel
6745. Dublul cuvnt 0.0390625 se afl la adresa ds: 0025.
Adresa variabilei gama din declaraia gama1 dd gama apare aici n forma:
5AB0:0019, unde 5AB0 este adresa de segment coninut n ds, iar 0019 este offsetul lui gama.
3.6. Alte directive
Directiva LABEL
Pentru a nlesni accesarea aceleai variabile, utiliznd dou tipuri de date diferite se poate utiliza
directiva LABEL a crei sintax este:
<variabila> LABEL <tip>
unde variabila este numele unei variabile de tip < tip >, iar tip este un specificator de tip: BYTE,
WORD, DWORD, etc.
De exemplu secvena de declaraii:
alfa label byte
beta dw 10 dup( 4,-5)
Va atribui ambelor variabile alfa, respectiv beta acelai prim octet din cei 40 generai,
dar alfa va desemna o variabil de tip byte iar beta o variabil de tip word (cuvnt).
Directiva EQU
- asigneaz rezultatul evalurii unei expresii ntregi, un simbol predefinit, definit anterior sau un
cuvnt cheie al asamblrii unui nume simbolic.
- Asamblorul va nlocui numele simbolic cu valoarea asignat. Forma general a directivei:
variabila equ expresie variabila equ expresie
unde;
- variabila este numele simbolic (identificator) asignat valorii expresiei;
- expresie este o expresie a crei valoare se asigneaz numelui simbolic.
Exemplu:
-----------------------
sir dw asamblare, 75, 20, 03
n equ ($ - sie)/type sir ; determina numarul de
cuvinte
l1 equ 25 * 6ah 125o
aduna equ add
baza equ [bp + 4}
.
mov ax,n
aduna ax,l1
Valorile ntregi se asigneaz pe cuvnt. Valoarea asignat nu poate fi modificat prin program Valorile ntregi se asigneaz pe cuvnt. Valoarea asignat nu poate fi modificat prin program
(la fel ca declaraia CONST din Pascal).
Directiva = (egal)
- asigneaz rezultatul evalurii unei expresii ntregi, un simbol definit n amonte sau predefinit
sau un simbol al limbajului de asamblarea unui nume simbolic.
Spre deosebire de directiva EQU, unde valoarea asignat numelui simbolic nu poate fi
schimbat, n cazul directivei = valoarea asignat poate fi modificat n cadrul programului.
Sintaxa directivei:
variabila = expresie
unde:
- variabila este numele simbolic asignat valorii expresiei;
- expresie este o expresie a crei valoare se asigneaz numelui simbolic (variabilei);
Exemplu:
---------------------------
a = 25
..
a = a + 7 ; noua valoare a = 32
Directiva .RADIX
- permite schimbarea bazei de numeraie n orice alt baz cuprins ntre baza 2 , 8 , 10 si 16.
Sintaxa directivei:
. radix expresie
unde - expresie este noua baza de numeraie, considerat ntotdeauna n zecimal.
Exemplu:
. radix 8
a dw 12 ; valoarea 12 generata este octal
. radix 10
b dw 25 ;valoarea 25 este considerata in
zecimal
Directiva END
Directiva END indic sfritul unei secvene de program. Forma general este:
END <eticheta> END <eticheta>
Eticheta apare numai n cazul indicrii sfritului programului principal i este asociat punctului
de ncepere al programului. Adresa asociat acestei etichete este adresa la care face salt
ncrctorul, dup ce programul a fost ncrcat n memorie spre a fi executat.
Exemplul 1:
cod segment