1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 IESIRE DATE Prin cele trei operatii de mai sus,am setat tot byte-ul inferior la va-
loarea 1 (255 binar este 1111 1111 iar SAHF incarca tot byte-ul inferior)
respectiv STD si STI seteaza bitii 9 si 10 la valoarea 1 . INSTRUCTIUNI PENTRU CONVERSIA DATELOR Permit schimbarea tipului de data.Pentru procesorul 8086 se pot apela
instructiunile cbw si cwd,care convertesc un byte intr-un word si respec-
tiv un word intr-un dword.Procesoarele 80386 accepta si instructiunile
cdq (dword in qword) si movsx(care conversteste un btye direct in dword).
Se utilizeaza pentru a realiza compatibilitatea dintre serii de date ar-
hivate in format diferit(Exemplu: pentru a utiliza o banca de date arhi-
vate in format de 32 de biti,cu un program care lucreaza pe 64 de biti).
CBW -converteste o data de tip byte intr-o data de tip word,in registrul
AX.Ca rezultat,data de tip word va mentine valoarea din registrul AL,
iar AH va fi "adus la zero"(se sterg datele din AH).
-43-
EXEMPLU: program assmb35;
uses WinCRT;
var b1:byte;
w1:word;
begin
b1:=33;
asm
mov AL,b1
mob AH,22
cbw
mov w1,AX
mov b1,AH
end;
writeln('dupa conversie numarul rezultat este: ',w1);
writeln('iar registrul AH este: ',b1);
end.
Practic,registrul AL a fost "extins" la intregul registru AX.
(EXEMPLU: 0001 0110 devine 0000 0000 0001 0110 )
CWD - converteste o valoare de tip word,la o valoare de tip dword(adica
16 biti la 32 de biti).Rezultatul va ocupa ambii registrii AX si DX
si va pastra valoarea registrului AX in timp ce DX va fi "adus la
zero" (datele din DX se sterg).
EXEMPLU: program assmb36;
uses WinCRT;
var dw1,dw2:word;
begin
asm
mov AX,299
mov DX,555
cwd
mov dw1,AX
mov dw2,DX
end;
writeln('valoarea registrului AX este: ',dw1);
writeln('valoarea registrului DX este: ',dw2);
end.
Pentru a nu pierde date in timpul conversiei,este bine ca datele din
registrul auxiliar (AH si respectiv DX ) sa fie valorificate inaintea
operatiei de conversie.
Conversia se poate face si prin extensia semnului,caz in care registrul
auxiliar va contine semnul numarului.Exemplu: AH in loc sa fie "adus la
zero" va mentine semnul numarului din AL,practic,fiecare bit va contine
valoarea flag-ului de semn,adica bitul 7 din registrul FLAGS.In acest caz,
registrul auxiliar va fi umplut fie cu 0 fie cu 1. INSTRUCTIUNI ARITMETICE BINARE
Efectueaza operatii aritmetice simple de adunare,scadere,inmultire si
impartire.Instructiunile din acest grup sunt: add,adc,inc,dec,sub,sbb,
cmp,neg,xadd,mul,imul,div si idiv.Toate aceste instructiuni opereaza
atat cu registri si valori imediate cat si cu variabile de memorie,dar
cel putin unul dintre operanzi trebuie sa nu fie o variabila de memorie.
-44-
ADD d,s -adauga valoarea din operandul sursa (s) la valoarea din operandul
de destinatie (d).Ca rezultat,operandul de destinatie (d) va contine
suma valorilor din cei doi operanzi.Daca valoarea rezultata este
in afara domeniului de reprezentare,seteaza automat flag-ul CF.
Nu se pot efectua operatii intre doua variabile de memorie,in rest
se pot face toate combinatiile intre registri,variabile si constante.
EXEMPLU: program assmb37;
uses WinCRT;
var nr1:word;
begin
asm
mov ax,33
mov bx,57
add ax,-19
add bx,-43
add ax,bx
mov nr1,ax
add nr1,23+46
end;
writeln('rezultatul final este: ',nr1);
end.
ADC d,s -este operatia "add with carry".Este identica cu ADD,dar adauga
la suma celor doi operanzi si valoarea flag-ului CF (carry flag).Ca
rezultat,atunci cand flagul CF este setat (1),rezultatul va fi suma
celor doi operanzi plus 1 (Exemplu: 1 +1 =3):
EXEMPLU: program assmb38;
uses WinCRT;
var nr1:word;
begin
asm
mov ax,1
stc
adc ax,1
mov nr1,ax
end;
writeln('rezultatul este: ',nr1);
end.
Rezultatul operatiei este influentat da valoarea flagului CF.Prin combi-
narea unui numar oarecare de instructiuni ADC la care sursa are valoarea
zero,se pot obtine valori diferite,in functie de setarea flagului CF.
Acest gen de algoritimi se pot utiliza pentru a obtine un set de variante
in functie da valoarea flag-ului.Se utilizeaza mai ales pentru programele
de depanare si setare automata.
INC d -adauga 1 la valoarea de destinatie (d).Aceasta instructiune nu
afecteaza flag-ul CF (chiar daca se depaseste setul de valori repre-
zentabile).Destinatia poate fi un registru general sau o variabila de
memorie iar valoarea din operandul de destinatie poate fi de tip
byte,word sau dword.Se utilizeaza mai ales in interiorul unor bucle
de repetitie,in care valoarea creste progresiv pana cand se ajunge la
pragul de iesire din bucla (Exemplu: verificarea succesiva a unui set
de valori,fata de o conditie fixa).
-45-
EXEMPLU: program assmb39;
uses WinCRT;
var nr1:word;
begin
while nr1 < 20 do
asm
mov ax,nr1
inc ax
mov nr1,ax
end;
writeln('rezultatul este: ',nr1);
end.
SUB d,s -este operatia inversa fata de ADD.Scade valoarea sursei din va-
loarea operandului de destinatie.Daca rezultatul necesita "un impru-
mut" (este mai mic decat zero),seteaza flagul CF (la valoarea 1).
Regulile sunt identice cu cele de la ADD(nu se pot efectua operatii
intre doua variabile de memorie).Efectueaza o scadere simpla:
EXEMPLU: program assmb40;
uses WinCRT;
var nr1:word;
begin
asm
mov ax,33
sub ax,32
mov nr1,ax
end;
writeln('rezultatul este: ',nr1);
end.
SBB d,s -este operatia "subbstract with borrow".Este identica cu SUB dar
scade din destinatie si valoarea flag-ului CF.Daca CF este 1,rezul-
tatul obtinut va fi mai mic cu o unitate decat cel returnat de SUB.