Sunteți pe pagina 1din 19

Unitile centrale ale calculatoarelor.

Assembler

10

2 Setul de instruciuni 8086


n cadrul acestui capitol, sunt prezentate n detaliu instruciunile de baz ale familiei de procesoare
Intel. Acolo unde este cazul, se specific tipurile interzise de adresare.
Setul de instruciuni este grupat n 6 clase:
instruciuni de transfer, care deplaseaz date ntre memorie sau porturi de intrare/ieire i registrele
procesorului, fr a executa nici un fel de prelucrare a datelor;
instruciuni aritmetice i logice, care prelucreaz date n format numeric;
instruciuni pentru iruri, specifice operaiilor cu date alfanumerice;
instruciuni pentru controlul programului, care n esen se reduc la salturi l la apeluri de proceduri;
instruciuni specifice ntreruperilor hard i soft;
instruciuni pentru controlul procesorului.
Aceast mprire este realizat dup criterii funcionale. De exemplu, instruciunile PUSH i POP
sunt considerate ca instruciuni de transfer, dei, ia prima vedere, ar putea fi considerate instruciuni
specifice procedurilor. Acelai lucru despre instruciunile IN i OUT, care interfaeaz procesorul cu
lumea exterioar: ele sunt considerate instruciuni de transfer, dei ar putea fi considerate instruciuni de
intrare/ieire. Intrrile i ieirile sunt ns cazuri particulare de transfer.
Fiecare categorie de instruciuni este nsoit de specificarea explicit a indicatprilor de condiie care
sunt modificai n urma execuiei.
2.1 Instruciuni pentru transferuri de date, instruciuni n aritmetica binara i n aritmetica
BCD. Noiuni teoretice
Instruciunile de transfer permit copierea unui octet sau cuvnt de la sursa la destinaie. Destinaia
poate fi un registru, locaie de memorie sau un port de ieire, iar sursa poate fi un registru, o locaie de
memorie, constante sau port de intrare. Ca regula general destinaia i sursa nu pot fi ambele locaii de
memorie. n specificarea sursei i destinaiei se vor folosi notaiile:
segment: offset pentru adrese fizice;
(x) paranteze rotunde pentru a desemna coninutul lui x.
OBS. Instruciunea de transfer nu modifica indicatori de condiie (flagurile) cu excepia instruciunilor
SAHF i POPF.
2.1.1 Instruciuni de transfer
a) Instruciunea MOV (Move Data).
Forma general a instruciunii Mov este:
mov dest, sursa ;
(dest) (sursa)
realizeaz transferul informaiei de la adresa efectiva data de sursa la dest.
Exemplu:
mov ax, alfa;
transfera coninutul adresei alfa n ax
mov bx, offset alfa; transfera adresa efectiva alfa n bx
mov al, 75h;
transfera 75h n al
mov cx, [100]; transfera coninutul adresei 100 n cx
mov [di], bx; transfera coninutul lui bx la adresa coninuta n di
mov byte ptr alfa , [bx]; pune coninutul octetului de la adresa
;dat de bx la adresa alfa
b) Instruciunea XCHG ( Exchange Data )
Interschimb sursa cu destinaia. Forma general:
XCHG dest, sursa
Restricii:
registrele de segment nu pot aprea ca operanzi;
cel puin un operand trebuie sa fie un registru general.
Exemple:
xchg
al, ah

Unitile centrale ale calculatoarelor. Assembler

11

xchg
alfa, ax
xchg
sir [si], bx
xchg
cs: [bx][si], ax
Interschimbarea coninutului a doi operanzi din memorie op1 i op2 se poate face prin secvena de
instruciuni:
mov
reg, op1
xchg
reg, op2
mov
op2, reg
c) Instruciunea XLAT (Translate)
Forma general:
XLAT
Instruciunea nu are operanzi, semnificaia fiind:
(al) ds: ((bx)+(al))
adic se transfera n al coninutul octetului de la adresa efectiva : (bx)+(al).
Instruciunea se folosete la conversia unor tipuri de date, folosind tabele de conversie, adresa acestor
tabele se introduce n bx, iar n al se introduce poziia elementului din tabel. De exemplu: conversia unei
valori numerice cuprins intre 0 i 15 n cifrele hexazecimale corespunztoare, se poate face prin:
tabel
DB '0123456789abcdef''
..........
lea bx, tabel
mov
al,11
xlat
n al se va depune cifra hexazecimala b.
d) Instruciunea IN (Input Data)
Execut o citire de la portul de intrare specificat 8 sau 16 bii, dup cum se specifica registrul al sau
ax sau alte registre generale, pentru noile procesoare.
Forma general:
IN dest, port
unde:
dest este registrul al sau ax (noile procesoare accept i alte registre n locul lui al, respectiv ax);
port este o constant cuprins intre 0 i 255, sau registrul dx.
e) Instruciunea OUT (Output Data)
Execut o scriere la portul de iesire specificat de 8 sau 16 bii, dup cum se specific registrul al sau
ax.
Forma general :
OUT dest, port
unde:
destinaie este registrul al sau ax;
port este o constant cuprins intre 0 i 255 sau registrul dx.
f) Instruciunea LEA (Load Effective Address)
Are ca efect ncarcrea adresei efective (offsetul) intr-un registru general.
Forma general:
LEA reg, sursa
unde:
sursa -este un operand aflat n memorie, specificat printr-un mod de adresare ;
reg- este un registru general.
Exemplu:
lea bx, alfa
lea si, alfa [bx][si]
Acelasi efect se obine folosind operandul OFFSET n Instruciunea MOV:

Unitile centrale ale calculatoarelor. Assembler

12

mov bx, offset alfa


mov si, offset alfa [bx][si]
g) Instruciunea LDS (Load Data Segment)
Forma general:
LDS reg, sursa
unde:
reg -este un registru general de 16 biti;
sursa -este un operand de tip double word aflat n memorie, care conine o adres complet de 32
bii.
Are ca efect transferul unei adrese complete n perechea de registre ds i reg specificat n instruciune,
adic:
(reg) ((sursa))
(ds) ((sursa) + 2)
Exemplu:
alfa db 25
adr_alfa
dd alfa
. . . . . . .. . .. . . .
lds si, adr-alfa
mov byte ptr [si], 75
. . . . .. . . .. . . . . . . .
h) Instruciunea LES (Load Extra Segment)
Forma general :
LES reg, sursa
unde:
reg- este un registru general;
sursa- este un operand de tip dd.
Efectul instruciunii este urmtorul: n registru se ncarc offsetul operandului sursa iar n registrul es se
ncarc segmentul (adresa de segment) aflat la adresa sursa + 2, adic:
(reg) ((sursa))
(es) ((sursa) + 2)
Exemplu:
b dw 3467h
adr_b dw b
. . . . . .. . . . . .. . . . . .
les di, adr_b
mov word ptr es: [di] , 75
Instruciunile LDS i LES pot fi folosite la exploatarea tabelelor de adrese. Fie tabela de adrese:
Tab_adr dd R1, R2, R3, R4, R5
i dorim sa ncarcm n ax coninutul adresei Ri, a crei indice este dat de registrul cx. Secvena de
instruciuni:
mov bx, cx
mov bx, bx ;
se dubleaz indicele 2 cx
mov bx, bx ;
se dubleaz valoarea lui bx, adic 4 cx
lds si, tab_adr [bx]; ncarc n si adresa Ri
mov ax, ds: [si]; ncarc indirect valoarea coninut n Ri
.................
ncarc n ax coninutul adresei Ri.
O adresa fizica ocupa 4 octei, ca atare valoarea coninut n cx trebuie nmulit cu 4, operaie
realizat prin doua instruciuni add bx, bx

Unitile centrale ale calculatoarelor. Assembler

13

i) Instruciunea LAHF (Load AH with FLAGS)


Instruciunea ncarc n registrul AH octetul dat de partea cea mai puin semnificativa a registrului
FLAGS, ce conine indicatorii. Instruciunea nu are operanzi.
AH FLAGS 07
j) Instruciunea SAHF (Store AH into FLAGS)
Instruciunea ncarc n registrul FLAGS, n octetul cel mai puin semnificativ coninutul registrului
AH, adic:
FLAGS (AH) 07
Instruciunea nu are operanzi.
2.1.2 Aritmetica binara
Aceste instruciuni modifica coninutul registrului FLAGS.
a) Instruciunea ADD (Add)
Forma general:
ADD
dest, sursa ; (dest) (dest) + (sursa)
unde:
dest poate fi un registru general sau o locatie de memorie;
sursa poate fi un registru general, o locatie de memorie sau o constant.
Cei doi operanzi nu pot fi simultan locaii de memorie.
Operaia se poate efectua pe octet sau pe cuvnt. Cei doi operanzi trebuie sa aib aceeasi dimensiune
(acelasi tip). n caz de ambiguitate se va folosi operatorul PTR.
Indicatorii afectai sunt: AF, CF, PF, SF, ZF i OF
Exemple:
add ax, 5
add bl, 5
add ax, bx
add word ptr [Bx], 75
add alfa, ax
add alfa, 5
add byte ptr [si], 75
add byte ptr alfa, 75
b) Instruciunea ADC (Add with Carry)
Forma general:
ADC
dest, sursa ; (dest) (dest) + (sursa) + (CF)
Unde dest i sursa au aceeasi semnificaie ca la Instruciunea ADD, iar CF este Carry Flag.
Instruciunea aduna coninutul dest cu coninutul sursei i cu bitul de transport CF. Indicatorii afectai sunt
aceeasi de la Instruciunea ADD.
Operaia ADC se folosete la adunri de operanzi pe mai multe cuvinte, operaie n care poate aparea
transport de care trebuie sa se in seama.
Exemplu. Sa se adune doua numere op1, op2 n dubla precizie (pe 2 cuvinte).
op1 dd 12345678h
op2 dd 0abcdefgh
reg dd ?
...................................
mov ax, word ptr op1
add ax, word ptr op2
mov word ptr rez, ax
mov ax, word ptr op1+2
adc ax, word ptr op2+2;
se considera eventualul transport
mov word ptr rez+2, ax

Unitile centrale ale calculatoarelor. Assembler

14

c) Instruciunea SUB (Substrat)


Forma general:
SUB
dest, sursa ; (dest) (dest) (sursa)
unde dest i sursa au aceeasi semnificaie ca la Instruciunea ADD. Indicatorii afectai sunt cei specificai
la ADD.
d) Instruciunea SBB (Substrat with Borrow)
Forma general:
SBB
dest, sursa ; (det) (dest) (sursa) (CF)
unde semnificaia dest, sursa i CF sunt cele prezentate la ADC. Instruciunea SBB ia n considerare
eventualul mprumut. Exemplu:
Op1 dd 12345678h
Op2 dd 0abcdefgh90h
Rez dd ?
.............
mov ax, word ptr op1
sub ax, word ptr op2
mov word ptr rez, ax
mov ax, word ptr op1 + 2
sbb ax, word ptr op2 + 2 ; se considera eventualul mprumut
mov word ptr rez + 2, ax
e) Instruciunea INC (Increment)
Forma general:
INC
dest ; (dest) (dest) + 1
unde dest este un registru general, un operand din memorie de tip octet sau cuvnt. Semnificaia fiind
operandul dest este incrementat cu unu. Indicatorii afectai sunt AF, PF, SF, ZF, OF.
Exemple:
inc alfa
inc bl
inc word ptr [Bx] [Si]
f) Instruciunea DEC (decrement)
Forma general:
DEC
dest ;
(dest) (dest) 1
unde dest are aceeasi semnificaie ca dest de la Instruciunea INC. Aceeasi indicatori ca la INC sunt
afectai.
g) Instruciunea NEG (Negate)
Forma general:
NEG
dest : (dest) 0 (dest) schimbare de semn
unde dest este un operand pe 8 sau 16 bii ce poate fi un registru general sau o locaie de memorie.
Instruciunea afecteaz indicatorii AF, CF, PF, SF, OF i ZF.
Exemplu:
alfa db 75
............
mov al, alfa
neg al
mov alfa, al ; la adresa alfa avem - 75
sau
neg alfa
h) Instruciunea CMP (Compare)
Forma general:

Unitile centrale ale calculatoarelor. Assembler

15

CMP
dest, sursa
; (dest) (sursa)
Instruciunea realizeaz o operaie de scdere intre cei doi operanzi, fr a modifica operandul dest
sau sursa cu poziionarea indicatorilor de condiie. Indicatorii afectai sunt: AF, CF, PF, SF, ZF i OF.
Aceasta instruciune se folosete mpreuna cu Instruciunea de salt condiionat.
Exemple:
cmp
ax, alfa[Bx][Si]
cmp [Si], 0
i) Instruciunea CBW (Convert Byte to Word)
Are ca efect extinderea bitului de semn (AL7) din AL la ntreg registru AH, adic:
dacaAL7 = 0 atunci
(ah) 0
altfel
(ah) 1
Instruciunea nu are operanzi i nu afecteaz indicatorii de condiie.
Exemplu. Se cere sa se adune un numr ntreg cu semn reprezentat pe octet cu un numr ntreg cu semn
pe cuvnt.
a db -75
b dw -188
c dw ?
.........
mov al, a
cbw ;
convertete octetul la cuvnt
add ax, b
mov c, ax
..........
j) Instruciunea CWD (Convert Word to Double Word)
Are ca efect extinderea bitului de semn din AX (AX15) la ntreg registrul DX, obinndu-se astfel AX pe
32 de bii, adic:
daca (AX15) = 0 atunci
(dx) 0
altfel
(dx) 1
Instruciunea nu are operanzi i nu afecteaz indicatorii de condiie.
Exemplu. Se cere diferena dintre un operand reprezentat pe 2 cuvinte (DP) i unul reprezentat pe cuvnt
(SP)
dp dd 12345678h
sp dw 0abcdh
rez dd ?
................
mov ax, SP
cwd ax ; operandul SP reprezentat n DX : AX
mov bx, ax ; salveaz ax n bx
mov ax, word ptr DP
sub ax, bx
mov word ptr rez, ax
mov ax, word ptr DP + 2
sbb ax, dx ; ia n considerare eventualul transport
mov word ptr REZ + 2
k) Instruciunea MUL (Multiply)
Forma general:

Unitile centrale ale calculatoarelor. Assembler

16

MUL sursa
unde sursa poate fi un registru sau o locaie de memorie de 8 sau 16 bii. Rezultatul se obine pe un numr
dublu de bii (16 sau 32). Operaia realizat este produsul intre acumulator i sursa cu depunerea
rezultatului n acumulatorul extins (ax pe octet sau dx:ax pe cuvnt). Cei doi operanzi se consider
numere fr semn.
Dac sursa este pe octet avem:
(AX) (AL) * (sursa)
iar dac sursa este pe cuvnt avem:
(DX : AX) (AX )* (sursa)
Afecteaz indicatorii CF i OF, ceilali sunt nedefinii. Exemplu.
a db 10h
b dw 100h
c dw ?
d dd ?
.........................................................
mov al, 20h
mul a
;
(ax)(al)*a
mov c, ax; depune rezultatul pe cuvnt
mov ax, 10h
mul b ;
(dx:ax) (ax)*b
mov word ptr d, ax; depune rezultatul pe dublu cuvnt
mov word ptr d+2, dx
.........................................................
l) Instruciunea IMUL (Integer Multiply)
Forma general:
IMUL
sursa
Instruciunea este similara cu MUL, deosebirea constnd n faptul ca cei doi operanzi se consider
numere cu semn. Afecteaz indicatorii CF i OF, restul sunt nedefinii.
Exemplu:
alfa db 93
beta dw 143
rez dd ?
.........................................................
mov al, alfa
cbw
; extensia de semn n ah
imul beta
(dx:ax) (ax)*(beta)
mov word ptr rez, ax
mov word ptr rez+2, dx
m) Intructiunea DIV (Divide)
Forma general:
DIV
sursa
unde sursa este un registru sau o locaie de memorie, reprezentata pe octet sau cuvnt.
Instruciunea realizeaz mprirea fr semn intre demprit i mpritor. Daca mpritorul (sursa) este
reprezentat pe octet atunci dempritul este AX i rezultatul este: catul n al iar restul n ah, adic:
DIV sursa
; (al) (ax)/(sursa)
; (ah) restul mpririi (ax)/(sursa)
Daca mpritorul (sursa) este reprezentat pe cuvnt atunci dempritul este considerat n DX i AX,

Unitile centrale ale calculatoarelor. Assembler

17

ctul se obine n AX iar restul n DX, adic


DIV sursa
; (ax) catul mpririi (dx:ax)/(sursa)
; (dx) restul mpririi (dx:ax)/(sursa)
Toi indicatorii nu sunt definii. Operaia de mprire poate conduce la depsiri, dac ctul depete
valoarea maxim reprezentabil pe 8, respectiv pe 16 bii sau daca mpritorul este 0.
n) Instruciunea IDIV (Integer Divide)
Forma general:
IDIV sursa
Semnificaia instruciunii i a operandului sursa este aceeasi ca la Instruciunea DIV, cu diferena c
operanzii sunt considerai numere cu semn, deci mprirea se face cu semn. Indicatorii sunt nedefinii.
Operaia poate conduce la depsiri.
2.1.3 Aritmetica BCD
a) Instruciunea AAA (ASCII Adjust for Addition)
Instruciunea nu are operanzi i executa corecia acumulatorului AX, dup operaii de adunare cu numere
n format BCD despachetai. Semnificaia este:
daca (AL0:3) > 9 sau (AF) = 1, atunci {
(AL) (AL) + 6
(AH) (AH)+1
(AF) 1
(CF) 1
(AL) (AL) AND 0FH
}
Indicatorii afectai : AF, CF, restul nedefinii.
Exemplu:
mov ax, 408h
mov dx, 209h
add ax, dx ; (ax)=0611h
AAA
; (ax)=0707h
b) Instruciunea AAS(ASCII Adjust for Subtraction)
Instruciunea nu are operanzi i execut corecia acumulatorului AX, dup operaii de scdere cu numere
n format BCD despachetai. Semnificaia este:
daca (AL0:3) > 9 sau (AF) = 1, atunci {
(AL) (AL) - 6
(AH) (AH) - 1
(AF) 1
(CF) 1
(AL) (AL) AND 0FH
}
Indicatorii afectai : AF, CF, restul nedefinii.
Exemplu:
mov ax, 408h
mov dx, 209h
sub ax, dx ; (ax)=04ffh
AAS
; (ax)=0109h
c) Instruciunea DAS (Decimal Adjust for Substraction)
Instruciunea nu are operanzi i executa corecia zecimala a acumulatorului AL, dup operaii de
scdere cu numere n format BCD mpachetat. Semnificaia este:
daca (AL0:3) > 9 sau (AF) = 1, atunci {

Unitile centrale ale calculatoarelor. Assembler

18

(AL) (AL) - 6
(AF) 1
}
daca acum (AL4:7) > 9 sau CF = 1, atunci {
(AL) (AL) - 60H
(CF) 1
}
Indicatorii afectai : AF, CF, PF, SF, ZF. Indicatorul OF este nedefinit.
De exemplu, n urma secvenei:
MOV AL, 52H
SUB AL, 24H ; AL = 2EH
DAS
; AL = 28H
se obine n AL rezultatul corect 28H.
d) Instruciunea AAM(ASCII Adjunct for Multiply)
Instruciunea nu are operanzi i efectueaz o corecie a acumulatorului AX, dup o nmulire pe 8
bii cu operanzi n format BCD despachetai.
Semnificaia este urmtoarea:
(AH) (AL) / 10
(AL) (AL) MOD 10
Indicatori afectai: PF, SF, ZF, restul nedefinite.
De exemplu
mov al, 7
mov bl, 9
mul bl ; 0036h
AAM ; 0504h
e) Instruciunea AAD (ASCII Adjunct for Division)
Instruciunea nu are operanzi i efectueaz o corecie a acumulatorului AX, naintea unei mpriri a
doi operanzi n format BCD despachetai.
Semnificaia este urmtoarea:
(AL) (AH) * 10 + (AL)
(AH) 0
Indicatori afectai: PF, SF, ZF, restul nedefinite.
De exemplu
mov ax, 305h
mov bl, 2
AAD
; (ax)=23h
div bl ; (al)=11h (ah)=1
2.1.4 EXEMPLE REZOLVATE i COMENTATE
Exemplul 1. Acest exemplu prezint cteva tehnici de adresare specifice procesoarelor din familia
8086/88:
TITLE exemplul_1
.MODEL SMALL
.STACK 10h
.DATA
alfa DW 3 DUP(?)
.CODE
begin: mov ax,@DATA

Unitile centrale ale calculatoarelor. Assembler

19

mov ds,ax
mov ax,17

; Adresare imediata a operandului


; sursa care este o constant
; zecimala
mov ax,10001b ; Sursa este o constant binara
mov ax,11h
; Sursa este o constant hexa
mov alfa,ax
; Adresare directa a operandului
; destinaie
mov cx,ax
; Interschimb coninuturile
mov ax,bx
; registrelor ax i bx
mov bx,cx
xchg ax,bx
; Acelasi efect cu secvena
; anterioara
mov si,2
mov alfa[si],ax ; Adresare relativa cu registrul
; i a operandului destinaie
mov si,2
mov bx,OFFSET alfa; Adresare imediat a operandului
; surs (adresa variabilei alfa)
; datorit operatorului OFFSET
lea bx,alfa
; Aceasta instruciune are acelasi
; efect cu cea anterioar cu toate
; c sursa este adresat direct
mov cx,[bx][si] ; Adresare bazat indexat a sursei
mov cx,alfa+2 ; Aceast instruciune are acelasi
; efect cu cea anterioar, sursa
; fiind ns adresat direct
mov cx,alfa[2] ; Notaii echivalente pentru
mov cx,[alfa+2] ; Instruciunea anterioar
mov di,4
mov [bx][di],55h ; Se va semnala eroare deoarece nu
; s-a precizat tipul destinaiei
; care este o variabila anonima
mov BYTE PTR [bx][di],55h; Se va folosi aceast
; variant cnd se dorete o
; adresare la nivel de octet
mov BYTE PTR alfa+4,55h; Aceast instruciune are
; acelasi efect cu cea anterioar,
; destinaia fiind ns adresat
; direct. Desi alfa este definit cu
; DW, operaia este realizata la
; nivel de octet
mov si,2
mov bx,3
mov alfa[bx][si],33h; Adresare bazata indexata
; relativa a operandului destinaie
mov alfa[bx+si],33h; Notaii echivalente pentru
mov [alpha+bx+si],33h; Instruciunea anterioara
mov [bx][si].alfa,33h
mov [bx][si]+alfa,33h
END begin
Pentru exemplificri s-a folosit Instruciunea mov n diferite variante de adresare: registru la registru,
din memorie n registru i din registru n memorie.
Exemplul 2. Se consider un vector de trei componente, fiecare component avnd dimensiunea de

Unitile centrale ale calculatoarelor. Assembler

20

un cuvnt. Sa se permute circular elementele vectorului cu o poziie la stnga:


TITLE exemplul_2
.MODEL SMALL
.STACK 10h
.DATA
vect
DW 100h,200h,300h
.CODE
start: mov ax,@DATA; Iniializarea registrului
mov ds,ax ; de segment ds
mov dx,vect ; Salvare n dx a primei
; componente a vectorului
mov ax,vect+2; Transfer a doua
mov vect,ax ; component n prima
mov ax,vect+4; Transfer a treia
mov vect+2,ax; component n a doua
mov vect+4,dx; Transfer prima
; component n ultima
END start
Exemplul 3. Sa se ncarce intr-o variabila pointer valoarea propriei adrese, sub forma de offset i
segment.
TITLE exemplul_3
.MODEL SMALL
.STACK 10h
.DATA
var_ptr DD
?
; Directiva DD are ca efect generarea sau
; rezervarea unor entiti pe 32 de bii
.CODE
begin: mov
ax,@DATA
mov
ds,ax
mov
ax,OFFSET var_ptr
mov
WORD PTR var_ptr,ax
; Operatorul OFFSET selecteaz componenta de
; offset a adresei unei variabile
mov
ax,SEG var_ptr
mov
WORD PTR var_ptr+2, ax
; Operatorul SEG selecteaz componenta de
; segment a adresei unei variabile
END
begin
Exemplul 4. Se consider un vector de trei componente cuvinte. Sa se introduc valoarea 55h n
octeii superiori ai elementelor vectorului.
TITLE exemplul_4
.MODEL SMALL
.STACK 10h
.DATA
val
EQU
55h
vect DW
111h,222h,333h
.CODE
start: mov
ax,@DATA
mov
ds,ax
mov
al,val ; Se ncarc valoarea
; dorita n registrul al
mov
BYTE PTR vect[1],al ; Se transfera

Unitile centrale ale calculatoarelor. Assembler

mov
mov
END

21

BYTE PTR vect[3],al ; valoarea in


BYTE PTR vect[5],al ; octeii
; superiori ai
; elementelor vectorului
start

Exemplul 5. Se consider un sir de 50 de cuvinte ncepnd de la adresa sir. Sa se genereze la adresa


adr_str adresa complet a sirului sub forma de offset i segment i s se ncarce n elementul al 25-lea al
sirului valoarea 100h.
TITLE exemplul_5
.MODEL SMALL
.STACK 10h
.DATA
nr_elem EQU
25
sir
DW
50 DUP(?)
adr_str DD
sir
; La adresa adr_str se genereaz adresa
; complet a variabilei sir sub forma de
; offset i segment, offset-ul fiind memorat
; la adresa cea mai mic
.CODE
begin: mov
ax,@DATA
mov
ds,ax
lds
bx,adr_str ; Se ncarc n registrul
; bx adresa de offset a variabilei sir si
; n registrul de segment ds adresa de
; segment a variabilei sir
mov
si,(nr_elem-1)*(TYPE sir)
; Operatorul TYPE ntoarce numrul de octei
; ai unei componente a sirului sir. Expresia
; indicat determin adresa primului octet al
; componentei care se vrea accesat
mov
WORD PTR [bx][si],100h
END
begin

Exemplul 6. S se adune doua numere folosind diferite moduri de adresare.


Data segment
a dw 75h ; primul operand
b dw ? ; al doilea operand
c dw ? ; rezultatul
data ends
cod segment
assume cs:cod,ds:data
start:
mov ax,data
mov ds,ax
; ncarc ds adresa de segment de date data
mov b,0a3bh ; transfer la adresa b valoarea 0a3bh
; operandul surs este adresat imediat
; operandul destinaie este adresat direct la memorie
mov bx,offset a ; ncarc n bx adresa variabilei a
; operandul destinaie este adresat direct la registru
mov ax,[bx] ; ncarc n ax coninutul adresei aflate n bx, adic
; valoarea variabilei a
; operandul sursa adresat indirect

Unitile centrale ale calculatoarelor. Assembler

22

add ax, b ; aduna la ax valoarea variabilei b


mov di, offset c ; ncarc n di adresa lui c
mov [di], ax ; transfer la adresa lui di, adic n c coninutul
; lui ax
mov ax,4c00h; ncarc n ah valoarea 4c, funcia...
int 21h
; intrerupere
cod ends
end start
Exemplul 6. S se evalueze expresia x+2*y-70, depunnd rezultatul la adresa z, unde x, y, z sunt
ntregi reprezentai pe cte un cuvnt.
TITLE exemplul_6
.MODEL SMALL
.STACK 10H
.DATA
x
DW
100
y
DW
-10
z
DW
?
.CODE
begin: mov
ax,@DATA
mov
ds,ax
mov
ax,x ; Se folosete ax ca
; acumulator
add
ax,y
add
ax,y
sub
ax,70
mov
z,ax
END
begin
Exemplul 7. Sa se efectueze operaia: dp2 <- - dp1- sp1+sp2 tiind ca sp1 i sp2 sunt ntregi cu semn
reprezentai n simpla precizie, pe un cuvnt i dp2 este un ntreg cu semn n dubla precizie pe doua
cuvinte.
TITLE exemplul_7
.MODEL SMALL
.STACK 10h
.DATA
dp1 DD
12345678h
sp1 DW
170h
sp2 DW
180h
dp2 DD
?
.CODE
begin: mov
ax,@DATA
mov
ds,ax
mov
si,WORD PTR dp1 ; Perechea (si:di)
mov
di,WORD PTR dp1+2; este folosit ca
; acumulator pe 32 de bii deoarece (ax:dx)
; se folosete pentru conversii din simpla in
; dubla precizie
mov
ax,sp1
cwd ; Se convertete coninutul registrului
; ax, considerat ca un numr ntreg fr
; semn, n dubla precizie, poriunea cea mai
; semnificativa depunndu-se n registrul dx
sub
si,ax
sbb
di,dx

Unitile centrale ale calculatoarelor. Assembler

23

mov
ax,sp2
cwd
add
si,ax
adc
di,dx
mov
WORD PTR dp2,si
mov
WORD PTR dp2+2,di
END
begin
Exemplul 8. Sa se schimbe semnul unui numr ntreg dp reprezentat n dubla precizie pe doua
cuvinte.
TITLE exemplul_8
.MODEL SMALL
.STACK 10h
.DATA
dp
DW
2 DUP(?)
.CODE
begin: mov
ax,@DATA
mov
ds,ax
mov
ax,0 ; Se scade numrul
; respectiv dn 0 reprezentat pe 32 de biti
sub
ax,dp
mov
dp,ax
mov
ax,0
sbb
ax,dp+2
mov
dp+2,ax
END
begin
ExempluL 9. Sa se elaboreze un program pentru implementarea operaiei:
z <-- ((w-x)/10*y)2
unde x, y, z, w sunt ntregi cu semn reprezentai pe cte un cuvnt.
TITLE exemplul_9
.MODEL SMALL
.STACK 10h
.DATA
w
DW
200
x
DW
100
y
DW
-1
z
DW
?
.CODE
begin: mov
ax,@DATA
mov
ds,ax
mov
ax,w ; Se folosete ax ca
; acumulator
sub
ax,x
mov
bl,10
idiv bl
; mprire ntreag,
cbw
imul y
imul ax
mov
z,ax
END
begin
Exemplul 10. Se consider dou numere ntregi dip i smp, primul reprezentat pe doua cuvinte i al
doilea pe un cuvnt. Sa se efectueze nmulirea dip*smp depunnd rezultatul n variabila tp.
TITLE exemplul_10

Unitile centrale ale calculatoarelor. Assembler

24

.MODEL SMALL
.STACK 10h
.DATA
smp DW
11h
dip DW
11h,22h
tp DW
3 DUP(?) ; Rezultat pe trei cuvinte
.CODE
begin:mov
ax,@DATA
mov
ds,ax
mov
ax,smp
mul
dp
mov
tp,ax
mov
cx,dx
mov
ax,dip+2
mul
smp
add
ax,cx
mov
tp+2,ax
mov
tp+4,dx
END
begin
Exemplul 11. Sa se genereze 2 numere a cte 4 cifre zecimale reprezentate n format BCD
mpachetat (adic fiecare grup de doua cifre zecimale este memorat intr-un octet) i s se scrie o secvena
de program pentru calculul sumei i diferenei lor.
TITLE exemplul_11
.MODEL SMALL
.STACK 10h
.DATA
bcd1 DB
34h,18h; 1834 n format BCD
; mpachetat
bcd2 DB
89h,27h; 2789 n format BCD
; mpachetat
sum DB2 DUP(?)
dif DB2 DUP(?)
begin: mov ax,@DATA
mov ds,ax
mov al,bcd1
add al,bcd2
daa
mov sum,al
mov al,bcd1+1
adc al,bcd2+1
daa
mov sum+1,al
mov al,bcd1
sub al,bcd2
das
mov dif,al
mov al,bcd1+1
sbb al,bcd2+1
das
mov sum+1,al
END begin
Exemplul 12. S se scrie o secvena de program care sa efectueze armatoarea operaie
u <- - v+(s- 6)
tiind ca numerele sunt reprezentate n cod BCD mpachetat (vezi enunul exemplului anterior), cu 2 cifre

Unitile centrale ale calculatoarelor. Assembler

25

zecimale.
TITLE exemplul_12
.MODEL SMALL
.STACK
.DATA
v
DB
56h; 56
s
DB
48h; 48
u
DB
?
.CODE
begin: mov ax,@DATA
mov ds,ax
mov al,s
sub al,6
das
add al,v
daa
mov u,al
END begin
Exemplul 13. S se scrie un program pentru adunarea i scderea a doua numere a cte doua cifre
zecimale reprezentate n format BCD nempachetat (adic fiecare cifra zecimala se memoreaz n tetrada
inferioar a unui octet):
TITLE exemplul_13
.MODEL SMALL
.STACK 10h
.DATA
upk1 DB
01h,02h; 21 n format BCD
; nempachetat
upk2 DB
03h,06h; 63 n format BCD
; nempachetat
sum DB
2 DUP(?)
dif DB
2 DUP(?)
.CODE
begin: mov ax,@DATA
mov ds,ax
mov al,upk1
add al,upk2
aaa
mov sum,al
mov al,upk1+1
adc al,upk2+1
aaa
mov dif+1,al
mov al,upk1
sub al,upk2
aas
mov dif,al
mov al,upk1+1
sbb al,upk2+1
aas
mov dif+1,al
END begin
Exemplul 14. Sa se scrie un program pentru mprirea unui numr ntreg pozitiv de trei cifre
zecimale reprezentat n format BCD nempachetat printr-o cifra zecimala:
TITLE exemplul_14

Unitile centrale ale calculatoarelor. Assembler

26

.MODEL SMALL
.STACK 10h
.DATA
dgt
DB
03h
num
DB
07h,05h,04h;754 n format BCD
; nempachetat
rez
DB
3 DUP(?)
rest
DB
?
.CODE
start: mov ax,@DATA
mov ds,ax
mov dl,dgt
mov ah,0
mov al,num
aad
div dl
mov rez,al
mov al,num+1
aad
div dl
mov rez+1,al
mov al,num+2
aad
div dl
mov rez+2,al
mov rest,ah
END start
Exemplul 15. S se scrie un program pentru nmulirea unui numr ntreg pozitiv de doua cifre
zecimale reprezentat n format BCD nempachetat cu o cifra zecimala:
TITLE exemplul_15
.MODEL SMALL
.STACK 10h
.DATA
dgt DB
09h ; 9 n format BCD
; nempachetat
num DB
03h,02h; 23 n format BCD
; nempachetat
rez DB
3 DUP(?)
.CODE
begin: mov ax,@DATA
mov ds,ax
mov dl,dgt
mov al,num
mul dl
aam
mov dh,ah
mov rez,al
mov al,num+1
mul dl
aam
add al,dh
aaa
mov rez+1,al
mov rez+2,ah

Unitile centrale ale calculatoarelor. Assembler

END

27

begin

Exemplul 16. S se scrie un program de conversie a unui numr zecimal de doua cifre sub forma a
doua caractere zecimale, i sa se afieze cele doua caractere pe ecran. Pentru afiare se va utiliza funcia
DOS cu codul 02h, n registrul dl aflndu-se codul ASCII al caracterului care se vrea afiat. La apelul
unei funcii DOS n registrul al se va transmite codul funciei.
TITLE exemplul_16
.MODEL SMALL
.STACK 10h
.DATA
oct DB
25
.CODE
start: mov ax,@DATA
mov ds,ax
mov al,oct
aam
add ah,'0'
add al,'0'
mov dx,ax
xchg dl,dh
mov ah,2 ; Funcia DOS cu codul 02h
int 21h ; se utilizeaz pentru
mov dl,dh; afiarea unui caracter pe
int 21h ; ecran, n dl
; transmindu-se codul ASCII al
; caracterului de afiat
mov ax,4C00h; Iesire normala la
int 21h ; sistemul de operare
END start
Exemplul 17. Conversia unui ntreg fr semn reprezentat pe 16 bii la un sir de caractere (cifre) n
baza 10. Algoritmul de conversie, daca n este numrul, i sir este variabila unde se depun cifrele
numrului descris n C este:
adresa = sir;
do{
rest = n%10;
n = n/10;
*sir++ = rest + 0;
}while (n!=0);
*sir = 0;
inverseaza (adrsir);
Restul furnizeaz cifra curenta creia i se aduga codul ASCII al cifrei 0. Funcia inverseaz ordinea
caracterelor din irul generat de algoritm.
Implementarea n asamblare arata astfel:
data segment
n dw 7654h
sir db
5 dup ("?"),'$'
data ends
cod segment
assume ds: data, cs:cod
start:
mov ax,data
mov ds,ax
mov ax,n
convert:

Unitile centrale ale calculatoarelor. Assembler

mov cx,0
mov bx,10
divide:
mov dx,0
div bx ; ctul n AX, restul n DX (DL)
add dx,'0'
push dx
inc cx
cmp ax,0
jnz divide
reverse:
pop ax
mov sir[di],al
add di,1
dec cx
cmp cx,0
jnz reverse
mov dx, offset sir
mov ah,9
int 21h
mov ax, 4c00h
int 21h
cod ends
end start

28