336
1 Limbaje de asamblare Cap. 1 Concepte de baza 1.1 Reprezentarea si codificarea informatiilor S.L. Sebestyen Gheorghe

ASM_Curs

Embed Size (px)

Citation preview

Page 1: ASM_Curs

1

Limbaje de asamblareCap. 1 Concepte de baza

1.1 Reprezentarea si codificarea informatiilor

S.L. Sebestyen Gheorghe

Page 2: ASM_Curs

2

Bibliografie

�Pusztai K. s.a "Programare in limbaj de asambalare" Ed. UTCN, 1996

�Pusztai K. s.a. Calculatoare numerice-Indrumator de lucrari de laborator, Ed. UTCN,

�William H. & Murray, s.a. " 80386/80286 Assembly Language programming", 1986

�Gorgan&Sebestyen "Structura calculatoarelor" Ed. Albastra (Microinformatica), 2000

� Internet - AoA-The Art of Assembly Language Programming (ftp.utcluj.ro)

�Lungu S. "Programare in limbaj de asamblare –Procesoare Pentium", 2002

Page 3: ASM_Curs

3

Bibliografie

�Www.intel.com – pt. procesoare Intel

�www.microchip.com – pt. microcontroloare

(familia PIC12/16/18)

�www.ti.com – pt. procesoare de semnal

(familia TMS 320C10-80)

�orice alte carti, reviste, articole care trateaza

probleme legate de (micro)procesoare

Page 4: ASM_Curs

4

De ce "programare in asamblare" ?� cauze externe independente de vointa noastra:

– este materie de examen

– coordonatorul de proiect insista pt. scrierea programului in asamblare

– trebuie modificat un program existent, scris in asamblare

� un specialist care se respecta stie sa programeze in asamblare

� programul lucreaza prea incet sau este prea mare

� vreti sa intelegeti modul in care lucreaza un calculator

� vreti sa scrieti programe eficiente (timp&spatiu)

� vreti sa incercati ceva nou

Page 5: ASM_Curs

5

De ce se evita limbajul de asamblare?

� este prea greu

� este greu de citit si de

inteles

� este greu de scris

� este greu de depanat si de

intretinut

� programarea este

ineficienta

� viteza nu mai constituie o

problema la calc. de azi

� memoria nu mai constituie

o problema

� compilatoarele actuale

genereaza cod eficient

� limbajul de asamblare nu

este portabil

Page 6: ASM_Curs

6

Ce este bun in L.A.?

� trei lucruri: viteza, viteza si viteza

�VITEZA: cele mai rapide programe se scriu in

asamblare

�SPATIU: programele scrise in asamblare ocupa

cel mai putin spatiu de memorie

�GRAD de LIBERTATE: maxima pt. programarea

in asamblare

�CUNOASTERE: o mai buna intelegere a modului

de lucru al procesorului, care poate ajuta la

scrierea unor programe eficiente in LNI

Page 7: ASM_Curs

7

Continutul cursului

�Concepte de baza– reprezentarea informatiilor si structuri de date

– stocarea si accesul la date

– formatul instructiunilor si executia lor

�Setul de instructiuni al arhitecturii ISA x86– arhitectura ISA x86

– formatul si sintaxa instructiunilor

– clase de instructiuni

– moduri de adresare

– directive de asamblare

– structuri de control si proceduri

– aritmetica in virgula flotanta

– tehnologia MMX

Page 8: ASM_Curs

8

Continutul cursului

�Etapele de elaborare a unei aplicatii in LA

– asamblare, linkeditare, incarcare si executie, depanare

�Metode de acces la resursele unui calculator

personal– accesul direct la resursele hardware

– accesul prin functii BIOS & DOS

– accesul prin biblioteci de functii

�Alte arhitecturi de calculatoare si seturi de

instructiuni– microcalculatoare,

– procesoare de semnal

– calculatoare RISC

Page 9: ASM_Curs

9

Concepte de baza

- Reprezentarea informatiilor

�Ce se reprezinta?

– instructiuni - prin coduri de instructiuni

– date:

• logice: Adevarat/Fals, Inchis/Deschis, Pornit/Oprit

• numerice: intregi, nr. fractionare, nr.pozitive/negative

• alfanumerice: caractere, text

• multimedia: sunet, imagine (audio/video)

– date simple

– structuri de date

Page 10: ASM_Curs

10

Reprezentarea informatiilor numerice

�Sisteme de numeratie:

– zecimal, binar, octal, hexazecimal

Xb-> xm xm-1 xm-2 .... x0 x-1 x-2.... x-n

Reguli:

0<= xi < b, i= -n .. m

xm!= 0, x-n!= 0

Xb = xm*2m + xm-1*2m-1 + .... x0*20 + x-1*2-1 + x-2*2-2... x-n*2-n

– sistemul binar: putine reguli, multe cifre

– sistemul zecimal: multe reguli, mai putine cifre

– sistemul hexazecimal: sistem intermediar intre binar si

zecimal

Page 11: ASM_Curs

11

Conversii dintr-o baza in alta

� conversia partii intregi: prin divizare succesiva cu noua

baza: exemplu din baza 10 in baza 2

30 3010 = 111102 0,48 0,4810=0,0111...2

15 0 0,96 0

7 1 1,83 1

3 1 1,66 1

1 1 1,32 1

� conversia partii fractionare: prin inmultire succesiva

cu noua baza

– atentie!!!, conversia nu este precisa (univoca)

Page 12: ASM_Curs

12

Conversia Binar - Hexazecimal

– 4 cifre binare = 1 cifra hexa(zecimala)

1 0 1 0 1 1 1 0 1 0 1 10 0 0 0

2 B A C

Page 13: ASM_Curs

13

Codificarea informatiilor

�Ce se urmareste:

– reprezentarea coerenta, univoca a informatiilor in

vederea stocarii, transmiterii si a prelucrarii acestora

– utilizarea eficienta a spatiului alocat (spatiu minim)

– detectia (si corectia) erorilor

– facilitarea (simplificarea) operatiilor de prelucrare,

stocare si transmitere

– securizarea datelor

�Cum se realizeaza:

– prin metode/algoritmi/standarde de codificare

– depinde de tipul de informatie care se codifica

Page 14: ASM_Curs

14

Formate binare de reprezentare

�Bit:

– binary digit;

– unitatea elementara de informatie

– starea unui bistabil, sau a unei celule elementare de memorie

�Octet (byte):

– grup de 8 biti

– unitatea elementara de adresare la cele mai multe calculatoare actuale (inclusiv Intel x86)

– poate reprezenta: o valoare numerica, un caracter (cod ASCII), un set de variabile (semnale) logice

Page 15: ASM_Curs

15

Formate binare de reprezentare

�Octet (continuare)

D7 - bitul cel mai semnificativ

D0 - bitul cel mai putin semnificativ

�Cuvant (word)

D15-D8 - octetul superior (High)

D7-D0 - octetul inferior (Low)

- folosit pt. reprezentarea intregilor, simpla precizie

7 6 5 4 3 2 1 015 14 13 12 11 10 9 8

7 6 5 4 3 2 1 0

Page 16: ASM_Curs

16

Formate binare de reprezentare

�Dublu-cuvant (double word):

– 32 biti, 4 octeti, 2 cuvinte

– D31-D16 cuvantul superior

– D15-D0 cuvantul inferior

– folosit pentru reprezentarea numerelor in virgula fixa

(dubla precizie la sistemele pe 16 biti) sau in virgula

flotanta

31 ...... 24 23 ...... 16 15 ...... 8 7 ...... 0

Page 17: ASM_Curs

17

Formate binare de reprezentare

�Cuadruplu-cuvant (quad-word)

– 64 de biti, 8 octeti, 4 cuvinte, 2 dublucuvinte

– folosit pentru reprezentarea numerelor in virgula fixa

(dubla precizie pt. sist. pe 32 biti) si in virgula flotanta

�Formate extinse:

– 80 de biti - pt. reprezentarea numerelor in virgula

flotanta (formate interne/intermediare)

63 0

Page 18: ASM_Curs

18

Conventii de stocare/transmitere a informatiilor

�Little-endian/ Big-endian

– Little-endian: partea mai putin semnificativa la adresa mai mica

– Octeti: 3AH, 33H, 12H

– Cuvinte: 1234H, 56ABH, FFFFH

– Dublu-cuvante: 01234567H, 89ABCDEFH

3A 33 12

Adresa: x x+1 x+2 x+3 x+4

34 12 ABAdresa: x x+1 x+2 x+3 x+4 x+5 x+6 x+7

FF56 FF

67 45 23Adresa: x x+1 x+2 x+3 x+4 x+5 x+6 x+7 x+8

CD01 EF AB 89

Page 19: ASM_Curs

19

Reprezentarea numerelor

� numere pozitive:

– intervalul de reprezentare: [0.. 2n-1], unde n - nr. de biti

� numere negative:

– mai multe metode de reprezentare (codificare):

MS, C1, C2

– intervalul de reprezentare: [-(2n-1-1) ... (2n-1-1)]

– bitul cel mai semnificativ - bit de semn:

• 0 - numar pozitiv

• 1 - numar negativ

Page 20: ASM_Curs

20

Aritmetica in complement fata de 2

7+ 0000.0111+ 7+

-10 1111.0110 246

-3 1111.1101 253

� in C2 operatiile aritmetice sunt identice cu aritmetica

numerelor pozitive ->

ESTE O CHESTIUNE DE INTERPRETARE !!!

� la reprezentarea numerelor negative trebuie sa se

precizeze lungimea de reprezentare

� pt. cresterea lungimii de reprezentare: Extensia de semn

1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1

Page 21: ASM_Curs

21

Reprezentarea in virgula flotanta

� scopul: reprezentarea numerelor foarte mari si foarte mici

� forma de reprezentare: semn, caracteristica si mantisa

– simpla precizie: 32 de biti

• 1 Semn, 8 Caracteristica, 23 Mantisa

– dubla precizie: 64 de biti

• 1 Semn, 11 Caracteristica, 52 Mantisa

– caracteristica = exponent + 1/2 (domeniu_exponent)

S Caracteristica Mantisa

1 c m

Page 22: ASM_Curs

22

Reprezentarea in virgula flotanta

� limite de reprezentare:

– unde: Vmax= 2^(2^(c-1)-1)*0,11111..1

Vmin=2^(- (2^(c-1)-1))*0,1

– rezolutia (granularitatea) absoluta -> variabila

– rezolutia (granularitatea) relativa ->constanta

� reprezentarea in flotant este discreta,

NU modeleaza pe deplin numerele reale

- ∞ + ∞

-Vmax -Vmin 0 Vmin Vmax

Page 23: ASM_Curs

23

Codificarea Alfanumerica

�Standardul ASCII:

– se codifica: litere, cifre, semne de punctuatie, semne

grafice, comenzi de formatare, comenzi de control al

transmisiei

– se folosesc 7 biti/cod (+1 bit paritate) sau 8 biti/cod (pt.

standardul extins)

�Exemple:

– litere mari: A- 41H, B- 42H, C - 43H ......

– litere mici: a - 61H, b - 62H, c - 63H, ..

– cifre: 0 - 30H, 1 - 31H, ..... 9 - 39H

– altele: spatiu - 20H, CR - 0DH, LF - 0AH.....

Page 24: ASM_Curs

24

Alte metode de codificare

� Coduri ponderale

– 8421, BCD (binary coded decimal), 2421

� Coduri neponderale

– Exces 3, Gray,

� Coduri detectoare si corectoare de erori

– Se bazeaza pe redondanta codurilor

– BCD+paritate, paritate matriciala,

– coduri Hamming – distanta

� Metode de compresie

– Huffman, RLL, mp3, mp4

Page 25: ASM_Curs

25

Codificarea informatiilor multimedia

�Audio:

– esantionare si conversie (A/D si D/A)

– frecventa de esantionare: 2* frecv. maxima (ex: 44KHz)

– conversie: 8biti/esantion, .... 1bit/esantion

�Video:

– esantionare, scanare si conversie

– rezolutia spatiala: nr. linii * nr.coloane = nr. pixeli

– rezolutia cromatica: nr. biti/pixel sau nr. biti/culoare

– frecventa cadrelor: fixa/variabila

Page 26: ASM_Curs

26

Cantitatea de informatie

(spatiu necesar pentru stocare)

Tip de informatie Detalii Cantitatea de

informatie

logica 1 semnal

bipozitional

1 bit

numerica 1 intreg 16-32 biti

text 1 pagina ~1 K0ctet

audio 10 sec.,

Fmax=20KHz

400 KOcteti

video 10 sec.

Fcadre=50Hz

Rez.=1000*1000

1,5 GOcteti

Page 27: ASM_Curs

27

Structuri de date

utilizate in limbaje de asamblare

� specificarea (declararea) structurilor de date:

– explicita: prin declaratii, care indica in speta lungimea datei

– implicita: prin utilizarea unor tehnici de adresare

– numele variabilei reprezinta o adresa de memorie !!!

� date booleene (logice)

– indicatori de conditie (flag-uri): C,Z,O,...

– zone de memorie cu acces la nivel de bit

– (numai la anumite procesoare – ex: microcontrolare)

� caractere

– date reprezentate pe octet in codificare ASCII

� intregi fara semn

– reprezentati pe octet, cuvant sau dublucuvant

Page 28: ASM_Curs

28

Structuri de date

� intregi cu semn

– in codificare C2 – anumite instructiuni pot face distinctie intre intregi cu semn si fara semn

– la declarare nu se face distinctie intre cele doua forme de intregi

� numere in reprezentare flotanta

– daca se accepta aritmetica in virgula flotanta (ex.: prezenta unui coprocesor matematic)

– reprezentare pe 32, 64 sau 80 biti

� poantori:

– folositi pentru pastrarea unor adrese (adr. segment: adr. offset)

� siruri de caractere sau de cuvinte

– tine de modul de utilizare si nu de modul de declarare

� inregistrari

Page 29: ASM_Curs

29

Masina virtuala

Nivelul orientat pe aplicatie

Limbaje de nivel inalt

Limbaj de asamblare

Sistemul de operare

Masina conventionala

Microprogram

Logica digitala-translatare

-interpretare

Page 30: ASM_Curs

1

Limbaje de asamblareCap. 1 Concepte de baza

1.2 Stocarea si accesul la date.

1.3 Instructiuni in cod masina

1.4 Modelul ISA x86

Page 31: ASM_Curs

2

Registre, memorii,

porturi de intrare/iesire

• Entitati de stocare a datelor:

– registre:

• intim legate de UCP

• adresate prin nume (ex: AX,BX, R0, R1, SP)

• numar redus de registre (1..32)

• timp de acces minim !!!

• registre:

– generale: folosite pt. operatii aritmetice si logice

– speciale: au functii determinate (ex: control, stare, pt.

adresare, pt. testare, etc.)

Page 32: ASM_Curs

3

Registre, memorii,

porturi de intrare/iesire

• Memoria:

– interna (principala, operativa):

• memorie semiconductoare (EPROM/Flash, SRAM, DRAM)

• permite acces aleator (citire/scriere) la nivel de locatie (cuvant de date);

• timp de acces mediu (15ns-70ns), relativ constant

• capacitate medie (64ko-2Go)

• UCP are acces direct la memoria interna prin intermediul magistralei sistem

• spatiu liniar de adresare – locatiile sunt ordonate pe baza de adresa

• spatiul de memorie poate fi structurat pe segmente

• la arhitecturile Harvard (ex: microcontroloare, procesoare de semnal) – memorie separata pentru program si pentru date (2 spatii de adresare separate)

Page 33: ASM_Curs

4

Registre, memorii,

porturi de intrare/iesire• Memoria externa:

• memorie pe suport magnetic (flopy-disck, hard-disck, banda magnetica), suport optic (CD, DVD) sau semiconductor (memorii nevolatile, Flash, smart-card, etc.)

• accesul UCP la memoria externa se face prin intermediul unei interfete specializate, conectata pe magistrala

• timp de acces relativ mare (10ms-10s), variabil

• capacitate f. mare (1Go-1To), teoretic infinita

• acces aleatoriu la nivel de bloc (ex: sector) si secvential in interiorul blocului; la banda magnetica accesul este doar secvential

• memorie structurata pe unitati fizice (ex: sectoare) si logice (clustere, fisiere, directoare)

• nu exista suport la nivelul L.A. pentru accesul la locatiile memoriei externe; accesul se face prin rutine (drivere) prefabricate din SO

Page 34: ASM_Curs

5

Registre, memorii,

porturi de intrare/iesire• Ierarhii de memorii

– memoria cache:

• memorie f. rapida, de capacitate mica

• transparenta (invizibila) pentru instructiunile L.A.

• pastreaza copii ale locatiilor din memoria interna

• structurata pe blocuri (linii cache)

– memoria virtuala:

• extensie a memoriei interne peste memoria externa

• doua tehnici de implementare:

– segmentarea

– paginarea

• memorie structurata pe pagini si segmente

• controlul memoriei virtuale se face numai in regimuri supervizor (modul protejat)

Page 35: ASM_Curs

6

Registre, memorii,

porturi de intrare/iesire• Porturi de intrare/iesire:

– registre continute in interfetele de intrare/iesire, prin care UCP controleaza transferul de date

– tipuri de porturi:

• porturi de date: pentru transferul de date; pot fi de intrare, de iesire sau bidirectionale

• porturi de control: registre de iesire prin care se controleaza functionarea interfetei si a dispozitivului legat la interfata

• porturi de stare: registre de intrare prin care se poate testa starea interfetei si a dispozitivului legat la interfata

– accesul la porturi:

• prin adresa si prin instructiuni dedicate (ex: IN, OUT); putine instructiuni au acces direct la porturi de I/E

• spatiu separat de adrese pentru memorie si pentru porturi de I/E (exceptie: microcontroloarele)

Page 36: ASM_Curs

7

Metode generice de acces la date

• Metoda de acces: modalitatea de specificare (exprimare) a locatiei instructiunii sau a operandului care urmeaza sa se acceseze

• Metode de acces pentru instructiuni:

– secventiala: se citeste instructiunea de la adresa urmatoare

• PC=PC+lungimea_instructiunii_curente

• ex: instructiuni aritmetice si logice

– directa: se citeste instructiunea de la adresa specificata in instructiunea curenta

• PC= adresa_directa

• ex: instructiuni de salt, apel de rutine

– relativa: se citeste instructiunea de la o adresa relativa fata de adresa curenta (deplasamentul poate fi pozitiv sau negativ)

• PC= PC+deplasament

• ex: instructiuni de salt, apel de rutine

– indirecta: instructiunea curenta specifica adresa adresei instructiunii urmatoare

Page 37: ASM_Curs

8

Metode generice de acces la date

• Metode de acces la date:

– imediata: valoarea operandului este prezenta in codul instructiunii

• ex: MOV AX, 1234H

– directa: adresa operandului este specificata in codul instructiunii

• ex: MOV AX, [1234H]

– registru: operandul se afla intr-un registru intern al UCP

• ex: MOV AX,BX

– indirecta: instructiunea contine adresa adresei operandului

• ex: MOV AX, [SI+1234H]

– implicita: codul instructiunii implica utilizarea unui anumit registru, adresa de memorie sau adresa de adresa de memorie

• ex: PUSH AX ; implicit se foloseste SP ca registru de adresare

– indexata: se acceseaza succesiv elementele unei structuri de date de tip tablou

• ex: MOV AX, [SI]

– altele: bazata, relativa, stiva

Page 38: ASM_Curs

9

Instructiuni in cod masina

• formatul instructiunilor (lungime+continut):

– varianta 1: fara operanzi in codul instructiunii

• operatia nu necesita operanzi sau operanzii sunt specificati implicit

prin codul de operatie

– varianta 2: un singur camp de operand in codul instructiunii

• operatia este unara (un operand) sau al doilea operand este implicit

– varianta 3: doua campuri de operanzi (sursa, destinatie)

– varianta4: trei campuri de operand (operand 1, operand 2,

rezultat)

Cod operatie

Cod operatie Adresa/Data imed.

Cod operatie Adresa operand 1 Adresa op.2/Data imed.

Cod operatie Adresa operand 1 Adresa op.2/Data imed. Adresa rezultat

Page 39: ASM_Curs

10

Executia instructiunilor• Faze de executie:

– citire cod instructiune (instruction fatch IF)

– decodificare instructiune (instruction decoding Dec)

– citire operand (operanzi) (data fatch DF)

– executie operatie (execution Ex)

– scriere rezultat (write back WB)

• Cicluri de transfer:

– ciclu de citire instructiune

– ciclu de citire operand (optional)

– ciclu de scriere rezultat (optional)

=>durata unei instructiuni este determinata (in majoritatea cazurilor) de numarul de cicluri care trebuie sa se execute

• un ciclu = unu sau mai multe perioade de ceas

• durata unei perioade de ceas= durata celei mai lungi cai in UCP (suma intarzierilor produse in circ. combinationale care alcatuiesc calea unui semnal)

Page 40: ASM_Curs

11

Executia instructiunilor

• Executie secventiala – CPI=5

• Executie pipeline - CPI=5..1

Instr. 1 Instr.2

Timp: T 2T 3T 4T 5T 6T 7T 8T 9T 10T

IF Dec DF Ex WB IF Dec DF Ex WB

Instr.1

Instr.2

Instr.3

Instr.4

Timp: T 2T 3T 4T 5T 6T 7T 8T

IF Dec DF Ex WB

IF Dec DF Ex WB

IF Dec DF Ex WB

IF Dec DF Ex WB

Page 41: ASM_Curs

12

Arhitectura procesoarelor Intel x86

Procesor Structura/

Frecv.

Spatiu de

memorie

Unitati de

prelucrare

Tip executie Altele

8086/88 16 /5MHz 1Mo 2 biprocesor

80286 16/20MHz 16Mo 4 pipeline

80386 32/33MHz 4Go 6 pipeline mem. virt

80486 32/66MHz 4Go 8 pipeline mem.

cache

Pentium 32/100MHz 4Go 12 2 linii pipeline

Pentium

Pro

32/200MHz 4Go 12 superscalar MMX

Pentium

II, III, IV

32/400MHz –

2GHz

4Go-64To 20 Superscalar,

hyperthreading

SIMD

Dual –Core

i7, i5, i3

64/2-3GHz 64To 2*12

4*12 ?

Multi-core GPU

Page 42: ASM_Curs

13

Modelul ISA x86 - Registre

• Registre generale:63 31 15 7 0

AH ALAXEAXRAX

BH BLBXEBXRBX

CH CLCXECXRCX

DH DLDXEDXRDX

DIEDIRDI

SIESIRSI

BPEBPRBP

SPESPRSP

R8-R15

Accumulator

Base index

Counter

Data

Destination index

Base pointer

Stack pointer

Source index

General purpose registers

Page 43: ASM_Curs

14

Modelul ISA x86 - Registre

• Registre segment:

• Registre speciale:

CS

15 0

DS

SS

ES

FS

GS

PC

Reg. stare (PSW)

31 16 15 0

Adresa segmentului Lungimea RPL

32 biti 20 biti 2 biti

EPC

EPSW

Page 44: ASM_Curs

15

Modelul ISA x86 Registre

PSW

CF transport

PF paritate

AF transport auxiliar

ZF rezultat zero

SF semn

TF trasare

IF validare intreruperi

mascabile

DF directia de transfer

OF depasire capacitate

PSW extins

IOPL nivel de privilegiu I/E

NT task imbricat

RF continuare in caz eroare

VM mod virtual 8086

AC verificare aliniere

VIF intrerupere virtuala

VIP validare intrerupere

virtuala

ID indicator

Page 45: ASM_Curs

16

Modelul ISA x86 – Moduri de lucru

• Modul real – modul de lucru 8086:

– organizare pe 16 biti

– spatiu maxim de memorie – 1 Mo

– resursele hardware sunt direct accesibile programului utilizator

• Modul protejat: - mecanisme complexe de protectie a memoriei

– registre pe 8, 16 si 32 biti

– spatiu de adresare: 4Gocteti – adrese pe 32 biti

– asigura un management mai bun al memoriei

• Modul “Virtual 8086” simularea executiei modului real in modul protejat

• Modul “long” pe 64 biti : modul natural de lucru al procesoarelor pe 64 biti

– organizare pe 64 biti (registre, memorie)

– spatiu fizic de adresare: 1Toctet) – adresa pe 40 biti

– spatiu virtual de adresare 256 Tocteti –adresa pe 48 biti

Page 46: ASM_Curs

17

Modelul ISA x86 - Adresarea memoriei

– modul real:

0

*16 +

Adr. segment Adr. offset

Adr. fizica

15 0 15 0

Memoria1M

Adr. offset

Adr. segment

Adr. fizica

1 2 3 4 0

5 6 7 8

1 7 9 B 8

Consecinte:

-lung. segment = 64Ko

-spatiu de memorie = 1Mo

-nu exista mec. de protectie

Page 47: ASM_Curs

18

Modelul ISA x86 - Adresarea memoriei:

– modul protejat:

+

Selector Adr. offset

Adr. fizica

15 0 31 0

Memoria4G0

Adresa de segment

31 0

Lungime

Descriptor de segment

Acces 0

Consecinte:

-spatiu de adresare = 4 Go

-dim. segment = 1o .. 4Go

-o mai buna protectie a segmentelor

-o utilizare mai eficienta a memoriei

Page 48: ASM_Curs

19

Modelul ISA x86-64 - Adresarea memoriei

• Modul “long”

– mod de lucru posibil doar pe procesoarele pe 64 biti; se lucreaza cu registre pe 64 biti

– in acest mod nu se poate emula modul real (16 biti) sau virtual 8086

– se pot executa programe pe 32 biti si 16 biti protejat

– adresarea memorie fizice – pe 40 biti (1Toctet)

– adresarea memoriei virtuale – pe 48 biti (256Tocteti)

Page 49: ASM_Curs

20

Adresarea memoriei –

• calculul adresei fizice

: [ + + ]Registru

segmentRegistru

de bazaRegistru

index

Deplasament

Adresa de offsetAdresa de segment

Page 50: ASM_Curs

21

Adresarea memoriei –

calculul adresei fizice• La procesoare pe 16 biti

• La procesoare pe 32 sau 64 biti

• La procesoare pe 64 biti in modul long

Page 51: ASM_Curs

22

Formatul instructiunilor x86

• Formatul instr. x86 – variabil ca lungime si continut

• Semnificatia campurilor:

• Prefix: unul sau mai multi octeti care preced instructiunea si modifica modul de executie al acesteia

• tipuri: segment explicit, dim. adresa (16/32 biti), dim. operand (16/32 biti), repetare instr. , blocare acces (lock)

• Cod operatie: 1..2 octeti, care codifica tipul de operatie

• instr. setului de baza au codul operatiei pe 1 octet

prefix cod operatie Reg/Mod sib deplasament data imediata

Page 52: ASM_Curs

23

Formatul instructiunilor x86

• Reg/Mod : specifica registrele folosite si modul de adresare adoptat

– Mod: modul de adresare folosit (registru-registru, registru-memorie

– Reg: codul registrului folosit

– R/M: al doilea registru folosit sau modul de adresare a memoriei

• sib: scala-index-baza – detaliaza modul de adresare folosit

• Deplasament: contine o adresa pe 8, 16 sau 32 biti, folosita pentru calculul adresei unui operand

• Data imediata: contine o valoare constanta pe 8, 16 sau 32 de biti

• instructiunea cea mai scurta: 1 octet

• instructiunea cea mai lunga: ~ 16 octeti

7 6 5 4 3 2 1 0

Mod Reg. R/M

Page 53: ASM_Curs

Limbaje de asamblare2.Setul de instructiuni ISA x86

Page 54: ASM_Curs

Sintaxa instructiunilor

• <linie_program>:= [<eticheta>:] [<prefix>] [<instructiune>|<directiva>] [;<comentar>]

• <eticheta> - sir de litere si cifre, care incepe cu o litera

• <prefix> - cuvant cheie care modifica regimul de executie al instructiunii care urmeaza (ex: REP – repeta instructiunea urmatoare de un nr. de ori)

• <instructiune>:= <mnemonica> [<operand1> [,<operand2>]]

• <mnemonica> - grup de litere care simbolizeaza o instructiune

• <operand1>:= <registru>|<variabila>

• <operand2>:= <val_imediata>|<operand1>

Page 55: ASM_Curs

Sintaxa instructiunilor (continuare)

• <registru> := EAX|EBX|...AX|BX| .. |AH|BH|.. |AL|BL| ...|CS|DS, ...|GS => nume de registru

• <variabila>:= <nume_var>|<adresa_var>

• <adresa_var>:=[<nume_var>]'['[reg_index][+<reg_baza>] [+<deplasament>]']'

• <val_imediata>:=<numar>|<expresie>– un numar sau o expresie aritmetico-logica care se poate evalua in

momentul compilarii; se poate exprima in zecimal, hexazecimal (indicativul H) sau binar (indicativul B)

• <deplasament> := <val_pe_16biti>|<val_pe_32biti>– valoare exprimabila pe 16 sau 32 biti

• <comentar> - text (cu caracter explicativ) ignorat de compilator

Page 56: ASM_Curs

Sintaxa instructiunilor x86

• Exemple:– instructiuni fara operand

NOP

MOVSB

– instructiuni cu un operand

PUSH AX

ROR DX

– instructiuni cu doi operanzi

MOV AX, BX

– linie cu eticheta instructiune si comentar

START: MOV AX,BX ;muta cont. AX in BX

– linie de comentar

; aceasta este o linie de comentar

– linie cu eticheta

ETICHETA:

Page 57: ASM_Curs

Reguli sintactice

• o linie de program poate contine maxim o instructiune (mnemonica + operanzi) sau o directiva

• o linie poate contine:– nici o entitate de instructiune (camp) – linie goala

– numai etichet

– numai comentar

– combinatii de eticheta, instructiune, directiva si comentar

• un comentar incepe cu ';' si se incheie la sfarsitul liniei

• o instructiune x86 poate contine maxim 2 campuri de operanzi: – operand1 – indica destinatia sau rezultat si primul termen al unei

operatii unare sau binare

– operand2 – indica sursa sau al doilea termen al unei operatii binare

Page 58: ASM_Curs

Reguli sintactice - Exemple

NOP

• instructiune fara operanzi

MOVSB

• instructiune cu operanzi impliciti

MUL CL

• instructiune cu primul operand implicit (AX=AL*CL)

MOV AX, BX

• AX – destinatia , BX sursa transferului

INC SI

• SI – termenul incrementat si destinatia rezultatului

ADD CX,DX

• CX – primul termen al sumei si destinatia rezultatului, DX – al doilea termen

ADD AX,BX,CX

• instructiune incorecta, prea multi operanzi

Page 59: ASM_Curs

Reguli sintactice

• pt. scrierea programului pot fi folosite litere mici si mari, insa asamblorul nu face distinctie intre literele mici si mai

• separarea campurilor dintr-o instructiune se poate face cu un numar arbitrar de caractere <spatiu> si <tab>

• pt. lizibilitate se recomanda aranjarea campurilor pe coloane distincte, separate prin <tab>: – eticheta: mnemonica operanzi ;comentar

• se recomanda utilizarea de nume simbolice in locul unor valori numerice ex: adrese de variabila => nume_variabila,

• adrese de instructiune => eticheta,

• valori de constante numerice=>nume_constanta

Page 60: ASM_Curs

Reguli sintactice- simboluri

• Simboluri, identificatori, etichete:

– secventa de litere, cifre si unele caractere speciale (ex: _, $, @), ?), care nu incepe cu o cifra

– lungimea simbolului este arbitrara, dar se considera primele 31 caractere

– exista simboluri rezervate, predefinite in limbaj (cuvinte cheie pt. instructiuni, directive, macrodefinitii)

– exemple:

• L1 Bletch RightHere Right_Here

Item1 __Special

• $1234 @Home $_1 Dollar$ WhereAmI?

@1234

• erori:

• 1TooMany – incepe cu o cifra

• Hello.There – contine punct

• $ - $ sau ? nu poate sa apara singur

• LABEL – cuvant rezervat.

Page 61: ASM_Curs

Reguli sintactice - constante

• Constante:

– intregi: 12, 21d, 123h, 0fffh, 1011b

– reale (flotant): 1.5, 1.0e10, 23.1e-12

– sir de caractere: "text", 'Text', 'TEXT''TEXT'

– constante simbolice: - nume simbolic dat pentru o

secventa de caractere (text); ex:

unu equ 1

numar = 26

var textequ <5[bx]> ; 5[bx] – constanta textuala

Page 62: ASM_Curs

Reguli sintactice - operanzi

• operanzii unei instructiuni trebuie sa fie de aceeasi lungime: octet, cuvant, dublu-cuvant (exceptii: operatii de inmultire si impartire)

• o instructiune poate contine cel mult un operand de tip locatie de memorie

– formatul instructiunilor x86 permite exprimarea adresei unei singure locatii de memorie

– pentru o operatie aritmetica sau logica intre doua variabile (locatii de memorie) unul dintre operanzi trebuie sa se transfere temporar intr-un registru intern

– aceasta restrictie favorizeaza operatiile pe registre – pt. cresterea eficientei de executie

• instructiunile sunt echivalente ca nivel de structurare si sunt independente intre ele

– nu exista forme de programare structurata

– structurarea programului se poate face la nivel logic (formal) prin directive

Page 63: ASM_Curs

Semnificatia entitatilor unei linii de program

• Eticheta:

– nume simbolic dat unei adrese de memorie unde incepe instructiunea care urmeaza dupa eticheta

– util pentru instructiuni de salt si apel de rutine

– se exprima prin : <adresa_segment>: <adresa_offset>

• Mnemonica (numele) instructiuii:

– nume simbolic dat unui cod de instructiune (2, 3, 4 sau 5 litere)

– semnifica un anumit tip de operatie elementara direct executabila de UCP

– aceeasi mnemonica poate simboliza mai multe coduri cu semnificatie apropiata (ex: MOV, ADD, ...)

– acelasi cod de instructiune se poate exprima prin mnemonici diferite (ex: JZ si JE)

– fiecarei instructiuni in L.A. ii corespunde strict o instructiune in cod masina (relatie biunivoca) !!!!!!!

Page 64: ASM_Curs

Semnificatia entitatilor unei linii de program

• Operand:– camp care exprima un termen al operatiei elementare

exprimata prin mnemonica

– indica locul si modul de regasire al operandului

(modul de adresare folosit)

– tipuri de operanzi:

• registre interne ale UCP:

• date imediate (constante numerice)

• locatii de memorie (variabile)

• porturi de intrare sau de iesire (registre de I/E)

Page 65: ASM_Curs

Semnificatia entitatilor unei linii de program

(operanzi)

• Registre interne:

– registre generale: • (8 biti) AH,AL,BH,BL,CH,CL,DH,DL

• (16 biti) AX, BX,CX,DX, SI,,DI,SP, BP

• (32 biti) EAX, EBX,ECX,EDX, ESI,EDI,ESP, EBP

– registre speciale: CS,DS, SS, ES, FS,GS, GDTR, LDTR , CR0,..CR4, PSW

• Date imediate (constante): – numar sau expresie aritmetico-logica evaluabila la un numar =>

expresia trebuie sa contina numai constante

– valoarea este continuta in codul instructiunii

– lungimea constantei – in acord cu lungimea celui de al doilea operand (octet, cuvant sau dublu-cuvant)

– ex: 0, -5, 1234h, 0ABCDh, 11001010b, 1b, 8* 4 - 3

Page 66: ASM_Curs

Semnificatia entitatilor unei linii de program

(operanzi)

• Locatii de memorie (variabile):

– expresie care exprima adresa unei locatii de memorie de o

anumita lungime

– lungimea variabilei:

• in acord cu al doilea operand (daca exista)

• se deduce din declaratia numelui de variabila

• se indica in mod explicit ('byte', 'word', 'dword')

– adresa variabilei:

• adresa de segment:

– specificata in mod implicit – continutul registrului DS

– exprimata in mod explicit: <reg_segment>:<variabila>

ex: CS: Var1, ES: [100h]

• adresa de offset - adresa relativa in cadrul segmentului

Page 67: ASM_Curs

Semnificatia entitatilor unei linii de program

(operanzi; variabile)

• adresa de offset

– adresa poate sa fie pe 16 biti (modul real) sau pe 32 biti (modul protejat)

– exprimabila in mai multe moduri:

• adresa fizica: valoare concreta de adresa

– '['<adresa_offset>']', ex: MOV AX, [100h]

– '[ '[<reg_baza>] [+<reg_index>] [<deplasament>']'

ex: MOV AX, [BX+SI+100h]

• adresa simbolica: - nume simbolic dat unei variabile

– VAR1, TEXT, VAR+5

– VAR[BX], VAR[BX+SI]

<reg_baza>:= BX|BP|EBX|EBP

<reg_index>:=SI|DI|ESI|EDI

Page 68: ASM_Curs

Calculul adresei unei variabile

(in modul real)

Deplasament

15 0

SI

DI

BX

BP

CS

DS

SS

ES

*16

+ + +Adr. offet Adr. fizica

Adr. segment

(16 biti) (20 biti)

Page 69: ASM_Curs

Semnificatia entitatilor unei linii de program

(operanzi)

• Porturi de Intrare/Iesire

– registre continute in interfetele de intrare/iesire

– spatiul de adresare maxim: 64Ko (adr. maxima 0FFFFH)

– la PC-uri spatiul este limitat la 1ko (adr. maxima 3FFH) (?)

– pe aceeasi adresa pot fi 2 registre:

• un reg. de intrare si unul de iesire

– porturile apar doar in instructiunile IN si OUT

– specificare:

• direct, prin adresa fizica (daca adresa este exprimabila pe un octet) sau nume simbolic

ex: IN AL, 12h

OUT 33h, AL

• indirect, prin adresa continuta in registrul DX

ex: IN AL,DX

OUT DX,AL

Page 70: ASM_Curs

Moduri de adresare pt. ISA x86

• Moduri 8086

• Adresarea imediata:

– operandul este o constanta

– operandul este continut in codul instructiunii

– operandul este citit o data cu instructiunea

– instr. poate lucra cu o singura valoare

– lungimea constantei este in acord cu celalalt operand

– flexibilitate limitata

– exemple:

MOV AL, 12h MOV AL,120

MOV AX, 12ABh MOV AL, 260 - eroare

Page 71: ASM_Curs

Moduri de adresare pt. ISA x86Moduri 8086

• Adresarea de tip registru:

– operandul este continut intr-un registru al UCP

– timp de acces foarte mic; nu necesita ciclu de transfer pe magistrala

– instructiune scurta (nr. mic de biti pt. specificare operand)

– numar limitat de registre interne => nu toate variabilele pot fi pastrate in registre

– exista limitari in privinta registrelor speciale (ex: registrele segment)

– exemple:

MOV AX,BX MOV DS,AX

MOV BX, AL – eronat MOV DS, 1234H - eronat

Page 72: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri 8086

• Adresarea directa (cu deplasament):

– operanul este specificat printr-o adresa de memorie (adresa relativa fata de inceputul unui segment)

– adresa operandului este continuta in codul instructiunii

– instructiunea poate lucra cu o singura locatie de memorie (octet, cuvant sau dublu-cuvand)

– necesita ciclu suplimentar de transfer cu memoria =>timp de executie mai mare

– adresarea directa se foloseste pt. variabile simple (date nestructurate)

– exemple:

MOV AL, [100h] MOV BX, var1

MOV CX, [1234h] MOV var2, SI

Page 73: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri 8086

• Moduri indirecte de adresare:

• Adresarea indirecta prin registru:

• adresa operandului se specifica intr-un registru

• registrele folosite pt. adresare: SI, DI, BX, BP

• instructiunea contine adresa registrului

• mod flexibil de adresare

• exemple:

MOV AL, [SI]

MOV [BX], CX

Page 74: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri 8086

• Adresarea (indirecta) indexata:

– adresa operandului se exprima printr-o adresa de baza, data de

<deplasament> si un index dat de continutul unui registru

– mod de adresare folosit pentru structuri de date de tip sir, vector,

tablou

– sintaxa: <nume_var>'['<reg_index>']' <reg_index>:=SI|DI

'['<reg_index>+<deplasament>']'

– exemple:

MOV AX, VAR[BX] MOV CX, [SI+100H]

MOV VAR[DI], AL MOV VAR[10H], 1234H

A[0] A[1] A[2] A[3]

Deplasament + SI=i*lung. = Adresa A[i]

Page 75: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri 8086

• Adresarea (indirecta) bazata:

– adresa operandului se exprima printr-o adresa de baza, data de un registru si o adresa relativa data de <deplasament>

– mod de adresare folosit pentru structuri de date de tip inregistrare

– formal este identica cu adresarea indexata, dar alta interpretare

– sintaxa: <nume_var>'['<reg_index>']' <reg_baza>:=BX|BP

'['<reg_baza>+<deplasament>']'

– exemple:

MOV AX, VAR[BX] MOV CX, [SI+100H]

MOV VAR[DI], AL MOV [SI][100h], 1234H

E1 Ei+1E2 Ei

Depl. Ei+BP = Adresa Ei

Page 76: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri 8086

• Adresarea mixta (bazat indexata):– adresa operandului se exprima printr-o adresa de baza, data de un

registru, un index dat de un registru si o adresa relativa data de <deplasament>

– mod de adresare folosit pentru structuri complexe de date de tip inregistrare de vectori sau vector de inregistrari

– modul cel mai flexibil de adresare, dar necesita 2 adunari

– sintaxa: <nume_var>'['<reg_baza>+<reg_index>']'

'['<reg_baza>+<reg_index>+<deplasament>']'

'['<reg_baza>']''['<reg_index>']''['<deplasament>']'

exemple:

MOV AX, VAR[BX+SI] MOV CX, [BX+SI+100H]

MOV VAR[BP+DI], AL MOV VAR[BP+SI], 1234H

MOV VAR[BP][DI], AL MOV [100h][BP][SI], 1234H

Page 77: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri '386, .. Pentium

• modificari fata de 8086:– extensia registrelor generale la 32 biti: EAX, EBX, ...

– toate registrele generale pot fi folosite pentru adresarea indirecta prin registru, indexata, bazata si mixta;

– ex: [EAX], [ECX], VAR[EAX+ECX], [DX+AX+100h]

– la adresarea mixta primul registru se considera registru de baza iar al doilea registru index

– !!!!! modurile '386 sunt mai putin eficiente decat cele 8086 !!!!!

obs:1. In modul real adresa de offset nu poate depasi limita de 64ko, chiar daca registrele sunt de 32 biti; in modul protejat adresa de offset se calculeaza pe 32 biti

2. Registrul SP nu poate fi folosit ca registru index

3. Daca se foloseste SP sau BP atunci implicit se lucreaza cu reg. segment SS

Page 78: ASM_Curs

Moduri de adresare pt. ISA x86

Moduri '386, .. Pentium

• Adresarea indexata, scalata:– permite multiplicarea registrului index cu un factor

egal cu lungimea unui element din sir: • 1 pt. octet, 2 pt. cuvant, 4 pt. dcuvant si 8 pt. qcuvant

– simplifica parcurgerea tablourilor a caror elemente sunt mai mari de 1 octet

– sintaxa: (in loc de '+' se poate folosi '][')

'['<reg_index>*n']'

'['<reg_index>*n + <deplasament> ']'

'[' <reg_baza> + <reg_index>*n']'

'[' <reg_baza> + <reg_index>*n + <deplasament> ']'

ex: MOV AX, [SI*2] MOV DX, [AX*4+12h]

MOV CX, 100h[BX][AX*1]

Page 79: ASM_Curs

1

Programarea in limbaj de asamblare

ISA x86

Variabile, structuri de date

si structuri de program

Page 80: ASM_Curs

2

Declararea variabilelor

• Scopul:– utilizarea unor nume simbolice in locul unor adrese fizice

– rezervarea de spatiu in memorie si initializarea variabilelor

– pt. verificarea utilizarii corecte a variabilelor (verificare de tip)

• Modul de declarare: - prin directive

• Directiva (pseudo-instructiune):– entitate de program utilizata pentru controlul procesului de

compilare, editare de legaturi si lansarea programului

– directivele NU SE EXECUTA; in programul executabil nu exista cod aferent pentru directive

– se folosesc pentru:

• declararea variabilelor si a constantelor

• declararea segmentelor si a procedurilor

• controlul modului de compilare, si editare de legaturi, etc.

Page 81: ASM_Curs

3

Declararea variabilelor Variabile simple (nestructurate):

• Octeti:• sintaxa:

<nume_var> DB ?|<valoare>

<nume_var> BYTE ?|<valoare>

<nume_var> SBYTE ?|<valoare>

• semnificatia:– se rezerva o locatie de memorie de 1 octet;

– locatia este initializata cu <valoare>, sau este neinitializata daca apare '?'

– <nume_var> - eticheta ce simbolizeaza adresa variabilei

– <valoare> - valoare numerica in intervalul [0..255] sau [-127..127]

– poate pastra: un numar intreg fara semn, un numar intreg cu semn, un cod ASCII, 2 cifre BCD

Page 82: ASM_Curs

4

Declararea variabilelor Variabile simple (nestructurate):

• Cuvinte:• sintaxa:

<nume_var> DW ?|<valoare>

<nume_var> WORD ?|<valoare>

<nume_var> SWORD ?|<valoare>

• semnificatia:

– se rezerva o locatie de memorie de 2 octeti;

– locatia este initializata cu <valoare>, sau ramane neinitializata daca apare '?'

– <nume_var> - eticheta ce simbolizeaza adresa variabilei

– <valoare> - valoare numerica in intervalul [0..216-1] sau [- 215-1.. 215-1]

– poate pastra: un numar intreg fara semn, un numar intreg cu semn, 2 coduri ASCII, 4 cifre BCD

Page 83: ASM_Curs

5

Declararea variabilelor Variabile simple (nestructurate):

• Dublu-cuvinte:• sintaxa:

<nume_var> DD ?|<valoare>

<nume_var> DWORD ?|<valoare>

<nume_var> SDWORD ?|<valoare>

• semnificatia:– se rezerva o locatie de memorie de 4 octeti;

– locatia este initializata cu <valoare>, sau este neinitializata daca apare '?'

– <nume_var> - eticheta ce simbolizeaza adresa variabilei

– <valoare> - valoare numerica in intervalul [0..232-1] sau [- 231-1.. 231-1]

– poate pastra: un numar intreg fara semn, un numar intreg cu semn, 4 coduri ASCII, 8 cifre BCD,

Page 84: ASM_Curs

6

Exemple de declaratii de variabile simple

m db ? erori

i db 6 l byte 260

j byte -7 al word 23

l byte 255 tt byte -130

k sbyte -23

bits byte 10101111b

car byte 'A'

cuv dw 1234h

var word 0FFFFh

dcuv dword 12345678h

Page 85: ASM_Curs

7

Declararea variabilelor Variabile simple (nestructurate):

• Variabile simple lungi:– FWORD

• variabila pe 6 octeti, introdus pentru pastrarea unor poantori (2 octeti pt. segment + 4 octeti pt. offset)

– QWORD (quad-word)

• variabila pe 8 octeti; folosit pentru pastrarea intregilor f. mari sau a valorilor in flotant (dubla precizie)

– TBYTE (ten-bytes)

• variabila pe 10 octeti; format folosit pt. coprocesorul matematic; se reprezinta 10 cifre BCD (despachetat) sau nr. flotant pe 80 biti

– FWORD,QWORD si TWORD se folosesc rar, exista declaratii mai bune care le inlocuiesc

Page 86: ASM_Curs

8

Declararea variabilelor Variabile simple (nestructurate):

• Variabile in virgula flotanta:– REAL4 – variabila flotanta pe 4 octeti

– REAL8 - variabila flotanta pe 8 octeti

– REAL10 - variabila flotanta pe 10 octeti

– sintaxa:

<nume_var> REAL4|REAL8|REAL10 ?|<val_reala>

– <val_reala> - valoare cu punct zecimal si eventual exponent

– ex: VAR REAL4 1.0

VAR2 REAL8 2.5e+10

VAR3 REAL4 1 - eronat

Page 87: ASM_Curs

9

Declararea variabilelor Variabile simple (nestructurate):

• declararea unor tipuri de date

proprii:

– se foloseste directiva TYPEDEF (asemanator

cu #DEFINE in C) – este o macrodefinitie

– nume diferite pentru tipuri de date

predefinite

– exemple:

integer typedef sword var1

integer 5

char typedef byte var2 char

'A'

boolean typedef byte var3

boolean 0

float typedef real4

var4 float 1.5

Page 88: ASM_Curs

10

Variabile de tip pointer

• pointer = adresa unei variabile

• pointer "near"

– indica adresa relativa (efectiva) in cadrul unui segment

– se reprezinta pe 16 biti

– exemplu de utilizare:

lea bx, j ; sau mov bx, offset j

=> bx= adr_offset(j)

mov p, bx

......

mov bx, p

mov ax, [bx]

– declarare:

<nume_pointer> word ?|near ptr

<nume_var>

Page 89: ASM_Curs

11

Variabile de tip pointer

• pointer "far"

– indica o adresa absoluta:

<adresa_segment>:<adresa_offset>

– se reprezinta pe 32 biti

– exemplu de utilizare:mov word ptr p, offset j ; "word

ptr" evita eroarea de tip

mov word ptr p+2, seg j

...........

les bx, p ;ES:BX<=p

mov es:[bx], al ;Mem[p]<=al

– declarare:

<nume_pointer> dword ?|far ptr

<nume_var>

Page 90: ASM_Curs

12

Date structurate

• Tablou: – structura de date care contine elemente de acelasi tip

– declaratie (pt. tablou unidimensional):<nume_matrice> <tip_element> <val_1>[..[,<val_n>]..]

<nume_matrice> <tip_element> n DUP(?|<val_1>[..[,<val_n>]..])

– exemple:octeti byte 1,3,0ffh, 34h, -13

byte 12,33,44

text byte 'Text'

cuvinte word 10 DUP(?)

tablou word 20 DUP(0)

var word 10 DUP(1,2)

Page 91: ASM_Curs

13

Date structurate Tablou

• amplasarea unui tablou unidimensional in memorie

• Adresare:– pt. un singur element:

MOV AX, TABLOU+INDEX*DIM

– pentru elemente consecutive:

MOV SI, INDEX*2 (mod '386)

MOV AX, TABLOU[SI] MOV SI,INDEX

ADD SI,2 MOV AX, TABLOU[SI*2]

A[0] A[1] A[2] A[3]

Adr. de baza Indexul Dim. element

Adr. element = Adr. de baza + index*Dim. element

Expresie evaluata la compilare

Page 92: ASM_Curs

14

Date structurate:Tablou

• Tablouri multidimensionale:

– dificil, nu exista suport adecvat in LA

– amplasarea in memorie a elementelor: dupa linii sau

dupa coloane

Adr. de baza Adr. rand 2

Page 93: ASM_Curs

15

Date structurate:Tablouri multidimensionale

• Declararea tablourilor bidimensionale:

<nume_tablou> <tip_element> n DUP( m DUP(?|<val>))

• !!!! <nume_tablou> reprezinta adresa primului element!!!!

• Adresarea unui element:

– element singular:MOV AX, TABLOU+rand*lung_rand+coloana*dim_element

– adresare succesiva:MOV SI, coloana*dim_element

MOV BX, rand*lung_rand

MOV AX, TABLOU[BX][SI]

ADD SI, dim_element

Expresii

constante

Page 94: ASM_Curs

16

Date structurate:Inregistrari (record)

• Declarare:

– prin declararea unei structuri de tip inregistrare SI

<nume_tip_struct> struct

<nume_var> <tip_var> ?|<val_1>[...<val_n>]..]]

<nume_var> <tip_var> ?|<val_1>[...<val_n>]..]]

........

<nume_tip_struct> ends

– prin declararea unei inregistrari care are structura

declarata:

<nume_inreg> <nume_tip_structura> {[<val_1>[...<val_n>]..]}

Page 95: ASM_Curs

17

Date structurate:Inregistrari (record)

• Exemplu:student struct

FirstName char 12 dup (?)

SecondName char 12 dup (?)

BirthYear integer ?

Mark byte ?

student ends

.............

popescu student {}

...........

MOV AX, popescu.BirthYear

– !!! "popescu" este adresa primului element din structura!!!

Page 96: ASM_Curs

18

Date structurate:Inregistrari (record)

• Alte metode de adresare:

• exemplul 1:

popescu student {}

popescuPtr dword popescu

..........

les bx, popescuPtr

mov ax, es:[bx].student.BirthYear

• exemplul 2:

mov bx, offset popescu

mov ax,[bx+12+12] ; ax<= popescu.BirthYear

Page 97: ASM_Curs

19

Declararea constantelor

• Scop: - nume simbolic dat unei valori des utilizate

• Sintaxa:<nume_constanta> equ|= <expresie>

<nume_constanta> textequ '<'<text>'>'

• Semnificatia:– la compilare <nume constanta> se inlocuieste cu

<expresie> ; este o constructie de tip MACRO

– sintaxa se verifica doar la inlocuire

– <expresie> este o expresie aritmetico-logica evaluabila in momentul compilarii => termenii sunt constante sau operatorul '$'

– '$' – reprezinta valoarea contorului curent de adrese

Page 98: ASM_Curs

20

Declararea constantelor

• Exemple:

trei equ 3

true equ 0

false = 0ffh

text byte 'acesta este un text'

lung_text equ $-text

dim_tablou equ rand*coloana*dim_element

Adr_port equ 378h

var textequ <[bx+100]>

Page 99: ASM_Curs

21

Declararea structurilor de program

• Declararea procedurilor:<nume_procedura> proc [near|far]

<instructiuni&directive>

<nume_procedura> endp

– near - apel din interiorul segmentului

– far – apel din exteriorul segmentului

– obs:

• procedura trebuie incheiata cu instr. RET altfel executia continua cu instructiunea de dupa endp

• asamblorul nu verifica ce contine procedura

• nume_procedura reprezinta adresa primei instructiuni (locatii) din procedura

Page 100: ASM_Curs

22

Declararea structurilor de program

• Declararea segmentelor:<nume_segment> segment [READONLY] [<align>] [<combine>] [<use>] [<'class'>]

<instructiuni&directive>

<nume_segment> ends

• Observatii: – pot fi declarate oricate segmente, dar la un moment dat numai 4

segmente (6 la '386) sunt direct accesibile

– pentru ca un segment sa fie accesibil, adresa sa (selector la '386, modul protejat) trebuie incarcata intr-un registru segment

– la lansarea programului CS si SS se incarca automat, restul registrelor segment trebuie initializate prin program

– un program contine in mod obisnuit un segment de date, un segment de cod si un segment de stiva

Page 101: ASM_Curs

23

Declararea structurilor de program Declararea segmentelor

• semnificatia parametrilor:– <align> - specifica modul de amplasare (aliniere) a

segmentului in memorie: byte, word, dword, para (16 octeti), sau page(256 octeti) -implicit-para)

– <combine> - folosit pt. concatenarea segmentelor care au acelasi nume: public, stack, common, memory, sauat.

– <class> - folosit pt. ordonarea segmentelor care nu au acelasi nume: 'CODE', 'DATA', 'STACK', 'CONST'

– READONLY – pt. a genera eroare in cazul in care se scrie in segment (ex:pt. protejarea segmentului de cod)

– <use> - specifica tipul de cod care se va genera: use16, use32, flat ;(pt. segmentul de cod neaparat use16 !!!)

Page 102: ASM_Curs

24

Declararea structurilor de program Declararea segmentelor

• Directiva ASSUME– specifica segmentele direct accesibile

– sintaxa:

assume cs: <nume_seg> [,<ds:<nume_seg>] [,es:<nume_seg>] .. [,<gs:<nume_seg>]

– permite verificarea la compilare a accesibilitatii unor variabile

– declaratia poate sa nu reflecte situatia reala

– directiva NU modifica continutul registrelor segment

– TREBUIE sa fie o directiva assume inaintea primei instructiuni din program

Page 103: ASM_Curs

25

Declararea structurilor de program

• Directiva END– directiva de incheiere a programului

– tot ce urmeaza dupa directiva se ignora la compilare

– sintaxa:

END [<eticheta>]

– <eticheta> - punctul de lansare a programului; daca lipseste atunci lansarea se face de la prima instructiune din segmentul de cod

Page 104: ASM_Curs

26

Prototip de program in LA

data segment public 'DATA'

..... ; declaratii de variabile si constante

data ends

code segment public 'CODE'

assume cs: code, ds: data

start: mov ax, data

mov ds, ax ; initializare DS

......

mov ax, 4c00h ; revenire in sistemul de operare

int 21h

code ends

end start ;sfarsit program

Page 105: ASM_Curs

Programarea in limbaj de asamblare

Setul de instructiuni ISA x86

Page 106: ASM_Curs

Clasificarea instructiunilor

• dupa importanta (grad de utilizare):

– uzuale, ocazionale, folosite f. rar

• dupa tipul de procesor:

– 8086 (modul real), '386 (modul protejat), x87 (instructiuni flotante), Pentium II (MMX)

• dupa tipul operanzilor:

– 8/16 biti, 32 biti

• dupa complexitate:

– simple (o singura operatie, mod simplu de adresare, lungime scurta, timp redus de executie)

• dupa gradul de cunostere:

– cunoscute, de care am auzit, necunoscute

Page 107: ASM_Curs

Clasificarea instructiunilor

• dupa tipul operatiei efectuate:

– Instructiuni de transfer

• mov, lea, les , push, pop, pushf, popf

– Instructiuni de conversie

• cbw, cwd, xlat

– Instructiuni aritmetice

• add, inc sub, dec, cmp, neg, mul, imul, div, idiv

– Instructiuni logice, de rotatie, deplasare (shift) si pe bit

• and, or, xor, not, shl, shr, rcl, rcr

– Instructiuni de Intrare/Iesire (I/O)

• in, out

Page 108: ASM_Curs

Clasificarea instructiunilor

• dupa tipul operatiei efectuate (continuare):

– Instructiuni pe siruri

• movs, stos, lods

– Instructiuni de control al fluxului de program

• jmp, call, ret, salturi conditionate

– Instructiuni ale coprocesorului matematic

– Instructiuni MMX

– Alte instructiuni

• clc, stc, cmc

Page 109: ASM_Curs

Instructiuni de transferInstructiunea MOV

– Transfera o data pe 8, 16 sau 32 biti: intre doua registre, intre un registru si o locatie de memorie sau o data imediata intr-un registru sau locatie de memorie

• Sintaxa:

mov reg, reg

mov mem, reg

mov reg, mem

mov mem, data_imediata

mov reg, data_imediata

mov reg_segm, mem16

mov reg_segm, reg16

mov mem16,reg_segm

mov reg16, reg_segm

obs: mov mem,mem – eroare

mov reg_segm, data_imediata - eroare

Exemple:mov ax, bx

mov al, ch

mov [100h], ax

mov var, 1234h

mov eax, 13

mov ds, var[si]

mov es, cx

mov bp, ss

mov var, ds

Page 110: ASM_Curs

Instructiuni de transferInstructiunile LDS, LES, LFS, LGS, si LSS

• Sintaxa:

LxS <reg16>, mem32

unde x Є [D, E, F, G, S]

• Semnificatia: - incarcare pointer "far"

< reg16 > <= [mem32]16

<reg_segm> <=[mem32+2]16

• Exemple:

lds si, p1 ; ds<=mem(p1+2) si<=mem(p1)

lss bp, p2 ; ss<=mem(p2+2) bp<=mem(p2)

Page 111: ASM_Curs

Instructiuni de transferInstructiunea LEA

• Sintaxa:

lea reg16, mem

lea reg32, mem ; doar pt. '386 si mai noi

• Semnificatia: incarca in registru "adresa efectiva" a variabilei de memorie; incarcare pointer pe 16 sau 32 biti

<reg16/32> = adr_offset(mem)

• !!! se ia adresa men. si nu continutul

• exemple:

lea ax, var1 ; ax=offset(var)

lea bx, [bx+5] ; bx=bx+5

lea di, var[bx+si] ; di=bx+si+offset(var)

lea si, -100[di] ; si=di-100

Page 112: ASM_Curs

Instructiuni de transferInstructiunile PUSH si POP

• sintaxa:

push <operand>

pop <operand>

pushf pusha pushad

popf popa popad

enter <imed>,<imed>

leave

<operand> - reg16, reg32, reg_segm, data_imediata, mem

• semnificatia: scriere/citire pe/de pe stiva

sp=sp – 2 sau 4 <operand>=ss:[sp]

ss:[sp]=<operand> sp=sp + 2 sau 4

Push/Pop all/alldouble regs

Flags

Page 113: ASM_Curs

Instructiuni de transferInstructiunile XCHG, LAHF,SAHF, BSWAP

• XCHG

– schimba continutul operanzilor intre ei

– sintaxa: xchg <operand1>, <operand2>

<operand1/2> - reg16, reg32, mem16, mem32

• LAHF SAHF

ah=<flags> <flags>=ah

• BSWAP (numai pt. >'486)

– converteste din Little-endian in Big-endian si invers

– sintaxa: bswap <reg32>

– ex: bsawp eax ; byte0-7�byte24-31 si byte8-15�byte16-23

Page 114: ASM_Curs

Instructiuni de conversieMOVZX, MOVSX, CBW, CWD, CWDE, and CDQ

• MOVZX <dest>, <sursa>

– muta <sursa> in <dest> cu extensie 0

– lungime(<dest>)=2*lungime(<sursa>)

– <sursa> - reg8, reg16, mem8, mem16

– <dest> - reg16, reg 32

• MOVSX <dest>, <sursa>

– muta <sursa> in <dest> cu extensie de semn

• CBW - converteste al (byte) in ax (word) cu extensie de semn

• CWD - converteste ax (word) in dx:ax (dword) cu extensie de semn

• CWDE – converteste ax (word) in eax (dword) cu extensie de semn

• CDQ – converteste eax (dword) in edx:eax (qword) cu extensie de semn

Page 115: ASM_Curs

Instructiuni de conversieXLAT

• sintaxa: XLAT [<tabel>]

– operandul este ignorat

• semnificatia:

– traduce un codul pe baza unui tabel de conversie

(Look-up table);

– adresa tabelului trebuie sa se incarce in prealabil in bx

al=[bx+al]

– util pentru conversii de cod, calcule rapide pe baza de

rezultate precalculate (ex: inmultire, impartire)

Page 116: ASM_Curs

Instructiuni aritmeticeadd, adc, sub, sbb

add <dest>, <src> ;<dest> :=

<dest> + <src>

adc <dest>, <src> ; <dest> :=

<dest> + <src> + C

SUB <dest>, <src> ; <dest> :=

<dest> - <src>

sbb <dest>, <src> ; <dest>

:= <dest> - <src> - C

• <dest> - reg8/16/32, mem8/16/32,

• <src> - reg8/16/32, mem8/16/32,, data_imediata

• operatiile aritmetice si logice afecteaza urmatorii indicatori de conditie: C, AC, Z, S, O, P

• eventuala depasire a capacitatii se verifica de programator (atentie la forma de reprezentare cu/fara semn)

Page 117: ASM_Curs

Instructiuni aritmeticemul, imul

• mul – inmultire nr. intregi fara semn

• imul – inmultire nr. intregi cu semn

mul src ; acc := accLO *

src

imul src ; acc := accLO *

src

imul dest, src1, imm_src ; dest :=

src1 * imm_src *

imul dest, imm_src ; dest := dest

* imm_src *

imul dest, src ; dest := dest

* src *

• src – reg8/16/32, mem8/16/32

• acc – ax, dx:ax , edx:eax (dim(src)*2)

Page 118: ASM_Curs

Instructiuni aritmeticediv, idiv

• div – impartire nr. intregi fara semn

• idiv – impartire nr. intregi cu semn

div src ; accLO := acc / src

; accHI := acc MOD src

idiv src ; accLO := acc / src

; accHI := acc MOD src

• src – reg8/16/32, mem8/16/32

• acc – ax, dx:ax, edx:eax (2*dim(src))

• nu se pot imparti 2 operanzi de

aceeasi lungime

• !!!! indicatorii de conditie (flags)

au continut imprevizibil dupa

inmultire si impartire!!!!!

Page 119: ASM_Curs

Instructiuni aritmetice

neg, inc, dec

neg dest ; dest := - dest

inc dest ; dest := dest + 1

dec dest ; dest := dest – 1

• dest – reg16/32, mem16/32

• instructiuni scurte si rapide

• inc si dec :

– utile pt. parcurgerea unor siruri

prin incrementarea sau decrementarea

adresei

– utile pentru contorizare (numarare)

Page 120: ASM_Curs

Instructiuni logice

• AND, OR, XOR, NOT– operatii logice pe bit

– sintaxa: <operator> <operand1>, <operand2>

– <operand1/2> := <reg8/16/32>|<mem8/16/32>|<val_imed>

– semnificatia: <operand1>=<operand1><operator><operand2>

– exemple:

and ax, bx mov al,10101111b

or ax, 33h and al, 00100000b

not var1 ;in al va fi 00100000b

xor si,si

Page 121: ASM_Curs

Instructiuni logice• Utilizarea operatorilor logici:

– pentru extragerea unui bit sau a unui grup de biti

dintr-un set de valori logice

ex: masca equ 101b

................................................

and al, masca ; in al se pastreaza bitii D0 si D2 restul vor fi 0

– pentru a seta/reseta un bit sau un set de biti

ex: masca1 equ 80h

or al, masca ; D7 va fi setat (valoare 1)

masca0 equ 7fh

and al, masca ; D7 va fi resetat (valoare 0)

Page 122: ASM_Curs

Instructiuni de deplasare

• SHL/SAL, SHR, SAL– instructiuni pentru deplasarea continutului unui operand la stanga

si la dreapta cu un numar de pozitii binare

– deplasari:

• logice: deplasare bit cu bit

• "aritmetice": echivalente cu operatiile de inmultire si impartire

– sintaxa:

<instructiune> <operand>, <contor>

<operand>:=<reg>|<mem>

<contor>:=1| cl |<val_imediata>

(<val_imediata> doar la procesoarele mai noi)

Page 123: ASM_Curs

Instructiuni de deplasare

SHL

SHR

SAR

- la procesoarele >286

- SHLD, SHRD

- sintaxa: <instr> <destinatie>, <sursa>, <contor>

- <contor>:= cl | <val_imediata>

- sursa si destinatia sunt pe 16 sau 32 de biti

D0D1D2DnCF 0

D0D1D2Dn CF0

D0D1D2Dn CF

Destinatie Copie sursaCF

Page 124: ASM_Curs

Instructiuni de rotatie

• RCR, RCL, ROR, ROL

– instructiuni de rotatie la stanga si la dreapta, cu si fara CF

– sintaxa:

<instructiune> <operand>,<contor>

<operand>:=<reg>|<mem> <contor>:= 1| cl| <val_imed.>

RCL

ROR

CF Dn D0D1

CF Dn D0D1

Page 125: ASM_Curs

Instructiuni pe bit

• TEST

– sintaxa: TEST <operand1>, <operand2>

– executa un SI logic fara a memora rezultatul

– se foloseste doar pt. pozitionarea indicatorilor de

conditie

• BT, BTC, BTR, BTS

– sintaxa: <instr> <operand>, <index>

– copiaza bitul specificat de <index> din <operand> in CF

– BTC complementeaza, BTR reseteaza, iar BTS seteaza bitul dupa

copiere

Page 126: ASM_Curs

Instructiuni pe bit

• SETcc –

– sintaxa SETcc <reg8>|<mem8>

– seteaza <reg8>|<mem8> daca o conditia este

indeplinita

– ex: SETC, SETNC, SETZ, SETNZ, .... SETA, SETB,

SETE, SETGE, SETBE, .....

Page 127: ASM_Curs

Instructiuni de intrare/iesire

• IN,OUT

– sintaxa: IN <destinatie>, <port>

OUT <port>, <sursa>

<destinatie>, <sursa> := AL| AX|EAX

<port>:= <valoare8>| DX

Page 128: ASM_Curs

1

Programarea in limbaj de asamblare

Setul de instructiuni ISA x86

(continuare)

Page 129: ASM_Curs

2

Instructiuni pe siruri

• permit manipularea unui bloc de date printr-o singura

instructiune

• singurele instructiuni care permit transfer memorie-

memorie sau memorie-port_I/E

• instructiunile folosesc operanzi impliciti:

– DS:SI - adresa elementului din sirul sursa

– ES:DI - adresa elementului din sirul destinatie

– CX - contor ; AL/AX - registru acumulator

– incrementarea sau decrementarea automata a registrelor index

(SI, DI) functie de starea indicatorului D (directie) (0 -

incrementare)

– decrementarea registrului CX

Page 130: ASM_Curs

3

Instructiuni pe siruri

• MOVSB, MOVSW, MOVSD

– semnificatia: transfera un element din sirul sursa intr-un

element din sirul destinatie

ES:[DI] = DS:[SI] ; B - octet, W - cuvant, D - dublu-cuvant

CX--

if(D==0)

SI=SI+n, DI=DI+ dim_element

else

SI=SI-n, DI=DI- dim_element

dim_element = 1, 2 sau 4

Page 131: ASM_Curs

4

Instructiuni pe siruri

• LODSB, LODSW, LODSD, STOSB, STOSW, STOSD

– semnificatia:

• LODS - incarca in acumulator un element din sir

• STOS - salveaza acumulatorul intr-un element al sirului

LODS STOS

AL|AX|EAX=DS:[SI] ES:[DI]=AL|AX|EAX

CX-- CX--

if(D==0) if(D==0)

SI=SI+dim_element DI=DI+ dim_element

else else

SI=SI- dim_element DI=DI- dim_element

; dim_element = 1, 2 sau 4

Page 132: ASM_Curs

5

Instructiuni pe siruri

• CMPSB, CMPSW, CMPSD, SCASB, SCASW, SCASD

– semnificatia:

• CMPS - compara elementele a doua siruri

• SCAS - compara acumulatorul cu un element din sir

(scanare sir); cauta o anumita valoare in sir

• INSB, INSW, INSD, OUTSB, OUTSW, OUTSD

– semnificatia:

• INS - incarca continutul unui port intr-un element al sirului

ES:[DI]=port[DX] CX--, DI=DI+/- dim_element

• OUTS - strie intr-un port un element al sirului

port[DX]=DS:[SI] CX--, SI=SI+/- dim_element

Page 133: ASM_Curs

6

Instructiuni pe siruri -

prefixe de repetare

• REP, REPZ, REPE, REPNZ, REPNE

– folosite inaintea instructiunilor pe siruri pt. repetarea

operatiei de un numar de ori

– semnificatia:

• REP - repeta atata timp cat CX != 0

• REPZ - repeta atata timp cat rezultatul este 0

• REPE - repeta atata timp cat operanzii sunt egali

• REPNZ - repeta atata timp cat rezultatul nu este 0

• REPNE - repeta atata timp cat operanzii nu sunt egali

Page 134: ASM_Curs

7

Exemple de utilizare a instructiunilor pe

siruri

Data segment

Vect1 word 10 DUP(?)

l_vect equ ($-Vect1)/2

Vect2 Byte 10 DUP(?)

Data ends

......................

MOV AX, Data

MOV DS, AX

MOV ES, AX

LEA SI, Vect1

LEA DI, Vect2

MOV CX, l_vect

REP MOVSW

Echivalent cu:

ET: MOV AX,[SI]

MOV [DI],AX

INC SI

INC SI

INC DI

INC DI

DEC CX

JNZ ET

Page 135: ASM_Curs

8

Exemple de instructiuni pe siruri

;Cautare element in sir

LEA SI,text

MOV AL,’*’

REPNZ SCASB

; SI contine pozitia caracterului ‘*’

; Eliminare spatiiLEA SI, sir

MOV AL,’ ‘

REPE SCASB

; SI contine adresa primului

element diferit de spatiu

;Comparare siruri

LEA SI,sir1

LEA DI,sir2

LEA BX, rez

MOV CX, l_sir*2

ET: CMPSB

JNZ ET1

MOV [BX], egal

ET1: INC BX

LOOP ET

Page 136: ASM_Curs

9

Instructiuni de control al programului

(instructiuni de salt)

• JMP - salt neconditionat

– sintaxa: JMP <eticheta>|<var_pointer>|<registru>

– tipuri de salt:

• salt relativ, scurt:

– -127..+127

– distanta exprimata pe 8 biti IP=IP+disp8

• salt relativ, intrasegment:

– -32.768 .. +32.767

– distanta exprimata pe 16 biti IP=IP+disp16

• salt direct intersegment:

– <adr_segment>:<adr_offset>

– deplasament pe 32 biti CS=<adr_seg>; IP=<adr_offset>

Page 137: ASM_Curs

10

Instructiuni de salt

• salt indirect intrasegment

– variabila pointer pe 16

• salt indirect intrasegment, prin registru

– registru pe 16 biti contine un pointer

• tipul saltului si distanta sau adresa de salt se determina de

catre compilator

• se prefera utilizarea etichetelor, pt. a marca tinta saltului

• salturile neconditionate nu sunt agreate in programarea

structurata

Page 138: ASM_Curs

11

Salt neconditionat - exemple

;salt inainte

JMP ET1

ET1: ....

;salt inapoi

......

JMP ET1

;salt relativ

pointer word adr_tinta

JMP pointer

JMP tabela_de_salt[BX]

JMP AX

;salt intersegment

cod1 segment

JMP ET5

cod1 ends

cod2 segment

.......

ET5: MOV AX,BX

cod2 ends

Page 139: ASM_Curs

12

Instructiuni de salt la rutina si revenire din

rutina

• CALL

– sintaxa: CALL <eticheta>|<var_pointer>|<registru>

– aceleasi tipuri ca si la instr. JMP, dar fara salt scurt

– apel intrasegment - “near”

• se salveaza pe stiva adresa instructiunii urmatoare:

SS:[SP] = IP+<lung_instr_curenta> ; SP=SP-2

• se incarca numaratorul de instructiuni cu adresa

rutinei

IP = <adr_offset_rutina>

• se continua executia de la adresa noua

Page 140: ASM_Curs

13

Aple de rutina

– apel intersegment - “far”

• se salveaza pe stiva CS

SS:[SP] = CS ; SP=SP-2

• se salveaza pe stiva adresa instructiunii urmatoare:

SS:[SP] = IP+<lung_instr_curenta> ; SP=SP-2

• se incarca adresa rutinei in CS:IP

CS:IP = <adr_segment>:<adr_offset_rutina>

• se continua executia de la adresa noua

– rutina se declara cu directive (proc, endp) sau

printr-o simpla eticheta

Page 141: ASM_Curs

14

Revenirea din rutina

• RET, RETN, RETF

– sintaxa: RET [<deplasament>]

– semnificatia:

• RET - revenire din rutina ‘near’ sau ‘far’

• RETN - revenire din rutina ‘near’

• RETF - revenire din rutina ‘far’

• RETx <deplasament> - revenire cu descarcarea stivei

– SP=SP+<deplasament> ; pt. descarcarea parametrilor de

apel

– revenirea din rutina:

• se reface in IP (pt. ‘near’) sau CS:IP (pt. ‘far’) adresa de

revenire prin descarcarea stivei

• se continua cu instructiunea de la adresa refacuta

Page 142: ASM_Curs

15

Exemple

rut1 proc near

push ax

......

pop ax

ret

rut1 endp

......

call rut1

mov bx,cx

rut2: mov dx,ax

.......

ret 2

....

push param1

call rut2

.......

call ax

call tabela[BX]

Page 143: ASM_Curs

16

Instructiuni de salt conditionat

• Jcc - salt daca conditia ‘cc’ este indeplinita; in caz

contrar se trece la instructiunea urmatoare

– sintaxa: Jcc <eticheta>

– <eticheta> - se traduce printr-o distanta relativa pe 8 biti

– conditia este data de starea unui sau a unor indicatoare

de conditie (flaguri): CF, ZF, SF, PF, OF

– pentru aceeasi conditie pot exista mnemonici diferite

(ex: JZ, JE)

– Atentie: la 8086/286 salturile pot fi doar in intervalul -128 .. +127;

– de la ‘386 salturile se pot face oriunde in interiorul unui segment

Page 144: ASM_Curs

17

Instructiuni de salt conditionat -

in raport de indicatorii de conditie

Instr. Conditia Alias

JC CF=1 JB,JNAE

JNC CF=0 JNB,JAEJZ ZF=1 JE

JNZ ZF=0

JS SF=1

JNS SF=0

JO OF=1 JPE

JNO OF=0 JP

JP PF=1 JPO

JNP PF=0 JNP

Page 145: ASM_Curs

18

Instructiuni de salt conditionat -

comparare numare fara semn

Instr. Conditie Indicator Alias

JA > CF=0; ZF=0 JNBE

JAE >= CF=0 JNB, JNC

JB < CF=1 JNAE, JC

JBE <= CF=1 sau ZF=1 JNA

JE = ZF=1 JZ

JNE != ZF=0 JNZ

Page 146: ASM_Curs

19

Instructiuni de salt conditionat -

comparare numere cu semn

Instr. Conditie Indicatori Alias

JG > SF=OF sau ZF=0 JNLE

JGE >= SF=OF JNL

JL < SF!=OF JNGE

JLE <= SF!=OF sau ZF=1 JNG

JE = ZF=1 JZ

JNE != ZF=0 JNZ

Page 147: ASM_Curs

20

Exemple

CMP AX,BX

JE egal

.......

egal: .......

TEST AL,101

JNZ et1

.....

et1: .....

ADD AX,[BX]

JO eroare

.......

;eroare de incepator: salt dublu

CMP AL,55h

JGE ET1

JL ET2

;salt pt. >= la “dest”

CMP AL,55h

JNGE skip

JMP dest

skip: ......

.....

dest: .....

Page 148: ASM_Curs

21

Instructiuni de salt conditionat

• JCXZ, JECXZ -salt daca CX (respectiv ECX) este 0

• se foloseste inaintea unei instructiuni de buclare (LOOP),

pentru a preintampina executia de ~65.000 ori a buclei, in

cazul in care CX=0

• LOOP - instructiune de buclare

– sintaxa: LOOP <eticheta>

– ce face: CX=CX-1

If(CX!=0) “salt la <eticheta>”

else “continua cu instructiunea urmatoare”

– CX este folosit implicit pentru contorizarea ciclurilor

executate

Page 149: ASM_Curs

22

Instructiuni de salt neconditionat

• LOOPZ/LOOPE - instructiuni de buclare

– Sintaxa: LOOPZ|LOOPE <eticheta>

– semnificatia: asemanator cu LOOP,

CX=CX-1

if((CX!=0) si (ZF=1) “salt la <eticheta”

else “continua”

• LOOPNZ/LOOPNE - instructiuni de buclare

– Sintaxa: LOOPZ|LOOPE <eticheta>

– semnificatia: CX=CX-1

if((CX!=0) si (ZF!=1) “salt la <eticheta”

else “continua”

Page 150: ASM_Curs

23

Exemple

MOV CX, l_vector

LEA SI,vector

MOV AL,0

bucla: ADD AL,[SI]

INC SI

LOOP bucla

; inlocuire LOOP pt. eficienta

ET1: ......

DEC CX

JNZ ET1

;bucle imbricate

MOV CX, numar1

ET2: PUSH CX

MOV CX, numar 2

ET1: ........

LOOP ET!

POP CX

LOOP ET2

; iesire fortata din bucla

MOV CX, nr_maxim

et4: .......

CMP AX,BX

LOOPNE et4

Page 151: ASM_Curs

Programarea in limbaj de asamblare

Setul de instructiuni ISA x86

(continuare)

Exemple de programe

Page 152: ASM_Curs

Instructiuni de intrerupere

• INT

– sintaxa: INT <nivel_intrerupere>

<nivel_intrerupere> = 0 ..255

– semnificatia: apelul prin program a unei rutine de

intrerupere (intreruperi software)

– adresa rutinei - pastrata intr-o tabela de intreruperi

– tabela contine 256 intrari (adrese) pt. cele 256 de

nivele de intrerupere acceptate de un procesor x86

– INT - forma speciala de instructiune “CALL”

Page 153: ASM_Curs

Instructiuni de intrerupere

– mod de executie:

• se salveaza pe stiva registrul de stare program

(indicatorii de conditie)

• se salveaza pe stiva CS si IP

• se copiaza in CS:IP adresa rutinei de intrerupere

din tabela de intreruperi de la adresa:

<nivel_intrerupere>*4

– adresa rutinei poate fi modificata in timpul executiei

programului - legare dinamica

– este o modalitate de acces la resursele (procedurile)

sistemului de operare

Page 154: ASM_Curs

Instructiuni de intrerupere

0000

*4 <adr_seg>:<adr_offset>

Memoria principala

Rutina de intrerupere

Tabela de intreruperi

Program

INT n

(256 intrari)

Page 155: ASM_Curs

Instructiuni de intrerupere

• INTO - interrupt on overflow

– se genereaza intrerupere la depasire de capacitate

if(OF=1) INT 4

• INT 3 - breackpoint

– intrerupere folosita pentru scopuri de depanare

– are cod pe 1 octet

– programul de depanare (CodView, Debug, TD)

insereaza acest cod in locul de oprire temporara a

programului (rulare cu breackpoint)

Page 156: ASM_Curs

Instructiuni de intrerupere

• BOUND

– sintaxa: BOUND <reg>, <mem>

– semnificatia: - verificare incadrarea in limite

if (reg < [mem]) or (reg > [mem+sizeof(reg)]) then int 5

– se poate inlocui cu:

cmp reg, LowerBound

jl OutOfBounds

cmp reg, UpperBound

jg OutOfBounds

– probleme la IBM-PC - INT 5 - PrintScreen

Page 157: ASM_Curs

Instructiuni de intrerupere

• IRET

– semnificatia: revenire din rutina de intrerupere

– ce face:

• descarca de pe stiva CS:IP

• descarca de pe stiva indicatorii de conditie

• continua cu instructiunea urmatoare celei in care s-

a produs intreruperea sau cu instructiunea de dupa

instructiunea care a provocat intreruperea

Page 158: ASM_Curs

Instructiuni de intrerupere

• Utilizarea instructiunilor de intrerupere

– pentru simularea unor intreruperi hardware

– pentru apelul unor rutine in functie de context (legarea

dinamica)

– pentru apelul unor functii (servicii) ale sistemului de

operare:

• “Intreruperi BIOS” - ex:

– INT 10H - functii video (de afisare)

– INT 13H - functii de acces la memoria externa (HDD,

FDD)

– INT 16H - functii de tastatura

• Apeluri sistem - INT 21H

Page 159: ASM_Curs

Exemple de apeluri de intreruperi

;Apeluri de intreruperi BIOS

;citeste un caracter de la tastatura

MOV AH,0

INT 16H

; in Al va fi codul caracterului citit

;scrierea unui caracter pe ecran

; in mod TTY

MOV AH, 0EH

MOV AL, ‘X’

INT 10H

;Apeluri sistem (INT 21H)

;terminarea programului utilizator

MOV AX, 4C00H

INT 21H

;Scrierea unui caracter pe ecran

MOV AH, 02

MOV DL,’X’

INT 21H

Page 160: ASM_Curs

Instructiuni pt. indicatorii de conditie

• CLC, STC, CMC

– semnificatia:

• CLC - clear carry - CF=0

• STC - set carry - CF=1

• CMC - complement carry - CF=NOT CF

• CLD, STD

– semnificatia:

• controleaza directia de avans pt. instructiunile pe siruri:

– DF=0 - incrementare registre index

– DF=1 - decrementare registre index

• CLD - clear direction - DF=0

• STD - set direction - DF=1

Page 161: ASM_Curs

Instructiuni pt. indicatorii de conditie

• CLI, STI

– semnificatia: permit validarea si invalidarea

intreruperilor mascabile

– CLI - clear IF - IF=0 - invalidare intreruperi mascabile

– STI - set IF - IF=1 - validare intreruperi mascabile

• Altele:

• NOP - no operation - instructiune de temporizare

– (este de fapt xchg ax,ax care nu are nici un efect)

• HLT - halt - oprirea procesorului

• HIT - halt until interrupt or reset -oprirea temporara a

procesorului

Page 162: ASM_Curs

Alte instructiuni

• LOCK

– blocarea accesului pe magistrala pe durata instructiunii

urmatoare

– folosit in sistemele multiprocesor, pentru accesul la

resurse partajate

• CPUID

– identificare procesor

– pt. Pentium in prealabil in EAX se pune 1

• RDTSC - (numai la Pentium)

– read real-time stamp counter

– EDX:EAX = contor de cicluri (64 biti)

Page 163: ASM_Curs

Exemple de programe -instructiuni de transfer

; x=5 x-intreg

x dw ?

mov x, 5

; x=y

x dw ?

y dw 1234h

mov ax, y

mov x,ax

;x=y[5]

x dw ?

y dw 1,2,3,20h,30h

mov ax,y+2*5

mov x,ax

;x=student.bursa

x dd ?

student db 10 dup(?) ; nume

db 10 dup(?) ; prenume

dd 600000

mov eax, dword ptr student+20

mov x, eax

; x=x+1 x=x-1 x=0

inc x

dec x

xor ax,ax

mov x,ax;

Page 164: ASM_Curs

Exemple de programe -instructiuni de transfer

;operatii pe siruri/vectori

vec1 db ‘sir de caractere’

l_vect equ $-vec1

vec2 db l_vec1 dup(?)

mov si, offset vec1

mov di, offset vec2

mov cx, l_vec1

cld

rep movsb

; vec2[i]=vec1[j]

vec1 dw 1,3,22,144,13

l_vec1 equ $-vec1

vec2 dw l_vec1 dup(?)

mov di,i

shl di

mov si,j

shl si

mov ax, vec1[si]

mov vec2[di]

;altfel

mov ax,vec1[si*2]

mov vec2[di*2],ax

Page 165: ASM_Curs

Exemple de programe -operatii pe tablouri bidimensionale

; filtrarea imaginilor

; 1 2 1

; 2 4 2 *1/16

; 1 2 1

imag db 100h dup( 100h dup(?))

E equ -1

V equ +1

S equ 100h

N equ -100h

NE equ -101h

NV equ -0ffh

SE equ 0ffh

SV equ 101h

mov si, offset imag+100h+1

mov dx, 100h-2

et1:mov cx, 100h-2

et: mov al, 0

mov ah, [si]

shl ah,2

add al,ah

mov ah, [si+E]

shl ah,2 inc si

add al,ah inc si

....... dec dx

shr al,4 jnz et1

loop et

Page 166: ASM_Curs

Exemple de programe -

operatii aritmetice

; x=y+z

mov ax,y

add x,ax

; y=y+x intregi foarte lungi

x dd 12345678h, 98765432h

y dd 55555555h, 11111111h

mov eax,x

add y,eax

mov eax,x+4

adc y+4,eax

;operatii in BCD impachetat

mov al, x

add al, y

daa

;

Page 167: ASM_Curs

Programare in limbaj de

asamblare

Instructiuni in virgula flotanta

Page 168: ASM_Curs

Aritmetica in virgula flotanta

�Reprezentarea in virgula flotanta

– semn+exponent+mantisa

– extinde posibilitatile de reprezentare ale

numerelor: foarte mari & foarte mici (fractionare)

– NU respecta algebra numerelor reale:

• numar finit de valori posibile

• rezolutie si acuratete limitata ( numar limitat de cifre

semnificative)

• anomalii la calculul operatiilor aritmetice:

– truncheri, rotunjiri, depasirea capacitatii de reprez.

Page 169: ASM_Curs

Aritmetica in virgula flotanta

�Anomalii si moduri de evitare a acestora

– adunarea si scaderea unor numere cu

magnitudini diferite - numerele f. mici se pierd

la trunchiere - gruparea operanzilor in raport de

magnitudine

– compararea numerelor - diferente datorate

rotunjirilor sau trunchierilor - comparare cu

marja de eroare

– modelarea valorilor limita : 0, +∞, -∞

Page 170: ASM_Curs

Formate standard pt. virgula flotanta

( Standardul Intel - IEEE)

�Intel foloseste 3 formate: precizie simpla

(32 biti) , dubla (64 biti) si extinsa (80 biti)

�Simpla precizie:

– semn - 1 bit (0 -pozitiv; 1- negativ)

– mantisa - 23+1 biti (m24 = 1, nu se reprezinta)

– exponent - 8 biti - exces 127 (exponent + 127)

31 30 23 22 0

Semn Exponent Mantisa

1 8 231

Page 171: ASM_Curs

Simpla precizie

�mantisa ∈ [1.000 - 2.000)

– cifrele semnificative se reprezinta in format

normalizat (exceptie: valoarea 0)

– bitul din stanga (=1) nu se reprezinta

– aprox. 6,5 cifre zecimale semnificative

�exponentul - reprezentat in codul exces 127

– la valoarea exponentului se adauga 127 (ex:

exponentul 0 se reprezinta prin valoarea 127)

– se simplifica operatiile de comparare

Page 172: ASM_Curs

Formate in virgula flotanta

�Dubla precizie: 64 biti

1 bit semn + 11 biti exponent+ (52+1) biti mantisa

�Precizie extinsa: 80 biti

1 bit semn + 15 biti exponent + 64 biti mantisa

– fara bit implicit pt. mantisa

– format folosit pentru rezultate intermediare

– toate calulele interne se fac in precizie extinsa

– ajuta la evaluarea mai precisa a rotunjirilor

Page 173: ASM_Curs

Coprocesorul matematic (80x87)

�Registre interne:

– registre de date:

• 8 reg*80 biti organizate ca o stiva

• ST(0) - ST(7);

• ST(0) - varful stivei; ST(1) penultima data

• adresare relativa si nu absoluta

Page 174: ASM_Curs

Registrele coprocesorului matematic

�Registrul de control:

Rotunjire:

00 - aproximare

01- in jos

10 - in sus

11 - trunchiere

Precizie:

00 - 24

01- rezervat

10 - 53

11 - 64

Masti pt. exceptii

Masti:

D5 - precizie

D4 - Underflow

D3 - Overflow

D2 - Div. cu 0

D1 - Denorm.

D0 - Op. invalida

1- ignora cond.

0 - generare intrer

15 11 10 9 8 5 4 3 2 1 0

FLDCW - Load Control Word

FSTCW - Store Control Word

Page 175: ASM_Curs

Registrele coprocesorului matematic

�Registrul de stare:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Busy C3 Top of C2 C1 C0

Stack

Coduri de conditie

Exceptie

Stiva

Precizie

Underflow

Overflow

Div. cu 0

Denormalizat

Operatie

invalida

Page 176: ASM_Curs

Tipuri de date acceptate de FPU

�Intregi:

– complement fata de 2 pe 16, 32 si 64 biti

�Zecimal impachetat

– semn + 17 cifre zecimale (80 biti)

�Flotant:

– precizie simpla (32), dubla (64) extinsa (80)

Page 177: ASM_Curs

Instructiunile coprocesorului matematic

�Instructiuni de transfer:

– scriere pe stiva: FLD

• decrementeaza ind. de stiva, apoi incarca un operand

pe 32,64 sau 80 biti pe varful stivei;

• valoarea este extinsa la 80 biti

fld st(1)

fld mem_32

fld MyRealVar

fld mem_64[bx]

• ex: fld st(0) ; dubleaza valoarea de pe

varful stivei

Page 178: ASM_Curs

Instructiuni de transfer

– instructiunile FST si FSTP: citire de pe stiva

• incarca un operand pe 32,64 sau 80 biti de pe varful

stivei intr-un registru sau intr-o locatie de memorie

• valoarea citita este rotunjita

• la instructiunea FSTP, dupa citire, indicatorul de

stiva se incrementeaza (operatie “POP”)

fst mem_32 fst mem_80

fstp mem_64 fst st(2)

fstp mem_64[ebx*8] fstp st(1)

Page 179: ASM_Curs

Instructiuni de transfer

� instructiunea FXCH:

• schimba continutul varfului de stiva cu un alt

registru

fxch st(2) ; st(0)<=>st(2)

fxch ; st(0)<=>st(1)

�Instructiuni de conversie:

– convertesc din intreg sau BCD in flotant si

invers

Page 180: ASM_Curs

Instructiuni de conversie

�Conversie intreg<=>flotant

– Instructiunea FILD: incarca un intreg pe 16,32 sau 64

biti pe stiva cu conversie din intreg (C2) in flotant extins

fild mem_16

fild mem_32[ecx*4]

fild mem_64[ebx+ecx*8]

– Instructiunile FIST si FISTP: descarca un flotant extins

de pe stiva si il converteste in intreg pe 16,32, 64

fist mem_16[bx]

fist mem_64

fistp mem_32

Page 181: ASM_Curs

Instructiuni de conversie

�Conversie flotant <=> BCD

– instructiunea FBLD: converteste BCD (80biti) in

flotant extins si pune valoarea pe stiva

– instructiunea FBSTP: converteste flotant extins in

BCD (80 biti) si descarca stiva

– exemplu: conversie BCD - intreg pe 64 biti

fbld bcd_80 ; conversie BCD=> flotant.

fist mem_64 ;conversie flotant=> intreg.

Page 182: ASM_Curs

Instructiuni aritmetice

� instructiuni de adunare: FADD, FADDP

fadd ;pop st(0); pop st(1); push st(0)+st(1)

faddp ; se pune tot pe stiva

fadd st( i), st(0) ; st(i)=st(i)+st(0)

fadd st(0), st(i) ; st(0)=st(0)+st(i)

faddp st( i), st(0) ; st(i)=st(i)+st(0) si pop st(0)

fadd mem ; st(0)=st(0)+mem(32 sau 64 flotant)

Page 183: ASM_Curs

Instructiuni aritmetice

� Instructiuni de scadere: FSUB, FSUBP, FSUBR, si

FSUBRP

fsub sau fsubp ; pop st(0);pop st(1); push st(0)-st(1)

fsubr sau fsubrp ; pop st(0);pop st(1); push st(1)-st(0)

fsub st( i). st(0) ; st(i)=st(i)-st(0)

fsub st(0), st(i) ; st(0)=st(0)-st(i)

fsubp st(i), st(0) ; st(i)=st(i)-st(0) si pop st(0)

fsub mem ; st(0)=st(0)-mem

fsubr st( i), st(0) ; st(i) = st(0)-st(i)

fsubrp st( i), st(0)

fsubr st(0), st(i) fsubr mem

Page 184: ASM_Curs

Instructiuni aritmetice

� Instructiuni de inmultire FMUL, FMULP

fmul ; pop st(0); pop st(1); push st(0)*st(1)

fmulp ;idem

fmul st(0), st(i) ; st(0)=st(0)*st(i)

fmul st( i), st(0) ; st(i)=st(i)*st(0)

fmul mem ; st(0)=st(0)*mem(32 sau 64)

fmulp st( i), st(0) ; st(i)=st(i)*st(0) si pop st(0)

Page 185: ASM_Curs

Instructiuni aritmetice

� Instructiuni de impartire:FDIV, FDIVP, FDIVR, si

FDIVRP

fdiv st(0), st(i)

fdiv st( i), st(0)

fdivp st( i), st(0)

fdivr st(0), st(i)

fdivr st( i), st(0)

fdivrp st( i), st(0)

fdiv

fdivp

fdivr

fdivrp

fdiv mem

fdivr mem

dest=dest/sursa sau “reverse”

dest=sursa/dest

Page 186: ASM_Curs

Instructiuni aritmetice

�Radacina patrata - FSQRT

– calculeaza radacina patrata din valoarea continuta in

varful stivei; rezultatul se pune in ST(0)

– nu are parametri

– exemplu: z= sqrt (x*x+y*y)

fld x fadd ;x*x+y*y

fld st(0) fsqrt ;sqrt(x*x+y*y)

fmul ;x*x fst z

fld y

fld st(0)

fmul ;y*y

Page 187: ASM_Curs

Instructiuni aritmetice

�Scalare FSCALE

– descarca 2 valori de pe stiva si reincarca valoarea:

st(0)*(2^st(1))

– inmultire sau impartire cu puteri intregi ale lui 2

– daca st(1) nu este intreg atunci se trunchiaza la zero

– exemplu:

var_intreaga word 16

fild var_intreaga

fld x

fscale ; x*(2^16)

Page 188: ASM_Curs

Instructiuni aritmetice

�Rest partial: FPREM1

– calculeaza restul impartirii st(0)/st(1),

(calculeaza corect restul daca exp(st(0))-exp(st(1))<64,

altfel operatia trebuie repetata)

– nu descarca 2 valori de pe stiva,

– rezultatul se pune in st(0)

�Rotunjire: FRNDINT

– rotunjeste valoarea din varful stivei la un intreg,

conform schemei de rotunjire indicate prin registrul de

control

Page 189: ASM_Curs

Instructiuni aritmetice

�Valoare absoluta: FABS

– transforma valoarea din varful stivei intr-un numar

pozitiv, prin stergerea bitului de semn

– st(0) = abs(st(0))

�Schimbare semn: FCHS

– schimba semnul valorii din varful stivei

– st(0)= - st(0)

Page 190: ASM_Curs

Instructiuni de comparare

– se compara 2 valori de pe varful stivei si se seteaza

corespunzator indicatorii de conditie din registrul de

stare al coprocesorului

– nu exista salt conditionat bazat pe acesti indicatori;

– indicatorii trebuie copiati in registrul AX (cu FSTSW)

si apoi din AH in registrul de stare al procesorului x86

(cu SAHF)

– echivalare indicatori: C0=>CF, C1=>?, C2=>PF,

C3=>ZF

– se pot utiliza numai salturile conditionate pentru intregi

fara semn !!!!: JA, JAE, JBE, JB, JE, JZ

Page 191: ASM_Curs

Instructiuni de comparare

�FCOM, FCOMP, FCOMPP

– sintaxa:fcom ; compara st(0) si st(1)

fcomp ; idem, + descarca st(0)

fcompp ; idem, + descarca st(0) si st(1)

fcom st( i) ; compara st(0) cu st(i)

fcomp st( i) ; idem, + descarca st(0)

fcom mem ; compara st(0) si mem

fcomp mem ; idem + descarca st(0)

Page 192: ASM_Curs

Instructiuni de comparare

�FUCOM, FUCOMP, FUCOMPP

– sintaxa:

fucom

fucomp

fucompp

fucom st( i)

fucomp st( i)

– identice cu cele anterioare, dar nu genereaza exceptie in cazul compararii unor valori care nu sunt numere (exceptie NAN)

Page 193: ASM_Curs

Instructiuni de comparare

�FTST

– compara st(0) cu 0.0

– nu face diferenta intre + si - 0.0

– nu descarca stiva

�FXAM

– examineaza valoarea din st(0) si seteaza

corespunzator indicatorii de conditie

– nu descarca stiva

Page 194: ASM_Curs

Incarcare constante

� permit incarcarea pe stiva a unor constante utilizate

frecvent

fldz ; +0.0.

fld1 ; +1.0.

fldpi ; pi

fldl2t ; log 2 (10).

fldl2e ; log 2 (e).

fldlg2 ; log 10 (2).

fldln2 ; ln(2).

Page 195: ASM_Curs

Instructiuni pentru functii logaritmice si

trigonometrice

�F2XM1

– calculeaza: 2st(0) - 1

– st(0) trebuie sa fie in intervalul: [-1.0 .. +1.0]

– exemplu: 10x = 2x*lg2(10)

fld x

fldl2t

fmul

f2xm1

fld1

fadd

Page 196: ASM_Curs

Instructiuni logaritmice

�FYL2X

– calculeaza: st(1)*lg2(st(0))

– util in calculul unor logaritmi in alta baza decat 2

– st(0) trebuie sa fie >0

�FYL2P1

– calculeaza: st(1)*lg2(st(0)+1)

Page 197: ASM_Curs

Functii trigonometrice

�FSIN, FCOS, FSINCOS

– calculeaza sinusul, cosinusul sau ambele functii pt.

valoarea din varful stivei; rezultatul se pune in varful

stivei

– FSIN: st(0)=sin(st(0))

– FCOS: st(0)=cos(st(0))

– FSINCOS st(0)= cos(st(0)) si st(1)=sin(st(0))

– unghiurile se considera in radiani si trebuie sa fie in

intervalul (-263 ..+263)

Page 198: ASM_Curs

Instructiuni trigonometrice

�FPTAN

– calculeaza tangenta din st(0)

– rezultatul si apoi valoarea 1.0 se pun pe stiva

�FPATAN

– calculeaza arctangenta din st(0)/st(1)

– extrage 2 valori de pe stiva si pune inapoi o valoare

Page 199: ASM_Curs
Page 200: ASM_Curs

Programare in limbaj de

asamblare

Instructiuni in virgula flotanta

(continuare)

Page 201: ASM_Curs

Alte instructiuni ale

coprocesorului matematic

�FINIT - initializare coprocesor

– aduce coprocesorul intr-o stare cunoscuta:

• reg. de control (CW)= 37H

• reg. de stare (SW) = 0

�FWAIT - forteaza procesorul x86 sa astepte

terminarea instructiunii curente din coprocesor

– evita executia in paralel a unor operatii care

afecteaza aceleasi variabile

Page 202: ASM_Curs

Operatii cu registrele speciale

�FLDCW si FSTCW - incarcare si salvare

registru de control

– sintaxa: fldcw mem_16 ; CW<=mem_16

fstcw mem_16 ; mem_16<=CW

�FLDSW si FSTSW - incarcare si salvare

registru de stare

– sintaxa: fldsw ax ; SW<=AX

fstsw ax ; AX<=SW

fldcw mem_16 ; CW<=mem_16

fstcw mem_16 ; mem_16<=CW

Page 203: ASM_Curs

Salvare si refacere stare coprocesor

�FLDENV si FSTENV - incarca si salveaza

“mediul” de lucru al coprocesorului

– se transfera 14 octeti avand urmatorul format:

• reg. de control (CW) - 2 octeti

• reg. de stare (SW) - 2 octeti

• cuvantul atasat (tag) - 2 octeti

• poantor de instructiuni - 20 biti

• codul de instructiune 11 biti

• poantor de date 20 biti

• restul nefolositi

Page 204: ASM_Curs

Operatii cu registrele speciale

�FSAVE/FNSAVE si FRSTORE

– salveaza si respectiv refac “starea”

coprocesorului, adica registrele de control, stare

si de date; folosite pt. comutare de context

– se transfera 94 octeti =

• 14 octeti pt. “mediu” +

• 80 octeti - continutul stivei ( ST(0) ... ST(7))

– sintaxa: fsave mem_94_oct

fnsave mem_94_oct

frstore mem_94_oct

Page 205: ASM_Curs

Alte instructiuni

�FINCSTP si FDECSTP - incrementare si

decrementare poantor de stiva (modulo 8)

�FNOP - no operation - pt. temporizare

�FFREE - modifica tag-ul atasat unui registru,

pentru a marca faptul ca registru este gol

– sintaxa:

ffree st(i) ; marcheaza reg. i ca fiind gol

�FCLEX/FNCLEX - sterge toti bitii de exceptie,

indicatorul Busy si eroarea de stiva

Page 206: ASM_Curs

Instructiuni cu intregi

– inainte de operatia aritmetica valoarea intreaga

este convertita in virgula flotanta pe 80 biti

– sintaxa:

fiadd int fidiv int

fisub int fidivr int

fisubr int ficom int

fimul int ficomp int

– int - intreg pe 16 sau 32 biti

Page 207: ASM_Curs

Exemple

�Calculul cotangentei

fld arc

fsincos

fdivr

fst cotangenta

�Arccotangenta actg(x)=atg(1/x)

fld1 ; pune “1” pe stiva

fld cotang

fpatan ; atan(st(1)/st(0))

fst arc

Page 208: ASM_Curs

Exemple

�Arcsinus: asin(x) = atan(sqrt(x*x/(1-x*x)))

fld sinus

fld st(0) ;Duplica x pe stiva

fmul ; calculeaza x*x.

fld st(0) ;Duplica x*x pe stiva.

fld1 ;Calculeaza 1-X**2.

fsubr

fdiv ;Calculeaza X**2/(1-X**2).

fsqrt ;Calculeaza sqrt(x**2/(1-X**2)).

fld1 ;Calculeaza arctangent.

fpatan

Page 209: ASM_Curs

Exemple

�Logaritm in baza 10 din x

– lg10(x)=lg2(x)/lg2(10)

fld1

fld x

fyl2x ;Calculeaza 1*lg(x).

fldl2t ;Incarca lg(10).

fdiv ;Calculeaza lg(x)/lg(10).

Page 210: ASM_Curs

1

Programare in limbaj de

asamblare

Instructiuni MMX

Page 211: ASM_Curs

2

Tehnologia MMX

� MMX – Multi-Media eXtension

� Obiectiv: � cresterea vitezei de prelucrare a informatiilor audio,

video, grafica, etc.

� Achizitia, prelucrarea si generarea in timp-real a informatiilor multimedia

� Dezvoltarea de aplicatii multimedia la care timpul de executie (reactie) este critic

� Componente MMX:� Registre MMX (8), MM0 .. MM7; 64biti/registru

� Instructiuni MMX (57)

� Tipuri de date impachetate

� Unitate de executie MMX

Page 212: ASM_Curs

3

Tehnologia MMX – caracteristici generale

� Ideea de baza:

� Executia in paralel a unei instructiuni pe un set de date

� Paralelism de tip SIMD – Single Instruction Multiple

Data (simulare)

� Tehnologia MMX este eficienta daca:

� Datele au o structura de tip vector, matrice, sau o alta

structura cu grad ridicat de regularitate

� Aceeasi secventa de operatii se aplica in mod identic

pe fiecare element al structurii

� Aceeasi secventa de prelucrare se executa de un

numar foarte mare de ori (ex: pe un milion de pixeli ai

unei imagini)

� Timpul de executie este critic

Page 213: ASM_Curs

4

Tipuri de date MMX

63 8 7 0

Octeti impachetati (Packed byte): 8 octeti, 64 biti

Cuvinte impachetate (Packed word): 4 cuvinte, 64 biti

Dublu-cuvinte impachetate (Packed dword): 2 dcuvinte, 64 biti

Cuadruplu-cuvant (Quadword): 1 qcuvant, 64 biti

Page 214: ASM_Curs

5

Sintaxa instructiunilor MMX

� <instructiune>:= <mnemonica> [<destinatie>,<sursa>]

� <mnemonica>:=P<operatie><sufixe>

� <sufixe>:= [US|S|SS][B|W|D|Q][B|W|D|Q]

� Sufixele indica tipul datelor si modul de efectuare a a operatiilor aritmetice:

� US – unsigned, saturation

� S, SS – signed, saturation (in lipsa – wrapearound)

� B, W, D, sau Q – byte, word, dword, qword; daca apar 2 litere atunci sursa este de tipul primei litere iar destinatia de tipul celei de a doua litere

� Exemplu:

paddusw MM4, mem1

psubusb MM4, mem1

Page 215: ASM_Curs

6

Operatii aritmetice cu

Saturare si cu Intoarcere (wraparound)

� Tehnici de solutionare a depasirilor de capacitate (superioara

sau inferioara):

� Prin “intoarcere”

� Prin saturare

Exemplul 1: operatii cu numere fara semn (octeti):

Intoarcere: Saturare:

F0h+20h = 10h F0h+20h = FFh

80h -A0h = 20h 80h -A0h=00h

Exemplul 2: operatii cu numere cu semn (octeti):

127+1= - 127 127+1= 127

- 128 – 1 = 127 - 128 – 1 = -128

(simulare)

Page 216: ASM_Curs

7

Operatii aritmetice cu saturare

� Exemplul 3: paddsw

7f38+1707 = 7fff - saturare

� Exemplul 4: paddusw

7f38+1707 = 963f - nu este saturare

7 f 3 8

1 7 0 7

7 f f f

9 6 3 f

Cu semn

Fara semn

+

Page 217: ASM_Curs

8

Instructiunile MMX

� EMMS

� Adunare si scadere

� Instructiuni de deplasare (shift)

� Instructiuni logice

� Instructiuni de multiplicare

� Instructiuni de comparare

� Instructiuni de impachetare/despachetare

� Instructiuni de transfer

Page 218: ASM_Curs

9

Instructiuni MMX

� Instructiunea EMMS

� Se foloseste dupa o secventa de instructiuni MMX si inainte de o instructiune in virgula flotanta pentru a evita generarea unei exceptii sau a unui rezultat incorect pt. operatii in virgula flotanta

� Problema:

� starea modulului MMX este o copie a starii unitatii flotante

� dupa instructiuni MMX registrul tag al coprocesorului este alterat; poate genera o exceptie de tip stiva invalida

� EMMS sterge starea MMX si astfel valideaza registrul tag (toate intrarile in stiva flotanta sunt validate)

Page 219: ASM_Curs

10

Instructiuni de adunare si scadere

Instructiune b w d q

padd X X X

padds X X

paddus X X

psub X X X

psubs X X

psubus X X

paddxx <destinatie>, <sursa>

<destinatie>:= MMi

<sursa>:=MMi | <variabila>

Page 220: ASM_Curs

11

Adunare si scadere - exemple

paddb MM3,MM4

paddd MM2, MM1

8 0 7 F 0 1 0 1 8 0 F F 7 F 8 0

F F 1 7 3 8 F F 8 0 F F 7 F 7 F

+ + + + + + + +

7 F 9 6 3 9 0 0 0 0 F E F E F F

MM3

MM4

MM3

8 0 7 F 0 1 0 1 8 0 F F 7 F 8 0

F F 1 7 3 8 F F 8 0 F F 7 F 7 F

7 F 9 6 3 A 0 0 0 1 F E F E F F

MM2

MM1

MM2

Page 221: ASM_Curs

12

Instructiuni de deplasare (shift)

Instructiune b w d q

psll X X X

psra X X

psrl X X X

psllx | psrax | psrl <destinatie>, <numar>

Elementele destinatiei se deplaseaza la stanga sau

la dreapta cu un <numar> de pozitii binare

Shift left logic

Shift right arithmetic

Shift right logic

Page 222: ASM_Curs

13

Instructiuni de deplasare - exemple

1010111111111111 1010000000001111 1000000000000001 1000000000000001

psllw MM4, 3

0111111111111000 0000000001111000 0000000000001000 0000000000001000

1010111111111111 1010000000001111 1000000000000001 1000000000000001

psllq MM4, 3

0111111111111101 0000000001111100 0000000000001100 0000000000001000

Page 223: ASM_Curs

14

Instructiuni logice

Instructiune 64 biti

pand X

pandn X

por X

pxor X

X=X AND Y

X=(NOT X) AND Y

X=X OR Y

X=X XOR Y

pand | pandn | por | pxor <destinatie>, <sursa>

Operatia logica se executa bit cu bit

Page 224: ASM_Curs

15

Instructiuni logice - exemplu

1010111111111111 1010000000001111 1000000000000001 1000000000000001

0111111111111101 0000000001111100 0000000000001100 0000000000001000

pand MM4, MM3

0010111111111101 0000000000001100 0000000000000000 0000000000000000

Page 225: ASM_Curs

16

Instructiuni de multiplicare

Instructiuni b w d q

pmadd

pmulh X

pmull X

pmadd – multiply and add

X31-0 = X15-0*Y15-0+X31-16*Y31-16

X63-32 = X47-32*Y47-32+X63-48*Y63-48

multiply and add

multiply and keep low

multiply and keep high

Page 226: ASM_Curs

17

Instructiuni de multiplicare

* *+* *+

pmadd MM3,MM4

MM3

MM3

MM4

Page 227: ASM_Curs

18

Instructiuni de multiplicare

pmulh MM3,MM4

MM3

MM3

MM4

7 1 C 7 8 D 9 4 8 0 0 0 7 1 C 7

8 0 0 0 C F C B F F F F 0 4 0 0

C 7 1 C 1 5 8 B 0 0 0 0 0 1 C 7

C71C8000 158BF05C 00008000 01C71C00

MM38 0 0 0 F 0 5 C 8 0 0 0 1 C 0 0

pmull MM3,MM4

Page 228: ASM_Curs

19

Instructiuni de comparare

Instructiuni b w d q

pcmpeq X X X

pcmpgt X X X

compare equal

compare greater (intregi

cu semn)

Exemplu: pcmpeqw MM3,MM4

MM3

MM3

MM4

0 0 0 0 1 2 3 4 F F F F 0 0 C B

0 5 6 0 1 2 3 4 1 3 F F 0 0 C B

0 0 0 0 F F F F 0 0 0 0 F F F F

Page 229: ASM_Curs

20

Instructiuni de impachetare/despachetare

Instructiuni b w d q

packss

packus

punpckh

punpckl

Impachetare: copierea unei structuri mai mari (ex: word)

intr-o structura mai mica (ex: byte) cu saturare in caz de

nevoie

Despachetare: interclasarea elementelor celor doi

operanzi – se foloseste pentru extinderea reprezentarii

unpack high

unpack low

pack signed, saturation

pack signed to unsigned

Page 230: ASM_Curs

21

Instructiuni de impachetare/despachetare

Exemplu de impachetare

MM3

MM4

8 0 B 1 0 0 6 C F F C 9 7 F 3 9

F F 8 0 F F 0 0 8 0 1 2 7 F C 1

packss MM3,MM4

MM38 0 8 0 8 0 7 F 8 0 6 C C 9 7 F

ns s s s s ns ns s

ns – nesaturat

s - saturat

7F39 = 32569 > 7F00 = 32.512 => sat.

FFC9 = - 37 > 8000 = -32.512 => nsat.

1111.1111.1100.1001 => 1100.1001

Page 231: ASM_Curs

22

Instructiuni de impachetare/despachetare

Exemplu de despachetare

MM3

MM4

8 0 B 1 0 0 6 C F F C 9 7 F 3 9

F F 8 0 F F 0 0 8 0 1 2 7 F C 1

punpckhwd MM3,MM4 ; cuvant ->dublu-cuvant

MM3F F 8 0 8 0 B 1 F F 0 0 0 0 6 C

Page 232: ASM_Curs

23

Instructiuni de transfer

Instructiune 32biti 64 biti

movd X

movq X

move dword (32 biti)

move qwordword (64 biti)

movd | movq <destinatie>, <sursa>

<destinatie> := MMi | <variabila_mem> |<registru_x86>

<sursa> := MMi | <variabila_mem> |<registru_x86>

exemple: movd MM2, var_32 ; se extinde cu 0

movd var_32, MM3 ; se copiaza partea low

movq var_64, MM5

Page 233: ASM_Curs

24

Exemple de proceduri MMX

Produsul scalar a doi vectori: Σ a(i)*b(i)

a7 a6 a5 a4 a1a2a3 a0

b7 b6 b5 b4 b1b2b3 b0

MM0

MM1

a1a2a3 a0 b1b2b3 b0*

a3*b3+a2*b2 a1*b1+a0*b0

Σ ciclu anterior

+ +

Σ ciclu anterior

et: movq MM0, [adr_v_a]

movq MM1, [adr_v_b]

pmaddwd MM0, MM1

paddd MM2, MM0

add adr_v_a, 8

add adr_v_b, 8

sub contor

jnz et

movq MM0, MM2

psrlq MM2, 32

paddd MM2, MM0

movd rez, MM2

Page 234: ASM_Curs

25

Exemple de programe MMX

Suprapunerea selectiva a imaginilor

1. pcmpeqb MM1, MM3

2. pand MM4, MM1

3. pandn MM1, MM3

4. por MM4, MM1 1.

2.

3.

4.

Page 235: ASM_Curs

Programare in limbaj de

asamblare

Modul de lucru protejat la

procesoarele x86

Page 236: ASM_Curs

Necesitatea introducerii modului protejat

� pt. cresterea spatiului de adresare de la 1Mo la 4Go

� pt. un control mai eficient al alocarii memoriei

� pt. o protectie sporita a zonelor de memorie alocate

pentru diferite scopuri

� pt. a asigura mai multe nivele de protectie si de

acces la resursele calculatorului

� pt. un control mai strict al operatiilor critice, care

pot sa afecteze functionarea sitemului:

– operatii de intrare/iesire (acces la interfete de I/E)

– intreruperi

Page 237: ASM_Curs

Necesitatea introducerii modului protejat

� ofera suportul necesar pentru implementarea unui

sistem de operare multitasking si multiutilizator, prin:

– managementul memoriei (segmentare si paginare)

– managementul intreruperilor

– managementul taskurilor

� asigura un control mai bun al fiabilitatii, prin

mecanisme de detectie a erorilor de acces:

– tentativa de acces la o zona de memorie nealocata taskului

– tentativa de scriere intr-o zona nepermise

– lipsa nivelului de prioritate solicitat

Page 238: ASM_Curs

Modurile de lucru ale procesoarelor x86

�Modul real (8086)

– spatiu de memorie de 1Mo

– segmente de lungime fixa de 64ko

– nu exista mecanisme de protectie a memoriei

�Modul protejat (‘286-partial, 386, 486, Pentium-perfectat):

– spatiu de memorie de 4Go

– segmente de lungime variabila (1octet-4Go)

– metode avansate de protectie

�Modul virtual:

– simularea modului real in regim protejat

Page 239: ASM_Curs

Elementele modului protejat

�Selectori de segment

– se pastreaza in registrele segment (CS, DS, ES, SS, GS, FS)

– continut:

• Index - arata pozitia Descriprorului de segment in

Tabela de descriptori

• TI - identificatorul tabelei de descriprori

– 0 - Tabela de descriprori generali

– 1 - Tabela de descriprori locali

• RPL - Requested Privilege Level - nivelul de

prioritate solicitat

Index TI RPL

15 3 2 1 0

Page 240: ASM_Curs

Elementele modului protejat

�Descriptori de segment

– controleaza accesul la un segment prin:

• adresa de inceput a segmentului

• lungimea segmentului

• drepturi de acces

• indicatori

– tipuri de descriptori:

• descriptori pt. segment de date si de cod

• descriptori de sistem

• descriptori de porti

Page 241: ASM_Curs

Descriptori pt. segmente de cod si date

15 0

Limita 15..0

Baza 15 ..0

A D G AV Lim 19..16

Baza 23 ..16

Baza 31 ..24

TipDTDPLP

1,0

3,2

5,4

7,6

Baza - adresa de inceput (32 b)

Limita - dimensiunea segm. (20b)

Tip: - tipul segmentului

DPL - Descriptor Privilege Level

DT - Dtype (1 pt. cod si date,

0 pt. sist. si poarta)

G - granularitate:0 - octet; 1- 4ko

P - prezenta

D - dimensiuna implicita0- 16b; 1-32b

AV - disponibil pt. progr.

1 -prezent in mem.

A - accesat

Page 242: ASM_Curs

Tipul sectorului

� Pt. segment de cod:

– Bit 11 - E - executable

• =1 pt. segment de cod

– Bit 10 - C - conforming

• 0- accesibil pt. CPL=DPL

• 1- accesibil pt. CPL<DPL

– Bit 9 - R - readable

• 0- nu se poate citi (numai

executa)

• 1 - se poate citi

– Bit 8 - A - (accessed)

• 0- neaccesat

• 1- a fost accesat

�Pt. segment de date– Bit 11 - E - (executable)

• =0 pt. segment de date

– Bit 10 - ED - expansion direction:

• 0 - extindere spere adrese

mari

• 1 - extindere spre adrese mici

– Bit 9 - W - writeable

• 0 - nu se poate scrie

• 1 - se poate scrie

– Bit 8 A - accessed

• 0- neaccesat

• 1- a fost accesat

Page 243: ASM_Curs

Adresarea memoriei

+

Selector Adr. offset

Adr. fizica

15 0 31 0

Memoria4G0

Adresa de segment

31 0

Lungime

Acces 0

Descriptor de segment

Page 244: ASM_Curs

Adresarea memoriei

Index TI RPL

*8

+

GDTR

GDT

Descriptor

0

LDT

Descriptor

LDTR

Selector

Selector*8

+

1

Descriptor

+

Adresa

Page 245: ASM_Curs

Descriptori de sistem

�Descriptor TSS (Task State Segment)– determina segmentul care pastreaza starea unui task

– in TSS se salveaza continutul registrilor procesor la trecerea de la

un task la celalalt (comutare de context)

�Descriptor LDT (Local Descriptor Table)– descriptorul segmentului care pastreaza tabela descriptorilor locali

(LDT)

- similari cu descriprorii de date si cod, difera doar semnificatia campului

“TIP”

� Porti (de acces)

Page 246: ASM_Curs

Descriptori de porti

� cai de apel ai unor functii sistem, care se afla in

segmente mai privilegiate

Selector - selectorul rutinei apelate

Offset - adresa relativa a rutinei apelate

Nr. cuvinte - nr. cuvintelor duble copiate pe stiva(fiecare nivel de

prioritate are stiva proprie)

Tip - poarta de apel, de task, de intrerupere sau de exceptie (trap)

Offset 15 ..0

Offset 31 ..16

Selector

P DPL 0 TIP 000 nr. cuvinte

15 0

Page 247: ASM_Curs

Tabele de descriptori

�GDT - General Descriptor Table

– contine descriptorii pentru segmente comune

– o singura tabela GDT pe sistem

�LDT - Local Descriptor Table

– contine descriptorii pentru segmentele alocate unui task

– fiecare task are propriul tabel LDT

� IDT - Interrupt Descriptor Table

– contine descriptorii segmentelor care contin rutinele de

tratare a intreruperilor

– un singur tabel pe sistem

Page 248: ASM_Curs

Nivele de prioritate

� asigura protectia impotriva unor accese neautorizate

� 4 nivele de prioritati:

– 0 - cel mai prioritar, 3- cel mai putin prioritar

– nivelul 0: nucleul sistemului de operare

• toate instructiunile protejate sunt permise

– nivelul 1: rutine de sistem

– nivelul 2: extensiile sistemului de operare

– nivelul 3: programe utilizator

Page 249: ASM_Curs

Nivele de prioritate

�RPL - Requested Privilege Level

– nivelul de prioritate solicitat

�CPL - Current Privilege Level

– nivelul curent de privilegiu (continut in selectorul din

CS)

�DPL - Descriptor Privilege Level

– nivelul de privilegiu al unui segment - se pastreaza in

campul DPL al descriptorului

�Restrictii de acces:

– conditia de acces: CPL < sau = DPL

Page 250: ASM_Curs

Registre speciale folosite in modul protejat

�GDTR - General Descriptor Table Register– contine adresa tabelei GDT (32b) si lungimea tabelei

(16b)

�LDTR - Local Descriptor Table Register

– contine selectorul tabelei LDT (descriptorul tabelei se

afla in GDT)

�TR - Task Register

– contine selectorul tabelei TSS

Page 251: ASM_Curs

Registre speciale folosite in modul protejat

�CR0 - Control Registre 0

– contine urmatoarele indicatoare de conditie:

• PG - page - validare/invalidare paginare

• ET - extension type - indica tipul coprocesorului

matematic (0-80287, 1 80387)

• TS - task switched - setat la comutarea unui task

• MP - math present

• PE -protected mode enabled - validare mod protejat

Page 252: ASM_Curs

Instructiuni pt. registrele speciale

�Incarcare registre:LGDT <registru>|<<memorie>

LLDT <registru>|<<memorie>

LIDT <registru>|<<memorie>

MOV CR0, <registru>

�Salvare registre:SGDT <registru>|<<memorie>

SLDT <registru>|<<memorie>

SIDT <registru>|<<memorie>

Page 253: ASM_Curs

Trecerea din modul real in modul protejat

� la punerea sub tensiune procesorul trece implicit in modul

real !!!

� Secventa de trecere in modul protejat:

– se construiesc tabelele de descriptori ce urmeaza sa se

foloseasca (GDT, LDT, IDT)

– se invalideaza intreruperile (daca se fol. intreruperi)

– se incarca adresele tabelelor in registrele speciale

corespunzatoare (GDTR, LDTR, IDTR)

– se seteaza bitul PE din registrul CR0

– se incarca registrele segment cu selectoarele dorite

– se incarca CS cu un selector prin executia unei

instructiuni de salt “far”

Page 254: ASM_Curs

Revenirea din modul protejat

� la procesorul 286 numai prin resetare

– la IBM-PC - metoda complicata de revenire, (prin

secventa controlata de resetare)

� la procesoarele 386, 486, .... prin stergerea indicatorului PE

din CR0

– trebuie luate masuri pentru revenirea corespunzatoare in

modul real:

• registrele segment trebuie incarcate cu adresele

segmentelor corespunzatoare modului real

• segmentele trebuie sa fie de 64ko

Page 255: ASM_Curs

Secventa de revenire din modul protejat

(numai la proc. 386, 486, ...)

– invalidare intreruperi

– salt “far” la un segment de cod cu limita 64k (FFFFH)

– incarca SS cu un selector potrivit pt. modul real:

• limita 64k, granularitatea = 0 (octert)

• expandare in sus (E=0), validare scriere (W=1)

• seg. prezent (P=1)

– sterge PE din CR0

– salt “far” la o adresa <16>:<16>

– incarca toate registrele segment de date cu valori

corespunzatoare modului real

Page 256: ASM_Curs

Secventa de revenire din modul protejat

(continuare)

– daca s-au folosit intreruperi in modul protejat se

foloseste LIDT pt. a incarca un IDT potrivit modului

real:

• adresa de baza =0, limita 3ffh

– sterge partea superioara a registrilor generali de 32 biti

– validare intreruperi

Page 257: ASM_Curs

Tehnici de protectie a acesului

in modul protejat

�Ce se protejeaza:– executia unor instructiuni protejate (ex:

validarea/invalidarea intreruperilor STI/CLI, operatii de

intrare/iesire - IN/OUT)

– accesul unui task la segmentele alocate altui task (cod

sau date)

– apelul necontrolat al unor functii sistem si coruperea

unor date privilegiate (ale sistemului de operare)

�Cum actioneaza protectia:

– se genereaza o exceptie in cazul violarii unei protectii

Page 258: ASM_Curs

Mecanisme de protectie

�Accesul la memorie prin descriptori pastrati in

GDT si LDT

– GDT pastreaza descriptorii segmentelor accesibile mai

multor taskuri

– LDT pastreaza descriptorii segmentelor alocate numai

unui singur task => segmente protejate

�Nivele de privilegiu:

– 4 nivele, 0 cel mai prioritat, 3 cel mai putin prioritar

– nivelele inferioare alocate sistemului de operare

– un task de prioritate mai mica (nuvel mai mare) nu

poate accesa segmente care au prioritate mai mare

Page 259: ASM_Curs

Mecanisme de protectie

�Nivele de prioritati (continuare)

– la trecerea in modul protejat nivelul curent de prioritate

(CPL) devine 0 (se considera ca se executa o secventa a

sistemului de operare)

– se pot face numai salturi “far” la segmente care au

prioritate mai mare sau egala (CPL_vechi<= DPL_nou)

– se pot apela segmente de date care au prioritate mai

mare sau egala cu prioritatea curenta

– in cazul unei tentative de acces la un segment mai

prioritar se genereaza o exceptie, tratata de sistemul de

operare

Page 260: ASM_Curs

Mecanisme de protectie

�Accesul la segmente mai privilegiate

(ex: apelul unor functii ale sistemului de operare)

– solutia: porti de acces (Call gates):

• descriptori speciali care contin un selector si un

offset al functiei apelate

• descriptorul de poarta are de obicei nivel mai mare

de privilegiu (privilegiu mai mic) pentru a permite

accesul tuturor taskurilor la poarta respectiva de

acces

• descriptorul de poarta poate fi inclus in GDT sau in

LDT

Page 261: ASM_Curs

Mecanisme de protectie

�Porti de acces (continuare)

– selectorul continut in descriptorul portii are un nivel de

privilegiu mai mic (privilegiu mai mare) pt. a permite

accesul la segmente protejate

Task

utilizatorGDT/LDT

DescriptorCALL far

Segment SO

Functie

sistem

Poarta Offset

+

Poarta= selector+offsetDPL=3

DPL=0

DPL=0CPL=3

Page 262: ASM_Curs

Mecanisme de protectie

�Controlul operatiilor efectuate asupra unui

segment:

– numai executie (segment de cod)

– numai executie & citire date (segment de cod)

– numai citire date (segment de date)

– citire&scriere date (segment de date)

�Controlul dimensiunii segmentului:

– se verifica daca adresa de offset (adresa relativa in

cadrul segmentului) este mai mica decat limita

segmentului

Page 263: ASM_Curs

Exemplu de trecere in modul protejat

; se fol. instructiuni privilegiate

.386

;macrouri pt. instr. pe 32 biti

LGDT32 MACRO Adr

DB 66h ; prefix 32 biti

DB 8Dh ;lea eax, Adr

DB 1Eh

DD Adr

DB 0Fh ; LGDT [BX]

DB 01h

DB 17h

ENDM

; macro pt. salt far 32 biti in seg de

; 16 biti

FJMP MACRO Selector, Offset

DB 66H ; prefix 32 biti

DB 0EAH ; jump far

DD Offset ; offset pe 32 biti

DW Selector

ENDM

Page 264: ASM_Curs

Exemplu de trecere in modul protejat

_TEXT SEGMENT PARA USE32

ASSUME CS: _TEXT

_ENTRY:

;incarca descriptor GDT

LGDT32 fword ptr GdtDesc

MOV EAX, CR0

OR AX,1

MOV CR0, EAX ; PE=1

JMP $+2 ; descarca coada de

;instructiuni

;acum se executa in mod protejat in

; segment de 16 biti

; se face sal la segment de 32 biti

FJMP32 08,Start32

;mod protejat,segment de 32 biti

Start32: ; init. reg. segmente cu

;intrarea nr. 2 di GDT - adr=10h

MOV AX, 10h

MOV DS, AX

MOV ES, AX

.......

MOV SS, AX

MOV ESP, 8000h

.............

Page 265: ASM_Curs

Exemplu de trecere in modul protejat

GdtDesc:

DW dim_GDT-1 ; limita GDT

DD GDT

ALIGN 4

; tabela GDT

GDT:

; GDT[0] intrarea 0 - nu se foloseste

DD 0

DD 0

; GDT[1] descriptor pt. seg. de cod

;limita FFFFF, granularitate 1 (4ko)

;dim. segment=4Go DW 0FFFFh ;

limita 15..0

DW 0 ; Baza 15..0

DB 0 ; Baza 23..16

DB 10011010B

;P=1, DPL=0, S=1, 1, C=0, R=1,A=0

DB 11001111B

;G=1, D=1, 0 0 Lim 19..16

DB 0 ; Baza 31..24

Page 266: ASM_Curs

Exemplu de trecere in modul protejat

; GDT[2] descriptor pt. seg. de date limita FFFFF

DW 0FFFFh ; limita 15..0

DW 0 ; Baza 15..0

DB 0 ; Baza 23..16

DB 10010010B

;P=1, DPL=0, S=1, 0, C=0, R=1,A=0

DB 11001111B

;G=1, D=1, 0 0 Lim 19..16

DB 0 ; Baza 31..24

dim_GDT EQU $- offset GDT

_TEXT ENDS

END

Page 267: ASM_Curs

Programare in limbaj de

asamblare

Tehnici de programare

Page 268: ASM_Curs

Accesul la resursele unui sistem de

calcul� resursele unui sistem de calcul:

– hardware:

• registre, indicatoare de conditie (flaguri)

• memorie,

• interfete si dispozitivede intrare/iesire,

• sistemul de intreruperi,

• ceas de timp real, alte timere

– software:

• sistemul de fisiere

• gestiunea taskurilor

• gestiunea comunicatiei si servicii de sincronizare, etc.

Page 269: ASM_Curs

Nivele de acces la resurse

M H

BIOS

DOS

LNI +BIB.

Aplicatii

Comenzi specificeFunctii predefinite

Functii sistem

(Int 21h)

Rutine de intrerupere

Int 10h, 13hh, 16h ....

Instructiuni

In/Out

Page 270: ASM_Curs

Accesul la nivelul masinii hardwareexemplu: tiparirea unui text la imprimanta

data segment

text db “hello world”

ltext equ $-text

port equ 378h

port_c equ 37ah

port_s equ 379h

strob equ 00000001b

busy equ 10000000b

ack equ 01000000b

cmd_init equ 00000001b

data ends

code segment

assume cs: code, ds: data

start: mov ax, data

mov ds, ax

mov si, offset text

mov cx, ltext

mov dx, port_c

mov al, cmd_init

out dx, al

mov dx, port_s

Page 271: ASM_Curs

tiparirea unui text la imprimanta (continuare)

et1: in al, dx

test al, busy ; activ pe 1

jz et1

mov al,[si]

inc si

mov dx, port

out dx, al

mov dx,port_c

mov al, cmd_init

; se forteaza 0 pe strob

and al, NOT strob

out dx, al

mov dx, port_s

et2: in al, dx

test al, ack ; activ pe 0

jnz et2

mov dx, port_c

mov al,cmd_init

; se forteaza 1 pe strob

or al, stb

out dx, al

mov dx, port_s

loop et1

Page 272: ASM_Curs

tiparirea unui text la imprimanta (continuare)

mov ax, 4c00h

int 21h

code ends

end start

Page 273: ASM_Curs

Accesul la resurse prin intreruperi BIOS

� doua tipuri de intreruperi:

– intreruperi hardware - generate de interfete la aparitia unui eveniment (ex: receptia unui caracter, citirea unui sector, eroare de transmisie, etc.)

– intreruperi software - “porti de acces” la resurse prin rutine (functii) BIOS

• fiecare tip de resursa (interfata) are rezervat un nivel de intrerupere

• se apeleaza prin instructiunea INT n

Page 274: ASM_Curs

Accesul la resurse prin intreruperi BIOS– exemple de intreruperi BIOS (software)

• INT 10h - functii de ecran

• INT 13H - functii FDD, HDD

• INT 16H - functii de tastatura

• INT 14H - functii de comunicatie pe canalul serial

• INT 17H - functii de tiparire

– apelul functiilor:

• se seteaza parametrii de apel in registrii procesorului

• se executa instructiunea de intrerupere corespunzatoare

• la revenirea din rutina se testeaza CF (0 - OK, 1-eroare)

Page 275: ASM_Curs

Accesul la resurse prin intreruperi BIOSexemplu: citirea unui sector de pe disc

data segment

buf db 512 dup(?)

data ends

code segment

assume cs:code, ds: data

start: mov ax, data

mov ds, ax

mov es, ax

;initializare parametrii de apel

mov ah, 02 ; functia de citire

mov al, 1 ; nr. de sectoare

mov cl, 5 ; nr sector

mov ch, 0 ; nr. pista

mov dl, 0 ; nr. disc

mov dh, 0 ; nr. cap

mov bx, offset buf

int 13h

jc err

....

err: ; cod pt. eroare

code ends

end start

Page 276: ASM_Curs

Accesul la resurse prin “apeluri sistem”

(system calls)� se folosesc concepte mai abstracte:

– fisier - pt. accesul la dispozitivele de stocare

– canal - pt. dispozitivele de transmisie a datelor

– dispozitiv standard de intrare

– dispozitiv standard de iesire

� modul de acces:

– se seteaza anumiti parametri in registrele procesorului

– se construiesc anumite structuri de date pt. acces (handler)

– se apeleaza intreruperea INT 21h

– se testeaza corectitudinea efectuarii operatiei

Page 277: ASM_Curs

Exemple de functii sistem:

� 01 - citirea tastaturii cu ecou

� 02 - afisarea unui caracter

� 05 - tiparirea unui caracter

� 08 - citirea tastaturii fara ecou

� 14h - citirea secventiala cu FCB

� 15h - scrierea secventiala cu FCB

� 3fh - citirea unui fisier

� 40h - scrierea unui fisier

� 31h - revenirea in procesul parinte cu pastrarea alocarii memoriei

� 4ch - revenirea in sistemul de operare

Page 278: ASM_Curs

Accesul la resurse prin “apeluri sistem”

(system calls) exemplu:

; tiparirea unui caracter

mov al, “x”

mov ah, 05

int 21h

;citirea unui caracter de la

; disp. de intrare standard

mov ah, 01

int 21h

; in al va fi caracterul citit

; iesirea dintr-un proces cu

;pastrarea alocarii memoriei

mov ah, 31h

mov al, cod_retur

mov dx, dimensiune

int 21h

;dimensiunea memoriei rezervate se da in paragrafe de 16 octeti

Page 279: ASM_Curs

Redirectarea unor intreruperi BIOS

� obiectivul:

– rescrierea unor functii ale sistemului de operare, referitor la o anumita resursa

� mod de realizare:

– se inlocuieste in tabela de intreruperi adresa rutinei vechi cu adresa noii rutine; la terminarea aplicatiei se reface vechea adresa

– noua rutina va contine noul “driver” al resursei

Page 280: ASM_Curs

VECT DW2 DUP(?); aici se salvează vechiul vector de

; întrerupere

;initializare

……..

MOV AH, 35h ; 35h-funcţie sistem pentru citirea

;vectorului de întrerupere

MOV AL, n ; n – nivelul de întrerupere redirectat

INT 21h ;apelul funcţiei sistem; funcţia returnează

;în ES:BX adresa rutinei de la nivelul n

MOV VECT, BX ; salvare adresă offset

MOV BX, ES

MOV VECT+2, BX ; salvare adresă segment

MOV AX, SEG RUT_INT

MOV DS, AX ;DS <- adresa de segment a noii rutine de

; tratare a întreruperii

Page 281: ASM_Curs

MOV DX, offset RUT_INT ; DX <- adresa de offset a noii

; rutine de întrerupere

MOV AH, 25h ;25h - funcţia de scriere vector;

; în DS:DX se pune adresa rutinei de întrer.

MOV AL,n ;n – nivel de întrerupere

INT 21h ;apelul funcţiei sistem

……….

; program

………

INT n

……

Page 282: ASM_Curs

; sfîrşit program

MOV AX, VECT+2 ; refacerea adresei

MOV DS, AX

MOV DX, VECT

MOV AH, 25h ; funcţia de scriere vector

MOV AL,n ; n – nivel întrerupere

INT 21h ; înscrierea vechiului vector în

;tabela de intreruperi

…….

Page 283: ASM_Curs

;rutina de tratare a întreruperii

RUT_INT PROC FAR ; noua rutina de tratare aintreruperii

PUSH r ; salvarea registrelor utilizate în cadrul

; rutinei (r = AX, BX, ….)

STI ; validare întrerupere

………..

; corpul rutinei

………..

; sfîrşitul rutinei

POP r ; refacere registre salvate

IRET

RUT_INT ENDP

Page 284: ASM_Curs

Executia periodica unor operatii

(intreruperea 1CH)

� Implementare: prin ceasul de timp-real– contor (timer) care genereaza periodic intreruperi -

la fiecare 18,2ms

– rutina de tratare a intreruperii contine instructiunea INT 1CH

– rutina de tratare a intreruperii 1CH contine o singura instructiune : IRET - revenire din rutina

– prin redirectarea intreruperii 1CH catre o anumita rutina, aceasta va fi apelata la fiecare intrerupere a ceasului de timp real

– rutina trebuie sa fie rezidenta in memorie

Page 285: ASM_Curs

Sfaturi de scriere a rutinelor

� parametrii de apel se transmit prin:

– registrii procesorului (de preferat)

– prin stiva (numai daca se combina cu module scrise in limbaje de nivel inalt); Bp se foloseste pt. adresarea parametrilor de pe stiva

� trebuie sa se precizeze modul de transmitere a parametrilor printr-o caseta de comentar

;nume functie

; descrierea operatiei efectuate

; Intrari: ...

; Iesiri: ...

; registre distruse/afectate

Page 286: ASM_Curs

Sfaturi de scriere a rutinelor

� continutul registrelor nu trebuie sa fie afectat de executia rutinei;

– toate registrele folosite in rutina vor fi salvate pe stiva si vor fi refacute la sfarsitul rutinei

– refacerea registrelor este obligatorie si la iesirea in caz de eroare

– exceptie: registrele care contin parametrii de iesire

� majoritatea functiilor sistem nu sunt reentrante

– nu pot fi apelate din nou inainte de terminare

Page 287: ASM_Curs

Reguli de scriere a procedurilor rezidente

(TSR - Terminate and Stay Resident)

� Procedura rezidenta:

– care se activeaza la aparitia unor evenimente (ex: intreruperi, apasarea unor combinatii de litere,

etc.)

– se foloseste functia sistem 31h (int 21h) pt. a specifica spatiul care ramane rezident

� Reguli:

– la apelul unei rutine rezidente nu trebuie sa afecteze starea procesorului si a taskului intrerupt

– se va evita apelarea unor functii sistem pt. a nu produce apelarea repetata a acestora

Page 288: ASM_Curs

Reguli de scriere a procedurilor rezidente

– frecventa maxima de apel a procedurii rezidente trebuie determinata astfel incat timpul de executie a acesteia sa nu consume intregul timp al procesorului

– la apelul si la revenirea din procedura rezidenta se va face o comutare de context: vor fi salvate si apoi refacute informatiile legate de taskul intrerupt:

• continutul registrilor

• informatii sistem:

– prefixul segmentului de program (PSP)

– zona de transfer a discului (DTA)

– contextul ecranului

– se folosesc functii sistem pt. determinarea ac. inf.

Page 289: ASM_Curs

Reguli de scriere a procedurilor rezidente

� pentru activarea procedurilor rezidente se pot folosi:

– intreruperea de ceas de timp-real (int 8h)

– intreruperea hard de tastatura (int 9h)

– intreruperea soft de tastatura (int 16h)

Page 290: ASM_Curs

1

Programare in limbaj de

asamblare

Tehnici avansate de scriere a programelor

Page 291: ASM_Curs

2

Pseodo-operatori

� Expresii aritmetico-logice

– trebuie sa se evalueze in procesul de compilare

– contin constante si variabile de compilare (ex: $)

� Operatori aritmetici

– operatori unari: +, -

• <operator> <expresie>

– operatori binari ,*, /, MOD, []

• <expresie> <operator> <expresie>

• ex: unu + doi, var[operator_index]

Page 292: ASM_Curs

3

Pseodo-operatori� Operatori logici:

– AND, OR, NOT, SHR, SHL, XOR

– <expresie> <operator> <expresie>

� Operatori relationali: (true=0ffh, false=0h))

– EQ, NE, LE, GT, GE

– <expresie> <operator> <expresie>

� Exemple:

mov ax, tablou+(index SHL 2)

mov al, stare AND 00001111B

text db “acesta este un text”

l_text equ $-text ; $ - contorul de locatii

Page 293: ASM_Curs

4

Fortare de tip (coercion)

� sintaxa:

<tip> ptr <expresie>

� exemple de utilizare:

octet_LO db 55h

octet_HI db 66h

dublu dd 0

mov ax, word ptr octet_LO ; ax<=6655h

mov word ptr dublu, bx

mov ax, ds

mov word ptr dublu, ax ; dublu<= ds:bx

mov word ptr [si], 5 ; nu se poate determina tipul datei

Page 294: ASM_Curs

5

Operatori de tip

� SEG, OFFSET

– pt. determinarea adresei de segment si a adresei relative

– exemple:

sir db 33h, 44h, 55h, 66h

mov ax, seg var

mov ds, ax

mov si, offset var

mov al, [si]

� SIZE, SIZEOF

– determina nr. de octeti ai unei variabile tablou

� LENGTH, LENGTHOF

– determina nr. de elemente dintr-un tablou

Page 295: ASM_Curs

6

Operatori de tip

� LOW, LOWWORD

– octetul/cuvantul inferior

� HIGH, HIGHWORD

– octetul/cuvantul superior

� SHORT

– jmp short <expresie>

– forteaza un depasament de salt de un octet (+-128)

Page 296: ASM_Curs

7

Asamblare conditionata

� Directiva IF- ENDIF

– pt. generarea de variante diferite

– sintaxa:

if <expresie>

<secventa de instructiuni>

else ; este optional

<secventa de instructiuni>

endif

– daca <expresie> este diferita de 0 se asambleaza prima secventa, altfel a doua

Page 297: ASM_Curs

8

Asamblare conditionata

Exemplu:; se genereaza cod diferit pt. 8086 sau 80386

Processor = 80386 ;

.

if Processor eq 80386

shl ax, 4

else ;procesor 8086

mov cl, 4

shl ax, cl

endif

Page 298: ASM_Curs

9

Asamblare conditionata

� IFDEF, IFNDEF

– sintaxa:

ifdef <simbol>

<secventa de instructiuni sau directive>

endif

– exemplu:

DEBUG = 0

............

ifdef DEBUG

<secventa de depanare>

endif

Page 299: ASM_Curs

10

Macrouri

� forme prescurtate de scriere a unor secvente de program care se repeta

� sintaxa:

<nume_macro> macro [<par1> [<par2> ...]]

<secventa de instructiuni>

endm

� exemplu:mm_mov macro Dest, Source mm_mov x, y

mov ax, Source

mov Dest, ax

endm

Page 300: ASM_Curs

11

Macrouri v.s. Proceduri

� Macrouri:

- la fiecare apel se copiaza secventa de instructiuni

- nu sunt necesare instructiuni de apel (CALL) si de revenire din rutina (RET)

- nu se foloseste stiva

- trnsferul de parametri -prin copierea numelui

� Proceduri:

- o singura copie pt. mai multe apeluri

- se folosesc instructiuni de apel si de revenire

- se utilizeaza stiva la apel si la revenire

- transferul de parametri se face prin registrii sau stiva

Page 301: ASM_Curs

12

Problema etichetelor in macrouri

� la copierea repetata etichetele se duplica

� solutie: etichete “locale”

� Directiva LOCAL <nume_macro> macro [<par1> [<par2> ...]]

local <et1> [<et2> ..]]

..................

<et1>:

....................

<et2>:

endm

Page 302: ASM_Curs

13

Avantajele si dezavantajele utilizarii

macrourilor

� Avantaje:– pot fi create “instructiuni” noi

– poate duce la o programare mai eficienta

– executie mai eficienta in comparatie cu apelurile de proceduri

� Dezavantaje:

– pot ascunde operatii care afecteaza continutul registrilor

– utilizarea extensiva a macrourilor ingreuneaza intelegerea si mentenanta programului

Page 303: ASM_Curs

14

Administrarea programelor mari

� Directiva INCLUDE

– sintaxa: include <nume_fisier_asm>

� Directivele PUBLIC, EXTERN, EXTRN

– sintaxa:

public <nume1>[,<nume2> ..]]

extern <nume1>:<tip>[, <nume1>:<tip> ....]]

Page 304: ASM_Curs

15

Probleme de optimizare

� Cand si ce se optimizeaza

– regula 90/10 - 90% din timp se executa 10% din cod

• consecinta - daca se elimina 90% din codul rar folosit imbunatatirea este de 10%

– ce se doreste?

• timp redus sau memorie redusa

– cum se masoara timpul ocupat al procesorului pt. fiecare modul - “profiler”

– cand este bine sa se optimizeze:

• de la inceput:

– se optimizeaza si partea nesemnificativa

– programul se scrie greu si se intelege si mai greu

• la sfarsit:

– prea tirziu

Page 305: ASM_Curs

16

Optimizarea este necesara ?

� Contra-argumente:– viteza mare a procesoarelor, a memoriilor a

magistralelor

– spatii de memorie foarte mari

� Cand este necesara optimizarea:

– prelucrari de informatii multimedia

– prelucrari de semnale

– sisteme de control in timp-real, sisteme reactive

Page 306: ASM_Curs

17

Trei tipuri de optimizare

� Alt algoritm, mai bun

– optimizare de nivel inalt

– gasirea unui algoritm cu grad mai mic de complexitate O(n2) =>O(nlg(n))

� Algoritm implementat mai bine

– optimizare de nivel mediu

� Minimizarea numarului de cicluri

– optimizare de nivel scazut

Page 307: ASM_Curs

18

Tehnici de optimizare

� reducerea numarului de bucle imbricate

� reducerea timpului de executie al buclei interioare

� utilizarea poantorilor in adresarea elementelor unor structuri de date

� parcurgerea structurilor de date prin incrementarea si decrementarea poantorilor in locul calcularii adresei emenentului

– ex: tab[i][j]

adr_elementij = adresa(tab)+i*lung_rand +j

� utilizarea registrelor interneale procesorului in operatiile curente

Page 308: ASM_Curs

19

Exemplu de optimizare

� Problema: filtrarea unei imagini de 100 de ori,

rezolutie 256*256 pixeli

� Variante:

– program Pascal - 45s

– program C - 29s

– asamblare (V1) - 6s • s-au folosit deplasamente precalculate in locul calculului

de adresa prin indecsi

– asamblare (V2) - 4s• s-au folosit registre interne in locul variabilelor de

memorie

Page 309: ASM_Curs

20

Exemplu de optimizare

� Variante (continuare):

– asamblare (V3) 2,5s

• s-a evitat recopierea imaginii intermediare in matricea initiala

– asamblare (V4) 2,4s

• s-a redus dimensiunea variabilelor de la intreg la caracter pt. a beneficia de mem. cache

– asamblare (V5) 2,2s

• s-a schimbat algoritmul de filtrare, s-au lutat in calcul numai 4 vecini ai pixelului in loc de 8 (rezultatul este diferit)

Page 310: ASM_Curs

21

Apelul procedurilor scrise in asamblare

din limbaje de nivel inalt

� Cand se justifica:

– la accesul direct al unor resurse fizice (ex: interfete de I/E, memoria video, etc.)

– pentru cresterea eficientei unor secvente critice

– functiile de acces la resurse au fost scrise (deja) in asamblare

� Dificultati:

– alta filozofie de scriere a programelor (ex: registre in loc de variabile, date simpe in locul celor structurate)

– transferul parametrilor de apel si a rezultatelor

Page 311: ASM_Curs

22

Apelul procedurilor scrise in asamblare

din limbaje de nivel inalt

� Reguli:– procedura scrisa in LA se va declara “far” si

“public”

– numele si tipul procedurii se va declara in LNI cu mentiunea EXTERN

– parametrii de apel se transmit prin stiva:

• ordinea de scriere pe stiva coincide cu ordinea din lista de parametri

• primul parametru este cel mai adanc in stiva (se afla la o adresa mai mare)

• ultima data inregistrata pe stiva este un dublucuvant care reprezinta adresa de revenire din rutina

Page 312: ASM_Curs

23

Reguli:� valoarea returnata dupa apel se transmite dupa cum

urmeaza:

– pt. un octet - in registrul AL

– pt. doi octeti - in registrul AX

– pt. patru octeti - in registrele DX (partea mai semnificativa) si AX(partea mai putin semnificativa

� in cele mai multe LNI transmiterea parametrilor se face prin valoare

� dupa revenirea din procedura indicatorul de stiva SP trebuie refacut la valoarea de dinaintea apelului

� variabilele utilizate in comun (variabilele globale) vor fi declarate cu “PUBLIC” si respectiv EXTERN

Page 313: ASM_Curs

24

Exemplu:

Program PASCAL

.........

var

i:int;

j:word;

var_com:int;

function test(par:word):int:external;

$L test.obj {include fisierul Test.obj}

.....................

i=test(j);

Page 314: ASM_Curs

25

Exemplu (programul in asamblare)

.MODEL LARGE

DATA SEGMENT PUBLIC ‘DATA’

EXTERN VAR_COM:FAR

............

DATA ENDS

CODE SEGMENT PUBLIC ‘CODE’

ASSUME CS:CODE

PUBLIC TEST

TEST PROC FAR

PUSH BP

MOV BP,SP

MOV AX, [BP+6] ; citeste par

.............

MOV BX, SEG VAR_COM

MOV DS, BX

MOV SI, OFFSET VAR_COM MOV AX, [SI]

..........

MOV AX, REZ ; val. functiei

POP BP

RET 2 ; descarcare par. de ;pe stiva

CODE ENDS

END

Page 315: ASM_Curs

1

Programare in limbaj de asamblare

Comparatie intre diferite limbaje de asamblare

Page 316: ASM_Curs

2

Arhitectura MIPS

� MIPS – (million instructions per second)� Arhitectura RISC – Reduced Instruction Set Computer� In contrast cu arhitectura CISC - Complex Instruction Set

Computer)� J. Hennesy, 1981, arhitectura “academica” cu f. multe

implementari practice (ex: PIC32, ARM, PlayStation)� Caracteristici arhitecturale:

� Set redus de instructiuni (aprox. 35)� Instructiuni de lungime fixa (32 biti)� Accesul la memorie numai prin 2 instructiuni Load/Store� Numar redus de moduri de adresare� Principiu RISC – sacrifica totul pentru viteza => arhitectura simpla

ce permite executia instructiunilor intr-un timp minim� Frecventa ceasului sistem este mai mare decat in cazul

arhitecturilor CISC

Page 317: ASM_Curs

3

MIPS - Registre interne

� 32 de registre � banc de registre ce compenseaza partial lipsa

instructiunilor cu memoria

� Adresarea registrelor: � Cu $n (n=0-31)

� Cu $xn unde x=v,a,t,s,k,sp,gp,ra si n=0,1,2,…9

� X indica functia indeplinita de registru; � ex: t=reg. temporar; s= registre salvate la apelul de rutina

� Sp=stack pointer, gp=global pointer, v= valori generate in urma evaluarii unor expresii

� Registrul $0 contine valoarea 0

Page 318: ASM_Curs

4

MIPS - Formatul instructiunilor

� Instructiunile au lungime fixa dar un continut variabil

� Instructiuni de tip “R” – registru

<instr> rd, rs, rt<instr> rd, rs, rt<instr> rd, rs, rt<instr> rd, rs, rt• rd – registru destinatie

• rs – registru sursa

• rt – registru tinta (target)

• Ex: add $s1, $s2, $s3add $s1, $s2, $s3add $s1, $s2, $s3add $s1, $s2, $s3 ; $s1=$s2+$s3

Opcode rs rt rd shift funct

6 biti 5 biti 5 biti 5 biti 5 biti 6 biti

Page 319: ASM_Curs

5

MIPS - Formatul instructiunilor

� Instructiune de tip “I” – cu valoare imediata

<instr> rt, rs, IMM• rs – registru sursa

• rt – registru tinta (target)

• Ex: addi $s1, $s2, 55addi $s1, $s2, 55addi $s1, $s2, 55addi $s1, $s2, 55 ; $s1=$s2+55

Opcode rs rt IMM/Addr

6 biti 5 biti 5 biti 16 biti

Page 320: ASM_Curs

6

MIPS - Formatul instructiunilor

� Instructiuni de tip “J” – jump

<instr> LABEL• Ex: j et1 ;jump

Opcode Addresa tinta

6 biti 26 biti

Page 321: ASM_Curs

7

MIPS - Tipuri de instructiuni

� 3 tipuri:

� Aritmetice si logice

� Load/Store

� Salturi/ramificatii (branch)

Page 322: ASM_Curs

8

Instructiuni aritmetice si logice

� add $rd, $rs, $rt ;$rd = $rs + $rt

� addi $rt, $rs, imm ;$rt = $rs + imm

� sub $rd, $rs, $rt ;$rd = $rs - $rt

� mult $rs, $rt ;$LO = $rs * $rt

� div $rs, $rt ;$LO=$rs/$rt; $HI=$rs % $rt

� and $rd, $rs, $rt ; $rd = $rs & $rt

� andi $rt, $rs, imm ; $rt = $rs & imm

� or $rd, $rs, $rt ; $rd = $rs | $rt

� ori $rt, $rs, imm ; $rt = $rs | imm

Page 323: ASM_Curs

9

Instructiuni Load/Store

• Load word

lw $rt, offset($rs) ; $rt = MEM[$rs + offset]

• Load byte

lb $rt, offset($rs) ; $rt = MEM[$rs + offset]

• Store word

sw $rt, offset($rs) ; MEM[$rs + offset] = $rt

• Store byte

sb $t, offset($s) ; MEM[$s + offset] = (0xff & $t)

Page 324: ASM_Curs

10

Instructiuni de salt

� Salturi neconditionatej target ; PC = (PC & 0xf0000000) | (target << 2)

jr $rs ; salt cu registru PC = $rs;

� Salturi conditionate (ramificari – branch)• Branch on equal

beq $rs, $rt, offset ; if $rs=$rt PC=PC+(offset<<2))

• Branch on greater than or equal with zero

bgez $rs, offset ; if $rs >= 0 PC=Pc+ (offset << 2))

Page 325: ASM_Curs

11

Comparatie MIPS ISAx86

Parametru ISAx86 MIPSNr. instructiuni Foarte multe (~150) Putine (35)

Complexitate instr. Instructiuni complexe Instructiuni simple

Format instr. Variabil 1-16 octeti Fix 4 octeti

Instructiuni cu memoria Majoritatea instructiunilor Doar instr. Load si store

Moduri de adresare Multiple, complexe Putine, simple

Executia instructiunilor Mai multe cicluri Un ciclu

Numar registre 8 reg. generale 32 de registre

Arhitectura UCP Complexa (CISC) Simpla (RISC)

Programare Simpla, flexibila Rigida, complicata

Page 326: ASM_Curs

12

Limbajul de asamblare al familiei de microcontroloare PIC16Fxx

� PIC16Fxx � Microcontrolor destinat pentru aplicatii de control, incapsulate

(embedded applications)� Arhitectura de tip Harvard

� Separarea memoriei de program de memoria de date� in contrast cu Arhitectura von Neumann – o singura memorie pentru date si

program

� Memoria de program si de date este inclusa in microcontrolor� Arhitectura RISC, pe 8 biti (registre de date de 8 biti)� Instructiuni de lungime fixa (14 biti )� Instructiuni executate intr-un singur ciclu (majoritatea) – timp de

executie predefinit� Executia instructiunilor – pipeline� Memoria interna de date – fisier de registre cu acces direct� Porturile de I/E mapate (suprapuse) peste memoria de date� Ortogonalitate: toate instructiunile pot opera cu orice locatie de

memorie, in acelasi mod

Page 327: ASM_Curs

13

Registre si bancuri de memorie

Sunt 2 sau mai multe bankuri de registre (zone temporare de memorie interna)

Registre folosite mai des:- W – registrul acumulator- STATUS – registrul de stare- PORTA, PORTB – porturile de intrare/iesire A si B; fiecare bit se poate configura ca intrare sau ca iesire- TRISA, TRISB – registre de control prin care se configureaza bitii porturilor A si B pentru intrare sau pentru iesire

STATUS equ 03h ; adresa registrului de stareTRISA equ 85h ; adresa registrului TRISA

;care controleaza directia bitilor din portul APORTA equ 05h ; adresa portului A

bsf STATUS,5 ; comuta pe Bankul 1movlw 00hmovwf TRISA ;seteaza iesirile portului A ca si iesiribcf STATUS,5 ; comuta pe Bankul 0

Start movlw 02h movwf PORTA ; scrie alternativ 0 si 1 pe bitul al 2-lea movlw 00h ; movwf PORTAgoto Start

Page 328: ASM_Curs

14

Formatul instructiunilor

� Instructiuni pe octeti

� Ex: ADDWF 0x25, W

Cod operatie File reg. address

File reg. addressDCod operatie

Destinatia: W sau F

13 7 6 0

FRA – File Reg. Addr. Destinatia

Page 329: ASM_Curs

15

Formatul instructiunilor

� Instructiuni pe bit

� Ex: BSF 0x25, 3

Cod operatie File reg. address

13 9 8 7 6 0

Poz. bit

FRA – File Reg. Addr. Pozitie bit

Page 330: ASM_Curs

16

Formatul instructiunilor

� Instructiuni de control (salt) si cu literale (valori immediate)

� Ex: MOVLW 0x55

Cod operatie

Cod operatie

13 10 8 7 6 0

Cod operatie

Constanta (Literal)

Constanta (Literal)

Page 331: ASM_Curs

17

Setul de instructiuni PIC16

� Notatii:� f – “File register”� d – destinatia:

� d=0 – destinatia este w (acumulatorul)� d=1 – destinatia este “file register”

� k – constanta sau “literal”� b – ordinul bitului (al catelea bit)

� Instructiuni aritmetice si logice:� addwf f,d ;aduna w cu f (file)� subwf f,d ; scade w din f� incf f,d ; incrementare f� decf f,d ; decrementare f� comf f,d ; complementare f� andwf f,d ; SI logic intre w si f� xorwf f,d ; SAU excl. intre w si f� iorwf f,d ; SAU inclusiv intre w si f

Page 332: ASM_Curs

18

Setul de instructiuni PIC16

� Instructiuni de transfer

� movf f,d ; transfera f

� movwf f; transfera w in f

� swapf f,d ;schimba cate 4 biti (nibble) in f

� clrw ; Sterge w

� clrf f ; sterge f

� Instructiuni pe bit

� bcf f,b ; sterge bit in f

� bsf f,b ; seteaza bit in f

� btfsc f,b ; bit test f si skip if clear

� btfss f,b ;bit test f si skip if set

Page 333: ASM_Curs

19

Setul de instructiuni PIC16

� Operatii cu literale (constante) si de control� addlw k ; w=w+k� sublw k ; w=k-w� andlw k ;w=w SI k� iorlw k ;SAU interior w ,k� movlw k ; w=k� call k ; apel rutina� goto k ; salt la adresa� sleep ; trecere in mod stand-by� return ; revenire din rutina� retlw k ; revenire din rutina cu w=k� retfie ; revenire din intrerupere

Page 334: ASM_Curs

20

Comparatie intre ahitectura PIC16 si ISAx86

Parametru ISAx86 PIC16xNr. instructiuni Foarte multe (~150) Putine (35)

Complexitate instr. Instructiuni complexe Instructiuni simple

Format instr. Variabil 1-16 octeti Fix 14 biti

Memoria Memorie comuna pentru

instructiuni si date

(arh. Von Neumann)

Memorie separata

pentru instructiuni si date

(arh. Harvard)

Moduri de adresare Multiple, complexe Putine, simple

Executia instructiunilor Mai multe cicluri Un ciclu

Numar registre 8 reg. generale Fisier de registre

Arhitectura UCP Complexa (CISC) Simpla (RISC)

Tipuri de date Octeti, cuvinte dublucuvinte

Biti, Octeti

Page 335: ASM_Curs

21

Elemente comune pentru orice limbaj de asamblare

� Acces la registrii procesorului, la locatii de memorie si porturi de intrare/iesire

� Controlul executiei programului prin instructiuni de salt (conditionat si neconditionat), apel de rutina si revenire din rutina

� Mai multe moduri de adresare a memoriei si a porturilor de intrare/iesire

� Exista o relatie biunivoca intre instructiunile limbajului de asamblare si codurile de instructiuni interpretate/executate de UCP (la o instructiune corespunde exact un cod masina)

� Instructiunile lucreaza cu 0, 1, 2 sau 3 operanzi� Operatiile tipice implementate prin setul de instructiuni:

� Aritmetice, logice, de transfer, de control al executiei (de salt), rotatii si shiftari

Page 336: ASM_Curs

22

Diferente intre limbajele de asamblare� Numar de instructiuni� Complexitatea instructiunilor� Formatul instructiunilor� Moduri de adresare acceptate� Accesul la memorie

� prin toate instructiunile � numai prin Load si Store

� Accesul la porturi � numai prin instructiuni speciale In si Out� prin toate instructiunile – mapare porturi peste memoria RAM

� Numar de registre interne: 8, 32 sau fisier de registre� Dimensiunea datelor acceptate: biti, octeti, cuvinte,

dublucuvinte, quadruplucuvinte� Organizarea interna a procesorului: 8, 16, 32 sau 64 de biti� Tipuri de date acceptate: biti, caractere, intregi (cu si fara

semn), virgula flotanta, date impachetate (MMX)