Limbajul Assembler abc-doar



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

*****************************

* 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:

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