Você está na página 1de 35

Arhitectura Calculatoarelor

Arhitectura Calculatoarelor Introducere Un calculator numeric este constituit dintr-un ansamblu de resurse fizice (hardware) i de programe de sistem (software de sistem) care asigur prelucrarea automat a informaiilor, n conformitate cu algoritmii specificai de utilizator prin programele de aplicaii (software utilizator). Arhitectura calculatorului cuprinde dou componente principale: a) arhitectura setului de instruciuni (ASI); b) implementarea mainii, cu cele dou sub - componente: organizare; hardware. Arhitectura setului de instruciuni este ceea ce trebuie s tie un programator pentru a scrie programe n limbaj de asamblare, respectiv pentru a concepe i construi un program de tip compilator, sau rutine destinate sistemului de operare. Termenul organizare include aspectele de nivel nalt ale unui proiect de calculator, ca de exemplu structura intern a UCP (unitatea central de procesare, microprocesor), structura i organizarea magistralelor, organizarea sistemului de memorie. Noiunea de hardware (resurse fizice) e utilizat pentru a ne referi la aspectele specifice ale implementrii calculatorului. Acestea includ proiectul logic de detaliu i tehnologia de realizare a mainii de calcul. 1. Reprezentarea func ional a unui calculator Un calculator poate fi descris att sub aspect funcional ct i structural. Circuitele electronice ale unui calculator recunosc i execut doar un set limitat de instruciuni elementare, codificate n form binar. Aceste instruciuni sunt doar succesiuni de bii (1 i 0) pe care procesorul le nelege - decodific i le execut. Indiferent de tipul de main, instruciunile recunoscute sunt rareori mai complicate dect [Tanenbaum99]: adun dou numere; verific dac un numr este egal cu zero; copiaz date dintr-o zon a memoriei calculatorului n alt zon. De exemplu, la procesoarele Intel din seria 80x86 codul binar al instruciunii urmtoare: 0000 0100 0000 0110 comand adunarea coninutului unui registru intern de 8 bii (numit registrul al) cu valoarea imediat 6. Adesea, cnd utilizatorul este obligat s lucreze cu valori numerice binare, se folosete reprezentarea n hexazecimal, care este mai compact i mai uor de citit. Codul, n hexazecimal, al instruciunii corespunztoare succesiunii binare de mai sus este 04 06 hex. i acest mod de scriere a instruciunilor este ns complicat pentru programator. Scrierea instruciunilor se poate realiza, la nceput, n limbaj natural, transpunndu-se apoi ntrun limbaj artificial, numit limbaj de programare. Limbajul de programare reprezint un set de instruciuni, mpreun cu regulile de organizare ale acestora ntr-un program. Totalitatea regulilor de scriere ale instruciunilor reprezint sintaxa limbajului, iar totalitatea regulilor prin care se asociaz o semnificaie instruciunilor reprezint semantica limbajului. Calculatorul poate executa numai instruciuni exprimate intern sub forma unor iruri de cifre binare. Programele n care instruciunile sunt scrise sub aceast form se numesc programe n limbaj main. Limbajul main este caracteristic fiecrui tip de calculator. Scrierea i introducerea programelor sub aceast form este dificil. Pentru simplificarea scrierii programelor, au fost create limbaje n care fiecrui cod de instruciune i s-a ataat un nume mnemonic. Acest mod de reprezentare a instruciunilor main se numete limbaj simbolic sau limbaj de asamblare. Acest limbaj permite utilizatorului s realizeze codificri simbolice ale instruciunilor i ale adreselor de memorie. Pentru a se executa un program n limbaj de asamblare, acesta trebuie translatat n prealabil n limbaj main, printr-un proces numit asamblare. Programul care se translateaz se numete program

Arhitectura Calculatoarelor

surs, iar cel rezultat n urma translatrii se numete program obiect. Operaia de translatare a programului surs n program obiect este executat de un program special numit asamblor. O instruciune n limbaj de asamblare corespunde unei instruciuni n limbaj main, deosebirea dintre ele constnd numai n modul de reprezentare. Deci, fiecare instruciune n limbaj de asamblare este translatat ntr-o singur instruciune n limbaj main. Un limbaj de asamblare este specific unui calculator, astfel nct trebuie s secunoasc instruciunile i organizarea intern a acelui calculator. Din acest motiv, s-au elaborat limbaje pentru programe care se pot executa pe orice calculator. Acestea sunt limbaje orientate pe probleme sau limbaje de nivel nalt, spre deosebire de limbajele de asamblare, care sunt limbaje orientate pe calculator sau limbaje de nivel sczut. Asemenea limbaje de nivel nalt sunt Pascal, C, LISP, PROLOG etc. Unei instruciuni ntr-un limbaj de nivel nalt i corespunde o succesiune de instruciuni n limbaj main. Translatarea n limbajul main se poate realiza cu ajutorul unui compilator, care genereaz din programul surs un program executabil, acesta fiind executat dup ce ntregul program a fost compilat. O alt posibilitate este utilizarea unui interpretor, care translateaz fiecare instruciune n limbajul de nivel nalt ntr-o succesiune de instruciuni main, acestea fiind executate imediat. n acest caz nu se genereaz un program executabil. Viteza de execuie este ns redus, deoarece fiecare instruciune trebuie interpretat chiar dac ea este executat n mod repetat. Uneori este mai convenabil s se considere c exist un calculator ipotetic sau o main virtual, a crui limbaj main este un anumit limbaj de nivel nalt. Un asemenea calculator ar executa direct instruciunile limbajului de nivel nalt, fr a fi necesar utilizarea unui translator (compilator) sau interpretor. Chiar dac implementarea unei maini virtuale care s lucreze direct cu un limbaj de nivel nalt ar fi prea costisitoare, se pot scrie programe pentru aceast main, deoarece aceste programe pot fi translatate sau interpretate cu un program care poate fi executat direct de calculatorul existent. Modelul unui calculator numeric Un model posibil al unui calculator numeric modern reprezint o ierarhie de maini virtuale pe mai multe nivele (Figura 1.1).

Figura 1.1 - Ierarhia de nivele a unui calculator modern Nivelul 0, numit nivelul logicii digitale, este reprezentat de componentele hardware ale calculatorului (maina fizic). Circuitele acestui nivel execut instruciunile main ale nivelului 1. Elementele de baz ale acestor circuite sunt porile logice, fiecare poart fiind format la rndul ei dintr-un numr de

Arhitectura Calculatoarelor

tranzistoare. O poart logic are una sau mai multe intrri digitale (semnale reprezentnd 0 logic sau 1 logic), i are ca ieire o funcie simpl a acestor intrri, de exemplu I logic, SAU logic. Nivelul 1, numit nivelul de microprogram, interpreteaz instruciunile nivelului 2, pentru fiecare instruciune a acestui nivel existnd cte un microprogram. Fiecare microprogram definete n mod implicit un limbaj de nivel 2 i o main virtual. De obicei exist multe similariti ntre mainile virtuale de nivel 2, chiar i n cazul calculatoarelor diferiilor productori. Acest nivel se numete nivelul mainii convenionale (Hardware abstraction layer HAL?). Atunci cnd se descrie setul de instruciuni al unui calculator, se descrie de fapt maina virtual de nivel 2, i nu maina real de nivel 1. Sunt descrise deci instruciunile interpretate de ctre microprogram, i nu instruciunile executate direct prin hardware. De menionat c la anumite calculatoare nivelul de microprogram lipsete. La aceste calculatoare, instruciunile mainii convenionale sunt executate direct de circuitele electronice ale nivelului 0. Nivelul 3 este de obicei un nivel hibrid (Tanenbaum), deoarece multe din instruciunile limbajului su sunt prezente n cadrul instruciunilor nivelului 2. Exist n plus un set de noi instruciuni, o organizare diferit a memoriei, posibilitatea de execuie a mai multor programe n paralel i alte faciliti. Noile faciliti adugate la nivelul 3 sunt realizate cu ajutorul unui interpretor, numit sistem de operare, iar instruciunile identice cu cele ale nivelului 2 sunt executate direct prin microprogram. Nivelul 3 este numit nivelul sistemului de operare. Un sistem de operare reprezint un ansamblu de programe care asigur exploatarea optim a resurselor hardware i software ale unui sistem de calcul. Sistemele de operare au fost create pentru simplificarea activitii de programare, utilizarea optim a posibilitilor de lucru ale echipamentelor i reducerea interveniei utilizatorilor n cursul execuiei programelor. Nivelele 0-3 nu sunt destinate utilizrii directe de ctre programatorii obinuii, ci pentru rularea translatoarelor i interpretoarelor scrise de programatorii de sistem. Nivelul 4 i nivelele superioare sunt destinate programatorilor de aplicaii. Nivelul 4 este nivelul limbajului de asamblare. Programele scrise n limbaj de asamblare sunt translatate n limbajul nivelului 1, 2 sau 3 i apoi interpretate de ctre maina virtual corespunztoare. Nivelul 5 const din limbajele destinate programatorilor de aplicaie, fiind numit nivelul limbajelor de nivel nalt. Programele scrise n aceste limbaje sunt translatate n limbajele nivelului 3 sau 4 cu ajutorul compilatoarelor sau interpretoarelor. Nivelul 6 reprezint nivelul aplicaiilor. Const din colecii de programe destinate unor domenii specializate, de exemplu pentru administraie, economie, proiectare asistat de calculator, grafic etc. Fiecare nivel reprezint o abstractizare distinct, cu diferite obiecte i operaii. Setul tipurilor de date, a operaiilor i facilitilor fiecrui nivel reprezint arhitectura nivelului respectiv. Arhitectura trateaz acele aspecte care sunt vizibile utilizatorului nivelului respectiv, ca de exemplu dimensiunea memoriei disponibile. Aspectele de implementare, ca de exemplu tehnologia utilizat pentru implementarea memoriei, nu fac parte din arhitectur. Arhitectura calculatorului reprezint studiul proiectrii acelor pri ale unui sistem de calcul care sunt vizibile pentru programatori. 2 Arhitectura Intel8086. 2.1 No iuni generale. Modelul program. n Assembler, calculatorul este vzut la nivelul hardware: adrese fizice de memorie, registre, ntreruperi etc. Sunt necesare unele noiuni pregtitoare. Unitatea de baz a informaiei memorate n calculator este bitul. Un bit reprezint o cifr binar (de aici i numele, care e o prescurtare de la binary digit), deci poate avea valorile 0 sau 1. Modelul hardware corespunztor este acela de bistabil. Un bistabil este deci un circuit electronic cu dou stri stabile, codificate 0 i 1, capabil s memoreze un bit de informaie. Un grup de bistabili formeaz un registru. De exemplu, 8 bistabili formeaz un registru de 8 bii. Informaia care se poate memora ntr-un asemenea registru poate fi codificat n binar, de la valoarea 00000000 (toi biii egali cu 0), pn la valoarea 11111111 (toi biii egali cu 1). Este uor de vzut c numrul combinaiilor care pot fi memorate este 256 (2 la puterea a 8-a). n general, un registru de n bii va putea memora 2n combinaii distincte. Aceste combinaii se numesc octei sau bytes (dac n = 8), respectiv cuvinte (dac n = 16, 32 etc). Memoria unui calculator este vzut ca o succesiune de octei. Fiecare octet are asociat o adres de memorie. Pentru a putea adresa memoria, e nevoie de un registru de adrese, a crui lungime determin dimensiunea maxim a memoriei. Dac avem un regsitru de adrese de 8 bii, atunci vom putea adresa 28

Arhitectura Calculatoarelor

octei de memorie. Procesorul 8086 are un registru de adrese de 20 de bii, deci poate adresa 220 octei de memorie (sau 1 megaoctet de memorie). Arhitectura procesorului 8086, din punctul de vedere al programului utilizator, este ilustrat schematic n figura 2.1. Sunt figurate registrele accesibile prin program.

Figura 2.1 - Registrele procesorului 8086 Toate registrele sunt de 16 bii. O serie de registre (AX, BX, CX, DX) sunt disponibile i la nivel de octet, prile mai semnificative fiind AH, BH, CH i DH, iar cele mai puin semnificative, AL, BL, CL i DL. Denumirile registrelor sunt: AX - registru acumulator BX - registru de baz general CX - registru contor DX - registru de date BP - registru de baz pentru stiv (base pointer) SP - registru indicator de stiv (stack pointer) SI - registru index surs DI - registru index destinaie Registrul notat FLAGS cuprinde flagurile procesorului, sau bistabililor de condiie, iar registrul IP (instruction pointer) este registrul de instruciuni. Denumirile registrelor de segment sunt: CS - registru de segment de cod (code segment) DS - registru de segment de date (data segment) SS - registru de segment de stiv (stack segment) ES - registru de segment de date suplimentar (extra segment) Se observ c denumirile registrelor de segment corespund zonelor principale ale unui program executabil. Astfel, perechea de registre (CS:IP) va indica totdeauna adresa urmtoarei instruciuni care se va executa, iar perechea (SS:SP) indic totdeauna adresa vrfului stivei. Registrele DS i ES sunt folosite pentru a accesa date. Registrul de flaguri (bistabili de condiie) al procesorului 8086 are configuraia din Figura 2.2. O serie de flaguri sunt flaguri de stare: acestea sunt poziionate la 0 sau la 1 ca urmare a unor operaii aritmetice sau logice. Celelalte flaguri controleaz anumite operaii ale procesorului. Semnificaia flagurilor este urmtoarea: CF (Carry Flag, bistabil de transport) - semnific un transport sau un mprumut din/n bitul cel mai semnificativ al rezultatului, de exemplu la operaii de adunare sau de scdere.

Arhitectura Calculatoarelor

Figura 2.2 - Registrul de flaguri al procesorului 8086 PF (Parity Flag, flag de paritate) - este poziionat n aa fel nct numrul de bii egali cu 1 din octetul cel mai puin semnificativ al rezultatului, mpreun cu flagul PF, s fie impar; altfel formulat, suma modulo 2 (XOR) a tuturor biilor din octetul c.m.p.s. i a lui PF s fie 1. AF (Auxiliarry Carry Flag, bistabil de transport auxiliar) - indic un transport sau un mprumut din/n bitul 4 al rezultatului. ZF (Zero Flag, bistabil de zero) - este poziionat la 1 dac rezultatul operaiei este 0. SF (Sign Flag, bistabil de semn) - este poziionat la 1 dac b.c.m.s. al rezultatului (bitul de semn) este 1. OF (Overflow Flag, bistabil de depire) - este poziionat la 1 dac operaia a condus la o depire de domeniu a rezultatului (la operaii cu sau fr semn). TF (Trap Flag, bistabil de urmrire) - dac este poziionat la 1, se foreaz o ntrerupere, pe un nivel predefinit, la execuia fiecrei instruciuni; acest fapt este util n programele de depanare, n care este posibil rularea pas cu pas a unui program. IF (Interrupt Flag, bistabil de ntreruperi) - dac este poziionat la 1, procesorul ia n consideraie ntreruperile hardware externe; altfel, acestea sunt ignorate. DF (Direction Flag, bistabil de direcie) - precizeaz sensul (cresctor sau descresctor) de variaie a adreselor la operaiile cu iruri de octei sau de cuvinte. Flagurile CF, PF, AF, ZF, SF i OF sunt numite flaguri de stare (aritmetice). Flagurile TF, IF i DF sunt numite flaguri de control. Procesorul 8086 dispune de adrese pe 20 de bii, fiind capabil s adreseze 1 megaoctet de memorie (220). Se pune problema cum se formeaz adresa fizic pe 20 de bii (deci pe 5 cifre hexa), deoarece toate registrele procesorului sunt de 16 bii, putnd codifica adrese n domeniul 0000...0FFFFH (pe 4 cifre hexa), deci ntr-un spaiu de maxim 64 KO. Memoria unui sistem cu procesor 8086 este divizat n segmente. Un segment este o zon continu de memorie, de lungime maxim de 64 KO, care ncepe la o adres fizic multiplu de 4. Acest fapt nseamn c ultima cifr hexa a adresei de nceput a unui segment este totdeauna 0. Ca atare, aceast cifr se poate omite i adresa de segment se poate reprezenta tot pe 16 bii. Adresele de nceput ale segmentelor se vor gsi ntotdeauna ntr-unui din cele 4 registre de segment. Adresarea n interiorul unui segment se realizeaz printr-un deplasament (offset) relativ la nceputul segmentului. Deoarece un segment nu poate depi 64 KO, deplasamentul se poate memora tot pe 16 bii. Deplasamentul poate fi o constant sau coninutul unui registru care permite adresarea memoriei. n concluzie, pentru adresarea unui octet de memorie, se folosesc dou entiti pe 16 bii: o adres de segment (coninut obligatoriu ntr-un registru de segment) i un deplasament. Deoarece ambele entiti sunt pe 16 bii, se vorbete de adrese (sau pointeri) de 32 de bii, dei adresa fizic este doar pe 20 de bii. Formarea adresei fizice (pe 20 de bii) este realizat automat (prin hardware) de ctre o component a procesorului, conform Figurii 2.3. Concret, adresa fizic se obine prin deplasarea adresei de segment cu 4 bii la stnga i prin adunarea deplasamentului. Pentru specificarea unei adrese complete (de 32 de bii), se folosete notaia (segment:offset) sau (registru_segment:offset). De exemplu, putem specifica o adres prin (18A3:5B27) sau prin (DS:5B27).

Arhitectura Calculatoarelor

Figura 2.3 - Formarea adresei fizice Trebuie remarcat faptul c asocierea (segment:offset) - adres fizic nu este biunivoc, deoarece la o aceeai adres fizic pot s corespund mai multe perechi (segment:offset). De exemplu, perechile (18A3:5B27) i (18A2:5B37) reprezint aceeai adres fizic. n situaia n care deplasamentul este redus la minim, adic n domeniul 0...F, corespondena devine biunivoc. O adres complet de 32 de bii este memorat cu offsetul la adrese mici i cu adresa de segment la adrese mari. Adresele complete se pot obine cu directiva DD (Define Double-Word). 2.2 Definirea segmentelor. Structura programelor Segmentele logice conin cele trei componente ale unui program: cod, date si stiv. Modul in care pot fi specificate segmentele sunt: definirea simplificata; definirea completa a segmentelor. Definirea simplificat a segmentelor Definirea simplificata ascunde multe detalii ale definirii segmentelor si utilizeaz aceleai convenii implementate de Microsoft in limbajele de nivel nalt. Pentru a scrie un program ASM ntr-o form simpl, se folosesc directivele simplificate de definire a segmentelor. Acestea sunt: .model small (precizeaz un model de memorie) .code (definire de segment de cod) .stack n (definire de segment de stiv) .data (definire de segment de date) end etichet (sfrit logic al programului) n principiu, segmentul de cod va cuprinde programul executabil (instruciuni), iar segmentul de date va cuprinde date definite de utilizator. Segmentul de stiv nu este folosit explicit. Comentariile se scriu folosind simbolul ;. Ceea ce urmeaz dup ; pn la sfritul liniei curente, este considerat comentariu. Utiliznd directive simplificate de segmentare, excluznd abuzul de limbaj, aa-zisul stil TASM, structura este: .MODEL small .STACK 512 .DATA definirea datelor .CODE

Arhitectura Calculatoarelor

declarare si definire proceduri start: mov ax,@data mov ds,ax program principal end start Directiva .stack aloc o zon avnd lungimea n (.stack n) , zon fiind definit ca stiv (ex: .stack 200h va aloca un segment de lungime 512 octei). Directiva rezerv (nu si iniializeaz) zona dedicat stivei. Aciunea de iniializare este opional. Putem scrie si .stack 512. Directiva .code precede segmentul de program. ncrcarea acestui segment este realizata automat de ctre DOS. In schimb registrul ds va trebui ncrcat de ctre programator. Simbolul @data va primi adresa segmentului de date, abia dup momentul editrii legturilor. Date pot exista si in cadrul segmentului de cod. Registrele de segment nu sunt niciodat ncrcate cu valori absolute. Se las in seama sistemului de operare sarcina amplasrii in memorie a segmentelor. Ordinea este asigurata tot de ctre componentele sistemului de operare. Directiva .model definete modul de dispunere in memoria RAM a segmentelor care alctuiesc un program. Sistemul DOS admite 6 modele. Sistemul OS/2 mai admite si modelele XLARGE si THREAD. Modele de memorie pot fi tiny, small, medium, large sau huge. Semnificaia acestor tipuri este: tiny - toate segmentele (date, cod, stiv) se pot genera ntr-un spaiu de 64KO i formeaz un singur grup de segmente. Se folosete la programele de tip COM. Toate salturile, apelurile i definiiile de proceduri sunt implicit de tip NEAR. Adresarea simbolurilor situate la distanta (FAR) spre deosebire de cele situate in apropiere (NEAR) va dura mai multe cicluri main, deoarece este vorba de ncrcarea celor 2 componente segment si respectiv deplasament. small - datele i stiva sunt grupate ntr-un singur segment iar codul n alt segment. Fiecare din acestea nu trebuie s depeasc 64KO. Toate salturile, apelurile i definiiile de proceduri sunt implicit de tip NEAR; medium - datele i stiva sunt grupate ntr-un singur segment (cel mult egal cu 64KO), dar codul poate fi n mai multe segmente separate (nu se grupeaz), deci poate depi 64KO. Salturile i apelurile sunt implicit tip FAR iar definiiile de proceduri sunt implicit de tip far. compact - codul generat ocup cel mult 64KO (se grupeaz), dar datele i stiva sunt n segmente separate (pot depi 64KO). Apelurile i salturile sunt implicit de tip NEAR. Se utilizeaz adrese complete (segment i offset) atunci cnd se acceseaz date definite n alte segmente. large - att datele ct i codul generat pot depi 64KO. huge - este asemntor modelului large, dar structurile de date pot depi 64KO; se utilizeaz adrese complete normalizate n care offsetul este redus la minim (n domeniul 0 - 15), ceea ce face ca o adres fizic s fie descris de o unic pereche (segment, offset). Definirea complet a segmentelor Definirea completa a segmentelor utilizeaz sintaxa: nume_segment SEGMENT nume_segment ENDS Dac n modulul de program, codul, datele si stiva nu depesc fiecare n parte 64koctei, atunci structura general a unui modul de program cu 3 segmente logice (de cod (program), date i stiv) este: Segment Stiv SSEG SEGMENT DW 100 DUP(?) SSEG ENDS

Arhitectura Calculatoarelor

Segment de date

DSEG SEGMENT definirea datelor DSEG ENDS

Segment de cod

CSEG SEGMENT ASSUME cs:CSEG,ds:DSEG,ss:SSEG,es:DSEG declarare si definire proceduri start: mov ax,DSEG ; iniializarea registrelor segment se face numai in mov ds,ax ; modulul principal mov es,ax ; ds,es DSEG programul principal CSEG ENDS END start ; sfritul modulului ; adresa start se include numai in modulul principal

Directiva ASSUME realizeaz o conexiune simbolic (logic) ntre definirea instruciunilor i datelor n segmente logice (cuprinse ntre SEGMENT i ENDS) la momentul asamblrii i accesul, la execuie, la instruciuni i date prin registrele de segment. Etichetele sunt nume simbolice de adrese ce identific instruciunile. Etichetele pot fi referite n alte instruciuni pentru executarea salturilor n program. Dac referirile la o etichet sunt fcute n cadrul segmentului n care ea este definit atunci se spune ca ea are atributul NEAR . Pentru declararea etichetelor in segmentul de program (etichete adrese de instruciuni) se utilizeaz operatorul : (ex: START:) Directiva END marcheaz sfritul logic al unui modul de program i e obligatorie n toate modulele. Tot ce se gsete n fiierul surs dup aceast directiv este ignorat la asamblare. Forma general este: END [punct_de_start] n care punct_de_start este o etichet sau un nume de procedur care marcheaz punctul n care se va da controlul dup ncrcarea programului n memorie. 2.3 Tipuri de date Bitul Cel mai mic element de memorare a unei informaii este bitul, n care se poate memora o cifra binara, 0 sau 1. De obicei informaia de prelucrat se reprezint pe segmente contigue de bii denumite tetrade, octei, cuvinte, dublu cuvinte, quadwords si tenbytes. Tetrada Tetrada este o secven de 4 bii, numerotai 0,1,2,3 de la dreapta la stnga, bitul 0 fiind cel mai puin semnificativ, iar bitul 3 cel mai semnificativ: 1 3 0 2 1 1 1 0

Octetul (Byte) Octetul sau byte este un element de numerotare, ce cuprinde o secvena de 8 bii. Octetul este unul dintre cele mai importante elemente (celule ) de memorare adresabile. Cei 8 bii ai unui octet sunt numerotai cu 0,1,2,...7 de la dreapta la stnga:

Arhitectura Calculatoarelor

0 1 1 1 0 1 0 1 7 6 5 4 3 2 1 0 Octetul este format din 2 tetrade, tetrad inferioara (din dreapta) conine biii 0, 1, 2, 3, iar cea superioara (din stnga) conine biii 4, 5, 6, 7 ai octetului. Cuvntul(Word) Cuvntul este o secvena de 2 octei, respectiv 16 bii, numerotai de la dreapta spre stnga, astfel 0, 1, 2 ......14, 15. Bitul cel mai semnificativ este bitul 15. Primul octet(inferior) din cuvnt conine biii 0, 1, 2, 3, 4, 5, 6, 7, iar al doilea octet(superior), biii 7, 8, 9, 10, 11, 12, 13, 14, 15. 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Cuvntul poate fi reprezentat printr-un registru de 16 bii sau n doi octei de memorie. In memorie, octetul inferior (biii 0-7) este memorat la adresa mai mic, iar octetul superior (biii 8-15) la adresa cea mai mare. De exemplu cuvntul 4567h se reprezint intr-un registru de 16 bii sub forma 4567h, iar n memorie la adresa 1000 sub forma 6745 (octetul 67 la adresa 1000, iar octetul 45 la adresa 1001). Dublu cuvnt (Double Word) O succesiune de 2 cuvinte (4 octei, 32 bii), reprezint un dublu cuvnt. Cei 32 de bii ai unui dublu cuvnt sunt numerotai de la dreapta la stnga prin 0, 1, 2, ......30, 31. Bitul cel mai semnificativ este bitul 31, octetul cel mai puin semnificativ conine biii 0-7, iar cel mai semnificativ octet (octetul 4) conine biii 23-31. Un dublu cuvnt poate fi reprezentat ntr-un registru de 32 bii sau pe 4 octei consecutivi de memorie. In memorie, octetul 1-cel mai puin semnificativ este memorat la adresa cea mai mica, iar octetul 4-cel mai semnificativ la adresa cea mai mare. De exemplu dublul cuvnt 12 34 56 78h, aflat la adresa 2000, va fi memorat astfel 78 56 34 12, cu octetul 78h la adresa 2000, iar octetul 12h la adresa 2003. Quadword Quadword (qword) este format din 2 dublu cuvinte(4 cuvinte, respectiv 8 octei succesivi de memorie). Cei 64 bii ai unui qword sunt numerotai de la dreapta la stnga astfel: 0, 1, 2, ......62, 63. Bitul cel mai semnificativ este bitul 63. In memorie octetul 1 se reprezint la adresa cea mai mica, iar octetul 8 la adresa cea mai mare. Tenbyte (10 octe i) O succesiune de 10 octei formeaz un tenbyte (tb). Cei 80 de bii ai elementului sunt numerotai de la dreapta la stnga cu 0, 1, 2,......78, 79. In memorie octetul cel mai puin semnificativ (biii 0-7) se reprezint la adresa cea mai mica, iar octetul 10 ( biii 73-80) la adresa cea mai mare. 2.4 Definirea datelor n limbajele de asamblare 80x86 se poate opera cu anumite tipuri de date, recunoscute de procesor, acesta dispunnd de directive (pseudoinstructiuni) specifice pentru definirea lor. a) Byte (octet). Acest tip de date ocupa 8 bii, adic un octet(byte). Informaia dintr-un octet poate fi: un ntreg fr semn cuprins intre 0 si 225, un ntreg cu semn cuprins intre 128 si 127, sau un caracter ASCII. Definirea datelor de tip byte se face cu ajutorul directivei DB(Define Byte) care are sintaxa: [variabila] DB lista expresii unde -variabila, opional, este un identificator asociat adresei efective a primului octet de memorie generat, corespunztor primei expresii din lista de expresii -lista-expresii cuprinde expresii constante(calculabile in momentul asamblrii) si separate prin virgula. Fie directivele: alfa DB 65, 72h, 75o, 11011b, 11h+22h, 0ach

Arhitectura Calculatoarelor

10

DB -65, 'a', 'abc' In memorie ncepnd de la adresa simbolica alfa, se va genera secvena de octei, reprezentata in hexazecimal : 41 72 3d 1b 33 ac bf 61 61 62 63 alfa +0 +1 +2 +3 +4 Valoarea binara 11011b va fi generata la adresa alfa+3. b) WORD (cuvnt). Un cuvnt ocupa doi octei (16 bii) si poate fi reprezentat intr-un registru de 16 bii sau in 2 octei consecutivi de memorie. Numerotarea biilor in cadrul unui cuvnt se face de la 0 la 15 (bitul 15 e bitul cel mai semnificativ al cuvntului, iar bitul 0 este bitul cel mai puin semnificativ), numerotarea se face de la dreapta la stnga: Informaia memorata intr-un cuvnt poate fi : -un ntreg pe 16 bii cu semn (bitul 15 este bitul de semn), cuprins intre -215 si 215 1, - un ntreg pe 16 bii fr semn, cuprins intre 0 si 216 -sau o adresa de memorie de 16 bii. Reprezentarea celor 2 octei ai cuvntului in memorie se face astfel nct octetul cel mai puin semnificativ este memorat la adresa cea mai mica. De exemplu: daca valoarea 2345h este memorata la adresa 2000h, atunci octetul 45h se va afla la adresa 2000h, iar octetul 23h la adresa 2001h. Generarea datelor de tip cuvnt se poate face folosind directiva de tip DW(Define Word), a crei sintaxa este : [variabila] DW lista de expresii unde: variabil, opional, este un identificator asociat adresei efective a primului cuvnt de memorie generat, corespunztor primei expresii din lista de expresii. lista de expresii este o lista de expresii constante separate prin virgula. Fie secvena de directive: beta DW 4567h, 0bc4ah, 1110111011b, 2476o DW -7683, 7683, 'ab' In memorie de la adresa beta se vor genera octeii: 67 45 4a bc bb 03 3e 05 fd e1 03 e1 62 61 beta +2 +4 +6 +8 +10 +12 +14 Constanta octala 2476o este generat de la adresa beta +6. c) Double WORD(dublu cuvnt) Un dublu cuvnt ocupa 2 cuvinte sau 4 octei ( 32 bii ) si poate fi reprezentat in memorie pe 4 octei consecutivi, ntr-o pereche de registre de 16 bii sau ntr-un registru de 32 bii (la procesoarele de 32 bii). Informaia memorata intr-un dublu cuvnt poate fi: un ntreg pe 32 bii, cu sau fr semn; un numr real in simpl precizie; sau o adres fizic de memorie de 32 bii. Generarea datelor de tip dublu cuvnt se poate face folosind directiva DD (Define Double Word), a crei sintaxa este: [variabil] DD lista expresii unde: - variabil, opional, este un identificator asociat adresei efective primului dublu cuvnt de memorie generat corespunztor primei expresii din lista de expresii; - lista de expresii este o lista de expresii constante separate prin virgula. Reprezentarea celor doua cuvinte a unui dublu cuvnt de memorie se face astfel nct cuvntul cel mai puin semnificativ este memorat la adresa cea mai mica. De exemplu dublul cuvnt 12345678 h, aflat la adresa 2000h se memoreaz astfel: cuvntul 5678h se memoreaz la adresa 2000h, iar cuvntul 1234h la adresa 2002h, adic adresa de segment este memorata la adrese mari, iar deplasamentul (offsetul) la adrese mici. Secvena de directive :

Arhitectura Calculatoarelor

11

DD 12345678h, 1, -1 DD 1.0, -1.0 DD gama presupunnd c memorarea se face de la adresa 4512:3467 va conduce la generarea urmtoarei secvene de octei:

gama

78 gama

56 00

34 +4 00

12 80

01

00

00 +8

00

ff 45

ff

ff

ff +12

00

00 80 +16

3f

bf 67 34 12 gama+16 +20 Constanta reala -1.0 se asambleaz la adresa gama + 16.

d) QUAD WORD (8 octe i) Tipul Quad word (qword) ocupa 8 octei i este reprezentat in memorie pe 64 bii sau ntr-o pereche de registre de 32 bii (n cazul procesoarelor de 32 bii). Informaia stocata intr-un qword poate fi: un ntreg cu sau fr semn pe 64 bii, sau un numr real in dubl precizie. Generarea unor date de tip qword se face cu ajutorul directivei DQ (Define Quad word), a crei sintaxa este: [variabila] DQ lista de expresii unde: - variabila, opional, este un identificator asociat adresei efective primului qword de memorie generat corespunztor primei expresii din lista de expresii; - lista de expresii este o lista de expresii constante separate prin virgula. Reprezentarea in memorie a celor 8 octei ai unui qword se face astfel nct octetul cel mai puin semnificativ este memorat la adresa cea mai mica. Fie secvena : q DQ 2, -2, 2.5, -2.5 care va fi reprezentat in memorie astfel: 02 q 00 00 00 00 00 00 00 00 00 00 00 00 00 fe +8 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff ff +16 c0

04 40 +24 Valoarea reala -2.5 este asamblat de la adresa q+24.

04

e) Ten Bytes Valorile Ten byte (tbyte) ocup 10 octei consecutivi de memorie, sau unul din registrele coprocesorului matematic. Informaia stocata intr-un tbyte poate fi: un numr ntreg reprezentat ca o secvena de cifre BCD (format mpachetat) cu semn sau un numr real in precizie extinsa. Generarea unor date de tip tbyte se face cu directiva DT ( Define Ten Bytes) a crei format este: [variabila] DT lista de expresii unde: - variabila, opional, este un identificator asociat adresei efective primului tbyte de memorie generat corespunztor primei expresii din lista de expresii; - lista de expresii este o lista de expresii constante separate prin virgula. n format BCD mpachetat fiecare cifra zecimal se reprezint pe o tetrad (4 bii), deci 2 cifre BCD pe octet. Un ntreg BCD se poate reprezenta cu maxim 19 cifre zecimale, care ar ocupa 76 bii.

Arhitectura Calculatoarelor

12

Ultima tetrad aflat la adresa cea mai mare este destinat memorrii semnului. Semnul se memoreaz doar in bitul cel mai semnificativ al numrului, deci urmtorii 3 bii ai tetradei ce conine semnul pot fi bii ai numrului. Astfel ntregii BCD pot fi cuprini intre: -79999 99999 99999 99999 i +79999 99999 99999 99999 cifra cea mai semnificativ fiind reprezentat doar pe 3 bii. Directiva: tb DT 45671234567890123456, -45671234567890123456 va conduce la generarea urmtoarei secvene de octei: 56 34 12 90 78 56 34 12 67 45 56 34 12 90 78 56 34 12 67 c5 tb +10 2.5 Setul de instruciuni 8086 n cadrul acestui capitol, sunt prezentate n detaliu instruciunile de baz ale familiei de procesoare Intel. Acolo unde este cazul, se specific tipurile interzise de adresare. Setul de instruciuni este grupat n 6 clase: instruciuni de transfer, care deplaseaz date ntre memorie sau porturi de intrare/ieire i registrele procesorului, fr a executa nici un fel de prelucrare a datelor; instruciuni aritmetice i logice, care prelucreaz date n format numeric; instruciuni pentru iruri, specifice operaiilor cu date alfanumerice; instruciuni pentru controlul programului, care n esen se reduc la salturi l la apeluri de proceduri; instruciuni specifice ntreruperilor hard i soft; instruciuni pentru controlul procesorului. Aceast mprire este realizat dup criterii funcionale. De exemplu, instruciunile PUSH i POP sunt considerate ca instruciuni de transfer, dei, ia prima vedere, ar putea fi considerate instruciuni specifice procedurilor. Acelai lucru despre instruciunile IN i OUT, care interfaeaz procesorul cu lumea exterioar: ele sunt considerate instruciuni de transfer, dei ar putea fi considerate instruciuni de intrare/ieire. Intrrile i ieirile sunt ns cazuri particulare de transfer. Fiecare categorie de instruciuni este nsoit de specificarea explicit a indicatorilor de condiie care sunt modificai n urma execuiei. 2.5.1 Instruciuni pentru transferuri de date, instruciuni n aritmetica binara i n aritmetica BCD. No iuni teoretice Instruciunile de transfer permit copierea unui octet sau cuvnt de la sursa la destinaie. Destinaia poate fi un registru, locaie de memorie sau un port de ieire, iar sursa poate fi un registru, o locaie de memorie, constante sau port de intrare. Ca regula general destinaia i sursa nu pot fi ambele locaii de memorie. n specificarea sursei i destinaiei se vor folosi notaiile: segment: offset pentru adrese fizice; (x) paranteze rotunde pentru a desemna coninutul lui x. OBS. Instruciunea de transfer nu modifica indicatorii de condiie (flagurile) cu excepia instruciunilor SAHF i POPF. Instruciuni de transfer a) Instruciunea MOV (Move Data). Forma general a instruciunii Mov este: mov dest, sursa ; (dest) (sursa) realizeaz transferul informaiei de la adresa efectiva data de sursa la dest. Exemplu: mov ax, alfa; transfera coninutul adresei alfa n ax mov bx, offset alfa; transfera adresa efectiva alfa n bx mov al, 75h; transfera 75h n al mov cx, [100]; transfera coninutul adresei 100 n cx

Arhitectura Calculatoarelor

13

mov [di], bx; transfera coninutul lui bx la adresa coninuta n di mov byte ptr alfa , [bx]; pune coninutul octetului de la adresa ;dat de bx la adresa alfa b) Instruciunea XCHG ( Exchange Data ) Interschimb sursa cu destinaia. Forma general: XCHG dest, sursa Restricii: registrele de segment nu pot aprea ca operanzi; cel puin un operand trebuie sa fie un registru general. Exemple: xchg al, ah xchg alfa, ax xchg sir [si], bx xchg cs: [bx][si], ax Interschimbarea coninutului a doi operanzi din memorie op1 i op2 se poate face prin secvena de instruciuni: mov reg, op1 xchg reg, op2 mov op2, reg c) Instruciunea XLAT (Translate) Forma general: XLAT Instruciunea nu are operanzi, semnificaia fiind: (al) ds: ((bx)+(al)) adic se transfera n al coninutul octetului de la adresa efectiva : (bx)+(al). Instruciunea se folosete la conversia unor tipuri de date, folosind tabele de conversie, adresa acestor tabele se introduce n bx, iar n al se introduce poziia elementului din tabel. De exemplu: conversia unei valori numerice cuprins intre 0 i 15 n cifrele hexazecimale corespunztoare, se poate face prin: tabel DB '0123456789abcdef'' .......... lea bx, tabel mov al,11 xlat n al se va depune cifra hexazecimala b. d) Instruciunea IN (Input Data) Execut o citire de la portul de intrare specificat 8 sau 16 bii, dup cum se specifica registrul al sau ax sau alte registre generale, pentru noile procesoare. Forma general: IN dest, port unde: dest este registrul al sau ax (noile procesoare accept i alte registre n locul lui al, respectiv ax); port este o constant cuprins intre 0 i 255, sau registrul dx. e) Instruciunea OUT (Output Data) Execut o scriere la portul de iesire specificat de 8 sau 16 bii, dup cum se specific registrul al sau ax. Forma general : OUT dest, port unde: destinaie este registrul al sau ax; port este o constant cuprins intre 0 i 255 sau registrul dx.

Arhitectura Calculatoarelor

14

f) Instruciunea LEA (Load Effective Address) Are ca efect ncarcrea adresei efective (offsetul) intr-un registru general. Forma general: LEA reg, sursa unde: sursa - este un operand aflat n memorie, specificat printr-un mod de adresare ; reg - este un registru general. Exemplu: lea bx, alfa lea si, alfa [bx][si] Acelai efect se obine folosind operandul OFFSET n Instruciunea MOV: mov bx, offset alfa mov si, offset alfa [bx][si] g) Instruciunea LDS/ LES (Load Data Segment/ Load Extra Segment) Forma general: LDS reg, sursa unde: reg -este un registru general de 16 biti; sursa -este un operand de tip double word aflat n memorie, care conine o adres complet de 32 bii. Are ca efect transferul unei adrese complete n perechea de registre ds i reg specificat n instruciune, adic: (reg) ((sursa)) (ds) ((sursa) + 2) Exemplu: alfa db 25 adr_alfa dd alfa . . . . . . .. . .. . . . lds si, adr-alfa ; n registru si se transfer offset-ul, ;iar n ds adresa de segment a celulei alfa mov byte ptr [si], 75 . . . . .. . . .. . . . . . . . i) Instruciunea LAHF (Load AH with FLAGS) Instruciunea ncarc n registrul AH octetul dat de partea cea mai puin semnificativa a registrului FLAGS, ce conine indicatorii. Instruciunea nu are operanzi. AH FLAGS 0 7 j) Instruciunea SAHF (Store AH into FLAGS) Instruciunea ncarc n registrul FLAGS, n octetul cel mai puin semnificativ coninutul registrului AH, adic: FLAGS (AH) 0 7 Instruciunea nu are operanzi. 2.5.2 Aritmetica binara Aceste instruciuni modifica coninutul registrului FLAGS. a) Instruciunea ADD (Add) Forma general: ADD dest, sursa ; (dest) (dest) + (sursa) unde: dest poate fi un registru general sau o locaie de memorie; sursa poate fi un registru general, o locaie de memorie sau o constant.

Arhitectura Calculatoarelor

15

Cei doi operanzi nu pot fi simultan locaii de memorie. Operaia se poate efectua pe octet sau pe cuvnt. Cei doi operanzi trebuie sa aib aceeai dimensiune (acelai tip). n caz de ambiguitate se va folosi operatorul PTR. Indicatorii afectai sunt: AF, CF, PF, SF, ZF i OF Exemple: add ax, 5 add bl, 5 add ax, bx add word ptr [bx], 75 add alfa, ax add alfa, 5 add byte ptr [si], 75 add byte ptr alfa, 75 b) Instruciunea ADC (Add with Carry) Forma general: ADC dest, sursa ; (dest) (dest) + (sursa) + (CF) Unde dest i sursa au aceeasi semnificaie ca la instruciunea ADD, iar CF este Carry Flag. Instruciunea adun coninutul dest cu coninutul sursei i cu bitul de transport CF. Indicatorii afectai sunt aceeai de la instruciunea ADD. Operaia ADC se folosete la adunri de operanzi pe mai multe cuvinte, operaie n care poate aprea transport de care trebuie sa se in seama. Exemplu. S se adune doua numere op1, op2 n dubla precizie (pe 2 cuvinte). op1 dd 12345678h op2 dd 0abcdefgh rez dd ? ................................... mov ax, word ptr op1 add ax, word ptr op2 mov word ptr rez, ax mov ax, word ptr op1+2 adc ax, word ptr op2+2; se considera eventualul transport mov word ptr rez+2, ax c) Instruciunea SUB (Substrat) Forma general: SUB dest, sursa ; (dest) (dest) (sursa) unde dest i sursa au aceeai semnificaie ca la instruciunea ADD. Indicatorii afectai sunt cei specificai la ADD. d) Instruciunea SBB (Substrat with Borrow) Forma general: SBB dest, sursa ; (det) (dest) (sursa) (CF) unde semnificaia dest, sursa i CF sunt cele prezentate la ADC. Instruciunea SBB ia n considerare eventualul mprumut. Exemplu: Op1 dd 12345678h Op2 dd 0abcdefgh90h Rez dd ? ............. mov ax, word ptr op1 sub ax, word ptr op2 mov word ptr rez, ax mov ax, word ptr op1 + 2 sbb ax, word ptr op2 + 2 ; se considera eventualul mprumut mov word ptr rez + 2, ax

Arhitectura Calculatoarelor

16

e) Instruciunea INC (Increment) Forma general: INC dest ; (dest) (dest) + 1 unde dest este un registru general, un operand din memorie de tip octet sau cuvnt. Semnificaia fiind operandul dest este incrementat cu unu. Indicatorii afectai sunt AF, PF, SF, ZF, OF. Exemple: inc alfa inc bl inc word ptr [bx] [si] f) Instruciunea DEC (decrement) Forma general: DEC dest ; (dest) (dest) 1 unde dest are aceeai semnificaie ca dest de la Instruciunea INC. Aceeai indicatori ca la INC sunt afectai. g) Instruciunea NEG (Negate) Forma general: NEG dest : (dest) 0 (dest) schimbare de semn unde dest este un operand pe 8 sau 16 bii ce poate fi un registru general sau o locaie de memorie. Instruciunea afecteaz indicatorii AF, CF, PF, SF, OF i ZF. Exemplu: alfa db 75 ............ mov al, alfa neg al mov alfa, al ; la adresa alfa avem - 75 sau neg alfa h) Instruciunea CMP (Compare) Forma general: CMP dest, sursa ; (dest) (sursa) Instruciunea realizeaz o operaie de scdere intre cei doi operanzi, fr a modifica operandul dest sau sursa cu poziionarea indicatorilor de condiie. Indicatorii afectai sunt: AF, CF, PF, SF, ZF i OF. Aceasta instruciune se folosete mpreuna cu instruciunea de salt condiionat. Exemple: cmp ax, alfa[bx][si] cmp [si], 0 i) Instruciunea CBW (Convert Byte to Word) Are ca efect extinderea bitului de semn (AL7) din AL la ntreg registru AH, adic: daca bitul de semn AL7 = 0 atunci (ah) 00h altfel (ah) 0ffh. Instruciunea nu are operanzi i nu afecteaz indicatorii de condiie. Exemplu. Se cere s se adune un numr ntreg cu semn reprezentat pe octet cu un numr ntreg cu semn pe cuvnt. a db -75 b dw -188 c dw ? ......... mov al, a cbw ; convertete octetul la cuvnt add ax, b

Arhitectura Calculatoarelor

17

mov c, ax .......... j) Instruciunea CWD (Convert Word to Double Word) Are ca efect extinderea bitului de semn din AX (AX15) la ntreg registrul DX, obinndu-se astfel AX pe 32 de bii, adic: daca (AX15) = 0 atunci (dx) 0000h, altfel (dx) 0ffffh. Instruciunea nu are operanzi i nu afecteaz indicatorii de condiie. Exemplu. Se cere diferena dintre un operand reprezentat pe 2 cuvinte (DO) i unul reprezentat pe cuvnt (SO) do dd 12345678h so dw 0abcdh rez dd ? ................ mov ax, so cwd ax ; operandul so reprezentat n DX : AX mov bx, ax ; salveaz ax n bx mov ax, word ptr do sub ax, bx mov word ptr rez, ax mov ax, word ptr do + 2 sbb ax, dx ; ia n considerare eventualul transport mov word ptr rez + 2 k) Instruciunea MUL (Multiply) Forma general: MUL sursa unde sursa poate fi un registru sau o locaie de memorie de 8 sau 16 bii. Rezultatul se obine pe un numr dublu de bii (16 sau 32). Operaia realizat este produsul intre acumulator i sursa cu depunerea rezultatului n acumulatorul extins (ax pe octet sau dx:ax pe cuvnt). Cei doi operanzi se consider numere fr semn. Dac sursa este pe octet avem: (AX) (AL) * (sursa) iar dac sursa este pe cuvnt avem: (DX : AX) (AX )* (sursa) Afecteaz indicatorii CF i OF, ceilali sunt nedefinii. Exemplu. a db 10h b dw 100h c dw ? d dd ? ......................................................... mov al, 20h mul a ; (ax)(al)*a mov c, ax; depune rezultatul pe cuvnt mov ax, 10h mul b ; (dx:ax) (ax)*b mov word ptr d, ax; depune rezultatul pe dublu cuvnt mov word ptr d+2, dx ......................................................... l) Instruciunea IMUL (Integer Multiply)

Arhitectura Calculatoarelor

18

Forma general: IMUL sursa Instruciunea este similara cu MUL, deosebirea constnd n faptul ca cei doi operanzi se consider numere cu semn. Afecteaz indicatorii CF i OF, restul sunt nedefinii. Exemplu: alfa db 93 beta dw 143 rez dd ? ......................................................... mov al, alfa cbw ; extensia de semn n ah imul beta (dx:ax) (ax)*(beta) mov word ptr rez, ax mov word ptr rez+2, dx m) Intructiunea DIV (Divide) Forma general: DIV sursa unde sursa este un registru sau o locaie de memorie, reprezentata pe octet sau cuvnt. Instruciunea realizeaz mprirea fr semn intre demprit i mpritor. Daca mpritorul (sursa) este reprezentat pe octet atunci dempritul este AX i rezultatul este: ctul n al iar restul n ah, adic: DIV sursa ; (al) (ax)/(sursa) ; (ah) restul mpririi (ax)/(sursa)

Daca mpritorul (sursa) este reprezentat pe cuvnt atunci dempritul este considerat n DX i AX, ctul se obine n AX iar restul n DX, adic DIV sursa ; (ax) ctul mpririi (dx:ax)/(sursa) ; (dx) restul mpririi (dx:ax)/(sursa) Toi indicatorii nu sunt definii. Operaia de mprire poate conduce la depsiri, dac ctul depete valoarea maxim reprezentabil pe 8, respectiv pe 16 bii sau daca mpritorul este 0. n) Instruciunea IDIV (Integer Divide) Forma general: IDIV sursa Semnificaia instruciunii i a operandului sursa este aceeasi ca la Instruciunea DIV, cu diferena c operanzii sunt considerai numere cu semn, deci mprirea se face cu semn. Indicatorii sunt nedefinii. Operaia poate conduce la depsiri. 2.5.3 Aritmetica BCD a) Instruciunea AAA (ASCII Adjust for Addition) Instruciunea nu are operanzi i executa corecia acumulatorului AX, dup operaii de adunare cu numere n format BCD despachetai. Semnificaia este: daca (AL0:3) > 9 sau (AF) = 1, atunci { (AL) (AL) + 6 (AH) (AH)+1 (AF) 1 (CF) 1 (AL) (AL) AND 0FH } Indicatorii afectai : AF, CF, restul nedefinii. Exemplu: mov ax, 408h

Arhitectura Calculatoarelor

19

mov dx, 209h add ax, dx ; (ax)=0611h AAA ; (ax)=0707h b) Instruciunea AAS(ASCII Adjust for Subtraction) Instruciunea nu are operanzi i execut corecia acumulatorului AX, dup operaii de scdere cu numere n format BCD despachetai. Semnificaia este: daca (AL0:3) > 9 sau (AF) = 1, atunci { (AL) (AL) - 6 (AH) (AH) - 1 (AF) 1 (CF) 1 (AL) (AL) AND 0FH } Indicatorii afectai : AF, CF, restul nedefinii. Exemplu: mov ax, 408h mov dx, 209h sub ax, dx ; (ax)=01ffh AAS ; (ax)=0109h c) Instruciunea DAS (Decimal Adjust for Substraction) Instruciunea nu are operanzi i executa corecia zecimala a acumulatorului AL, dup operaii de scdere cu numere n format BCD mpachetat. Semnificaia este: daca (AL0:3) > 9 sau (AF) = 1, atunci { (AL) (AL) - 6 (AF) 1 } daca acum (AL4:7) > 9 sau CF = 1, atunci { (AL) (AL) - 60H (CF) 1 } Indicatorii afectai : AF, CF, PF, SF, ZF. Indicatorul OF este nedefinit. De exemplu, n urma secvenei: MOV AL, 52H SUB AL, 24H ; AL = 2EH DAS ; AL = 28H se obine n AL rezultatul corect 28H. d) Instruciunea AAM (ASCII Adjunct for Multiply) Instruciunea nu are operanzi i efectueaz o corecie a acumulatorului AX, dup o nmulire pe 8 bii cu operanzi n format BCD despachetai. Semnificaia este urmtoarea: (AH) (AL) / 10 (AL) (AL) MOD 10 Indicatori afectai: PF, SF, ZF, restul nedefinite. De exemplu mov al, 7 mov bl, 9 mul bl ; 003fh AAM ; 0603h e) Instruciunea AAD (ASCII Adjunct for Division) Instruciunea nu are operanzi i efectueaz o corecie a acumulatorului AX, naintea unei mpriri

Arhitectura Calculatoarelor

20

a doi operanzi n format BCD despachetai. Semnificaia este urmtoarea: (AL) (AH) * 10 + (AL) (AH) 0 Indicatori afectai: PF, SF, ZF, restul nedefinite. De exemplu mov ax, 305h mov bl, 2 AAD ; (ax)=23h div bl ; (al)=11h (ah)=1 2.5.4 Exemple programe Exemplul 1. Acest exemplu prezint cteva tehnici de adresare specifice procesoarelor din familia 8086/88: TITLE exemplul_1 .MODEL SMALL .STACK 10h .DATA alfa DW 3 DUP(?) .CODE begin: mov ax,@DATA mov ds,ax mov ax,17 ; Adresare imediata a operandului ; sursa care este o constant ; zecimala mov ax,10001b ; Sursa este o constant binara mov ax,11h ; Sursa este o constant hexa mov alfa,ax ; Adresare directa a operandului ; destinaie mov cx,ax ; Interschimb coninuturile mov ax,bx ; registrelor ax i bx mov bx,cx xchg ax,bx ; Acelasi efect cu secvena ; anterioara mov si,2 mov alfa[si],ax ; Adresare relativa cu registrul ; i a operandului destinaie mov si,2 mov bx,OFFSET alfa; Adresare imediat a operandului ; surs (adresa variabilei alfa) ; datorit operatorului OFFSET lea bx,alfa ; Aceasta instruciune are acelasi ; efect cu cea anterioar cu toate ; c sursa este adresat direct mov cx,[bx][si] ; Adresare bazat indexat a sursei mov cx,alfa+2 ; Aceast instruciune are acelasi ; efect cu cea anterioar, sursa ; fiind ns adresat direct mov cx,alfa[2] ; Notaii echivalente pentru mov cx,[alfa+2] ; Instruciunea anterioar mov di,4 mov [bx][di],55h ; Se va semnala eroare deoarece nu ; s-a precizat tipul destinaiei

Arhitectura Calculatoarelor

21

; care este o variabila anonima mov BYTE PTR [bx][di],55h; Se va folosi aceast ; variant cnd se dorete o ; adresare la nivel de octet mov BYTE PTR alfa+4,55h; Aceast instruciune are ; acelasi efect cu cea anterioar, ; destinaia fiind ns adresat ; direct. Desi alfa este definit cu ; DW, operaia este realizata la ; nivel de octet mov si,2 mov bx,3 mov alfa[bx][si],33h; Adresare bazata indexata ; relativa a operandului destinaie mov alfa[bx+si],33h; Notaii echivalente pentru mov [alpha+bx+si],33h; Instruciunea anterioara mov [bx][si].alfa,33h mov [bx][si]+alfa,33h END begin Pentru exemplificri s-a folosit Instruciunea mov n diferite variante de adresare: registru la registru, din memorie n registru i din registru n memorie. Exemplul 2. Se consider un vector de trei componente, fiecare component avnd dimensiunea de un cuvnt. Sa se permute circular elementele vectorului cu o poziie la stnga: TITLE exemplul_2 .MODEL SMALL .STACK 10h .DATA vect DW 100h,200h,300h .CODE start: mov ax,@DATA; Iniializarea registrului mov ds,ax ; de segment ds mov dx,vect ; Salvare n dx a primei ; componente a vectorului mov ax,vect+2; Transfer a doua mov vect,ax ; component n prima mov ax,vect+4; Transfer a treia mov vect+2,ax; component n a doua mov vect+4,dx; Transfer prima ; component n ultima END start Exemplul 3. Sa se ncarce intr-o variabila pointer valoarea propriei adrese, sub forma de offset i segment. TITLE exemplul_3 .MODEL SMALL .STACK 10h .DATA var_ptr DD ? ; Directiva DD are ca efect generarea sau ; rezervarea unor entiti pe 32 de bii .CODE begin: mov ax,@DATA mov ds,ax mov ax,OFFSET var_ptr mov WORD PTR var_ptr,ax

Arhitectura Calculatoarelor

22

; Operatorul OFFSET selecteaz componenta de ; offset a adresei unei variabile mov ax,SEG var_ptr mov WORD PTR var_ptr+2, ax ; Operatorul SEG selecteaz componenta de ; segment a adresei unei variabile END begin Exemplul 4. Sa se efectueze operatia: dp2 <- - dp1- sp1+sp2 stiind ca sp1 si sp2 sint intregi cu semn reprezentati in simpla precizie, pe un cuvint si dp2 este un intreg cu semn in dubla precizie pe doua cuvinte. TITLE exemplul_7 .MODEL SMALL .STACK 10h .DATA dp1 DD 12345678h sp1 DW 170h sp2 DW 180h dp2 DD ? .CODE begin: mov ax,@DATA mov ds,ax mov si,WORD PTR dp1 ; Perechea (si:di) mov di,WORD PTR dp1+2; este folosit ca ; acumulator pe 32 de bii deoarece (ax:dx) ; se folosete pentru conversii din simpla in ; dubla precizie mov ax,sp1 cwd ; Se convertete coninutul registrului ; ax, considerat ca un numr ntreg fr ; semn, poriunea cea mai ; semnificativa depunndu-se n registrul dx sub si,ax sbb di,dx mov ax,sp2 cwd add si,ax adc di,dx mov WORD PTR dp2,si mov WORD PTR dp2+2,di END begin ExempluL 5. Sa se elaboreze un program pentru implementarea operaiei: z <-- ((w-x)/10*y)2 unde x, y, z, w sunt ntregi cu semn reprezentai pe cte un cuvnt. TITLE exemplul_9 .MODEL SMALL .STACK 10h .DATA w DW 200 x DW 100 y DW -1 z DW ? .CODE begin: mov ax,@DATA mov ds,ax

Arhitectura Calculatoarelor

23

mov sub mov idiv cbw imul imul mov END

ax,w ; Se folosete ax ca ; acumulator ax,x bl,10 bl ; mprire ntreag, y ax z,ax begin

Exemplul 6. Sa se genereze 2 numere a cte 4 cifre zecimale reprezentate n format BCD mpachetat (adic fiecare grup de doua cifre zecimale este memorat intr-un octet) i s se scrie o secvena de program pentru calculul sumei i diferenei lor. TITLE exemplul_11 .MODEL SMALL .STACK 10h .DATA bcd1 DB 34h,18h; 1834 n format BCD ; mpachetat bcd2 DB 89h,27h; 2789 n format BCD ; mpachetat sum DB 2 DUP(?) dif DB 2 DUP(?) begin: mov ax,@DATA mov ds,ax mov al,bcd1 add al,bcd2 daa mov sum,al mov al,bcd1+1 adc al,bcd2+1 daa mov sum+1,al mov al,bcd1 sub al,bcd2 das mov dif,al mov al,bcd1+1 sbb al,bcd2+1 das mov sum+1,al END begin Exemplul 7. S se scrie un program pentru nmulirea unui numr ntreg pozitiv de doua cifre zecimale reprezentat n format BCD nempachetat cu o cifra zecimala: TITLE exemplul_15 .MODEL SMALL .STACK 10h .DATA dgt DB 09h ; 9 n format BCD ; nempachetat num DB 03h,02h; 23 n format BCD ; nempachetat rez DB 3 DUP(?) .CODE

Arhitectura Calculatoarelor

24

begin: mov ax,@DATA mov ds,ax mov dl,dgt mov al,num mul dl ; ax - 001bh aam ; ax- 0207h mov dh,ah mov rez,al mov al,num+1 mul dl ; ax 0012h aam ; ax 0108h add al,dh ; ax- 010Ah aaa ; ax 0200h mov rez+1,al mov rez+2,ah ; 07,00,02 END begin Exemplul 8. S se scrie un program de conversie a unui numr zecimal de doua cifre sub forma a doua caractere zecimale, i sa se afieze cele doua caractere pe ecran. Pentru afiare se va utiliza funcia DOS cu codul 02h, n registrul dl aflndu-se codul ASCII al caracterului care se vrea afiat. La apelul unei funcii DOS n registrul al se va transmite codul funciei. TITLE exemplul_16 .MODEL SMALL .STACK 10h .DATA oct DB 25 .CODE start: mov ax,@DATA mov ds,ax mov al,oct aam ; ax 0205h add ah,'0' add al,'0' mov dx,ax xchg dl,dh mov ah,2 ; Funcia DOS cu codul 02h int 21h ; se utilizeaz pentru mov dl,dh; afiarea unui caracter pe int 21h ; ecran, n dl ; transmindu-se codul ASCII al ; caracterului de afiat mov ax,4C00h; Iesire normala la int 21h ; sistemul de operare END start Exemplul 9. Conversia unui ntreg fr semn reprezentat pe 16 bii la un sir de caractere (cifre) n baza 10. Algoritmul de conversie, daca n este numrul, i sir este variabila unde se depun cifrele numrului descris, n C este: adresa = sir; do{ rest = n%10; n = n/10; *sir++ = rest + 0; }while (n!=0); *sir = 0; inverseaza (adrsir);

Arhitectura Calculatoarelor

25

Restul furnizeaz cifra curenta creia i se aduga codul ASCII al cifrei 0. Funcia inverseaz ordinea caracterelor din irul generat de algoritm. Implementarea n asamblare arata astfel: data segment n dw 7654h sir db 5 dup ("?"),'$' data ends cod segment assume ds: data, cs:cod start: mov ax,data mov ds,ax mov ax,n convert: mov cx,0 mov bx,10 divide: mov dx,0 div bx ; ctul n AX, restul n DX (DL) add dx,'0' push dx inc cx cmp ax,0 jnz divide reverse: pop ax mov sir[di],al add di,1 dec cx cmp cx,0 jnz reverse mov dx, offset sir mov ah,9 int 21h; 30292 mov ax, 4c00h int 21h cod ends end start 2.5.5 Instruciuni de salt i ciclare a)Instruciunea de salt necondiionat JMP Forma generala : JMP operand unde, operand este adresa de salt necondiionat. Exista urmtoarele tipuri de instruciuni JMP: de tip SHORT - cnd operandul specifica o adresa in domeniul -128 +127 fa de (IP) actualizat de tip NEAR - operandul specifica o adresa din acelai segment de cod; de tip FAR - operandul specifica o adresa din alt segment de cod. b)Instruciuni de salt condiionat Aceste instruciuni implementeaz salturile condiionate de indicatorii de condiie. Forma generala: Jcond operand unde: - cond este condiia de salt i este reprezentat de una sau doua litere (vezi tabelul de mai jos); - operand este un offset cuprins intre -128 si 128.

Arhitectura Calculatoarelor

26

Dac condiia este ndeplinit are loc saltul la adresa dat de operand, dac nu - se continu n secven. Se observa ca exista 2 categorii de instruciuni pentru mai mic si mai mare, cele care conin cuvintele above sau bellow si cele care conin cuvintele less sau greater. Primele se folosesc in situaia comparrii a doua valori fr semn, iar ultimele in situaia comparrii a doua valori cu semn. Fie secvenele de program: mov ax,0FFFEh mov bx, 2 cmp ax, bx ja alfa i mov ax, 0FFFEh mov bx, 2 cmp ax, bx jg alfa n care se compar pe cuvnt 0FFFEh si 2. Se observa ca (AX) > (BX) daca cele doua valori se considera reprezentate fr semn si ca (AX) < (BX) daca cele doua valori se considera cu semn. (-2 este mai mic decat 2). Ca atare in primul caz saltul la eticheta alfa are loc, pe cand in cel de-al doilea caz nu are loc. Fiecare mnemonic din tabel se refer la iniialele cuvintelor urmtoare, ce indic condiia n limba englez: Above (peste, mai mare), Below (sub, mai mic), Equal (egal), Not (nu), Greater (mai mare), Less (mai mic), Carry (transport), Zero, Overflow (depire de capacitate), Parity (PEven - paritate par, POdd - paritate impar), Sign (semn). Instruciune Condiie de salt Interpretare (mnemonica) JE, JZ ZF = 1 Zero, Equal JL, JNGE Less, Not Greater or Equal SF OF JLE,JNG SF OF sau ZF = 1 Less or Equal, Not Greater JB, JNAE, JC CF = 1 Below, Not Above or Equal, Carry JBE, JNA CF = 1 sau ZF = 1 Below or Equal, Not Above JP, JPE PF = 1 Parity, Parity Even JO OF = 1 Overflow JS SF = 1 Sign JNE, JNZ ZF = 0 Not Zero, Not Equal JNL, JGE SF = OF Not Less, Greater or Equal JNLE, JG SF = OF si ZF = 0 Not Less or Equal, Greater JNB, JAE, JNC CF = 0 Not Below, Above or Equal, Not Carry JNBE, JA CF = 0 si ZF = 0 Not Below or Equal, Above JNP, JPO PF = 0 Not Parity, Parity Odd JNO OF = 0 Not Overflow JNS SF = 0 Not Sign (Exemplu de citire: JNBE = jump if not below or equal, salt (J) dac nu (N) e mai mic (B) sau egal (E)). c) Instructiunea JCXZ (JUMP if CX is Zero) Instructiunea realizeaza salt la etcheta specificata daca continutul registrului CX este zero. Forma generala: JCXZ eticheta unde eticheta este o eticheta aflata in domeniul -128 si 127 fata de (IP) d) Instructiunea LOOP Forma generala: LOOP eticheta Are ca efect:

Arhitectura Calculatoarelor

27

cx cx -1 daca cx = 0 atunci (IP) (IP) + D8 adica se decrementeaza CX si daca acesta este diferit de zero se sare la eticheta specificata, in caz contrar se continua cu instructiunea urmatoare. D8 este un deplasament pe 8 biti si reprezinta diferenta intre offset-ul instructiunii urmatoare instructiunii LOOP si offset-ul etichetei. Ex: Suma celor n octeti de la adresa sir. .data sir db 7, 9, 15, 25, -18, 33, 11 n equ ($ - sir)/type sir suma db ? .code begin: mov ax, @data mov ds, ax xor al, al mov cx, n xor si, si repeta: add al, sir[si] inc si LOOP repeta mov suma, al mov ax, 4c00h int 21h end begin e) Instructiunea LOOPZ/LOOPE (LOOP While Zero/Equal) Forma generala: LOOPZ eticheta sau LOOPE eticheta Semnificatia: cx cx - 1 daca cx = 0 si ZF = 1 atunci (IP) (IP) + D8 Se decrementeaza cx si daca acesta este diferit de zero si indicatorul ZF este 1 (rezultatul ultimei operatii aritmetice a fost zero) se sare la eticheta specificata. f) Instructiunea LOOPNZ/LOOPNE (Loop While Not Zero/Not Equal) Forma generala: LOOPNZ eticheta sau LOOPNE eticheta Semnificatia: cx cx - 1 daca cx 0 si ZF = 0 atunci (IP) (IP) + D8 Efectul este ca se cicleaza cat timp rezultatul ultimei operatii aritmetice este diferit de zero, dar nu de mai multe ori cat este continutul initial a lui cx. 2.5.6 Instruciuni de deplasare (SHL, SAL, SHR, SAR) si de rotatie (ROL, RCL, ROR, RCR). Acest grup de instructiuni realizeaza operatii de deplasare si de rotatie la nivel de bit. Instructiunile au doi operanzi: primul este operandul propriu-zis, iar al doilea este numarul de biti cu care se deplaseaza sau se roteste primul operand. Ambele operatii se pot face la dreapta sau la stinga.

Arhitectura Calculatoarelor

28

Deplasarea inseamna translatarea tuturor bitilor din operand la stinga/dreapta, cu completarea unei valori fixe in dreapta/stinga si cu pierderea bitilor din stinga/dreapta. Deplasarea cu un bit la stinga este echivalenta cu inmultirea operandului cu 2, iar deplasarea la dreapta, cu impartirea operandului la 2. Rotatie inseamna translatarea tuturor bitilor din operand la stinga/dreapta, cu completarea in dreapta/stinga cu bitii care se pierd in partea opusa. Ambele operatii se fac cu modificarea bistabilului CF, care poate chiar participa la operatiile de rotatie. Forma generala a instructiunilor este: OPERATIE operand, contor in care operand este un registru sau o locatie de memorie de 8 sau 16 biti, iar contor (numarul de biti) este fie constanta 1, fie registrul CL, care contine numarul de biti cu care se deplaseaza/roteste operandul. Procesoarele mai avansate (80286 si peste) accepta un numar oarecare de biti, specificat si printr-o constanta intreaga. La operatiile de deplasare , se modifica toate flagurile conform rezultatului, in afara de AF, care este nedefinit. La operatiile de rotatie, se modifica numai CF si OF. La instructiunile de deplasare, se considera deplasari logice si aritmetice, care se pot utiliza dupa natura operanzilor. a) Instructiunea SHL/SAL (Shift Logic/Arithmetic Left) Are forma generala: SHL/SAL operand, contor

Desi exista doua mnemonice (SHL si SAL), in fapt este vorba de o unica instructiune. Bitul cel mai semnificativ al operandului trece in CF, dupa care toti bitii se deplaseaza la stanga cu o pozitie. Operatia se repeta de atitea ori de cat este valoarea lui contor (1 sau continutul registrului CL). b) Instructiunea SHR (Shift Logic Right) Are forma generala: SHR operand, contor

Bitul cel mai putin semnificativ din operand trece in CF, dupa care se deplaseaza toti bitii cu o pozitie la dreapta (impartire la 2). Faptul ca operatia de impartire se executa fara semn inseamna ca se completeaza cu un bit 0 dinspre stinga. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). c) Instructiunea SAR (Shift Arithmetic Right) Are forma generala: SAR operand, contor

Bitul de semn ramine nemodificat. Bitul cel mai putin semnificativ din operand trece in CF, dupa care se deplaseaza toti bitii cu o pozitie la dreapta . Faptul ca operatia de deplasare se executa cu semn inseamna ca se completeaza toti bitii eliberati cu bitul de semn. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). d) Instructiunea ROL (Rotate Left) Are forma generala: ROL operand, contor

Bitul cel mai semnificativ din operand trece atit in CF, cat si in bitul cel mai putin semnificativ din

Arhitectura Calculatoarelor

29

operand, dupa ce toti bitii acestuia s-au deplasat la stanga cu o pozitie. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). e) Instructiunea ROR (Rotate Right) Are forma generala: ROR operand, contor

Bitul cel mai putin semnificativ din operand trece atit in CF, cat si in bitul cel mai semnificativ din operand, dupa ce toti bitii acestuia s-au deplasat la dreapta cu o pozitie. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). f) Instructiunea RCL (Rotate Left through Carry) Are forma generala: RCL operand, contor

Bitul cel mai semnificativ din operand trece in CF, se deplaseaza toti bitii din operand cu o pozitie la stinga, iar CF initial trece in bitul cel mai putin semnificativ din operand. Operatia se repeta de atitea oricit este valoarea lui contor (1 sau continutul registrului CL). f) Instructiunea RCR (Rotate ight through Carry) Are forma generala: RCR operand, contor

Bitul cel mai putin semnificativ din operand trece in CF, se deplaseaza toti bitii din operand cu o pozitie la dreapta, iar CF initial trece in bitul cel mai semnificativ din operand. Operatia se repeta de atitea ori cit este valoarea lui contor (1 sau continutul registrului CL). 2.5.7 Instuctiuni logice Instuctiunile logice realizeaza functiile logice de baza, pe octet sau pe cuvant. Operatiile se fac la nivel de bit. a) Instuctiunea NOT (Not) Forma generala : NOT dest in care dest poate fi un registru sau o locatie de memorie. Instructiunea provoaca negarea tuturor bitilor operandului, adica se face complementul fata de unu. b) Instuctiunea AND (And) Forma generala : AND dest, sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest si-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. c) Instuctiunea OR (Or) Forma generala : OR dest, sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest sau-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit.

Arhitectura Calculatoarelor

30

d) Instuctiunea XOR (Exclusive Or) Forma generala : XOR dest,sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea depune in dest xor-logic la nivel de bit intre dest si sursa. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. e) Instuctiunea TEST (Test) Forma generala : TEST dest,sursa in care dest poate fi un registru sau o locatie de memorie iar sursa un registru sau o locatie de memorie sau o constanta. Instructiunea realizeaza and-logic la nivel de bit intre dest si sursa cu pozitionarea indicatorilor. Indicatori afectati: SF, ZF, PF, CF=0, OF=0, AF nedefinit. Exemple programe {Cautare secventiala} Sa se scrie un program pentru cautarea primului blanc din sirul incepind de la adresa sir. La iesirea din program ax va contine valoarea 0 daca sirul nu contine blancuri, altfel va contine valoarea pozitiei din sir a primului blanc gasit. Se presupune ca sirul sir are l caractere. TITLE exemplul_1 .MODEL SMALL .STACK 10h .DATA sir DB 'Acesta este un sir!' l EQU $-sir .CODE begin: mov ax,@DATA mov ds,ax mov cx,l mov si,-1 mov al,' ' urm: inc si cmp al,sir[si] loopne urm jne nu_gasit mov ax,l sub ax,cx jmp iesire nu_gasit: mov ax,0 iesire: nop END begin 2.5.8 Instruciuni pentru controlul procesorului Sunt instruciuni care controleaz anumite funcii ale procesorului, ce acioneaz fie prin intermediul unor indicatori de control (sau registre de control), fie prin introducerea unor stri sau semnale necesare pentru sincronizarea cu evenimentele externe. Exemple: CMC ;complementarea valorii indicatorului CF CLC ;poziionarea pe 0 a indicatorului CF STC ;poziionarea pe 0 a indicatorului CF NOP ;Nici o operaie, dar consum 3 perioade de ceas. CLD ;poziionarea pe 0 a indicatorului DF STD ;poziionarea pe 1 a indicatorului DF CLI ;poziionarea pe 0 a indicatorului IF, dezactivare ntreruperi mascabile STI ;poziionarea pe 1 a indicatorului IF

Arhitectura Calculatoarelor

31

HLT ;Oprire microprocesor pn la RESET, NMI, sau INT (dac sunt activate) WAIT ;ateptare pn cnd vine semnalul exterior test=0 ESC ;operaie destinat coprocesorului LOCK ;prefix care activeaz semnalul extern /lock, astfel c microprocesorul anun ;c nu va rspunde la o cerere de cedare a controlului magistralelor. 2.5.9 Instruciuni pentru lucrul cu iruri n afar de tipurile de baz amintite mai sus, exist i posibilitatea efecturii unor operaii de transfer, sau operaii aritmetice i logice cu iruri de date (cu informaii aflate n zone continue de memorie). Operaiile pe iruri pot fi efectuate individual, pentru fiecare cuvnt din ir, sau automat - cu repetare, numrul de repetri al instruciunii fiind dictat de coninutul unui registru contor. Operaiile tipic efectuate sunt: transferul unui ir din zon sursa n zon destinaie comparare ntre dou iruri cutarea unei valori ntr-un ir ncrcarea acumulatorului cu elementele unui ir. citirea unui ir de la un port de intrare scrierea unui ir la un port de ieire Exemple : MOVSB(W) ;transfer pe 8 (16) bii [DS:SI][ES:DI] ;SISI+1; DIDI+1 (decrementare pentru DF=1) CMPSB(W) ;comparare pe 8(16) bii [DS:SI] cu [ES:DI] ;SISI+1; DIDI+1 (decrementare pentru DF=1) SCASB(W) ;comparare pe 8(16) bii intre AL(AX) i [ES:DI] ;DIDI+1 (decrementare pentru DF=1) LODSB(W) ;se ncarc AL(AX) de la [DS:SI] ;SISI+1 (decrementare pentru DF=1) STOSB(W) ;se stocheaz AL(AX) la [ES:DI] ;DIDI+1 (decrementare pentru DF=1) REP ;prefix de repetare. Contorul este CX. DATA SEGMENT sir1 DB 100 DUP(7) sir2 DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME cs:CODE,ds:DATA,es:DATA start: mov ax,DATA mov ds,ax mov es,ax mov si,OFFSET sir1 mov di,OFFSET sir2 mov cx,LENGTH sir1 cld muta: movs sir1,sir2 loop muta CODE ENDS END start Utilizind prefixul rep bucla: muta: movs sir1,sir2 loop muta din exemplu se poate rescrie astfel: rep movs sir1,sir2 2.5.10 Echivalari

Arhitectura Calculatoarelor

32

Echivalarile reprezinta niste valori constante de tip constanta numerica sau sir de caractere atribuite unor nume simbolice, simbolurile putind fi inlocuite in locul valorilor respective. a) Echivalarile numerice sint folosite pentru a atribui o constanta numerica unui simbol. Acestea pot fi: - redefinibile: valoarea unui simbol poate fi redefinita in orice moment in timpul asamblarii; Sintaxa unei echivalari numerice redefinite este: nume = expresie unde: expresie poate fi un intreg, o expresie constanta, o constanta de tip sir de caractere sau doua constante sau o expresie evaluata la o adresa. nume este un nume de simbol unic sau un nume de simbol definit anterior cu =. - neredefinibile: valoarea simbolului nu poate fi redefinita in timpul asamblarii. Sintaxa unei echivalari numerice neredefinibile este: nume EQU expresie parametrii avind semnificatiile: nume este un nume de simbol unic; Simbolurile definite prin echivalari numerice pot fi folosite in constructii ulterioare ca operanzi imediati. Acestor simboluri nu li se aloca memorie. Operatorii admisi in cazul folosiri expresiilor constante sunt: 1.operatori aritmetici: + si - unari, + si - binari, * si /(impartire intreaga), mod(rest). Operaorii binari + si - se pot folosi si cind un operad este o constanta si celalalt o adresa, rezultatul fiind o adresa. Operatorul binar se poate folosi si cind ambii operanzi sint adrese, cu restrictia de a fi plasati in acelasi segment, rezultatul fiind o constanta. 2.operatori de deplasare: SHR si SHL realizeaza deplasarea logica dreapta, stinga. Sintaxa este expresie SHR/SHL cant unde cant reprezinta numarul de biti deplasati. 3.operatori logici la nivel de biti: Acestia sint: NOT, AND, OR, XOR. 4.TYPE intoarce un numar ce reprezinta tipul unei expresii; 5.SIZE intoarce numarul total de octeti alocati pentru un tablou sau (variabila definita cu DUP); 6.HIGH, LOW selecteaza octetii cel mai semnificativ respectiv cel mai putin semnificativ ai unei expresii; Exemplificare echivalari : DATA SEGMENT WORD 'DATA' intgr = 14*3 ;=42 intgr = intgr/4 ;10 intgr = intgr mod 4 ;2 intgr = intgr+4 ;6 intgr = intgr-3 ;3 ORG 100h a DB ? ;aduna 100h b DB ? ;aduna 101h mem1 EQU a+5 ;mem1=105h mem2 EQU a-5 ;mem2=0FBh const EQU b-a ;const=1 val = 01110111b depls = val SHL 3 ;=01110111000b depld = val SHR 3 ;=01111b off_a EQU OFFSET a

Arhitectura Calculatoarelor

33

high_off_a EQU HIGH off_a seg_b EQU SEG b vect DW 60 DUP(?) s_vect EQU SIZE vect ;60 * 2 = 120 l_vect EQU LENGTH vect ;60 t_vect EQU TYPE vect ;2 verif EQU t_vect*l_vect ;=2*60 DATA ENDS END In general echivalarile sint pastrate in fisiere separate de includere, fiind incluse intr-un program prin intermediul directivei INCLUDE.

2.6 Subprograme i macroinstruiuni n general definirea unui subprogram se face cu directiva PROC n maniera urmtoare: nume PROC {NEAR | FAR} corp RET {constanta} nume ENDP Dac atributul NEAR i FAR lipsesc, n cazul utilizrii definiiilor complete se consider implicit NEAR, iar n cazul definiiilor simplificate se folosesc valorile implicite n funcie de modelul de memorie utilizat. Tehnicile de transfer a parametrilor combin diversele modaliti de alegere a tipurilor de locaii fizice pentru pstrarea parametrilor transmii: registre, locaii de memorie fixate, codul apelant, stiva procesorului, tehnica blocurilor (tabelelor) de parametri, cu ceea ce se transmite efectiv referitor la un anumit parametru: adresa sau valoarea acestuia. Instructiunea CALL (apel de procedura) Poate aparea sub una din formele: CALL nume_proc CALL NEAR PTR nume_proc CALL FAR PTR nume_proc Tipul apelului poate fi dedus din tipul procedurii (primul caz) sau specificat explicit prin NEAR si FAR. Tipul apelului trebuie sa coincida cu tipul procedurii si cu tipul instructiunii RETURN din interiorul procedurii. Instructiunea RET (RETURN) Forma general: RET [n] unde n este o constanta intreaga optionala. Daca instructiunea RET este de tip NEAR semnificatia sa este: (IP) SS: ((SP) + 1:(SP)) (SP) (SP) + 2 [(SP) (SP) + n] adica se reface (IP) prin copierea continutului varfului stivei si incrementarea cu 2 a lui (SP). Daca in instructiunea RET apare si constanta n atunci aceasta constanta se aduna la (SP), adica se descarca stiva. Exemplu: DATA SEGMENT a DD 55555h b DD 77777h

Arhitectura Calculatoarelor

34

s DD ? DATA ENDS COD SEGMENT ... ; incarca primul numar in DX:AX mov ax,WORD PTR a[0] mov dx,WORD PTR a[2] ; incarca al doilea number in DI:SI mov si,WORD PTR b[0] mov di,WORD PTR b[2] ; incarca adresa rezultatului in BX mov bx,OFFSET s ; apeleaza procedura call pro_ad ... ; codul procedurii pro_ad PROC NEAR add ax,si adc dx,di mov [bx],ax mov [bx+2],dx ret pro_ad ENDP ... COD ENDS O macroinsrtuctiune reprezinta o secventa de cod sursa careia i se atribuie un nume simbolic, continutul acastei secvente putind fi repetat ori de cite ori in cadrul unui program prin simpla referire la numele simbolic respectiv. Utilizarea unei macroinstructiuni necesita parcurgerea a doi pasi: 1.Definirea macroinstructiunii, care se marcheaza printr-o macrodefinitie. Aceasta cuprinde o secventa de cod, intre directivele MACRO si ENDM. Sintaxa este: nume MACRO {parametrii} cod ENDM unde: nume reprezinta numele simbolic dat macroinstructiunii ; parametrii reprezita parametrii formali optionali ai macroinstructiunii, separati prin virgula, blancuri sau TAB-uri. La apelul macroinstructiunii, acesti parametri formali sint inlocuiti textual cu parametrii actuali. 2.Apelul macroinstructiunii, care se realizeaza printr-un macroapel, cu sintaxa: nume {argumente} unde: nume reprezinta numele simbolic al macroinstructiunii apelate; argumente reprezinta lista parametrilor actuali, separati prin virgula, blancuri sau TAB-uri. Apelul macroinstructiunii are ca efect includerea textuala a codului din definitia macroinstructiunii in corpul programului. Exemplu : Adunarea a 3 cuvinte cu depunerea rezultatului in ax. TITLE exemplu addup MACRO ad1,ad2,ad3 mov ax,ad1 add ax,ad2

Arhitectura Calculatoarelor

35

add ax,ad3 ENDM a DW 1 b DW 2 c DW 3 d DW ? begin:mov ax,@DATA mov ds,ax addup a,b,c mov dx,ax addup dx,dx,dx mov d,ax addup d,dx,c END begin Pentru definirea unor simboluri in cadrul unei macroinstructiuni, care la fiecare apel al macroinstructiunii respective vor fi inlocuite cu nume unice de simboluri, gesionate de asamblor, se utilizeaza directiva LOCAL cu sintaxa: LOCAL nume {,nume} ... Directiva LOCAL, daca este prezenta intr-o macrodefinitie, trebuie sa urmeze imediat directivei MACRO. Exemplu: Ridicarea unui numar la o putere. power MACRO factor,exponent LOCAL again,gotzero xor dx,dx mov ax,exponent mov ax,1 again: jcxz gotzero mul bx loop again gotzero: ENDM

Você também pode gostar