Upload
robertyno
View
94
Download
0
Tags:
Embed Size (px)
Citation preview
1
Limbaje de asamblareCap. 1 Concepte de baza
1.1 Reprezentarea si codificarea informatiilor
S.L. Sebestyen Gheorghe
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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.....
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
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
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
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
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
29
Masina virtuala
Nivelul orientat pe aplicatie
Limbaje de nivel inalt
Limbaj de asamblare
Sistemul de operare
Masina conventionala
Microprogram
Logica digitala-translatare
-interpretare
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
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.)
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)
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
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)
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)
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
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
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
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)
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
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
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
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
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
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
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
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
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)
20
Adresarea memoriei –
• calculul adresei fizice
: [ + + ]Registru
segmentRegistru
de bazaRegistru
index
Deplasament
Adresa de offsetAdresa de segment
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
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
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
Limbaje de asamblare2.Setul de instructiuni ISA x86
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>
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
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:
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
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
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
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.
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
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
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) !!!!!!!
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)
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
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
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
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)
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
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
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
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
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
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]
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
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
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
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]
1
Programarea in limbaj de asamblare
ISA x86
Variabile, structuri de date
si structuri de program
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.
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
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
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,
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
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
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
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
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>
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>
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)
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
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
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
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>]..]}
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!!!
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
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
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]>
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
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
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 !!!)
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
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
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
Programarea in limbaj de asamblare
Setul de instructiuni ISA x86
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
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
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
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
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)
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
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
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
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
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)
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)
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)
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!!!!!
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)
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
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)
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)
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
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
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
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, .....
Instructiuni de intrare/iesire
• IN,OUT
– sintaxa: IN <destinatie>, <port>
OUT <port>, <sursa>
<destinatie>, <sursa> := AL| AX|EAX
<port>:= <valoare8>| DX
1
Programarea in limbaj de asamblare
Setul de instructiuni ISA x86
(continuare)
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
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
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
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
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
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
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
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>
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
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
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
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
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
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]
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
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
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
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
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: .....
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
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”
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
Programarea in limbaj de asamblare
Setul de instructiuni ISA x86
(continuare)
Exemple de programe
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”
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
Instructiuni de intrerupere
0000
*4 <adr_seg>:<adr_offset>
Memoria principala
Rutina de intrerupere
Tabela de intreruperi
Program
INT n
(256 intrari)
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)
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
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
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
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
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
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
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)
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;
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
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
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
;
Programare in limbaj de
asamblare
Instructiuni in virgula flotanta
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.
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, +∞, -∞
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
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
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
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
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
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
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)
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
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)
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
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
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.
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)
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
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)
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
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
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)
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
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)
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
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)
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)
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
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).
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
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)
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)
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
Programare in limbaj de
asamblare
Instructiuni in virgula flotanta
(continuare)
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
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
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
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
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
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
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
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
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).
1
Programare in limbaj de
asamblare
Instructiuni MMX
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
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
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
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
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)
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
+
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
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)
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>
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
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
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
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
15
Instructiuni logice - exemplu
1010111111111111 1010000000001111 1000000000000001 1000000000000001
0111111111111101 0000000001111100 0000000000001100 0000000000001000
pand MM4, MM3
0010111111111101 0000000000001100 0000000000000000 0000000000000000
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
17
Instructiuni de multiplicare
* *+* *+
pmadd MM3,MM4
MM3
MM3
MM4
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
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
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
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
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
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
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
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.
Programare in limbaj de
asamblare
Modul de lucru protejat la
procesoarele x86
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
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
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
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
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
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
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
Adresarea memoriei
+
Selector Adr. offset
Adr. fizica
15 0 31 0
Memoria4G0
Adresa de segment
31 0
Lungime
Acces 0
Descriptor de segment
Adresarea memoriei
Index TI RPL
*8
+
GDTR
GDT
Descriptor
0
LDT
Descriptor
LDTR
Selector
Selector*8
+
1
Descriptor
+
Adresa
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)
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
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
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
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
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
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
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>
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”
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
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
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
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
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
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
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
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
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
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
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
.............
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
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
Programare in limbaj de
asamblare
Tehnici de programare
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.
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
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
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
tiparirea unui text la imprimanta (continuare)
mov ax, 4c00h
int 21h
code ends
end start
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
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)
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
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
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
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
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
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
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
……
; 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
…….
;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
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
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
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
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
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.
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)
1
Programare in limbaj de
asamblare
Tehnici avansate de scriere a programelor
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]
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
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
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
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)
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
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
9
Asamblare conditionata
� IFDEF, IFNDEF
– sintaxa:
ifdef <simbol>
<secventa de instructiuni sau directive>
endif
– exemplu:
DEBUG = 0
............
ifdef DEBUG
<secventa de depanare>
endif
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
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
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
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
14
Administrarea programelor mari
� Directiva INCLUDE
– sintaxa: include <nume_fisier_asm>
� Directivele PUBLIC, EXTERN, EXTRN
– sintaxa:
public <nume1>[,<nume2> ..]]
extern <nume1>:<tip>[, <nume1>:<tip> ....]]
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
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
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
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
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
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)
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
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
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
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);
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
1
Programare in limbaj de asamblare
Comparatie intre diferite limbaje de asamblare
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
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
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
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
6
MIPS - Formatul instructiunilor
� Instructiuni de tip “J” – jump
<instr> LABEL• Ex: j et1 ;jump
Opcode Addresa tinta
6 biti 26 biti
7
MIPS - Tipuri de instructiuni
� 3 tipuri:
� Aritmetice si logice
� Load/Store
� Salturi/ramificatii (branch)
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
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)
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))
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
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
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
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
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
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)
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
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
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
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
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
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)