|
Limbajul Assembler abc-doar
|
səhifə | 1/10 | tarix | 16.12.2017 | ölçüsü | 1,03 Mb. | | #35021 |
|
*****************************
* Limbajul Assembler *
* ABC-doar *
*****************************
************************************
* autor RUSU MIRCEA AUREL VALER *
************************************
********************************************
* MOTTO: *
* "De minimis non curat praetor " *
* " INTEL...ligenti pauca " *
* *
********************************************
Limbajul Assembler este simplu si concis.Se adreseaza direct memoriei
interne a procesoarelor 80286...80686.Este destinat pentru a programa
functii noi,pentru a scrie compilatoare sau sisteme de operare,sau
pur si simplu pentru viteza maxima de executie.Valoarea acestui limbaj
este determinata de experienta utilizatorior (poate fi magnific sau
derizoriu).In principiu nu este recomandat incepatorilor,dar poate fi
utilizat si pentru initiere in programarea proceselor elementare.
C O N T I N U T
Generalitati . . . . . . . . . . . . . . . . . . . . 1
Arhitectura procesoarelor 8086 . . . . . . . . . . . 3
Limbajul Assembler (prezentare generala) . . . . . . 17
Declaratii . . . . . . . . . . . . . . . . . . . . . 24
Operanzi si operatori . . . . . . . . . . . . . . . . 27
Constante numerice . . . . . . . . . . . . . . . . . 36
Instructiuni . . . . . . . . . . . . . . . . . . . . 37
Instructiuni pentru deplasarea datelor . . . . . . . 37
Instructiuni pentru controlul registrului FLAGS . . . 41
Instructiuni pentru conversia datelor . . . . . . . . 42
Instructiuni aritmetice binare . . . . . . . . . . . 43
Instructiuni aritmetice decimale . . . . . . . . . . 50
Instructiuni logice . . . . . . . . . . . . . . . . . 54
Instructiuni pentru transfer de control . . . . . . . 57
Instructiuni I/O (intrare-iesire) . . . . . . . . . . 66
Instructiuni pentru operatii asupra sirului . . . . . 67
Procesorul 8087 si setul de instructiuni 8087 . . . . 74
Unitati si biblioteci DLL . . . . . . . . . . . . . . 90
ASSEMBLER (ASM)
GENERALITATI:
Istoria limbajelor de asamblare se confunda practic cu cea a tehnicii
de calcul.Cunoscute sub mai multe denumiri,dintre care cele mai cunoscute
sunt: ASSEMBLEY,ASSEMBLER,ASM si SYMBOLIC MACHINE CODE,limbajele de asam-
blare au fost dezvoltate si implementate pentru fiecare tip nou de pro-
cesor.Practic nu se poate vorbi despre un singur limbaj de asamblare,ci
despre un grup de limbaje simbolice care utilizeaza formule mnemotehnice
pentru formarea denumirilor,instructiunilor si a operatorilor,pentru a
forma expresiile,care se structureaza apoi sub forma de stream-uri.
In epoca de pionierat,in anii 50,calculatoarele erau programate cu
ajutorul unor programe extrem de simple,scrise in limbaj masina (adica
binar cu 0 si 1 ).In timp,aceste mici programe au inceput sa fie stocate
pe diverse forme de memorie si s-a pus problema combinarii lor pentru a
forma programe noi,mai performante(performantele maxime erau intre 16 si
256 k).Pentru manipularea acestor mici rutine binare,s-au conceput si
dezvoltat programe care sa permita legarea cap la cap a doua sau mai
multe astfel de rutine scrise in limbaj masina.Aceste programe realizau
o sarcina destul de dificila,extrageau din stiva si ordonau automat datele
indiferent de ordinea in care au fost introduse(dupa principiul "LIFO"=
LAST IN FIRST OUT ).Aceste programe au fost denumite asambloare si au
fost concepute in functie de arhitectura interna a fiecarui tip de pro-
cesor.
O etapa noua in evolutia procesoarelor,si implicit a programelor soft-
ware a fost data de unificarea proceselor primare sub forma unor standarde
internationale (ANSI-DOS,ASCI,ASCII etc.) care sa permita portabilitatea
codurilor de la un tip de platforma hardware la alta si de la un limbaj
de programare la altul.O data cu aceste standarde,caracterele au fost
definite pe 8 biti(1 byte) si s-a adoptat standardul ASCII (cu 256 de ca-
ractere) utilizat pentru toate datele de interes comun sau international.
Ca rezultat,memoria a fost organizata in stive cu largimea de 16 biti,
impartite in segmente de cate 64 k.Evident,prelucrarea datelor se facea
cu procesoare proiectate cu 16 linii de date ("procesoare pe 16 biti" )
care puteau procesa cate o linie din stiva/operatie.
Prototipul cel mai raspandit al acestor procesoare este denumit 8086 si
a fost urmat de intreaga serie Intel,pana la Intel Pentium IV.Setul de
instructiuni pentru acest procesor,denumit setul 8086 a stat la baza
tuturor programelor de asamblare dezvoltate ulterior.Practic,fiecare
"up-grade" a mai adaugat niste registrii si un set nou de instructiuni.
In etapa de pionierat,limbajele de asamblare au stat la baza dezvoltarii
tuturor sistemelor de operare(EXEMPLE: CP/M,MS-DOS,Lotus 123 etc.).In
timp programe ca Fortran,Basic si mai tarziu C si Pascal al luat locul
limbajelor de asambalre in conceptia de sisteme si compilatoare sau emu-
latoare software.
Alte aplicatii ale limbajelor de asamblare sunt automatica si micro-
calculatoarele,la care se adauga consolele de joc tip Super Nintendo En-
terteinment sau jocurile pentru calculator gen " NBA Jam".
Exista si limabje de asamblare,care au caracteristicele unor limbaje
de nivel superior(structurate in functii,proceduri,unitati etc.),cum sunt:
TASM Borland,MASM Microsoft,HLASM IBM sau HLA scris de Randall Hyde.Lista
completa a acestor programe poate fi consultata in Wikipedia(pe Internet).
-2-
Dintre programele dezvoltate in limbaj de asamblare cele mai cunoscute
sunt:ASEM-51 (Dos,Win32 si Linux),BAL(Basic AssembLer pt. IBM System 360),
FAP(Fortran Assembley Program pt. IBM 709,7090,7094),GAS(GNU Assembler),
HLA(High Level Assembler),MASM(Microsoft MacroAssembler),TASM(Turbo Ass-
embler form Borland) si x86 Assembley Language (Intel,AMD,Athlon).
Acest manual,dupa cum este si intitulat,nu are decat intentia unui
abecedar.Ca rezultat,va cuprinde doar date foarte simple,valabile pentru
majoritatea sau pentru toate aceste programe.Acest manual nu este struc-
turat ca un ghid al programatorului,ci doar ca un indrumar elementar de
programare "la nivel inferior" (adica la nivel de bit si byte).
Limbajele de asamblare se adreseaza direct stucturilor hardware,fara
nici un intermediar,fara sa fie necesara nici o compilare sau conversie
a datelor.Sunt extrem de condensate,ocupa foarte putin spatiu si sunt
extrem de rapide (au viteza maxima de executie a procesorului).Dezavan-
tajul principal este generat de faptul ca orice eroare de programare
poate determina defecte majore sau chiar iremediabile.
In etapa actuala,limabjele de asamblare sunt recomandabile mai ales
in urmatoarele situatii:
1. -daca este necesara executia unui program scris in limbaj masina
2. -daca se interactioneaza direct cu hard-ul (drivere de dispozitiv)
3. -daca este necesara optimizarea maxima a unui proces (proces lent)
4. -pentru sisteme cu performante reduse (nu accepta limbaje avansate)
5. -daca nu exista limbaje avansate care sa rezolve problema propusa
In plus,pot fi utilizate pentru a concepe functii noi,pentru a edita
sisteme de operare,compilatoare,emulatoare sau chiar jocuri logice.
Limbajele de asamblare nu fac parte dintre cele strict obligatorii
pentru munca de programare,dar in mod cert,extind foarte mult paleta de
optiuni si asigura practic o solutie pentru aproape orice tip de problema
de tip interactiune software-hardware.
In timp,procesoarele au evoluat de la 16 biti de adresa,la 32,apoi 64
si apoi 128 de biti de adresa.Ca rezultat si modul de adresare a evoluat
de la modul real la cel "protejat" si apoi la cel "long".
"Real mode",este implementat pe procesoarele 8086,utilizeaza stive de
memorie de 16 biti.La procesoarele 80286 si 80386,modul real a fost extins
la 32 de biti,dintre care 16 sunt pentru adresa segmentului iar 4 sunt
pentru adresa off-set-ului.Practic fiecare adresa este "pe 20 de biti".
"Protected mode" utilizeaza stive de 32 de biti,dintre care 24 sunt
pentru adresele fizice (asigura pana la 16 M de memorie) si permite o
extensie de pana la 1 Giga pentru memoria virtuala.In plus,memoria prote-
jata utilizeaza adrese separate pentru fiecare proces aflat in executie,
astfel incat sa excluda complet posibilitatea coruperii unui proces de
catre alt proces aflat in executie(spre deosebire de modul real,care
fragmenteaza procesele si le executa serial in acelasi modul de memorie
cu riscul de a intersecta datele dintre doua procese editate imperfect).
"Long mode" a fost implementat pentru AMD64 si este organizat in
adrese organizate pe 64 de biti(stive de 64 de biti) la care adauga si
o serie de registri de procesor noi si un set nou de instructiuni.
Indiferent de formatul memoriei(16,32,64 sau 128 de biti) toate pro-
gramele scrise in limbaj de asamblare se adreseaza direct registrilor de
procesor,prin instructiuni specifice si cu ajutorul unor operatori comuni.
Intelegerea acestui limbaj este instructiva si extrem de utila !.
-3-
ARHITECTURA PROCESOARELOR 80x86 (notiuni elementare)
Limbajele de programare cu inalt nivel de integrare,cum sunt C,Pascal,
FoxPro si urmasii lor,utilizeaza niste structuri de date intermediare,
care fac legatura dintre limbajul masina si codul editat.Aceste structuri
poarta numele de interpretor de comenzi si transforma codul editat in
alt cod,scris cu instructiuni directe pentru procesorul instalat.Ca re-
zultat,programatorul nu trebuie sa cunoasca resursele hardware ale cal-
culatorului ci este suficient sa respecte sintaxa limbajului utilizat.
Limbajele de asamblare,se adreseaza direct procesorului,utilizand un
set de instructiuni recunoscute de procesor,ca atare.Ca rezultat,este
absolut indispensabil ca programatorul sa cunoasca aceste instructiuni si
structurile hardware care le vor implementa.
In calculator,informatia circula sub forma de curenti rectangulari,
care prin alternarea intensitatii realizeaza semnale electrice de genul:
_ _ _
__| |__| |________| |___
fiecare bucla,este echivalenta cu un bit 1 iar fiecare linie este echi-
valenta cu un bit 0.Prin combinarea acestor semnale se obtine un semnal
complex,denumit binar.In functie de numarul de elemente citite per ope-
ratie,se realizeaza asa numitul format al datelor.
Primele calculatoare,functionau cu lampi electronice de tip dioda care
generau un curent alternativ rectangular,din care se forma semnalul binar.
La inceput,se utiliza un format binar de patru biti,cu ajutorul caruia se
puteau forma cifre si respectiv numere,dupa urmatorul cod:
0 0 0 0 = 0
0 0 0 1 = 1
0 0 1 0 = 2
0 0 1 1 = 3
0 1 0 0 = 4
0 1 0 1 = 5
0 1 1 0 = 6
0 1 1 1 = 7
1 0 0 0 = 8
1 0 0 0 = 9
Aceste calculatoare se numeau calculatoare numerice si puteau efectua
strict operatii aritmetice simple.Se utilizau doar pentru calcule astro-
nomice sau pentru codificarea si decodificarea numerica a unor mesaje.
In continuare,prin combinarea cifrelor,se formau diverse coduri,care au
fost atribuite unor caractere,pentru a putea forma semnale mai complexe,
cu ajutorul carora se puteau genera texte,sau se putea procesa un text.
Prima dezvoltare a acestor tehnici a fost generata de aparitia tran-
zistoarelor,care prin dimensiunea lor redusa si prin curentii mici uti-
lizati,au permis gruparea unui numar mai mare de piese in acelasi circuit.
Ca rezultat,a crescut considerabil de mult numarul de porti logice prin
care putea fi procesat un semnal electric.Aceasta dezvoltare a dus la
schimbarea formatului datelor din patru biti in 8 biti.Astfel,semnalul
era citit in grupuri de cate 8 biti,care permiteau o analiza mult mai
complexa si respectiv o codificare mult mai clara si discriminativa a
datelor.Grupurile de cate 8 biti de informatie au primit numele de octeti
sau bytes,si au stat la baza tuturor dezvoltarilor ulterioare.
-4-
Codul numeric in format de 8 biti era interpretat in felul urmator:
1 1 1 1 1 1 1 1 = 0
0 1 1 0 0 0 0 0 = 1
1 1 0 1 1 0 1 1 = 2 ... etc.
In acest format al datelor,un numar mare de combinatii binare a ramas
neutilizat dupa codificarea cifrelor,si a fost utilizat pentru a genera
diverse alte semne de punctuatie sau caractere.De exemplu,cu doua coduri
se puteau codifica o liniuta orizontala si o liniuta verticala.Cu cele
doua coduri se putea scrie orice litera sau cifra,dupa un cod de genul:
a
f b
g unde a,d si g sunt liniute orizontale iar b,c,f,s verticale
e c
d
_ _
prin combinarea lor rezulta: | | _|
|_| (abcdef) sau |_ (abged) etc.
Deoarece circuitele electrice erau extrem de aglomerate cu lipituri si
picioruse de piese,tranzistoarele au fost proiectate din ce in ce mai
mici,cu picioare tot mai scurte,apoi au fost grupate cate doua sau cate
patru,pentru a forma o singura piesa cu racitor comun.In timp,s-au
grupat cate 8 tranzistoare,intr-o singura piesa,care forma un mic pro-
cesor de 8 biti.Aceste piese,au fost denumite circuite integrate (pentru
ca erau echivalentul unui intreg circuit),apoi au fost denumite chip-uri,
iar prin miniaturizare au devenit microchip-uri.Deoarce erau capabile sa
proceseze direct,atat cifre cat si caractere,au fost denumite procesoare
alfa-numerice,iar calculatoarele cu aceasta arhitectura au purtat acelasi
nume:calculatoare alfa numerice.
Acest tip de calculator era deja destul de rapid,dar prezenta un incon-
venient major:numarul mic de combinatii facea ca decodificarea oricarui
cod sa fie destul de usoara (mai ales daca se utiliza un alt calculator
pentru decodificare).Ca rezultat,numarul tot mai mare de "specialisti"
si de "hack-eri" a generat un numar din ce in ce mai mare de programe
eronate sau defective,cu care blocau activitatea pentru perioade mai lungi
sau mai scurte de timp.Mai mult de 75% din timpul util era consumat in
etape de depanare,sau in interminabile sedinte prin care se stabileau pri-
oritatile de acces pentru cei care aveau dreptul sa ruleze programe.
Astfel a inceput cursa pentru dezvoltarea de procesoare cat mai per-
formante ("upgradare"),care sa permita editarea de programe software tot
mai complexe si tot mai bine securizate.
Primul procesor care a satisfacut cerintele de acest gen,a fost cele-
brul 256.Acest procesor a grupat 16 procesoare de 16 biti (de unde numele
de 256) pentru a permite operatii cu grupuri de cate 1-16 blocuri de date
in format de 1-16 biti per operatie.Acest procesor,format din mai multe
module,distribuite in interor asemenator cu camerele unei locuinte,a facut
cariera si a cucerit in scurt timp intregul mapamond.Ca rezultat direct,
au fost generate coduri,din ce in ce mai savant "securizate",astfel incat
doua sau mai multe persoane care utilizau acelasi calculator,foloseau un
numar tot mai mare de formate si coduri numerice,incompatibile intre ele.
-5-
Arhitectura interna (secreta) era asemantoare cu cea a spatiilor si
a usilor si ferestrelor unei locuinte.Fiecare firma producatoare alegea
un anumit tip de conexiuni,astfel incat intrarile si iesirile din
fiecare modul sa fie cat mai simple si cat mai flexibile.Initial,accesul
se putea face exclusiv secvential (fiecare modul putea fi accesat doar
intr-o anumita ordine) iar apoi s-a dezvoltat accesul simultan la fiecare
modul ("random acces memory" si procesarea paralela).
Desi foarte versatil,procesorul 256 prezenta un inconvenient major: nu
dispunea de memorie interna si fiecare operatie trebuia sa fie urmata de
o accesare a memoriei de suport.Pentru a rezolva acest inconvenient,
procesorul 256 a fost practic dublat,iar jumatate din el s-a transformat
in memorie de operare de tip stiva.Ca rezultat,procesorul avea 16 module
de cate 16 biti,denumite registrii,si o memorie interna de tip stiva de-
numita STACK.Acest procesor a fost denumit 8086 si a stat la baza tuturor
modernizarilor ulterioare (practic au existat si alte etape intermediare
Z,8080 etc.).Acest procesor avea o structura interna de genul:
*******************************************
* AL AH * * STACK *
Registrul AX * 00000000 00000000 * * 00000000 00000000 *
(acumulator) * BL BH * * * AX,BX,CX,DX =
Registrul BX * 00000000 00000000 * * 00000000 00000000 * registri
(base) * CL CH * * * generali
Registrul CX * 00000000 00000000 * * 00000000 00000000 *
(count) * DL DH * * *
Registrul DX * 00000000 00000000 * * 00000000 00000000 *
(data) * IP * * * IP,SP,BP =
Registrul IP * 00000000 00000000 * * 00000000 00000000 * registri
(instruction) * SP * * * pointer
Registrul SP * 00000000 00000000 * * 00000000 00000000 *
(stack) * BP * * *
Registrul BP * 00000000 00000000 * * 00000000 00000000 *
(base pointer)* CS * * *
Registrul CS * 00000000 00000000 * * 00000000 00000000 *
(code segment)* DS * * * CS,DS,SS,ES=
Registrul DS * 00000000 00000000 * * 00000000 00000000 * registri
(data segnent)* SS * * * segment
Registrul SS * 00000000 00000000 * * 00000000 00000000 *
(stack segm.) * ES * * *
Registrul ES * 00000000 00000000 * * 00000000 00000000 *
(extra segm.) * SI * * *
Registrul SI * 00000000 00000000 * * 00000000 00000000 * SI,DI =
(source index) * DI * * * registri
Registrul DI * 00000000 00000000 * * 00000000 00000000 * index
(destination) * FLAGS * * *
Registrul FLAG * 00101010 00001010 * * 00000000 00000000 *
REZERVED * * * *
* 00000000 00000000 * * 00000000 0000000 *
REZERVED * * * *
* 00000000 00000000 * * 00000000 0000000 *
*******************************************
-6-
Asadar,procesorul este format din mai multe module.O parte dintre
acestea,se numesc registri.Fiecare registru este echivalentul unui
procesor de linie de 16 biti,adica poate procesa simultan date in format
de maxim 16 biti.Practic fiecare registru are o structura de genul:
0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0
__|_|_|_|_|_|_|_|__|_|_|_|_|_|_|_|_
************************************
* 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 *
************************************
| | | | | | | | | | | | | | | |
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Astfel,datele pot avea o anumita valoare la intrare,pot fi stocate in
registru pentru o anumita perioada de timp,pot fi modificate in registru
si apoi sunt eliberate la comanda,cu noua valoare a datelor.
Fiecare registru poarta un nume,generat de aplicatiile principale pentru
care a fost destinat.Chiar daca din punct de vedere fizic sunt identici,
conexiunile lor sunt astfel realizate incat sa faciliteze un anumit gen
de operatii.
Un registru mai special,este registrul FLAGS,care mai este cunoscut si
sub numele de registru de status,deoarece permite realizarea unor setari
caracteristice modului de lucru.Cei 16 biti care formeaza acest registru
sunt tot binari,adica 0 si 1 dar in functie de valoarea lor pot fi denu=
miti si SET(1) sau NOTSET(0) si au urmatoarea semnificatie:
Dostları ilə paylaş: |
|
|