səhifə 5/10 tarix 16.12.2017 ölçüsü 1,03 Mb. #35021
SHL -salt logic stanga
SHR -salt logic dreapta
aditivi + -adunare binara
- -scadere binara
binari NOT -negatie binara
AND -SI binar
OR -SAU binar
XOR -SAU binar exclusiv
Operatorii de mai sus se pot utiliza izolat,sau se pot grupa pentru a
forma expresii complexe.Operatorii din aceeasi categorie au aceeasi
precedenta.Tabelul este prezentat in ordine descrescatoare a precedentei:
astfel & are precedenta cea mai mare iar XOR are precedenta cea mai mica.
Pentru familiarizarea cu expresiile asm,urmeaza cateva exemple simpliste
de utilizare a operatorilor.
Pentru operatiile aritmetice simple gen adunare si multiplicare,operatorul
+ si respectiv * poate utiliza doar valori imediate(valori numerice).Nu
se pot utiliza valori arhivate in variabile:
EXEMPLU: program assmb10;
uses WinCRT;
var nr1,nr2:word;
begin
nr1:=77;
asm
mov ax,nr1
mov bx,5+14
add ax,bx
mov bx,12*3
add ax,bx
mov nr2,ax
end;
writeln('rezultatul operatiilor este: ',nr2); end.
-29-
Operatorul & se utilizeaza pentru a desemna un identificator de tipul
celor definiti de catre utilizator.Se poate utiliza chiar si pentru a
utiliza cuvintele rezervate(cuvintele cheie) pe post de identificator.
Orice combinatie de caractere ce urmeaza imediat dupa & va fi tratata
ca identificator declarat de utilizator:
EXEMPLU: program assmb11;
uses WinCRT;
var AH,rezultat:byte;
begin
AH:=17;
asm
mov AH,&AH
mov rezultat,AH
end;
writeln('Rezultatul este: ',AH);
end.
In exemplul de mai sus,AH este un identificator banal in Pascal,dar este
un cuvant rezervat in assembler(registrul de un byte).Pentru a putea
transfera valoarea variabilei AH din Pascal in bucla asm...end,se poate
utiliza operatorul &.In acest caz,&AH va fi recunoscut ca identificator
banal si nu va mai fi confundat cu registrul AH.
Parantezele rotunde sunt operatorul prin care se poate introduce in
expresie,o subexpresie,care va fi evaluata inainte de a evalua expresia
principala,dupa care va fi tratata ca si un element simplu al expresiei.
EXEMPLU: program assmb12;
uses WinCRT;
var nr:word;
begin
asm
mov ax,(5*3)+(33/3)
mov nr,ax
end;
writeln('rezultatul expresiei este: ',nr);
end.
Punctul este operatorul pentru selectia unui membru dintr-o structura de
date cu mai multi membri.Primul identificator desemneaza structura iar
cel de al doilea(dupa punct) desemneaza membrul:
EXEMPLU: program assmb13;
uses WinCRT,WinTypes;
var punct:TPoint;
begin
asm
mov ax,50
mov bx,75
mov punct.x,ax
mov punct.y,bx
end;
writeln('Coordonatele punctului sunt: ');
writeln(' x= ',punct.x,' si y= ',punct.y);
end.
In exemplu,am utilizat o data de tip TPoint ( record cu x,y :integer )
-30-
Programul assembler inclus in Pascal accepta si date de tip obiect.In
cazul obiectelor,operatorul "punct" se utilizeaza pentru a selecta
membrii sau metodele obiectului:
EXEMPLU: program assmb14;
uses WinCRT,WinTypes;
type ob1=object
x1,y1:word;
constructor unu;
end;
constructor ob1.unu;
begin
x1:=77;
y1:=33;
end;
var obiect:ob1;
punct:TPoint;
begin
obiect.unu;
asm
mov ax,obiect.x1
mov bx,obiect.y1
mov punct.x,ax
mov punct.y,bx
end;
writeln('Coordonatele punctului sunt: ');
writeln(' x= ',punct.x,' si y= ',punct.y);
end.
Parantezele drepte [ ] se utilizeaza pentru a marca o adresa de memo-
rie.Datele incluse in paranteze drepte se refera la o adresa de memorie.
EXEMPLU: program assmb15;
uses WinCRT;
type arie=array[0..6] of char;
var a1:arie;
adr,sg1:word;
pt1:PChar;
x:integer;
begin
a1[1]:='A';
a1[2]:='B';
a1[3]:='C';
a1[4]:='D';
a1[5]:='E';
asm
mov ax,offset a1[0]+1
mov bx,seg a1[1];
mov adr,ax
mov sg1,bx
end;
pt1:=Ptr(sg1,adr);
writeln('Datele din aria a1 sunt: ',pt1);
end.
-31-
Datele cuprinse intre paranteze drepte se refera la adrese de memorie.
In exemplul anterior,observati ca se pot efectua si operatii asupra
adreselor de memorie (gen a1[0]+1).Datele cuprinse intre paranteze
drepte sunt evaluate complet inainte de a fi tratate ca un element simplu
( EXEMPLU : a1[2+3} va fi evaluata ca a1[5] ).
Operatorii unari HIGH si LOW returneaza byte-ul cel mai semnificativ,
si respectiv byte-ul cel mai putin semnificativ dintr-o data de tip word.
Se amplaseaza imediat inaintea valorii asupra careia opereaza,care trebuie
sa fie o valoare imediata (nu poate fi o variabila).
EXEMPLU: program assmb16;
uses WinCRT;
var a,b,c,d:byte;
begin
asm
mov a,HIGH 255
mov b,LOW 255
mov c,HIGH 257
mov d,LOW 257
end;
writeln('byte-ul superior din 255 este: ',a);
writeln('byte-ul inferior din 255 este: ',b);
writeln('byte-ul superior din 257 este: ',c);
writeln('byte-ul inferior din 257 este: ',d);
end.
Pentru a clarifica eventualele nelamuriri,trebuie remarcat faptul ca
adresele de memorie de tip word,se formeaaza din cate doua adrese de tip
byte.Asfel,vor exista 256 de segmente de cate 256 de bytes(total 65536).
Adresele vor fi segmentate in felul urmator:
NUMAR ADRESA
0 0 : 0
1 0 : 1
2 0 : 2
... ...
255 0 : 255
256 1 : 0
257 1 : 1
258 1 : 2
... ...
65536 256 : 256
Practic,functioneaza la fel ca si SEG si OFFSET,dar pentru a nu fi con-
fundate cu datele de 32 de biti,se utilizeaza cuvintele cheie HIGH si LOW.
In Pascal,HIGH si LOW se pot apela atat pentru a returna un byte,cat si
pentru a returna un word ( EXEMPLE: vezi HIBYTE si HIWORD din Pascal )
Operatorul : (doua puncte) desemneaza segmentul unei adrese.Atunci
cand se introduce intr-o expresie,instruieste assemblerul aspura faptului
ca expresia care urmeaza dupa cele doua puncte apartine segmentului de
adresa situat imediat inaintea celor doua puncte:
segmentul : Expresia
Rezultatul este o adresa de memorie cu valoarea expresiei .
-32-
EXEMPLU: program assmb17;
uses WinCRT;
var adr:word;
begin
asm
mov AX,DS:[033h]
mov adr,AX
end;
writeln('Adresa: ',adr,' face parte din segmentul de date !');
end.
Operatorii OFFSET si SEG,returneaza word-ul cel mai semnificativ si
respectiv cel mai putin semnificativ,dintr-o adresa de 32 de biti.
EXEMPLU: program assmb18;
uses WinCRT;
var sir1:string;
of1,seg1:word;
begin
sir:='Exemplu pentru controlul offset-ului';
asm
mov of1,OFFSET sir1
mov seg1,SEG sir1
end;
writeln('Offset-ul sirului este: ',of1);
writeln('Segmentul sirului este: ',seg1);
writeln('Adresa completa este: ',seg1,':',of1);
end.
In cazul adreselor de 32 de biti,atat offset-ul cat si segmentul sunt
adrese de cate un word(2 bytes) si pot lua valori decimale cuprinse
intre 0 si 65536.La randul sau,fiecare word (adica fiecare offset si
fiecare segment) poate fi subimpartit in cate 256 adrese de cate un byte.
Acest mod de formare al adreselor este valabil pentru toate programele
care respecta standardele internationale de comunicatie (ASCII etc.).
Fiecare adresa de cate un word (fiecare segment si fiecare offset)
poate fi reprezentata fie zecimal,fie hexazecimal sau binar.Valoarea
adresei este aceeasi,indiferent de formatul utilizat pentru reprezentare.
Exemplu: pentru offset-ul 97 decimal corespunde valoarea 61 hexazecimala
care poate fi reprezentata binar ca: 10110000 01100001.
Astfel cele doua expresii:
mov ax,97
mov ax,61h
au aceeasi semnificatie.
Pentru compatibilitatea programelor,si pentru a fi cat mai usor de editat
si de redactat,este bine sa utilizati formatul hexazecimal atunci cand
apelati adresele expresiilor,din doua motive: 1.sunt mai scurte si 2.lite-
ra "h" utilizata pentru a specifica formatul hexazecimal atrage atentia
asupra faptului ca este vorba despre o adresa(oricum un format hexa).
Formatul de 32 de biti,este cel mai larg utilizat,dar nu este absolut.
Exista programe care folosesc pentru adrese 24,48 sau 64 de biti,etc.
Daca exista neclaritati asupra modului de formare a adreselor,exersati
pe hartie cu patratele,serii crescatoare de numere binare si hexazecimale.
-33-
Operatorul TYPE returneaza tipul expresiei,respectiv dimensiunea in
bytes a tipului de data respectiv.Pentru valorile imediate,tipul de data
este 0 (nu ocupa spatiu de memorie ca si variabilele).Se poate utiliza
pentru orice tip de data acceptat de assemblerul din Pascal(inclusiv
pentru obiecte definite de utilizator).
EXEMPLU: program assmb19
uses WinCRT,WinTypes;
var a,b,c,d,e:word;
a1:byte;
b1:real;
c1:TPoint;
d1:string;
begin
asm
mov a,TYPE a1
mov b,TYPE b1
mov c,TYPE c
mov d,TYPE c1
mov e,TYPE d1
end;
writeln('Variabila a1 este din tipul: ',a);
writeln('Variabila b1 este din tipul: ',b);
writeln('Variabila c este din tipul: ',c);
writeln('Variabila c1 este din tipul: ',d);
writeln('Variabila d1 este din tipul: ',e);
end.
Operatorul PTR schimba tipul expresiei urmatoare la expresia precedenta:
EXEMPLU: program assmb20;
uses WinCRT;
var c:word;
a,b:byte;
a1:shortint;
b1:integer;
c1:longint;
begin
a1:=15;
b1:=33;
c1:=29;
asm
mov ah,BYTE PTR a1
mov a,ah
mov bh,BYTE PTR b1
mov b,bh
mov cx,WORD PTR c1
mov c,cx
end;
writeln('Valoarea lui a este: ',a);
writeln('Valoarea lui b este: ',b);
writeln('Valoarea lui c este: ',c);
end.
PTR a schimbat datele: din shortint si int in BYTE si din longint in WORD.
-34-
Daca sintaxa este: Expresia1 PTR Expresia2 atunci Expresia1 primeste
tipul de data al Expresia2 dar pastreaza valoarea.Rezulta o expresie din
tipul Expresia1 dar cu valoarea din Expresia2.
Pentru tipul final de data se accepta oricare dintre variantele:
BYTE PTR,WORD PTR,DWORD PTR,FWORD PTR,TBYTE PTR,QWORD PTR,NEAR PTR,FAR PTR
Operatorul MOD efectueaza impartirea si returneaza restul.Ambele ex-
presii trebuie sa fie valori imediate.Rezulta tot o valoare imediata.
EXEMPLU: program assmb21;
uses WinCRT;
var nr1:word;
begin
asm
mov ax,73 MOD 19
mov nr1,ax
end;
writeln('restul din 73/19 este: ',nr1);
end.
Operatorii SHL si SHR efectueaza un salt binar(modifica puterea lui 2)
spre dreapta sau spre stanga (cresc sau scad exponentul).Opereaza doar
cu valori absolute(spre deosebire de instructiunile de procesor SHR si
SHL care actioneaza atat asupra variabilelor cat si a registrilor).
Rezultatul este tot o valoare imediata(tipul 0).
EXEMPLU: program assmb22;
uses WinCRT;
var nr1,nr2:word;
begin
asm
mov ax,256 SHL 4
mov bx,256 SHR 4
mov nr1,ax
mov nr2,bx
end;
writeln(' 256 SHL 4 este= ',nr1);
writeln(' 256 SHR 4 este= ',nr2);
end.
Operatorii + si - binari,executa suma si diferenta binara.Spre
deosebire de cei unari ,accepta ca primul membru sa fie o variabila:
EXEMPLU: program assmb23;
uses WinCRT;
var nr1,nr2:word;
begin
asm
mov nr1,33
mov bx,[nr1]+19
mov cx,[nr1]-13
mov nr1,bx
mov nr2,cx
end;
writeln('primul numar calculat este: ',nr1);
writeln('al doilea numar calculat este: ',nr2);
end.
-35-
Este bine sa nu utilizati operatorii + si - binari decat pentru operatii
asupra adreselor.Pentru operatii simple de adunare si scadere utilizati
operatorii unari sau instructiunile de procesor ADD si SUB.
Operatorii logici actioneaza la nivel de bit.Operatorul logic NOT
returneaza valoarea bitwise negativa (complementul) expresiei dupa care
urmeaza.Se poate utiliza doar pentru valori absolute(pentru 0 returneaza
65535,pentru 1 returneaza 65534 ...etc.).Practic,operatorul NOT citeste
valorile "in oglinda" fata de valoarea reala.
EXEMPLU: program assmb24;
uses WinCRT;
var nr1:word;
begin
asm
mov ax,NOT 0
mov nr1,ax
end;
writeln('numarul transferat este: ',nr1);
end.
Operatorii logici AND,OR si XOR returneaza rezultatul operatiei respective
Membrii operatiei trebuie sa fie valori imediate,iar rezultatul returnat
va fi tot o valoare imediata.Rezultatul este identic cu cel al operatilor
logice SI,SAU si respectiv SAU exclusiv si au corespondent direct cu
portile logice similare de la nivelul procesorului.Se deosebesc de in-
structiunile cu acelasi nume(AND,OR si XOR) prin faptul ca nu opereaza
decat cu valori imediate(nu accepta variabile si registri pe post de
operanzi).
EXEMPLU: program assmb25;
uses WinCRT;
var nr1,nr2,nr3:word;
begin
asm
mov ax,7 AND 39
mov bx,7 OR 39
mov cx,7 XOR 39
mov nr1,ax
mov nr2,bx
mov nr3,cx
end;
writeln(' 7 AND 39 rezulta: ',nr1);
writeln(' 7 OR 39 rezulta: ',nr2);
writeln(' 7 XOR 39 rezulta: ',nr3);
end.
Operatorii pot fi grupati sub forma de expresii si subexpresii destul
de complexe.Atunci cand formulele de calcul sunt lungi,este bine sa fie
subimpartite in cat mai multe operatii succesive posibil.Este bine sa se
evite fenomenul de supraincarcare a operatorilor.Expresiiile,cu cat sunt
mai simple,cu atat sunt mai usor de executat,dar mai ales,cu atat sunt
mai usor de depanat (in majoritatea cazurilor,depanarea va fi facuta tot
de catre d-voastra,dar in momentele in care va asteptati cel mai putin !).
E bine sa proiectati expresiile in asa fel incat sa fie clare de la prima
vedere,fara o analiza detaliata sau asumptii logice multiple.
-36-
CONSTANTE NUMERICE
Assemblerul din Pascal accepta pentru constantele numerice numere
intregi incluse in intervalul: -2147483648 pana la 4294967295.Formatul
implicit al numerelor este cel zecimal.
Aseembler accepta si formatele binare (caz in care dupa numar se adauga
litera B),octale (caz in care dupa numar se adauga litera O) si hexazeci-
male( caz in care dupa numar se adauga litera H sau numarul este precedat
de semnul $).
EXEMPLE: 55B 17B 331B sunt numere in format binar
21O 11O 227O sunt numere in format octal
99H 18H $79 sunt numere hexazecimale
In cazul in care utilizati conventiile Pascal pentru declararea constan-
telor,expresiile de tip Pascal nu recunosc decat formatul decimal si cel
hexazecimal in care numarul este precedat de semnul $ (Exemplu: $29).In
declaratii de tip Pascal nu se pot utiliza celelalte formate (programul
le accepta insa in cazul filelor asm externe).
In cazul numerelor hexazecimale,scrise cu sufixul H,daca numarul incepe
cu o litera,trebuie sa se adauge un zero in fata numarului,astfel incat
numarul sa inceapa cu o cifra.In caz contrar,numarul va fi interpretat ca
si cand ar fi un identificator oarecare (Exemplu: BA4H devine 0BA4H).
EXEMPLU: program assmb26;
uses WinCRT;
const ABCh=77;
var nr1,nr2:word;
begin
asm
mov ax,ABCh
mov bx,0ABCh
mov nr1,ax
mov nr2,bx
end;
writeln('numarul nr1 este: ',nr1);
writeln('numarul nr2 este: ',nr2);
end.
Pentru a putea utiliza o fila asm externa ,aceasta trebuie asociata cu
programul (link-ata) in etapa de compilare cu ajutorul directivei de pre-
compilare {$L numele filei} dupa care functiile si procedurile pot fi
apelate cu external,la fel ca si cele importate din filele DLL.
EXEMPLU: function GetMode: word;external;
este o declaratie prin care se specifica faptul ca functia a fost definita
extern.
Se spune despre o expresie ca este realocabila,atunci cand in momentul
compilarii trebuie sa se rezerve spatiu de memorie pentru valoarea respec-
tiva.Etichetele,variabilele,functiile si procedurile sunt valori realoca-
bile.Valorile numerice imediate,nu necesita spatiu de memorie si se mai
numesc si valori absolute (sunt din tipul 0 si ocupa 0 bytes de memorie).
Asupra valorilor absolute se pot efectua orice tip de operatii,in timp
ce asupra valorile realocabile nu se pot efectua decat operatii de adauga-
re sau extragere a unor constante.In momentul compilarii,nu se cunoaste
locatia finala a valorilor realocabile (acestea devin adrese daor in
etapa de link-are a programului).
-37-
INSTRUCTIUNI
In tabelul de la paginile 13-15,au fost prezentate sintetic toate
instructiunile acceptate de procesorul 8086.In continuare,instructiunile
vor fi prezentate prin exemple simple,grupate in functie de tipul de
operatie executata.Acest capitol,este util doar pentru incepatori.
INSTRUCTIUNI PENTRU DEPLASAREA DATELOR
Principalele instructiuni pentru deplasarea datelor sunt mov,xchg,push
si pop.Se utilizeaza pentru a transfera date intre registri,variabile etc.
MOV - transfera date de tip byte,word sau dword de la operandul sursa la
Dostları ilə paylaş: