+ All Categories
Home > Documents > Microprocesoare Curs

Microprocesoare Curs

Date post: 21-Jul-2015
Category:
Upload: radu-constantin
View: 227 times
Download: 1 times
Share this document with a friend
156
 UNIVERSITATEA DIN BACĂU FACULTATEA DE INGINERIE DAN ROTAR MICROPROCESOARE  Note de curs EDITURA ALMA MATER BACĂU 2007
Transcript

UNIVERSITATEA DIN BACU FACULTATEA DE INGINERIE

DAN ROTAR

MICROPROCESOARENote de curs

EDITURA ALMA MATER BACU 2007

CUPRINSpag. CAPITOLUL 1 PROGRAMAREA N LIMBAJ DE ASAMBLARE 1.1. 1.2. 1.3. 1.4. Introducere Caracterizarea limbajului de asamblare Etapele elaborrii unui program n cod main Formatul fiierelor hex (.hex, .hxl, .hxh) CAPITOLUL 2 PROGRAMAREA MICROPROCESORULUI INTEL 8086 2.1. 2.2. 2.3. 2.3.1. 2.3.2. 2.3.3. 2.3.4. 2.3.5. 2.3.6. 2.3.7. 2.3.8. 2.3.9. 2.3.10. 2.4. 2.4.1. 2.4.2. 2.4.2.1. 2.4.2.2. 2.4.2.3. 2.4.2.4. 2.4.2.5. 2.4.2.6. Structura microprocesorului 8086 Instruciunile microprocesorului 8086 Extinderea structurii unitii centrale la familia 80x86 Unitatea central 80x86 din punct de vedere al programatorului Registrele de uz general ale unitii centrale 8086 Registrele de segment 8086 Registrele de uz special Registrele 80286 Registrele procesoarelor 80386/80486 Organizarea memoriei fizice la 80x86 Segmentele la 80x86 Adrese normalizate la 80x86 Registrele de segment la procesoarele 80x86 Modurile de adresare la procesoarele 80x86 Modul de adresare a registrelor la procesorul 8086 Modurile de adresare ale memoriei la procesorul 8086 Modul de adresare numai prin deplasament Modul de adresare indirect prin registre Modurile de adresare indexate Modul de adresare indexat bazat Adresare indexat bazat plus deplasament Un mod simplu de a reine modurile de adresare a memoriei la procesorul 8086 6 6 8 10 13 19 19 21 36 36 36 37 38 39 39 40 41 43 44 45 46 46 47 48 50 51 51 53

2.4.2.7. Cteva comentarii finale asupra modurilor de adresare la 3

2.4.3. 2.4.3.1. 2.4.3.2. 2.4.3.3. 2.4.3.4. 2.4.3.5. 2.5. 2.6. 2.7. 2.8. 2.8.1. 2.8.2. 2.8.3. 2.9. 2.9.1.

procesorul 8086 Modurile de adresare a registrelor la 80386 Modurile de adresare a memoriei la 80386 Modul de adresare indirect prin registre Modurile de adresare indexat, indexat/bazat i bazat/indexat/deplasament la procesorul 80386 Modul de adresare scalat indexat la procesorul 80386 Cteva consideraii finale asupra modurilor de adresare a memoriei la 80386 Instruciunea MOV la procesorul 8086 Comentarii finale asupra instruciunilor MOV Cteva instruciuni suplimentare Structura unui program n limbaj de asamblare Directivele de segmentare Directivele pentru definirea datelor Concluzii privind limbajul de asamblare Scrierea aplicaiilor Windows n limbaj de asamblare Includerea limbajului de asamblare n programele Visual Basic CAPITOLUL 3 PROGRAMAREA MICROPROCESORULUI TMS 320F240

53 54 54 54 54 56 56 57 60 60 61 62 69 69 78 78

82 82 92 108

3.1. Setul de instruciuni a procesoarelor Texas Instruments C5X/C2XX 3.2. Turbo-Asamblorul (TASM) 3.3. Exemple de programe n limbaj de asamblare, pentru microprocesorul TMS 320F240 CAPITOLUL 4 PROGRAMAREA MICROCONTROLERELOR DE TIP PIC12, PIC16 I PIC 18 4.1. 4.1.1. 4.1.2. 4.1.3. 4.1.4. 4.1.5. 4.1.6. 4.1.7. 4.1.8. 4.1.9. 4.1.10. 4.1.11. 4.1.12. 4.1.13. 4.1.14. Organizarea memoriei microcontrolerelor PIC Memoria program Memoria de date Registrele SFR Bancuri de Memorie Contorul de Program Stiva Registrul STATUS (ADRESA: 03h, 83h) Registrul OPTION (ADRESA: 81h) Registrul INTCON (ADRESA: 0Bh, 8Bh) PCL i PCLATH Memoria de date EEPROM Registrul EECON1 (ADRESA: 88h) Citirea memoriei EEPROM Scrierea n memoria de date EEPROM 4

122 122 124 124 124 124 125 125 125 127 128 129 129 130 130 131

4.1.15. 4.1.16. 4.1.17. 4.2. 4.3. 4.4. 4.4.1. 4.4.2. 4.4.3. 4.4.4. 4.4.5.

Verificarea scrierii Harta memoriei RAM Moduri de adresare Porturile microcontrolerului Setul de instruciuni a unitilor centrale de tip RISC PIC12, PIC16 i PIC18 Exemple de programme n limbaj de asamblare Iniializarea unei zone de memorie RAM Salvarea i restaurarea regitrilor (echivalentul instruciunilor PUSH i POP) Testarea coninutului unui registru Conversie binar-ASCII Afiarea unui ir pe un display LCD BIBLIOGRAFIE

132 133 133 135 137 144 144 145 146 146 146 154

5

CAPITOLUL 1PROGRAMAREA N LIMBAJ DE ASAMBLARE 1.1. Introducere

Microprocesoarele reprezint uniti centrale integrate ntr-un singur circuit integrat pe scar foarte larg (VLSI Very Large Scale Integration), care au cptat o larg dezvoltare o dat cu dezvoltarea tehnologiei de integrare i cu rspndirea utilizrii sistemelor cu microprocesor n cele mai diverse domenii de activitate. Pe de alt parte, tendina de miniaturizare continu a sistemelor numerice a dus la apariia i dezvoltarea calculatoarelor integrate, utilizate n cele mai diverse domenii ale activitii umane. Procesarea digital a semnalelor (DSP Digital Signal Processing) se distinge de alte domenii ale tiinei calculatoarelor prin faptul c exist un singur tip de date utilizate i anume semnalele. n marea majoritate a cazurilor aceste semnale provin de la senzori care preiau mrimi din lumea real: vibraii seismice, imagini, sunete etc. DSP reprezint matematica, algoritmii i tehnicile utilizate pentru prelucrarea acestor semnale dup ce acestea au fost transformate n prealabil n format digital. Aceast prelucrare se face n diferite scopuri, obiectivele urmrite avnd un spectru larg de aplicabilitate: analiza imaginilor, recunoaterea formelor, recunoaterea i generarea vorbirii, compresia datelor pentru stocare sau transmitere etc. Dac vom ataa un convertor analog-digital unui calculator n scopul prelurii unei anumite cantiti de date din lumea real, tehnica DSP ne va ajuta s interpretm aceste date. nceputurile DSP se localizeaz la nceputurile anilor 1960 i 1970 cnd calculatoarele numerice au nceput s fie folosite n diferite ramuri ale tiinei i tehnicii. n aceast perioad ns calculatoarele erau foarte scumpe i din acest motiv aplicaiile DSP erau limitate doar la cteva domenii de mare interes. ncercri de pionerat s-au fcut n domeniile cheie ca: tehnologia radar care presupune creterea securitii naionale, exploatarea petrolului care aduce venituri nsemnate, explorarea spaiului cosmic unde utilizarea acestei tehnologii este indispensabil i analiza imaginilor n domeniul medical care permite salvarea de viei omeneti. Revoluia calculatoarelor personale din anii 1980 i 1990 a dus la dezvoltarea spectaculoas a tehnicilor DSP ntr-un numr impresionant de domenii. Dac la nceput aceast tehnic era utilizat aproape exclusiv n aplicaii militare sau guvernamentale, scderea preului de cost a tehnicii de calcul o dat cu dezvoltarea spectaculoas a tehnologiei digitale a dus la utilizarea tehnologiei DSP n multe domenii comerciale cum sunt: telefonia mobil, CD playere, pot electronic vocal etc. 6

Dezvoltarea tehnologiei DSP a dus la apariia procesoarelor de semnal (DSP Digital Signal Processor) care reprezint calculatoare integrate specializate pentru acest domeniu. Observm faptul c acronimul DSP este folosit att pentru tehnica de prelucrare digital a semnalelor ct i pentru dispozitivul utilizat pentru aceasta. n final trebuie remarcat c nu exist o grani clar ntre tehnologia DSP i alte domenii ale tiinei. Dintre domeniile care se ntreptrund cu tehnologia DSP se pot aminti: o teoria comunicaiei; o analiza numeric; o statistica i probabilitile; o procesarea analogic a semnalelor; o teoria deciziei; o electronica digital; o electronica analogic. Indiferent de structura sistemului de calcul utilizat, modul de programare al unitii centrale se face n acelai fel existnd similitudini evidente dar i diferene importante ntre diferitele tipuri de uniti centrale. O unitate central are un limbaj propriu, care difer de la o unitate central la alta, instruciunile unitii centrale fiind reprezentate de iruri de numere binare. Productorul unitii centrale stabilete tipurile de instruciuni, codificarea, structura i modul de utilizare a acestora. Un program scris n binar cu ajutorul acestor instruciuni se numete program main iar codul n care este scris se numete cod obiect (sau cod binar) direct executabil. Primele programe au fost scrise n acest fel dar evident, scrierea unor astfel de programe este dificil iar riscul de eroare este ridicat. Pentru simplificarea scrierii programelor n cod obiect direct executabil, productorii unitilor centrale asociaz codului binar corespunztor unei instruciuni, un nume care s fie semnificativ i care s sugereze aciunea realizat de instruciune. Acest nume poart denumirea de mnemonic. Programarea cu mnemonici este mai uor de realizat dar este necesar un program de traducere din mnemonici n cod binar. Un astfel de program prevzut cu o serie de faciliti care s uureze munca programatorului se numete asamblor iar programele scrise cu ajutorul mnemonicelor, pentru asamblor, se numesc programe n limbaj de asamblare. Astzi programarea unitilor centrale se face n limbaj de asamblare. Deoarece acest program se adreseaz direct structurii fizice a unui sistem de calcul, se spune c limbajul de asamblare este un limbaj de programare de nivel sczut spre deosebire de limbajele de nivel nalt (C, PASCAL, Java etc) care sunt limbaje de programare de nivel nalt. Programele scrise n limbaj de asamblare nu pot fi rulate dect pe unitatea central pentru care au fost scrise i din acest motiv se spune c programele scrise n limbaj de asamblare nu sunt portabile. Avantajul utilizrii programelor n limbaj de asamblare este reprezentat de faptul c ele permit accesul programatorului la structurile intime ale sistemului de calcul (ceea ce nu se ntmpl la limbajele de nivel nalt) i permit scrierea unor programe de dimensiuni mici ce se execut n timp scurt iar uneori astfel de cerine sunt impuse. Din acest motiv i limbajele de programare de nivel nalt permit mecanisme de inserare a unor secvene de program scrise n limbaj de asamblare. 7

1.2.

Caracterizarea limbajului de asamblarePrezentm n continuare cteva motive pentru studiul limbajului de asamblare: o pentru a face programe mai scurte i care s lucreze mai repede; o pentru a nelege mai bine cum lucreaz calculatoarele; o pentru a scrie un cod eficient.

Limbajul de asamblare este puin rspndit printre nespecialiti. Acest lucru se datoreaz unor prejudeci rspndite de-a lungul timpului pe care le vom analiza n continuare n scopul caracterizrii corecte a acestui limbaj. Dificultile limbajului de asamblare: 1) 2) 3) 4) 5) 6) 7) este greu de nvat; este greu de citit i de neles; este greu de depanat; este greu de ntreinut; este greu de scris; programarea n acest limbaj este mare consumatoare de timp; tehnologia mbuntit a compilatoarelor a eliminat nevoia de limbaj de asamblare; 8) mainile actuale sunt att de rapide nct nu mai este necesar programarea n limbaj de asamblare; 9) dac este nevoie de vitez se pot folosi algoritmi performani mai degrab dect programarea n limbaj de asamblare; 10) mainile actuale dispun de mari cantiti de memorie i economia adus de limbajul de asamblare devine neimportant; 11) limbajul de asamblare nu este portabil. n general aceste afirmaii sunt fcute de persoane care nu utilizeaz limbajul de asamblare i nici nu au o idee precis asupra acestui limbaj. Din acest motiv, afirmaiile de mai sus vor fi explicate n ideea c ele pot s nu fie adevrate n momentul cnd cunoatem i folosim limbajul de asamblare. 1) Limbajul de asamblare este greu de nvat. Dac stpnii un limbaj de programare cum este, de exemplu, Pascal, atunci nvarea altor limbaje ca de exemplu: C, BASIC, FORTRAN, Modula-2 sau Ada este relativ simpl pentru c ele sunt destul de asemntoare cu Pascal. Pe de alt parte nvarea unui limbaj ce difer mult de Pascal, cum este Prolog, nu e simpl. i limbajul de asamblare este diferit de Pascal i atunci el va fi puin mai dificil de nvat. n orice caz nvarea limbajului de asamblare nu este mai grea dect nvarea pentru prima dat a unui limbaj de programare. 2) Limbajul de asamblare este greu de citit i neles. Aceast afirmaie este fcut de persoanele ce nu cunosc acest limbaj. Evident c pot fi scrise programe de neneles n limbaj de asamblare ca i n alte limbaje. Dup ctigarea 8

experienei n limbaj de asamblare v vei da seama c este mai uor de citit dect alte limbaje. 3) Limbajul de asamblare este greu de depanat. Acelai argument trebuie explicat ca mai sus. Odat ctigat experien nimic nu va prea mai simplu. 4) Limbajul de asamblare este greu de ntreinut. Programele n C sunt greu de ntreinut. Aptitudinea de a scrie programe uor de ntreinut se ctig dup oarecare experien. 5) Limbajul de asamblare este greu de scris. Aceast afirmaie are un smbure de adevr. O lung perioad de timp programatorii n limbaj de asamblare au scris programele n ntregime de la nceput la sfrit, reinventnd de fiecare dat roata. Limbajele de nivel nalt beneficiaz de biblioteci ce simplific mult munca. Acelai lucru poate fi fcut i n limbaj de asamblare dac inem cont c sunt disponibile biblioteci (cele mai multe gratuite) cu majoritatea rutinelor necesare scrierii programelor. 6) Programarea n limbaj de asamblare este consumatoare de timp. Este adevrat c elaborarea unui program n limbaj de asamblare necesit mai mult timp (uneori dublu) fa de scrierea programelor n limbaje de nivel nalt. Oricum ctigul de timp nu poate umbri celelalte beneficii aduse de limbajul de asamblare. 7) Tehnologia mbuntit a compilatoarelor a eliminat nevoia de limbaj de asamblare. Acest lucru nu este adevrat i probabil nu va fi niciodat adevrat. Performana programelor scrise n limbaj de asamblare const n modul de scriere al acestora i de talentul i inventivitatea programatorului ceea ce nu se poate compara cu aciunea unui compilator. 8) Mainile actuale dispun de mari cantiti de memorie i economia adus de limbajul de asamblare devine neimportant. Este uimitor faptul c oamenii prefer s cheltuiasc bani ca s cumpere maini mai rapide n loc s consume timp s scrie programe n limbaj de asamblare. Un fapt rmne: tot timpul se dorete mai mult vitez. Pentru o main dat cele mai rapide programe rmn cele scrise n limbaj de asamblare. 9) Dac este nevoie de vitez se pot folosi algoritmi performani mai degrab dect programarea n limbaj de asamblare. Orice algoritm ce poate fi implementat n limbajele de nivel nalt poate fi implementat i n limbaj de asamblare i deci va fi mai rapid aici. Pe de alt parte, exist algoritmi ce nu pot fi implementai dect n limbaj de asamblare. 10) Mainile actuale dispun de mari cantiti de memorie i economia adus de limbajul de asamblare devine neimportant. D-i cuiva un centimetru i-i va cere un metru. Este evident c orict de mult memorie este disponibil ea nu va 9

ajunge. De asemenea, din motive tehnice este recomandabil ca programatorii s scrie programe ct mai scurte. 11) Limbajul de asamblare nu este portabil. Acest fapt este de necontestat. Dac programul trebuie s funcioneze pe procesoare diferite atunci limbajul de asamblare nu este o soluie. Limbajul de asamblare prezint i avantaje incontestabile pe care le vom enumera n continuare. Aceste avantaje reprezint argumente serioase n scopul nvrii acestui limbaj. Avantajele programrii n limbaj de asamblare: o vitez programele scrise n limbaj de asamblare sunt n general cele mai rapide; o spaiu programele scrise n limbaj de asamblare sunt de regul cele mai mici; o performan aceste programe v permit s facei ceea ce este imposibil n limbajele de nivel nalt; o cunotine cunoaterea limbajului de asamblare v permite s scriei programe mai performante n limbajele de nivel nalt.

1.3.

Etapele elaborrii unui program n cod main

Etapele elaborrii unui program n cod main difer de la caz la caz. Astfel, dac dorim s elaborm un program n cod main pentru unitatea central a sistemului pe care lucrm, atunci la sfrit programul realizat se va gsi n memoria calculatorului, gata de execuie. Acest caz l ntlnim atunci cnd scriem un program n limbaj de asamblare pentru microprocesorul 8086 pe un calculator personal de tip IBM PC. Aceste calculatoare sunt dotate cu procesoare Intel 80x86 sau compatibile care pot executa programe n cod obiect scrise pentru unitatea central 8086 deoarece politica Intel a fost de a pstra compatibilitatea procesoarelor de jos (ncepnd cu 8086) n sus (ultima generaie de procesor Intel). Etapele elaborrii unui program pentru microprocesorul 8086, lucrnd pe un calculator compatibil IBM PC vor fi: o se scrie programul n limbaj de asamblare cu ajutorul unui editor de texte, obinndu-se un fiier text numit fiier surs care are cel mai adesea extensia .asm (fiierul surs reprezint instrumentul de lucru al programatorului coninnd numeroase comentarii i explicaii); o traducerea (translatarea) fiierului surs n format binar se face cu ajutorul programului asamblor. n aceast etap asamblorul semnaleaz eventualele erori de sintax ale programului i genereaz, n cazul n care programul este corect din punct de vedere sintactic (la acest nivel nu se poate face i verificarea logic), un fiier n cod binar. n funcie de 10

necesitile programatorului, asamblorul poate genera dou tipuri de fiiere: fiiere n cod obiect absolut, direct executabile de ctre unitatea central, care sunt aezate n memorie la adresa de unde vor fi executate (fiierul generat conine adresele absolute ale programului) i care vor avea extensia .com sau .exe (modul de stabilire a extensiei se va explica mai trziu), sau fiiere n cod obiect relativ, care conin codul obiect dar adresele sunt relative (simbolice) i care nu pot fi executate direct dar pot fi puse n biblioteci (pentru o utilizare ulterioar) i care pot fi utilizate mpreun cu alte programe n cod obiect relativ din bibliotecile deja create, pentru obinerea programului final, n cod obiect absolut; o dac s-a obinut fiierul n cod obiect absolut (extensia .com sau .exe) se poate trece la lansarea n execuie n scopul verificrii i eventual a depanrii (cu ajutorul unui program de depanare debugger) funcionrii logice a acestuia; o dac s-a obinut un fiier n cod obiect relocabil, fiierul poate fi adugat unei biblioteci (library) cu ajutorul unui program bibliotecar (librarian) sau se poate genera programul n cod obiect absolut cu ajutorul unui editor de legturi (linkeditor). Editorul de legturi caut n biblioteci legturile solicitate, adaug n programul n cod obiect absolut secvenele extrase din biblioteci, semnaleaz eventualele referine nerezolvate i, n cazul n care nu au fost erori, genereaz codul obiect absolut. S exemplificm modul n care se poate realiza un program care conine o operaie de nmulire utilizat dintr-o bibliotec matematic extern. Pentru aceasta trebuie s cunoatem numele rutinei de nmulire din biblioteca utilizat. Se scrie programul in limbaj de asamblare iar acolo unde se folosete operaia de nmulire se scrie numele rutinei din biblioteca extern i se respect conveniile de utilizare specificate pentru biblioteca respectiv. De asemenea se specific n program faptul c numele folosit este o referin extern n aa fel nct asamblorul s nu semnaleze o eroare. Modul de lucru este similar cu cel din limbajele de nivel nalt cnd se folosesc funcii sau proceduri din bibliotecile externe. Se genereaz fiierul n cod obiect relocabil, dup care se trece la prelucrarea cu ajutorul editorului de legturi. Linkeditorului i se specific numele bibliotecii n care s caute rutina de nmulire i dac acesta o gsete, include n programul n cod obiect absolut secvena de cod corespunztoare rutinei. n afar de uneltele (programele) folosite pentru prelucrare, se mai folosete i un program numit dezasamblor (disassembler), util n depanare, care are aciune invers asamblorului: traduce formatul n cod obiect absolut n textul corespunztor. 11

n cazul n care se dezvolt programe pe o alt main dect cea pentru care se scriu programele, etapele sunt aceleai (asamblorul se numete n acest caz crossasamblor crossassembler), numai c la final programul trebuie transferat de pe maina pe care s-a lucrat pe maina pentru care s-a scris programul. Transferul se face de regul cu ajutorul programatoarelor care transfer codul obiect absolut din memoria mainii gazd n memoria mainii pentru care s-a scris programul. Pentru transfer se folosete formatul IntelHEX. Pentru a exemplifica acest lucru, vom arta modul n care se dezvolt programe pentru microcontrolere de tip PIC (Microchip) pe maini de calcul compatibile IBM PC (calculatoare personale). Pe calculatorul personal se folosete programul MPLAB, furnizat n mod gratuit de firma Microchip, care este un mediu de dezvoltare (IDE Integrated Development Environment) care conine un crosasamblor, un dezasamblor, un linkeditor, un simulator, un bibliotecar, help i alte faciliti pentru realizarea programelor. n acest fel, programele se pot dezvolta si pune la punct pe calculatorul personal i apoi se pot transfera n memoria microcontrolerului. Verificarea final se face ns tot prin execuia programului pe microcontroler n aa fel nct s se poat verifica n condiii reale funcionarea programului. Generarea codului absolut. Codul absolut este ieirea implicit pentru (cross)asamblorul MPASM. Procesul este artat n figura 1.1.

Figura 1.1. Generarea codului absolut pentru microcontroler.

Cnd un fiier surs este asamblat n acest fel, toate variabilele i subprogramele folosite n fiierul surs trebuie s fie definite n acest fiier surs sau s fi fost incluse n acest fiier. Dac asamblarea se realizeaz fr erori, se va genera un fiier hex ce conine codul executabil pentru dispozitivul int. Acest fiier poate fi utilizat cu un depanator pentru a teste execuia codului sau cu un programator pentru programarea dispozitivului. Generarea codului relocabil. Asamblorul MPASM are de asemenea posibilitatea de a genera un modul obiect relocabil care poate fi legat cu alte module utiliznd MPLINK pentru obinerea codului executabil. Aceast metod este foarte folositoare pentru crearea modulelor reutilizabile. 12

Figura 1.2. Generarea i utilizarea fiierelor relocabile.

Modulele nrudite pot fi grupate i stocate mpreun folosind bibliotecarul MPLIB. Bibliotecile necesare pot fi specificate la link-editare i numai rutinele necesare vor fi incluse n fiierul executabil.

1.4.

Formatul fiierelor hex (.hex, .hxl, .hxh)

Asamblorul MPASM i linkeditorul MPLINK pot crea fiiere text ASCII de tip hex de diferite formate: Numele formatului Format Intel Hex Format Intel Split Hex Intel Hex 32 Format Tipul formatului INHX8M INHX8S INHX32 Extensia fiierului .hex .hxl, .hxh .hex Utilizare Programatoare pentru dispozitive de 8 bii Programatoare par/impar Programatoare pentru dispozitive de 16 bii

Aceste formate de fiiere sunt folositoare pentru transferarea codului pentru PIC MCU ctre programatoare. Formatul Intel HEX Acest format creeaz un fiier hex pe 8 bii cu combinaia octetul cel mai puin semnificativ, octetul cel mai semnificativ (low byte, high byte). Chiar dac fiecare adres conine 8 bii, n acest format toate adresele sunt dublate. 13

Fiecare nregistrare ncepe cu un prefix de 9 caractere i se termin cu o suma de contro de 2 caractere. Fiecare nregistrare are urmtorul format: :BBAAAATTHHHH....HHHCC unde: BB AAAA TT HH CC un numr de un octet cu dou cifre hexazecimale ce reprezint numrul de octei de date ce apar pe linie; o adres hexazecimal de 4 cifre care arat adresa de start a nregistrrii de date; tipul nregistrrii reprezentat pe 2 cifre hexa care este ntotdeauna "00" cu excepia nregistrrii de sfrit de fiier (end of file) care este "01"; un octet de date reprezentat cu 2 cifre hexa n ordinea Low byte/High byte; o sum de control cu 2 cifre hexa care reprezint suma tuturor octeilor precedeni ai nregistrrii n complement fa de 2. (Not - complementul fa de 2 se calculeaz ca suma octeilor precedeni care apoi se scade din 256. De exemplu suma = 5 iar in complement faa de 2=256-5=251)

Exemplu: INHX8M nume_fisier.hex :1000000000000000000000000000000000000000F0 :0400100000000000EC :100032000000280040006800A800E800C80028016D :100042006801A9018901EA01280208026A02BF02C5 :10005200E002E80228036803BF03E803C8030804B8 :1000620008040804030443050306E807E807FF0839 :06007200FF08FF08190A57 :00000001FF Formatul Intel Split Hex Formatul divizat (split) creeaz 2 fiiere: .hxl i .hxh. Formatul este asemntor cu formatul normal pe 8 bii cu excepia faptului c octeii cei mai puin semnificativi ai cuvintelor de date sunt stocai n fiierul .hxl iar octeii cei mai semnificativi ai cuvintelor de date sunt stocai n fiierul .hxh iar adresele sunt mprite la 2. Acest format este folosit la programarea cuvintelor de 16 bii n dou memorii EPROM de 8 bii care vor fi folosite pereche (mpreun). Exemplu: INHX8S 14

nume_fisier.hxl :0A0000000000000000000000000000F6 :1000190000284068A8E8C82868A989EA28086ABFAA :10002900E0E82868BFE8C8080808034303E8E8FFD0 :03003900FFFF19AD :00000001FF nume_fisier.hxh :0A0000000000000000000000000000F6 :1000190000000000000000010101010102020202CA :100029000202030303030304040404050607070883 :0300390008080AAA :00000001FF Format Intel Hex 32 Formatul extins la 32 de bii este similar formatului pe 8 bii cu excepia faptului c adresa stabilete cei mai semnificativi 16 bii ai adresei de date. Acest format este folosit pentru dispozitive pe 16 bii la care memoria de program adresabil depete 64 de koctei. Fiecare nregistrare de date ncepe cu un prefix de 9 caractere i se termin cu o suma de control de 2 caractere. Fiecare nregistrare are urmtorul format: :BBAAAATTHHHH......HHHCC unde: BB AAAA TT un numr de un octet cu dou cifre hexazecimale ce reprezint numrul de octei de date ce apar pe linie; o adres hexazecimal de 4 cifre care arat adresa de start a nregistrrii de date; tipul nregistrrii reprezentat pe 2 cifre: 00 - nregistrare de date 01 - nregistrare end of file 02 - Segment address record 04 - Linear address record un octet de date reprezentat cu 2 cifre hexa n ordinea Low byte/High byte; o sum de control cu 2 cifre hexa care reprezint suma tuturor octeilor precedeni ai nregistrrii n complement fa de 2. (Not - complementul fa de 2 se calculeaz ca suma octeilor precedeni care apoi se scade din 256. De exemplu suma = 5 iar in complement faa de 2=256-5=251) 15

HH CC

Analiza generrii unui fiier INTEL HEX Folosim urmtorul studiu de caz: Fiierul listing: MPASM 4.02 Released TEST1.ASM 12-13-2005 8:09:51 LOC OBJECT CODE LINE SOURCE TEXT VALUE

PAGE

1

00001 ;Program pentru initializarea portului B si setarea pinilor 00002 ;la starea unu logic 00003 00004 ;Declaratia si configuratia procesorului 00005 00006 PROCESSOR 16F84A 00007 #include "p16f84A.inc" 00001 LIST 00002 ; P16F84A.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00134 LIST 00008 Warning[205]: Found directive in column 1. (LIST) 00009 LIST 2007 3FF1 00010 __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC 00011 0000 00012 org 0x00 ;vector reset 0000 2805 00013 goto main 0004 00014 org 0x04 ;rutina de intrerupere nu exista 0004 2805 00015 goto main 00016 0005 00017 main 0005 0000 00018 nop ;programul principal 0006 0000 00019 nop 0007 2805 00020 goto main

Din acest listing rezult c trebuie scris n memorie: 16

Adresa 2007 0000 0004 0005 0006 0007

Valoare cuvnt 3FF1 2805 2805 0000 0000 2805

Fiierul HEX obinut: :020000040000FA :020000000528D1 :08000800052800000000052896 :02400E00F13F80 :00000001FF o prima linie: 020000040000FA este compus din: 02 - numrul de octei de date ce apar pe linie, 0000 - adresa de start a nregistrrii de date (n acest caz aici trebuie s fie ntotdeauna 0000), 04 - extended linear address record, 0000 - cei mai semnificativi 16 bii ai adresei, FA - suma de control = 01h + NOTA (02h + 00h + 00h + 04h + 00h + 00h). Modul de calcul se face n felul urmtor: 02h+04h+06h, 06h mod 100h = 06h, NOT(06h) = FFh - 06h = F9h, F9h+01h = FAh. o a doua linie: 020000000528D1 este compusa din: 02 numrul de octei de date ce apar pe linie, 0000 - adresa de start a nregistrrii de date, 00 - nregistrare de date, 0528 datele scrise n ordinea: octetul cel mai putin semnificativ, octetul cel mai semnificativ, deci este de fapt 2805 n listing, D1 - suma de control: 01h + NOT (02h+05h+28h) = 01h + NOT(2Fh) ((2Fh MOD 100h=2Fh)), 01h+FFh-2Fh=D1. o a treia linie: 08000800052800000000052896: 08 - numrul de octeti de date, 0008 - adresa de start, 00 - nregistrare de date, octeii de date sunt: 0528000000000528, ceea ce nseamna: 2805, 0000, 0000, 2805. Se pare c din cauz c pentru fiecare adres sunt cte 2 octei, aceasta apare dublat. Deci adresa de start 0008 este de fapt adresa 0004. Suma de control: 08h+08h+05h+28h+05h+28h=6Ah, 6Ah MOD 100h = 6Ah, FFh-6Ah=95h+01h=96h. o a patra linie: 02400E00F13F80: 02 - 2 0cteti de date, 400Eh adresa de start care e n realitate 400Eh/2h=2007h (ca n listing), 00 - nregistrare de date, datele: F13F care se citesc 3FF1, i suma de control: 02h+40h+0Eh+F1h+3Fh = 180h MOD 100h = 80h, FFh - 80h = 7Fh + 01h =80h. o ultima linie: 00000001FF este linia de End of File. 17

Acest studiu de caz a fost aplicat pentru un exemplu realizat n MPLAB. Se pot trage urmtoarele concluzii: o se folosete adresarea linear extins; o adresa de start a datelor de pe o linie din fiierul HEX este dublul adresei reale (din listing); o fiecrei adrese i sunt asociai 2 octei, 4 cifre hexa, scrise n ordinea: cel mai puin semnificativ octet urmat de cel mai semnificativ octet; o restul regulilor sunt respectate de la formatul INTEL HEX.

18

CAPITOLUL 2PROGRAMAREA MICROPROCESORULUI INTEL 8086Vom reaminti, pentru nceput, principalele caracteristici ale structurii accesibile programatorului, pentru microprocesorul I8086, utile n programarea n limbaj de asamblare a acestuia.

2.1.

Structura microprocesorului 8086

Exist trei categorii de registre: registre de uz general, registre de adrese, indicatori, pointeri i index i registre de uz special. Unitatea central 8086 are 16 patru registre de uz general, pe 16 bii: 15 AH 8 7 AL 0AX BX CX DX

AX, BX, CX, DX care pot fi folosite i ca registre de 8 bii: AH, AL, BH, BL, CH, CL, DH, DL

BH CH DH

BL CL DL

8

aa cum se arat n figura alturat. Fiecare dintre registrele de 16 bii poate fi folosit ca destinaie a datelor (acumulator) dar registrul acumulator implicit este registrul AX. Registrul bistabililor de condiii i de control al microprocesorului, FX, asociat cu registrul acumulator (de regul registrul AX): FX 15 X 14 X 13 X 12 X 11 10 9 OF DF IF 8 7 6 5 TF SF ZF X 4 3 AF X 2 1 PF X 0 CF

unde cu X s-a simbolizat bistabilul inaccesibil utilizatorului. Semnificaia fanioanelor din registrul FX este: CF = "carry flag": depire aritmetic (CF = 0 nu s-a produs o depire aritmetic, CF = 1 s-a produs o depire aritmetic); PF = parity flag: paritate; 19

AF = auxiliary flag: transport ntre bitul 7 i 8; ZF = "zero flag: valoare zero (ZF = 0 n acumulator este o valoare diferit de zero, ZF = 1 n urma unei operaii, valoarea rezultat n acumulator este zero); SF = sign flag: semnul n reprezentarea numerelor cu semn (bitul 15); TF = trip flag; TF = 1 determin UCP s lucreze n mod pas cu pas (single step), n care se genereaz o ntrerupere intern dup fiecare execuie a unei instruciuni; IF = masca pentru ntreruperi externe (IF = 1 => validarea ntreruperilor; IF = 0 => invalidarea ntreruperilor); DF = direction flag- indic direcia deplasrii adresei la operaiile cu iruri de date (DF = 1 => autodecrementare, DF = 0 => autoincrementare, dup o operaie elementar); OF = V (depire). Registrele de adrese, indicatori, pointeri i index (se utilizeaz numai pe 16 bii): SP (pointer stiv), BP (pointer adres de baz), SI (index surs), DI (index destinaie). Utilizrile implicite ale registrelor sunt: AX: utilizat pentru operaii aritmetice nmulire, mprire pe 16 bii i pentru operaii de I/E pe 16 bii; n mod analog AL este utilizat pe 8 bii i n plus pentru aritmetic zecimal i conversii de cod; AH este utilizat la nmuliri i mpriri pe 8 bii; BX: utilizat n conversii de cod i ca registru de baz de adrese; CX: utilizat n operaii cu iruri, cu rol de contor de cicluri; CL: utilizat n deplasri (stnga, dreapta cu un numr de pai dai ca parametru de valoare lui CL); DX: utilizat la nmuliri, mpriri pe 16 bii i ca registru de adresare indirect la porile de intrare ieire (I/E); SP,BP: utilizat implicit n toate operaiile cu stiva; SI, DI: utilizate n operaiile asupra irurilor de date, SI conine adresa sursei iar DI adresa destinaiei. Registrele de uz special sunt cele destinate adresrii segmentate: CS, DS, SS, ES = sunt registre segment care conin adresele de baz ale segmentelor logice de cod, date, stiv i extrasegment; IP = Instruction Printer = contor de program, cu 16 bii. Valoare ce reprezint adresa relativ (offset-ul) a instruciunii curente n segmentul de cod (relativ la CS). n cazul unei instruciuni de salt, IP este salvat n vrful stivei (mpreun cu CS, deci saltul este inter-segment) i apoi ncrcat cu adresa relativ n segmentul de cod a instruciunii int. ntre registre de adrese, indicatori, pointeri i index i registre de uz special exist anumite relaii n funcionarea microprocesorului 8086. Segmentul de date are ca registru segment registrul DS i ca registru pointer implicit, registrul DX. Relaiile ntre registrele microprocesorului 8086 sunt prezentate n figura 2.1. 20

POINTER STIVA (SP) POINTER ADR. BAZA (BP) INDEX SURS| (SI) INDEX DESTINAIE (DI) COD SEGMENT (CS) DATE SEGMENT (DS) STIV| SEGMENT (SS) EXTRA SEGMENT (ES) POINTER INSTRUCIUNE (IP) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF

Registre de adrese (indicatori, printer, index)

Registre segment pentru operaii auxiliare cu datele

Numrtor instruciuni

F

Figura 2.1. Relaia ntre registrele microprocesorului 8086.

2.2.

Instruciunile microprocesorului 8086

Microprocesorul 8086 are un set complex de instruciuni. Mnemonicile utilizate sunt prezentate n tabelul 2.1. TABELUL 2.1. CMPSB AAA CMPSW AAD CWD AAM DAA AAS DAS ADC DEC ADD DIV AND HLT CALL IDIV CBW IMUL CLC IN CLD INC CLI INT CMC INTO CMP IRET JA

JAE JB JBE JC JCXZ JE JG JGE JL JLE JMP JNA JNAE JNB

JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE

JPO JS JZ LAHF LDS LEA LES LODSB LODSW LOOP LOOPE LOOPNE LOOPNZ LOOPZ

MOV MOVSB MOVSW MUL NEG NOP NOT OR OUT POP POPA POPF PUSH PUSHA PUSHF RCL

RCR REP REPE REPNE REPNZ REPZ RET RETF ROL ROR SAHF SAL SAR SBB

SCASB SCASW SHL SHR STC STD STI STOSB STOSW SUB TEST XCHG XLATB XOR

Semnificaia acestor mnemonici va fi prezentat pe scurt, n continuare. 21

AAA - ASCII adjust for addition (ajustare ASCII pentru adunare) Indicatori afectai: AF, CF Descriere: Dac cei mai puin semnificativi 4 bii ai lui AL sunt mai mari dect 9 sau dac carry auxiliar este 1, atunci adun 6 la AL i 1 la AH. AF i CF sunt actualizai. AAD - ASCII adjust for division (ajustare ASCII pentru mprire) Indicatori afectai: PF,SF,ZF Descriere: Octetul semnificativ a lui AH este nmulit cu 10 i adunat la AL. AAM - ASCII adjust for multiply (ajustare ASCII pentru nmulire) Indicatori afectai: PF,SF,ZF Descriere: Dac jumtatea mai puin semnificativ a lui AL este mai mic de 9 sau dac (AF)=1 atunci se scade 6 din AL si 1 din AH. Indicatorii (AF) si (CF) devin 1. Vechea valoare a lui AL este nlocuit de un octet n care jumtatea superioar este 0 iar jumtatea inferioar este un numr creat de scderea anterioar. AAS - ASCII adjust for subtraction (ajustare ASCII pentru scdere) Indicatori afectai: AF,CF Descriere: Dac jumtatea mai puin semnificativ a lui AL este mai mic de 9 sau dac (AF)=1 atunci se scade 6 din AL i 1 din AH. Indicatorii (AF) si (CF) devin 1. Vechea valoare a lui AL este nlocuit de un octet n care jumtatea superioar este 0 iar jumtatea inferioar este un numr creat de scderea anterioar. ADC - add with carry (adun cu carry) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Suma celor doi operanzi i a lui carry este memorat n operandul destinaie (stnga). ADD addition (adunare) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Suma celor doi operanzi este memorat n operandul destinaie (stnga) AND - logic and (i logic) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Se realizeaz i logic ntre cei doi operanzi, rezultatul va avea 1 in poziiile n care ambii operanzi au 1, restul fiind 0. Rezultatul este memorat la operandul din stnga. Carry i overflow sunt pui pe 0. CALL - call a procedure (apel de procedur) Indicatori afectai: niciunul Descriere: Dac este un apel intersegmente, stiva este decrementat cu 2 si continutul lui CS este salvat n ea. CS va fi umplut cu al doilea cuvnt al dublului cuvnt de adresare. Apoi se salveaz n stiv, n acelai mod, i coninutul lui IP. Ultimul pas este de a nlocui coninutul lui IP cu offset-ul adresei de destinaie, adic offset-ul primei instruciuni din procedura. Un apel n cadrul aceluiai segment sau grup are numai paii 2,3 si 4. CBW - convert byte to word (convertete octet la cuvnt) Indicatori afectai: niciunul Descriere: Dac AL e mai mic dect 80h, atunci AH devine 0. Altfel, AH este setat la 0ffh. Este echivalent cu a replica bitul 7 a lui AL la AH. 22

CLC - clear carry flag (terge indicatorul carry) Indicatori afectai: CF Descriere: Indicatorul carry este pus la zero. CLD - clear direction flag (terge indicatorul direcie) Indicatori afectai: DF Descriere: Indicatorul direcie este pus la zero. CLI - clear interrupt flag (terge indicatorul ntrerupere) Indicatori afectai: IF Descriere: Indicatorul ntrerupere este ters. CMC - complement carry flag (complementeaz indicatorul carry) Indicatori afectai: CF Descriere: Dac carry este 0, el devine 1; dac este 1 devine 0. CMP - compare two operands (compar doi operanzi) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Operandul sursa (stnga) este sczut din operandul destinaie (dreapta). Indicatorii sunt afectai dar operanzii nu. CMPS - compare byte string, compare word string (compar ir de octet, compar ir de cuvnt) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Operandul din dreapta, utiliznd DI ca registru index este sczut din operandul din dreapta, care utilizeaz registrul SI ca index. Sunt afectai numai indicatorii. DI i SI sunt incrementate dac indicatorul de direcie este 0, i decrementate dac e 1. Incrementul este 1 pentru ir de octei i 2 pentru cel de cuvinte. CWD - convert word to doubleword (convertete cuvnt la dublucuvnt) Indicatori afectai: niciunul Descriere: Cel mai semnificativ bit din AX este replicat n DX. DAA - decimal adjust for addition (ajustare zecimal pentru adunare) Indicatori afectai: AF,CF,PF,SF,ZF Descriere: Daca cei mai puin semnificativi (4) bii a lui AL sunt mai mari dect 9 sau dac carry auxiliar este 1 , atunci adun 6 la AL si AF devine 1. Dac AL este mai mare dect 9fh sau carry este 1 atunci adun 60h la AL i seteaz CF. DAS - decimal adjust for subtraction (ajustare zecimal pentru scdere) Indicatori afectai: AF,CF,PF,SF,ZF Descriere: Dac cei mai puin semnificativi (4) bii a lui AL sunt mai mari dect 9 sau daca carry auxiliar este 1, atunci scade 6 din AL si AF devine 1. Dac AL este mai mare dect 9fh sau carry este 1 atunci scade 60h din AL i seteaz CF. DEC - decrement destination by one (decrementeaz destinaia cu unu) Indicatori afectai: AF,OF,PF,SF,ZF Descriere: Operandul specificat este redus cu 1. DIV - division, unsigned (mprire, fr semn) Indicatori afectai: rezultatele indicatorilor nu sunt valide Descriere: Dac rezultatul mpririi e o valoare care nu poate fi pstrat n registrul corespunztor, se genereaz o ntrerupere de nivel 0. Indicatorii sunt pui n stiv, IF si TF devin 0, CS este de asemenea pus n stiv, fiind apoi umplut cu valoarea de la adresa 2. i IP curent este salvat i apoi ncrcat cu valoarea de la adresa 0. Aceast secven include un apel lung la rutina de ntreruperi ale crui segment i offset sunt memorate la locaiile 2 i 0. Dac 23

rezultatul ncape atunci ctul este memorat n AL sau AX (pentru operaii pe cuvnt) i respectiv restul n AH sau DX. ESC - escape Indicatori afectai: nici unul Descriere: Instruciunea ESC furnizeaz un mecanism prin care alte procesoare pot primi instruciuni de la 8086 i utilizeaz modul de adresare a lui 8086. Procesorul 8086 nu are alt operaie pentru ESC dect de a accesa un operand din memorie i de a-l plasa pe magistral. HLT - halt Indicatori afectai: nici unul Descriere: Instruciunea HLT determina procesorul 8086 s intre n starea halt. Starea halt este tears prin ntrerupere extern valid sau reset. IDIV - integer division, signed (mprire ntreag, cu semn) Indicatori afectai: AF,CF,OF,PF,SF,ZF dar sunt toi nedefinii Descriere: Dac rezultatul mpririi e o valoare care nu poate fi pstrat n registrul corespunzator, se genereaz o ntrerupere de nivel 0. Indicatorii sunt pui n stiv, IF i TF devin 0, CS este de asemenea pus n stiv, fiind apoi umplut cu valoarea de la adresa 2. i IP curent este salvat i apoi ncrcat cu valoarea de la adresa 0. Aceast secven include un apel lung la rutina de ntreruperi ale crui segment i offset sunt memorate la locaiile 2 si 0. Dac rezultatul ncape atunci ctul este memorat n AL sau AX (pentru operaii pe cuvnt) i respectiv restul n AH sau DX. IMUL - integer multiply accumulator by register-or-memory, signed (nmulire ntreag ntre acumulator i registru sau memorie, cu semn) Indicatori afectai: CF,OF Descriere: Acumulatorul (AL pentru octet, AX pentru cuvnt) e nmulit prin operandul specificat. Dac jumtatea superioar a rezultatului este extensia de semn a jumtii inferioare, indicatorii carry i overflow sunt teri, altfel sunt 1. IN - input byte and input word (input de octet i input de cuvnt) Indicatori afectai: nici unul Descriere: Coninutul acumulatorului este nlocuit de coninutul portului designat. Destinaia pentru input trebuie s fie AX sau AL, i trebuie specificat cu scopul comunicrii asamblorului a tipului intrrii. Numele portului trebuie s fie o valoare imediat ntre 0 i 255 sau numele registrului DX care trebuie umplut mai devreme cu locaia portului. INC - increment destination by one (incrementeaz destinaia cu unu) Indicatori afectai: AF,OF,PF,SF,ZF Descriere: Operandul specificat este adunat cu 1. Nu se genereaz carry. INT interrupt (ntrerupere) Indicatori afectai: IF,TF Descriere: Pointer-ul de stiv este decrementat cu 2 i indicatorii sunt salvai n stiv. Indicatorii de ntrerupere i capcan sunt pui la 0, din nou SP e decrementat 2 iar coninutul lui CS este salvat. CS este umplut cu partea semnificativ a vectorului de ntreruperi (dublucuvnt), deci cu segmentul de baz al rutinei de ntreruperi pentru acest tip de ntreruperi. SP e din nou decrementat cu doi, de data asta se salveaz IP n stiv. IP va fi umplut cu cuvntul mai puin semnificativ al vectorului de ntreruperi, locatat la adresa 24

absolut TYPE*4. Astfel se completeaz un apel intersegment la procedura care prelucreaz acest tip de ntrerupere (vezi de asemenea PUSHF, INTO, IRET). INTO - interrupt if overflow (ntrerupere dac exist overflow) Indicatori afectai: nici unul Descriere: Dac exista overflow pointer-ul de stiv este decrementat cu 2 i indicatorii sunt salvai n stiv. Indicatorii de ntrerupere i capcan sunt pui la 0, din nou SP e decrementat 2 iar coninutul lui CS este salvat. CS este umplut cu partea semnificativ a vectorului de ntreruperi (dublucuvnt), deci cu segmentul de baz al rutinei de ntreruperi pentru tipul 4 de ntreruperi. SP e din nou decrementat cu doi, de data asta se salveaz IP n stiv. IP va fi umplut cu cuvntul mai puin semnificativ al vectorului de ntreruperi, locatat la adresa absolut 16(10h). Astfel se completeaz un apel intersegment la procedura care prelucreaz acest tip de ntrerupere (vezi de asemenea INT, IRET, PUSHF). IRET - interrupt return (retur din ntrerupere) Indicatori afectai: toi Descriere: IP este nscris cu coninutul vrfului stivei. Ca urmare pointer-ul de stiva este incrementat cu 2, i cuvntul din capul stivei este introdus n CS. Astfel se ntoarce controlul n punctul n care a fost ntlnit ntreruperea. SP este din nou incrementat cu 2 i se refac indicatorii utiliznd cuvntul din vrful stivei. SP se incrementeaz din nou. JA/JNBE - jump if not below nor equal, or jump if above (salt dac nu e mai mic nici egal, sau salt la mai mare) Indicatori afectai: nici unul Descriere: Dac att indicatorul de carry ct i cel de zero sunt 0 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Daca CF sau ZF sunt 1 nu rezult nici un salt. JAE/JNB - jump if not below, or jump if above or equal(salt dac nu e mai mic sau salt dac e mai mare sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorul de carry este 0 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac CF este 1 nu rezult nici un salt. JNAE/JB - jump if below, or jump if not above nor equal(salt daca e mai mic, sau salt daca nu e mai mare nici egal) JC - jump if carry(salt dac exist carry) Indicatori afectai: nici unul Descriere: Dac indicatorul de carry este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta inta este adunat la IP, efectund un transfer. Dac CF este 0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNA/JBE - jump if below or equal, or jump if not above (salt dac e mai mic sau egal, sau salt dac nu e mai mare) Indicatori afectai: nici unul Descriere: Dac indicatorul de carry sau zero sunt 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac CF i ZF sunt 0 nu rezult nici un salt. 25

Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JCXZ - jump if CX is zero (salt daca CX este zero) Indicatori afectai: nici unul Descriere: Dac registrul numrator CX este 0 atunci distana de la sfritul acestei instruciuni pn la eticheta inta este adunat la IP, efectund un transfer. Dac CX este 1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JE/JZ - jump if equal, jump if zero(salt daca e egal, salt la zero) Indicatori afectai: nici unul Descriere: Dac ultima operaie care a afectat indicatorul zero a dat un rezultat zero atunci (ZF) va fi 1. Dac (ZF)=1 atunci distana de sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac ZF este 0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octeti fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNLE/JG - jump if not less nor equal, or jump if greater (salt daca nu e mai mic sau egal, sau salt la mai mare) Indicatori afectai: nici unul Descriere : Dac indicatorul zero este 0 i indicatorii sign i overflow sunt egali atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac ZF este 1 sau (SF)(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNL/JGE - jump if not less, or jump if greater or equal (salt dac nu e mai mic, sau salt la mai mare sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorii sign si overflow sunt egali atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (SF)(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JL/JNGE - jump on less, or jump on not greater nor equal (salt la mai mic, sau salt dac nu e mai mare sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorii sign i overflow nu sunt egali (asta nseamn c (SF) sau-exclusiv cu (OF) este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (SF)=(OF) nu rezult nici un salt. 26

Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JLE/JNG - jump if less or equal, or jump if not greater (salt daca e mai mic sau egal, sau salt dac nu e mai mare Indicatori afectai: nici unul Descriere: Dac indicatorii sign i overflow nu sunt egali (asta inseamna ca (SF) sau-exclusiv cu (OF) este 1 sau dac indicatorul zero e setat atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JMP - jump (salt) Indicatori afectai: niciunul Descriere: IP este nlocuit de offset-ul etichetei int n toate salturile intersegment, acelai lucru i pentru salturile indirecte n cadrul aceluiai segment. Dac este un salt direct n acelai segment atunci distana de la sfritul instruciunii pn la eticheta int e adunat la IP. Salturile inter-segment nlocuiesc prima data coninutul lui CS, utiliznd cuvntul urmtor instruciunii (direct) sau utiliznd cuvntul urmtor al adresei indicate (indirect). JNA/JBE - jump if below or equal, or jump if not above (salt daca e mai mic sau egal, sau salt dac nu e mai mare Indicatori afectai: nici unul Descriere: Dac indicatorul carry sau zero este setat atunci distana de la sfritul acestei instructiuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (CF)=0 i (ZF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNAE/JB - jump if below, or jump if not above nor equal (salt dac e mai mic, sau salt dac nu e mai mare nici egal) Indicatori afectai: nici unul Descriere: Dac indicatorul carry este setat atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (CF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNB/JAE - jump if not below, or jump if above or equal (salt daca nu e mai mic, sau salt dac e mai mare sau egal) JNC - jump if no carry (salt dac nu e carry) Indicatori afectai: nici unul Descriere: Dac indicatorul carry este zero atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (CF)=1 nu rezult nici un salt.

27

Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNBE - jump if not below nor equal (salt dac nu e mai mic nici egal) Indicatori afectai: nici unul Descriere: Dac nici indicatorul carry nici zero nu sunt setate atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (CF)=1 sau (ZF)=1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNE/JNZ - jump if not equal, or jump if not zero (salt daca nu e egal, sau salt daca nu e zero) Indicatori afectai: nici unul Descriere: Dac indicatorul zero nu e setat atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (ZF)=1 nu rezult nici un salt. Observatie: Eticheta int trebuie sa fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNG/JLE - jump if not greater, or jump if less or equal (salt dac nu e mai mare, sau salt dac e mai mic sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorul zero e setat, sau dac indicatorul sign nu e egal cu indicatorul overflow atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (ZF)=0 i (SF)=(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNGE/JL - jump if less, or jump if not greater nor equal (salt daca e mai mic, sau salt daca nu e mai mare sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorul sign nu e egal cu indicatorul overflow atunci distana de la sfritul acestei instruciuni pna la eticheta int este adunat la IP, efectund un transfer. Dac (SF)=(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JGE/JNL - jump if not less, or jump if greater or equal (salt daca nu e mai mic, sau salt dac e mai mare sau egal) Indicatori afectai: nici unul Descriere: Dac indicatorul sign e egal cu indicatorul overflow atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (SF)(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. 28

JG/JNLE - jump if not less nor equal, or jump if greater (salt dac nu e mai mic nici egal, sau salt dac e mai mare) Indicatori afectai: nici unul Descriere: Dac indicatorul zero e resetat i indicatorul sign e egal cu indicatorul overflow atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (ZF)=1 sau (SF)(OF) nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. Comparaiile i deci implicit relaiile (mai mici, mai mari) se refer la dou valori fr semn. JNO - jump if not overflow (salt dac nu exist overflow) Indicatori afectai: nici unul Descriere: Dac indicatorul overflow este 0 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (OF)=1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. JNS - jump on not sign, jump if positive (salt dac nu exista sign, salt dac e valoare pozitiv) Indicatori afectai: nici unul Descriere: Dac indicatorul sign este 0 atunci distana de la sfritul acestei instruciuni pna la eticheta int este adunat la IP, efectund un transfer. Dac (SF)=1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. JNZ/JNE - jump on not zero, jump if not equal (salt dac nu exist zero, salt dac nu e egalitate) Indicatori afectai: nici unul Descriere: Dac indicatorul zero este 0 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (ZF)=1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. JO - jump on overflow (salt dac exist overflow) Indicatori afectai: nici unul Descriere: Dac indicatorul overflow este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (OF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie in intervalul -128 la +127 octei fa de aceast instruciune. JP/JPE - jump on parity, or jump if parity even (salt dac exista parity, sau dac paritatea e par) Indicatori afectai: nici unul Descriere: Dac indicatorul parity este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (PF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. 29

JNP/JPO - jump on no parity, or jump if parity odd (salt dac nu exist parity, sau dac paritatea e impar) Indicatori afectai: nici unul Descriere: Dac indicatorul parity este 0 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (PF)=1 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. JS - jump on sign (salt dac exist sign) Indicatori afectai: nici unul Descriere: Dac indicatorul sign este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (SF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceasta instruciune. JZ/JE - jump if equal, jump if zero (salt dac exist egalitate, salt dac este zero) Indicatori afectai: nici unul Descriere: Dac indicatorul zero este 1 atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un transfer. Dac (ZF)=0 nu rezult nici un salt. Observaie: Eticheta int trebuie s fie n intervalul -128 la +127 octei fa de aceast instruciune. LAHF - load AH from flags (ncarc AH cu indicatorii de condiie) Indicatori afectai: nici unul Descriere: Biii registrului AH sunt umplui dup cum urmeaz: indicatorul sign umple bitul 7; indicatorul zero bitul 6; indicatorul carry auxiliar bitul 4; indicatorul parity bitul 2; indicatorul carry bitul 0. Biii 1, 3 i 5 a lui AH rmn nedeterminai. LDS - load data segment (ncarc segmentul de date) Indicatori afectai: nici unul Descriere: 1) Coninutul registrului specificat este nlocuit de partea mai puin semnificativ a cuvntului adresat de operandul (de tip dublu cuvnt) al instruciunii. LEA - load effective address (ncarc adresa efectiv) Indicatori afectai: nici unul Descriere: Coninutul registrului specificat este nlocuit de offset-ul variabilei indicate sau a etichetei sau a expresiei de tip adres. LES - load extra-segment register (ncarc registrul de segment auxiliar) Indicatori afectai: nici unul Descriere: 1) Coninutul registrului specificat este nlocuit de partea mai puin semnificativ a cuvntului adresat de operandul (de tip dublu cuvnt) al instruciunii. (REG)=(EA) 2) Coninutul registrului ES este nlocuit de partea semnificativ a cuvntului adresat de operandul (de tip dublu cuvnt) al instruciunii. (ES)=(EA+2) LOCK Indicatori afectai: nici unul Descriere: Orice instruciune poate fi precedat de un octet special de tip "lock". El face ca procesorul s serveasc semnalul de "bus-lock" (magistral ocupat) 30

pe timpul de execuie al instruciunii. In sistemele cu procesoare multiple care folosesc n comun resursele este necesar s se asigure un mecanism de control al accesului la aceste resurse. Se presupune c hardware-ul extern, dup recepia acestui semnal va asigura accesul la magistrala pentru ali "masteri" n timpul perioadei de aseriune a lui "bus-lock". LODS - load byte or word string (ncarc ir de octei sau cuvinte) Indicatori afectai: nici unul Descriere: Octetul surs (sau cuvntul) este ncrcat in AL (sau AX). Indexul surs este incrementat cu 1 (sau 2 pentru iruri de cuvinte) dac indicatorul direction este 0; altfel SI e decrementat cu 1 (sau 2). LOOP - loop, or iterate instruction sequence until count complete (bucla, sau secventa de iterare a instruciunilor pn la epuizarea numrtorului) Indicatori afectai: nici unul Descriere: Registrul numrtor (CX) este decrementat cu 1. Dac noul CX nu e 0, atunci distana de la sfritul acestei instruciuni pn la eticheta inta este adunat la IP, efectund un salt. Dac CX=0 , nu apare nici un salt. LOOPE/LOOPZ - loop on equal, or loop on zero (bucla la egal, sau bucla la zero) Indicatori afectai: nici unul Descriere: Registrul numrtor (CX) este decrementat cu 1. Dac noul CX nu e 0 i indicatorul zero este 1, atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un salt. Dac CX=0 sau dac (ZF)=0 nu apare nici un salt. LOOPNE/LOOPNZ - loop on not equal, or loop on not zero (bucla la neegal, sau bucla la nezero) Indicatori afectai: nici unul Descriere: Registrul numrtor (CX) este decrementat cu 1. Dac noul CX nu e 0 i indicatorul zero este 0, atunci distana de la sfritul acestei instruciuni pn la eticheta int este adunat la IP, efectund un salt. Dac CX=0 sau dac (ZF)=1 nu apare nici un salt. MOV move (mut) Indicatori afectai: nici unul Descriere: Exista 7 tipuri distincte de instructiuni de transfer. Fiecare tip are utilizari multiple depinznd de tipul datelor de mutat i de locaia acestor date. TIP 1: n memorie de la acumulator TIP 2: n acumulator din memorie TIP 3: n registru de segment din operand de tip memorie/registru TIP 4: n registru/memorie din registru segment TIP 5: n registru din registru TIP 6: n registru din data imediat TIP 7: n memorie / registru din data imediat MOVS - move byte string or move word string (mut ir de octei sau mut ir de cuvinte) Indicatori afectai: nici unul Descriere: irul surs al carui offset se gsete n SI este ncrcat n locaia din segmentul auxiliar al crui offset este n DI. SI i DI sunt amndou incrementate, dac indicatorul direction este 0, sau amndou decrementate dac (DF)=1. Incrementul sau decrementul e 1 pentru iruri de octei i 2 pentru iruri de cuvinte. 31

NEG - negate, or form 2's complement (neag sau formeaz complementul fa de 2) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Operandul specificat este sczut din 0FFH pentru octei sau 0FFFFH pentru cuvinte. Se adaug 1 i rezultatul este memorat n operandul dat. NOP - no operation (nici o operaie) Indicatori afectati: nici unul Descriere: NOP nu determina nici o operaie dar ine 3 perioade de ceas. Urmtoarea instruciune din secven este apoi executat. NOT - not, or form 1's complement (nu, sau formeaz complementul fa de 1) Indicatori afectai: nici unul Descriere: Operandul specificat este sczut din 0FFH pentru octei sau 0FFFFH pentru cuvinte. Rezultatul este memorat n operandul dat. OR - or, inclusive (sau, inclusive) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Fiecare poziie de bit n operandul destinaie (stnga) devine 1, pn cnd att el ct i bitul corespunztor din operandul surs (dreapta) sunt 0. Indicatorii carry i overflow devin 0. OUT - output byte and output word (output de octet i output de cuvint) Indicatori afectai: nici unul Descriere: Coninutul portului designat este nlocuit de coninutul acumulatorului. POP - pop word off stack into destination (terge un cuvnt din stiv i pune-l n destinaie) Indicatori afectai: nici unul Descriere: POP transfer un cuvnt de la locaia din stiva adresat de SP la operandul destinaie i incrementeaza SP cu 2. POPF - pop flags off stack (reface indicatorii din stiva) Indicatori afectai: toi Descriere: Indicatorii = ((SP)+1:(SP)), (SP)=(SP)+2 Registrul de indicatori sunt umplui cu poziiile corespunztoare de bit din cuvntul din vrful stivei: overflow = bit 11, direction = bit 10, interrupt = bit 9, trap = bit 8, sign = bit 7, zero = bit 6, auxiliary carry = bit 4, parity = bit 2, carry = bit 0. SP este apoi incrementat cu 2. PUSH - push word onto stack (salveaz cuvnt n stiv) Indicatori afectai: nici unul Descriere: 1) pointerul de stiv este decrementat cu 2, (SP)=(SP)-2 2) coninutul destinatiei este pus n cuvntul din vrful stivei PUSHF - push flags on stack (salveaz indicatorii n stiv) Indicatori afectai: nici unul Descriere: SP este decrementat cu 2, apoi indicatorii nlocuiesc biii corespunztori ai cuvntului din vrful stivei (vezi POPF). (SP)=(SP)-2, ((SP)+1:(SP))=indicatorii RCL - rotate left through carry (rotete stnga cu carry) Indicatori afectai: CF,OF Descriere: Operandul specificat ca destinaie (stnga) e rotit la stnga mpreun cu carry de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Rotaia continu pn cnd COUNT=0. CF este pstrat i e rotit n 32

bitul 0 al destinaiei. Bitul cel mai semnificativ al destinaiei e rotit n CF. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. RCR - rotate right through carry (rotete dreapta cu carry) Indicatori afectai: CF,OF Descriere: Operandul specificat ca destinaie (stnga) e rotit la dreapta mpreun cu carry de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Rotaia continu pn cnd COUNT=0. CF este pstrat i e rotit n bitul cel mai semnificativ al destinaiei. Bitul 0 e rotit in CF. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. REP/REPZ/REPE/REPNZ - repeat string operation (repet operaiile pe iruri) Indicatori afectai: depind de operaiile pe ir realizate Descriere: Operaia pe ir specificat este realizat de un numr de ori, pn cnd CX devine 0. CX este decrementat cu 1 dup fiecare operaie. Operaiile de comparare i scanare a irurilor determin o ieire din bucla dac indicatorul zero nu e egal cu valoarea bitului 0 al acestui octet de instruciune. RET - return from procedure (ntoarcere din procedura) Indicatori afectai: nici unul Descriere: Pointerul de instruciune este nlocuit de cuvntul din vrful stivei. SP este incrementat cu 2. Pentru ntoarcerea din alt segment, registrul CS este nlocuit cu cuvntul acum n vrful stivei i SP este din nou incrementat cu 2. Dac s-a specificat o valoare imediat n instruciunea RET aceast valoare este adunat la SP. ROL - rotate left (rotete stnga) Indicatori afectai: CF,OF Descriere: Operandul specificat ca destinaie (stnga) e rotit la stnga mpreun cu carry de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Rotaia continu pn cnd COUNT=0. CF este pierdut. Bitul cel mai semnificativ al destinaiei e rotit n CF. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. ROR - rotate right (rotete dreapta) Indicatori afectai: CF,OF Descriere: Operandul specificat ca destinaie (stnga) e rotit la dreapta mpreun cu carry de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Rotaia continu pn cnd COUNT=0. CF este pierdut. Bitul cel mai puin semnificativ al destinaiei e rotit n CF. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. SAHF Indicatori afectai: AF,CF,PF,SF,ZF Descriere: Cei cinci indicatori specificai sunt nlocuii de biii specifici din AH. (SF)=bit 7, (ZF)=bit 6, (AF)=bit 4, (PF)=bit 2, (CF)=bit 0;(SF):(ZF):X:(AF):X:(PF):X:(CF)=(AH) 33

SHL/SAL - shift arithmetic left and shift logic left (mut la stnga aritmetic, i mut la stnga logic) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Operandul specificat ca destinaie (stnga) e deplasat la stnga de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Deplasarea continu pn cnd COUNT=0. CF este pierdut. Bitul cel mai semnificativ al destinaiei e deplasat n CF. Bitul cel mai puin semnificativ e umplut cu 0. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. SAR - shift arithmetic right (mut la dreapta aritmetic) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Operandul specificat ca destinaie (stnga) e deplasat la dreapta de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Deplasarea continu pn cnd COUNT=0. CF este pierdut. Bitul cel mai puin semnificativ al destinaiei e deplasat n CF. Bitul cel semificativ e umplut cu 0. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. SBB - subtract with borrow (scade cu mprumut) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Operandul surs este sczut din operandul destinaie (stnga). Dac indicatorul carry era setat, se scade unu din rezultatul de mai sus. Rezultatul nlocuiete operandul destinaie original. SCAS - scan byte string or scan word string (scaneaz iruri de octei sau scaneaz iruri de cuvinte) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Elementul de ir specificat de DI n segmentul ES este sczut din valoarea existent n acumulator, operaia afectnd numai indicatorii. DI este incrementat (dac indicatorul direction este zero) sau decrementat (dac (DF)=1) cu 1 pentru octet sau 2 pentru cuvinte. SHR - shift logic right (mut la dreapta logic) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Operandul specificat ca destinaie (stnga) e deplasat la dreapta de un numr de ori (COUNT). Acest numr este sau exact 1, specificat de numrul absolut 1, sau este numrul inut n registrul CL, specificat explicit ca operand. Deplasarea continu pn cnd COUNT=0. CF este pierdut. Bitul cel mai puin semnificativ al destinaiei e deplasat n CF. Bitul cel mai semificativ e umplut cu 0. Dac COUNT=1 i cei doi bii mai semnificativi ai destinaiei au valori neegale atunci indicatorul overflow devine 1. Dac COUNT1, OF e nedefinit. STC - set carry flag (seteaz indicatorul carry) Indicatori afectai: CF Descriere: Indicatorul carry este setat la 1. STD - set direction flag (seteaz indicatorul direcie) Indicatori afectai: DF Descriere: Indicatorul direcie este setat la 1. 34

STI - set interrupt flag (seteaz indicatorul ntrerupere) Indicatori afectai: IF Descriere: Indicatorul ntrerupere este setat la 1. STOS - store byte string or store word string (memoreaz ir de octei sau ir de cuvinte) Indicatori afectai: nici unul Descriere: Octetul (sau cuvntul) din AL (sau AX) nlocuiete coninutul octetului sau cuvntului adresat de DI n ES. Apoi DI este incrementat dac indicatorul direction este 0 sau decrementat dac DF=1. Se va schimba valoarea cu 1 pentru octei i 2 pentru cuvinte. SUB - subtract (scadere) Indicatori afectai: AF,CF,OF,PF,SF,ZF Descriere: Operandul surs este sczut din operandul destinaie (stnga). Rezultatul nlocuiete operandul destinaie original. TEST - test, or logical compare (testeaz, sau compar logic) Indicatori afectai: CF,OF,PF,SF,ZF Descriere: Cei doi operanzi sunt supusi unui "i" logic pentru a afecta indicatorii dar nici unul din operanzi nu este afectat. Indicatorii carry i overflow devin 0. WAIT wait (ateapt) Indicatori afectai: nici unul Descriere: Nu se efectueaz nici o operaie. WAIT determin intrarea procesorului n starea wait dac pinul TEST nu e asignat. Starea WAIT poate fi ntrerupt de o ntrerupere extern. Cnd aceasta se ntmpl locaia de cod salvat e aceea a instruciunii WAIT, astfel nct dup ntoarcerea din ntrerupere se revine n starea wait. Starea wait este prsit cnd se furnizeaz semnalul TEST. Se reia astfel execuia i nu se permit ntreruperi pn cnd nu se intr n execuia instruciunii urmtoare. Instruciunea permite astfel procesorului s se sincronizeze cu hardware extern. XCHG exchange (schimb) Indicatori afectai: nici unul Descriere: Exist dou forme pentru instruciunea XCHG, una pentru comutarea coninuturilor acumulatorului cu acela al altor registre generale, i una pentru comutarea registrelor cu un operand de tip registru sau memorie. 1) Coninutul destinaiei e memorat temporar ntr-un registru intern de lucru (temp)=DEST ; 2) Coninutul destinaiei e nlocuit de coninutul operandului (DEST)=(SRC) 3) Coninutul anterior al destinaiei este mutat din registrul de lucru n operandul surs (SRC)=(temp) XLAT translate (translateaz) Indicatori afectai: nici unul Descriere: Coninutul acumulatorului este nlocuit de octetul din tabela. Adresa de nceput a tabelei a fost mutat n registrul BX. Coninutul original a lui AL este numrul de octei de dup adresa de start, unde trebuie gsit octetul dorit a fi translatat. El nlocuiete coninutul lui AL. XOR - exclusive or (sau exclusiv) Indicatori afectati: CF,OF,PF,SF,ZF Descriere: Fiecare poziie de bit n operandul destinaie (stnga) devine 0, dac poziiile corespunztoare din ambii operanzi sunt egale. Dac sunt neegale atunci aceea poziie de bit devine 1. Indicatorii carry i overflow devin 0. 35

2.3.

Extinderea structurii unitii centrale la familia 80x86

2.3.1. Unitatea central 80x86 din punct de vedere al programatorului Se vor discuta n acest capitol procesoarele reale 8088/8086, 80188/80186, 80286, i 80386/80486/80586/Pentium. Dintre componentele hardware ale sistemului de calcul cea mai important rmne unitatea central din punct de vedere al programrii n limbaj de asamblare. Cele mai utilizate componente ale unitii centrale sunt registrele i acestea au o importan deosebit n programarea n limbaj de asamblare. Vom prezenta n continuare, pe larg, modul de utilizare a registrelor unitii centrale. Fiecare procesor din familia 80x86 conine un set de registre. Particularitatea acestei familii de procesoare este reprezentat de faptul c un procesor conine un superset de regitrii ai procesorului precedent. Punctul de plecare l reprezint setul de registre al unitilor centrale ale procesoarelor 8088, 8086, 80188 i 80186 deoarece cele patru tipuri de procesoare au acelai tip de registre. n cele prezentate n continuare termenul de 8086 se va referi de fapt la oricare dintre aceste procesoare. Fabricantul acestor procesoare, firma INTEL, mparte registrele unitii centrale ale procesorului 8086 n trei categorii: o registre de uz general, o registre de segment, o registre cu destinaie special. Registrele de uz general sunt cele care pot aprea ca operanzi n operaiile aritmatice, logice i n instruciunile legate de acestea. Dei aceste registre sunt denumite de uz general, fiecare dintre ele se utilizeaz ntr-un anumit scop implicit dar destinaia acestora poate fi schimbat explicit de programator. Registrele segment sunt utilizate pentru accesarea unor blocuri de memorie numite segmente. Registrele de uz special au destinaii diverse. Dintre acestea, dou prezint o importan deosebit i vor fi prezentate pe scurt n continuare. 2.3.2. Registrele de uz general ale unitii centrale 8086 Unitatea central a procesorului 8086 are opt registre de uz general, de cte 16 bii fiecare, notate: ax, bx, cx, dx, si, di, bp i sp. Dei n calcule se pot folosi oricare din aceste registre, multe instruciuni lucreaz mai eficient iar altele chiar impun utilizarea unui anumit registru. Din acest motiv, denumirea de uz general dat acestor registre nu este chiar potrivit. Registrul ax (registrul Acumulator) este registrul n care au loc majoritatea calculelor aritmetice i logice. Dei operaiile aritmetice i logice pot fi efectuate i cu ajutorul altor registre, cel mai eficient este s se foloseasc registrul ax. Registrul bx (registrul Baz) are i el o destinaie special. Acest registru este folosit pentru a stoca adresa indirect (la acest procesor mai mult ca la procesoarele din familia x86). Registrul cx (registrul Contor) este utilizat de regul pentru contorizri la bucle sau pentru a stoca dimensiunea irurilor. 36

Registrul dx (registrul Date) are n general dou destinaii: el stocheaz depirile pentru anumite operaii aritmetice sau stocheaz adresa portului I/O la accesarea perifericelor. Registrele si i di (registrul Index Surs i registrul Index Destinaie) au de asemenea mai multe destinaii speciale. Registrele pot fi folosite ca pointer (indicator) la adresarea indirect a memoriei (similar cu registrul bx) sau pot fi folosite n operaiile pe iruri. Registrul bp (registrul Pointerul Indicatorul - Bazei) este similar registrului bx. El va fi n general utilizat pentru accesarea parametrilor i a variabilelor locale dintr-o procedur. Registrul sp (registrul Pointer (Indicator) Stiv) are o destinaie foarte important: el pstreaz stiva programului. n mod normal acest registru nu trebuie folosit de programator pentru calcule aritmetice. Funcionarea corect a celor mai multe programe depinde n mod esenial de utilizarea corect a acestui registru. Primele patru registre ax,bx,cx i dx ale unitii centrale 8086 pot fi folosite de asemenea ca registre pe opt bii. Aceste registre sunt denumite: al, ah, bl, bh, cl, ch, dl i dh. Denumirile se refer la partea superioar sau inferioar a registrelor pe 16 bii aa cum este prezentat n figura urmtoare.

Este de notat faptul c registrele pe 8 bii nu sunt registre independente. O modificare n registrul al, de exemplu, va modifica i registrul ax; la fel i dac va fi modificat registrul ah. Este evident c i modificarea registrului ax va duce la modificarea registrelor ah i al. Este de asemenea de remarcat faptul c modificarea registrului al nu va afecta registrul ah i invers. Registrele si, di, bp i sp sunt registre numai pe 16 bii. 2.3.3. Registrele de segment 8086 Procesorul 8086 are patru registre de segment: cs, ds, es i ss. Numele lor sunt respectiv: registrul segment de cod (Code Segment), registrul segment de date (Data Segment), registrul segment de date suplimentar (Extra Segment) i registrul segment de stiv (Stack Segment). Toate aceste registre au dimensiunea de 16 bii i ele permit selectarea blocurilor (segmentelor) din memoria principal. Un registru segment indic (conine) adresa de nceput a unui segment de memorie. Segmentul de memorie la 8086 nu poate avea o dimensiune mai mare de 65536 octei, adic are maximum 64 de Koctei. Registrul cs indic segmentul de memorie ce conine instruciunile main ce sunt executate la un moment dat. Dei un segment are dimensiunea unui segment este 37

de maximum 64 Koctei, programele pot avea dimensiuni mai mari de 64 de Koctei. Acest lucru se realizeaz prin folosirea mai multor segmente i comutarea ntre aceste segmente prin schimbarea coninutului registrului cs. Registrul ds indic n general segmentul ce conine datele globale ale programului. i aici putem face aceeai observaie, faptul c datele unui program nu trebuie s se limiteze la maximum 64 de Koctei. Registrul es indic un segment suplimentar numit extrasegment. Programele scrise pentru 8086 folosesc adesea acest registru pentru a avea acces la alte segmente atunci cnd este dificil sau imposibil s se modifice alte registre segment. Registrul ss indic segmentul unde se afl stiva 8086. Stiva reprezint locul unde 8086 stocheaz informaii importante cu privire la starea mainii, adresele de rentoarcere din subprograme, parametrii procedurilor i variabile locale. n general coninutul registrului segment de stiv nu trebuie modificat din cauz ca multe date importante ale sistemului depind de acesta. De asemenea este posibil s se stocheze date n segmentul de stiv dar acest lucru nu trebuie fcut niciodat deoarece coninutul stivei reprezint indicatoare la zone de memorie accesibil i o ncercare de a folosi stiva n alte scopuri poate crea probleme considerabile n special cnd folosii uniti centrale mai evoluate cum este, spre exemplu, 80386. 2.3.4. Registrele de uz special Unitatea central a procesorului 8086 are dou registre cu destinaie special: contorul de program ip (instruction pointer) i registrul bistabililor de condiii. Aceste registre nu pot fi accesate n acelai fel cu celelalte registre ale unitii centrale 8086. De regul unitatea central controleaz n mod direct aceste registre. Registrul ip este echivalent cu registrul ip al procesoarelor x86 el conine adresa instruciunii curente n execuie. Registrul ip este un registru pe 16 bii care indic adresa din segmentul de cod curent (cu 16 bii pot fi selectate 65536 de locaii de memorie diferite). Registrul bistabililor de condiii (sau a fanioanelor de condiii) este diferit de celelalte registre ale unitii centrale 8086 care pot memora valor de 8 sau 16 bii. Registrul bistabililor de condiii este de fapt o colecie de bistabile, fiecare dintre acestea ajutnd la determinarea strii curente a procesorului. Dei registrul bistabililor de condiii are o dimensiune de 16 bii, 8086 nu folosete dect nou dintre acetia. Patru fanioane sunt folosite n mod frecvent la programare: zero, carry, sign i overflow. Aceste fanioane mai sunt denumite i coduri de condiii. Registrul bistabililor de condiii este prezentat mai jos.

38

2.3.5. Registrele 80286 La 80286 apar modificri consistente la componentele vizibile programatorului n modul protejat. Totui nu vom discuta aici despre modul protejat la 80286 pentru c acest mod este folosit doar n cazuri speciale. Cu toate acestea se vor prezenta registrele suplimentare i bistabilii de stare ce apar n plus n caz c v vei ntlni cu acetia. n registrul bistabililor de condiii la 80286 apar trei bistabili suplimentari. Nivelul privilegiat pentru operaii I/O are doi bii (biii 12 i 13) i specific unul din cele patru nivele de privilegii posibile pentru realizarea operaiilor I/O. Aceti doi bii conin n general valoarea 00b cnd 80286 lucreaz n modul real (modul 8086 emulat). Bistabilul NT (nested task) controleaz operaiile realizate de instruciune de rentoarcere din ntrerupere (IRET). n mod normal NT este zero n programele ce lucreaz n modul real. n afar de biii suplimentari din registrul bistabililor de condiii, 80286 mai are cinci registre suplimentare folosite de sistemul de operare pentru gestionarea memoriei i a mai multor procese: the machine status word (msw), the global descriptor table register (gdtr), the local descriptor table register (ldtr), the interrupt descriptor table register (idtr) and the task register (tr). n modul protejat la procesorul 80286 poate fi accesat o memorie mai mare de un megaoctet. Datorit faptului c procesorul este depit aceast metod este rareori folosit de programatori. 2.3.6. Registrele procesoarelor 80386/80486 La procesorul 80386 a fost extins n mod semnificativ setul de registre. Acesta conine toate registrele procesorului 80286 (i implicit 8086) dar are cteva registre suplimentare i definirea registrelor existente a fost extins. Procesorul 80486 nu are registre suplimentare fa de 80386 dar are definii civa bii rmai nedefinii la 80386. Cea mai important schimbare din punct de vedere al programatorului la procesorul 80386 a fost introducerea setului de registre de 32 de bii. Registrele ax, bx, cx, dx, si, di, bp, sp, registrul bistabililor de condiii i ip sunt extinse la 32 de bii. La 80386 aceste registre se numesc eax, ebx, ecx, edx, esi, edi, ebp, esp, eflags, i eip pentru a le diferenia de varianta de 16 bii (care sunt i ele disponibile la 80386). Pe lng registrele de 32 de bii 80386 are de asemenea dou registre segment noi de 16 bii numite fs i gs care permit programatorului s acceseze simultan ase segmente de memorie diferite fr a fi necesar rencrcarea registrelor segment. Trebuie fcut observaia c la 80386 registrele de segment au rmas toate pe 16 bii. n registrul bistabililor de condiii nu s-a fcut nici o modificare dar acesta a fost extins la 32 de bii (eflag) i au fost definii biii 16 i 17. Bitul 16 este fanionul de ncepere a depanrii (RF) utilizat de registrele de depanare ale lui 80386. Bitul 17 este fanionul pentru modul virtual (VM) care semnaleaz dac procesorul lucreaz n modul virtual 86 (care simuleaz un procesor 8086) sau n modul protejat standard. Procesorul 80486 adaug un al treilea bit n registrul eflags pe poziia 18, fanionul de verificare a alinierii. mpreun cu registrul de control zero (CR0) din 80486, acest fanion foreaz o ntrerupere (abandon program) atunci cnd procesorul acceseaz o dat nealiniat (de exemplu, un cuvnt de la o adres impar sau un dublu cuvnt de la o adres care nu este multiplu de patru). 39

Procesorul 80386 are suplimentar patru registre de control CR0-CR3. Aceste registre constituie o extensie a registrului msw a lui 80286 (80386 emuleaz registrul msw a lui 80286 pentru compatibilitate dar informaiile apar n realitate n registrele CRx). La 80386 i 80486 aceste registre controleaz funcii cum ar fi gestionarea memoriei paginate, operaii de activare/dezactivare a memoriei cache (numai la 80486), operarea n mod protejat i altele. Procesoarele 80386/486 au de asemenea opt registre de depanare suplimentare. Un program de depanare cum sunt Microsoft Codeview sau Turbo Debugger poate utiliza aceste registre pentru a seta puncte de ntrerupere cnd se ncearc localizarea unei erori ntr-un program. Dei aceste registre nu sunt utilizate n programe ele sunt foarte utile n depanatoare pentru gsirea i eliminarea rapid a erorilor. n sfrit, procesoarele 80386/486 au suplimentar o serie de registre de test care testeaz funcionarea corect a procesorului cnd sistemul este pornit. Cel mai probabil Intel a pus aceste registre pentru testarea imediat dup fabricaie dar proiectanii de sistem pot folosi avantajul oferit de aceste registre la testul power-on. Pentru marea majoritate a programatorilor n limbaj de asamblare registrele suplimentare aprute la procesoarele 80386/486/Pentium nu prezint o prea mare importan. Oricum, extensia la 32 de bii i registrele extrasegment sunt destul de folositoare. Pentru programatorii de aplicaii, modelul de programare pentru procesoarele 80386/486/Pentium este cel prezentat n figura urmtoare.

2.3.7. Organizarea memoriei fizice la 80x86 ntr-un sistem de calcul Von Neumann unitatea central este conectat la memorie prin intermediul unei magistrale. Procesorul 80x86 selecteaz un anumit element de memorie prin trimiterea unui valori binare pe magistrala de adrese. Din alt punct de vedere memoria reprezint o matrice de octei. O structur de date n Pascal care este similar unei memorii va fi: Memory : array [0..MaxRAM] of byte; Valoarea de pe magistrala de adrese corespunde indexului furnizat acestei matrice. De exemplu, scrierea unei date n memorie este echivalent cu: Memory[address] := Value_to_write; 40

Citirea unei date din memorie este echivalent cu: Value_read := Memory[address]; n funcie de tipul unitii centrale numrul maxim de locaii de memorie (spaiul maxim de adresare ) este diferit. De exemplu, 80386 are o magistral cu 32 de linii de adres ceea ce nseamn c poate adresa pn la patru gigaoctei de memorie. De asemenea, nu este obligatoriu ca ntreg spaiul maxim de adresare s fie acoperit cu memorie fizic existent n sistem. Primul megabit de memorie, de la adresa zero la 0FFFFFh este special pentru 80x86. Acesta corespunde spaiului maxim adresabil la procesoarele 8088, 80186 i 80188. Cele mai multe programe DOS limiteaz dimensiunea codului i a datelor la acest domeniu. Adresele limitate la acest domeniu se numesc adrese reale dup modul real 80x86. 2.3.8. Segmentele la 80x86 Pentru a putea nelege adresarea memoriei la procesoarele 80x86 trebuie discutat mai ni mecanismul segmentrii. Mecanismul segmentrii furnizeaz un mecanism puternic de gestionare a memoriei. Acesta permite programatorilor s partiioneze programele n module care pot opera independent unul de cellalt. Segmentele furnizeaz de asemenea o cale de implementare simpl a programelor orietate pe obiecte. O alt facilitate a segmentrii este aceea c permite simplificarea utilizrii n comun a datelor de ctre dou procesoare. n concluzie segmentarea este o facilitate puternic care poate ridica ns unele probleme la realizarea programelor. Principalele probleme de care trebuie inut cont la utilizarea segmentrii sunt sistemul de operare utilizat i tipul de procesor. Dac sistemul de operare DOS impune o anumit limit i procesoarele care pot face adresarea pe 16 sau 32 de bii ridic unele probleme. Dac vom considera memoria ca un vector liniar atunci adresarea poate fi fcut prin furnizarea adresei (indexului) curente n spaiul maxim de adresare. Acest mod de adresare se numete adresare liniar. Adresarea segmentat necesit dou componente pentru a specifica o locaie de memorie: o valoare de segment i o valoare a ofsetului n segmentul respectiv. Ideal ar fi ca cele dou valori s fie independente una de cealalt. Cel mai simplu mod de a descrie adresarea segmentat este s considerm o matrice bidimensional. Valoarea segmentului furnizeaz un indice iar ofsetul cellalt indice din matrice, conform figurii urmtoare.

Adresarea memoriei prin specificarea segmentului Y i a offsetului X

41

S explicm care este avantajul unei astfel de structuri. S presupunem c se scrie un program n care este necesar o rutin care s calculeze funcia SIN(X). Vor fi necesare o serie de variabile temporare care cel mai probabil nu vor fi folosite ca variabile global ci ca variabile locale n interiorul rutinei de calcul a funcieiSIN(X). n sens larg aceasta este una din facilitile oferite de segmentare: s poat fi ataate blocuri de variabile (un segment) la o anumit seciune de cod. Dac programul creat conine un segment pentru variabilele locale ale funciei SIN, un segment pentru variabilele locale ale funciei SQRT, este imposibil ca rutina SIN s afecteze datele din segmentul de variabile SQRT aa cum s-ar putea ntmpla la adresarea liniar. ntradevr, cu procesorul 80286 i urmtoarele lucrnd n modul protejat, unitatea central poate ca o rutin s modifice accidental variabilele dintr-un segment diferit. O adres complet atunci cnd se folosete adresarea segmentat se compune din adresa de segment i adresa ofsetului (deplasamentului). O astfel de adres se scrie: segment:offset. La procesoarele 8086 pn la 80286 aceste dou valori sunt constante pe 16 bii. ncepnd cu procesorul 80386 ofsetul poate fi o constant pe 16 sau 32 de bii. Dimensiunea ofsetului limiteaz valoarea maxim a unui segment. La procesorul 8086 cu un ofset pe 16 bii, segmentul poate avea cel mult 64K (un segment poate fi mai mic dect valoarea sa maxim dar niciodat mai mare). La procesoarele 80386 i urmtoarele, ofsetul avnd 32 de bii rezult c segmentele pot avea dimensiuni maxime de patru gigaoctei. Dimensiunea segmentului este de 16 bii la toate proce


Recommended