Documente Academic
Documente Profesional
Documente Cultură
Assembler
10
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:
12
13
14
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:
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,
17
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
19
mov ds,ax
mov ax,17
20
mov
mov
END
21
22
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
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
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
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
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:
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