Limbajul Assembler abc-doar



Yüklə 1,03 Mb.
səhifə5/10
tarix16.12.2017
ölçüsü1,03 Mb.
#35021
1   2   3   4   5   6   7   8   9   10

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

Yüklə 1,03 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin