Sunteți pe pagina 1din 18

Coprocesorul matematic

Consideraii teoretice Cu toate c procesorul 8086 respectiv 80286, 80386 i 80486 au o serie de instruciuni aritmetice puternice (care exist n repertoriul microprocesoarelor de generaia a doua, cum sunt nmulirea i mprirea binar) nu sprijin operaiile aritmetice cu numerele reprezentate n virgula flotant sau pentru numerele ntregi reprezentate pe mai muli octei. Dac vrem sa efectum astfel de operaii atunci aceste operaii trebuie sa fie realizate prin biblioteci de macrouri sau prin subrutine. O cale mai simla este utilizarea limbajelor de nivel nalt, n aceste limbaje operaiile de mai sus fiind realizate prin biblioteci. Pentru evitarea greutilor amintite firma INTEL a dezvoltat coprocesorul aritmetic INTEL 8087 (80287, 80387). Acestea dup cum arat i numele sunt co-procesoare, care coopereaz cu procesorul principal al calculatorului. Coprocesorul nu poate lucra independent de procesor. Coprocesorul nu poate s extrag singur instruciunile din memorie, acesta fiind realizat de procesor. Principiul de funcionare Coprocesorul se iniializeaz odat cu activarea semnalului RESET, general n sistemul de calcul. n urma acestui semnal coprocesorul este adus intr-o stare iniial (cu mascarea erorilor, tergerea registrelor, iniializarea stivei, rotunjirea implicit, etc. ). Dupa prima instruciune executat de procesor coprocesorul poate detecta cu ce procesor lucreaz (dac este 8086 pe pinul 34 va fi 0 logic-semnalul / BHE-iar dac este 8088 va fi 1 logic-semnalul/SS0). n funcie de tipul procesorului, coprocesorul se configureaz corespunztor. Coprocesorul se conecteaz pe magistrala local a procesorului prin liniile de adrese/date, stare, ceas, ready, reset, test i request/grant. Fiind conectat la magistrala local microprocesorul permite coprocesorului accesul la toat memoria i resursele de intrare/ieire, prin intermediul cererii de magistral request/grant. Cele dou procesoare lucrnd n paralel este nevoie de sincronizarea proceselor care ruleaz n ele. De regul sincronizarea erorilor i a instruciunilor este rezolvat de compilatoare sau asambloare, iar sincronizarea datelor trebuie s o fac utilizatorul care lucreaz n limbajul de asamblare. Responsabilitatea controlului programului o are microprocesorul. Operaia cu microprocesorul este iniiat cu o instruciune special ESCAPE n felul urmtor: coprocesorul supravegheaz fluxul de instruciuni de la memorie spre procesor. Din decodificarea semnalelor S0, S1 i S2 coprocesorul tie cnd se ncarc n coada de instruciuni a procesorului instruciuni i memoreaz aceste instruciuni n propria coad. Din semnalele de stare a microprocesorului (QS0 i QS1) coprocesorul va cunoate cnd se extrage din coada de instruciuni primul octet din instruciune. Dac coprocesorul detecteaz pe baza informaiilor din propria coad i pe baza semnalelor de stare c procesorul urmeaz s execute (deci se va extrage din coada de instruciuni) o instruciune ESC, coprocesorul se activeaz.

Codul instruciunii ESC este urmtorul: 1101 1xxx mod xxx r/m

Semnificaia simbolurilor x este: indiferent. Rezult c toate instruciunile care au codul operaiei cuprins ntre D8-DF sunt interpretate ca instruciuni ESC. mpreun cu cei trei bii din octetul doi permit n total 64 de instruciuni pentru coprocesor. Microprocesorul execut instruciunea ESC calculnd o adres de memorie (din mod i r/m) i executnd un ciclu de magistral de a citi datele de la adresa calculat (dac mod este 11 nu se execut nici un ciclu magistral). Nu se citesc efectiv datele aduse din memorie, numai se genereaz un ciclu magistral (deci apare ca o instruciune fr efect NOP). Coprocesorul fiind activat de codul instruciunii ESC, decodific cei sase bii din instruciunea ESC i poate captura adresa i/sau datele prezente n locaia de memorie selectat de instruciune. Acest mecanism permite programatorului de a trata instruciunea ESC (definit pentru coprocesor) ca o instruciune obinuit cu toate modurile de adresare. Se permite transferul unei adrese ca parametru pentru coprocesor. Dac coprocesorul are nevoie de mai multe date din memorie, el poate s cear preluarea controlului de la microprocesor. Este de reinut c toate informaiile pentru procesor sunt n memorie, registrele microprocesorului nefiind accesibile. n timpul execuiei activitii proprii coprocesorul ine linia / TEST la nivel nalt pentru a arta procesorului c este ocupat. n interiorul coprocesorului avem o memorie de 80 de octei organizat sub forma unei stive de opt elemente de 10 octei fiecare. Pe cei zece octei numerele n virgul mobil se reprezint sub format intern, cu precizie extins. Coprocesorul poate accesa memoria calculatorului, cu orice mod de adresare cunoscut de 8086, orice dat de format legal. Datele aduse din memorie se convertesc n formatul intern al coprocesorului i se pun la vrful stivei. La scrierea n memoria principal se face conversia din formatul intern n formatul specificat de utilizator. Condiia pentru efectuarea operaiilor n virgul flotant n coprocesor este ca operandul (pentru operaii cu doi operanzi, cel puin unul din operanzi) s fie n vrful stivei. Deci cu ajutorul coprocesorului putem efectua urmtoarele operaii: - citirea datelor n memoria intern a coprocesorului (pe stiv) din memoria calculatorului - efectuarea operaiilor aritmetice necesare - scrierea rezultatului n memoria calculatorului. Tipurile de date cunoscute de INTEL 8087 Marele avantaj al coprocesorului este faptul c nu lucreaz doar cu numere n virgul flotant, ci i cu numere ntregi i recunoate i tipuri de date zecimale mpachetate. Deci dac avem o operaie complicat de efectuat ntre numere ntregi i ea trebuie s fie foarte rapid i acest lucru de poate realiza cu ajutorul coprocesorului, nu avem nevoie de conversie, costisitoare n timp, din ntreg n virgul flotant i dup aceea invers doar pentru ca coprocesorul s poat lucra cu ele.

Tipuri de date n virgul flotant Real scurt-numr reprezentat n virgul flotant pe 32 de bii. Numrul se reprezint descompus pe mantis i caracteristic. Caracteristica se reprezint pe 8 bii dintre care cel mai semnificativ este bitul de semn, interpretat special. Lungimea fizic a mantisei este de 23 de bii. Semnul numrului real este dat de bitul cel mai semnificativ: 31 30 23 22 0 s Caracteristic Mantis (ncepe cu 1) | se consider implicit un bit 1 Aceast reprezentare a numerelor n virgul flotant lucreaz ntotdeauna cu numere normalizate, deci primul bit al mantisei este ntotdeauna 1, acesta nu se scrie considerndu-se implicit. Deci lungimea real a mantisei este de 24 de bii. Este important s cunoatem precizia practic. Mantisa nseamn 6-7 cifre zecimale, pe cnd caracteristica prin cei 8 bii ai si crete numrul pn la ordinul de mrime ~10 la puterea 38 (numrul exact nu se poate stabili deoarece depinde de mantis). Cel mai mare numr este aproximativ 1, 7*10la puterea 38, iar cel mai mic numr real pozitiv este n jur de 10 la puterea 38. Real lung-numrul n virgul reprezentat pe 64 bii. Este reprezentat descompus n mantis i caracteristic. Caracteristica are lungime de 11 bii din care cel mai semnificativ este bitul semn special al caracteristicii. Mantisa are lungime fizic de 52 bii. Semnul numrului este dat de bitul cel mai semnificativ : 63 62 52 51 0 s caracteristic Mantis (ncepe cu 1) | se consider un 1 implicit Ca i n cazul anterior i aici avem un bit implicit, deci lungimea efectiv a mantiseieste 53 de bii. Pe aceti 53 de bii se pot reprezenta aproximativ 15-16 cifre, iar reprezentarea numerelor mici este foarte exact. Real cu precizie ridicat-numr n virgul flotant reprezentat pe 80 de bii. Este reprezentat descompus pe mantis i caracteristic. Lungimea caracteristicii este de 15 bii dintre care cel mai semnificativ este bitul de semn. Lungimea mantisei este de 64 de bii. Semnul numrului este dat de cel mai semnificativ bit. 79 78 64 63 0 s caracteristic 1 mantis Numerele flotante cu precizie ridicat nu sunt ntotdeauna normalizate, motiv pentru care numrul nu ncepe obligatoriu cu un bit de 1. Deci lungimea mantisei, n acest caz, este doar de 64 de bii. Mantisa normalizat pe 64 de bii a numerelor reale cu precizie ridicat reprezint aproximativ 19 cifre zecimale. Caracteristica are o lungime de 15 bii. Deoarece numrul nu este reprezentat ntotdeauna normalizat cel mai mic numr reprezentabil este mult mai mic dect cel la care ne ateptm: este n jur de 10 la puterea 4932. Acest mod de reprezentare este foarte sensibil la faptul dac numrul este diferit sau nu de 0. Complementul fa de doi

Principiul metodei: ne lipsim de unul din biii care ne stau la dispoziie (cel mai semnificativ) acesta va reprezenta semnul. Numrul zero este reprezentat de un ir de bii de 0. Pornind de aici obinem numerele pozitive prin mrire. Numerele negative se obin prin scdere. Pentru un numr de opt bii avem: nr. zecimal nr. binar 0 0000 0000 1 0000 0001 2 0000 0010 ...... ...... 122 0111 1010 127 0111 1111 -1 1111 1111 -2 1111 1110 ... .... ... -122 1000 0110 -128 1000 0000 Pentru orice numr de bii, semnul numrului este coninut n cel mai semnificativ bit. Dac acest bit este zero numrul este pozitiv i dac e unu numrul e negativ. S reinem cel mai simplu algoritm de conversie: S inversm toate cifrele binare i s adunm 1 la rezultat. S nu inem cont de depire. Primul mod este utilizarea instruciunii NEG caz n care procesorul efectueaz conversia. Un alt mod este utilizarea instruciunilor NOT (care ne d complementul fa de unu i INC. Cele dou ci difer prin efectele laterale, vor exista cazuri n care dup calculul complementului fa de doi cu cele dou metode, flag-urile vor fi poziionate n mod diferit pentru cele dou cazuri. Pentru conversia unor ntregi mai lungi avem o singur metod: aplicm NOT pentru fiecare octet apoi octetul cel mai puin semnificativ l incrementm cu unu asigurnd transportul prin tot numrul:
VERYLONG DQ NOT NOT NOT NOT ADD ADC ADC ADC ? WORD WORD WORD WORD WORD WORD WORD WORD PTR PTR PTR PTR PTR PTR PTR PTR ;ntreg foarte lung VERYLONG VERYLONG+2 VERYLONG+4 VERYLONG+6 VERYLONG, 1 VERYLONG, 0 VERYLONG, 0 VERYLONG, 0 ;inversm ;atent ;toi ;biii ;incrementm ;numrul ;cu unu ;

Urmtoarea problem este reprezentarea numerelor n BCD mpachetat. Dup cum urmeaz s vedem vom putea utiliza numerele BCD foarte comod nu numai cu ajutorul coprocesorului ci i din program. Dar operaiile cu numerele BCD cu semn introduc unele probleme In care vor iei la iveal adevratele avantaje ale reprezentrii n complement fa de doi.

Dup cum s-a mai descris, un numr BCD ocup 10 octei, are 18 cifre i bitul cel mai semnificativ este bitul de semn. S vedem un astfel de numr BCD creat de asamblor. Prezentm o parte dintr-un program exemplu: 0000 56 34 12 00 00 00 00 00 00 BCD1 DT 123456 000A 56 34 12 00 00 00 00 00 80 BCD2 DT -123456 Aceast bucat de segment de date conine doi operatori DT, valorile lor iniiale fiind opuse. se vede c cifrele ocup 4 bii i cifra cea mai semnificativ va fi reprezentat pe cei 4 bii mai puin semnificativi ai zonei de 10 octei. Semnul numrului este n cei mai semnificativi 4 bii i din acetia cel mai semnificativ bit. Dup cum se cunoate, operaiile adiionale (adunarea i incrementarea respectiv scderea i decrementarea) se pot efectua simplu cu numere reprezentate n BCD. Dar dei nmulirea i mprirea n BCD sunt susinute de codul main, n limbaj de asamblare aceste operaii ne creeaz dificulti. S ne gndim la faptul c unul din cei mai complicai algoritmi ai matematicii elementare este mprirea. mprirea binar este mult mai simpl dect mprirea numerelor zecimale deoarece nu trebuie s nimerim ctul, ns a aduce urmtoarea cifr este forte greu de realizat n limbaj de asamblare. Totui algoritmul mpririi binare este mult mai simplu dect cel n BCD deoarece n BCD, din punct de vedere algoritmic numerele sunt descrise n zecimal i nu n binar. Dac admitem ns i reprezentarea numerelor zecimale n BCD obine o reprezentare mai exact: aceast reprezentare nu face rotunjiri i numrul 58. 3 se poate reprezenta exact. S vedem n continuare problema reprezentrii numerelor n virgul flotant. Este clar c numrul 0. 0000 este reprezentat doar cu bii de 0. Reprezentarea numrului 1. 0000 (eticheta lui este FL1). Dup cum s-a observat n prezentarea scurt anterioar primul bit al mantisei este obligatoriu 1. Avem deci reprezentarea: 1. 0000x2 La valoarea FL1 (citind de sus n jos 3F 80 00 00). Valoarea mantisei este un ir de 0-uri deoarece primul 1 este considerat implicit. Caracteristica este FFH, dar de ce? Rspunsul este caracteristica trebuie reprezentat mrit cu FFH pentru ca n operaiile cu caracteristici s nu trebuiasc s operm cu reprezentarea n complement fa de doi. De aici avem deja clar reprezentarea numrului 2. 0 1. 00000x2 unde mantisa este un ir de zerouri, iar caracteristica 80H. (FFH+1) Avem acest lucru n numrul FL2 reprezentat prin 40 00 00 00. Puterile mai mari a lui doi se trateaz identic, cu mrirea continu a caracteristicii, iar valorile negative se trateaz simplu prin poziionarea pe 1 a bitului cel mai semnificativ. De aici i citirea corect a numrului 2. 00000 este 0[bit semn], 80[caracteristic] i 23 de 0[mantis]. Pentru urmtorul exemplu pornim de la numrul 1. 00000, dar de data aceasta nu se nmuleste ci se mparte cu doi. Nici n acest caz nu avem o schimbare semnificativ n mantisa numerelor, ea va rmne n continuare 23 de 0. Ca urmare a mpririlor repetate caracteristica ncepe s se descarce. Dup cum se poate observa din numrul FLO5 lipsete valoarea 80 a celui de-al doilea octet, deci caracteristica scade de la 7FH la 7EH s. a. m. d. Pentru variantele negative, bitul cel mai semnificativ se poziioneaz pe 1, simboliznd semnul negativ.

n pasul urmtor se folosesc cu numere care nu sunt puteri ale lui doi. Valorile numerice sunt: 3. 00000 nmulit cu puteri ale lui doi. Prima observaie este c numrul 3. 00000 difer doar printr-un singur bit de numrul 2. 00000. Acest bit se afl n al doilea octet pe poziia 6. Acesta este de fapt bitul cel mai semnificativ al mantisei. Adugnd bitul cel mai semnificativ, implicit al mantisei, rezult mantisa 1100 n care punctul se nelege ntre cei doi bii unu. Valoarea caracteristicii este desigur 1. Valorile negative corespunztoare numerelor de mai sus se obin identic ca n cazurile anterioare, deci nu se vor trata. Valoarea aproximativ a lui 1/3 (este o fracie infinit deci se poate reprezenta doar trunchiat) este urmtoarea: 0[bit semn], 7D[caracteristic], apoi pe 23 de bii secvena 0101.... Valoarea 7D a caracteristicii valoreaz 2, deoarece numrul este mai mic dect . 0064 AA AA AA 3E FL03 DD 0. 333... In final numerele reprezentate n dubl precizie i n precizie ridicat. se propune n aceast parte s prezentarea definiiilor utilizate. Caracteristica numrului n dubl precizie este de 12 bii, valoarea complementar e 3FFH. Citirea reprezentarii n dubl precizie a numrului 1. 00000: 0[bit semn] 3FFH[caracteristic, cu bitul semn 0] 52 buc de bii 0 (din care rezult 53 de bii adugnd 1 implicit). La numerele reprezentate n precizie ridicat caracteristica este de 15 bii; cel mai semnificativ bit al celui de-al treilea octet pornind de la cel mai semnificativ este parte a mantisei. nainte de a termina analiza reprezentrii numerelor se remarc avantajul reprezentrii numerelor cu caracteristic deplasat. La compararea a dou numere efectum comparaia celor dou pornind de la bitul cel mai semnificativ; prima valoare diferit va decide care din ele este mai mare. n cazul reprezentrii n complement fa de doi compararea ar fi mult mai complicat. n reprezentarea intern a coprocesorului avem cteva cazuri speciale. Coprocesorul cunoate 0-ul negativ i se poate reprezenta infinitul i a infinitul cu semn. Valoarea fizic 0 a caracteristicii este o valoare special nedefinit. Erori de operaie (excepii) La efectuarea operaiilor n virgul flotant putem avea numeroase erori ncepnd de la erori logaritmice triviale, pn la erorile provenite din limitele reprezentrii. Acestea le vom numi excepii. n continuare vom cunoate tipurile acestor erori i posibilitile principale de manevrare a lor. n cazul apariiei erorilor, coprocesorul poate avea dou tipuri de comportare. Anun eroarea printr-o ntrerupere dac utilizatorul valideaz acest lucru. Dac nu validm ntreruperea, coprocesorul va trata intern eroarea i n funcie de erorile aprute va aciona n modul prezentat n continuare. Proiectanii coprocesorului au clasificat erorile n urmtoarele 6 clase: Invalid operation operaie invalid Aceasta poate fi: depire superioar sau inferioar a stivei interioare a coprocesorului. Depirea inferioar apare n cazul n care vrem s accesm un element din

stiv care nu exist. Acestea sunt de obicei erori (destul de grave) algoritmice; coprocesorul nu afecteaz operaia. Avem rezultat nedefinit n cazul n care ncercm s mprim 0. 0 cu 0. 0, coprocesorul nu este pregtit pentru aceasta. Cazuri similare apar la scderea lui infinit din infinit, etc. Aceste erori (dei se pot evita prin algoritm) nu sunt erori att de grave ca cele de depire inferioar sau superioar a stivei. Avem tot acest rezultat dac o funcie de coprocesor este apelat ca parametrii necorespunztori. n cazul apariiei rezultatului nedefinit coprocesorul nscrie n caracteristic o valoare rezervat pentru acest caz (bii de zero). Overflow depire superioar Rezultatul depete numrul cel mai mare ce se poate reprezenta. Coprocesorul nscrie infinit n locul rezultatului i continu lucrul. Zero Divizor mprire cu zero mpritorul mpririi de efectuat este zero, iar dempritul nu este zero sau infinit. Coprocesorul nscrie n locul rezultatului infinit i continu lucrul. Underflow depire inferioar Valoarea rezultatului n modul este mai mic dect numrul cel mai mic reprezentabil. Rezultatul va fi zero, coprocesorul continu lucrul. Denormalized Operand operand nenormalizat Aceast excepie apare dac unul din operanzi nu este normalizat sau rezultatul nu se poare reprezenta normalizat (de exemplu este att de mic nct este imposibil normalizarea lui). Coprocesorul continu lucrul (valorile diferite de zero se pierd, vor fi zero). Inexact result Rezultat inexact Rezultatul operaiei este inexact din cauza unor rotunjiri prescrise sau necesare. Putem avea astfel de rezultate dup mprire, dac mprim de exemplu 2. 0 cu 3. 0 rezultatul se poate reprezenta doar ca o fracie infinit. Coprocesorul efectueaz rotunjirea i continu lucrul. Cele de mai sus sunt prezentate n funcie de gravitatea erorii. Dac apare o depire de stiv atunci programul este eronat; nu merit s se continue programul. n acelai timp nu e nevoie s se trateze o de eroare de rotunjire. Nici pe hrtie nu putem manevra uor fracii cu repetiie infinit sau cu numere iraionale. Din punct de vedere practic este indiferent dac pierdem a 20-a cifra a fraciei sau nu, deoarece nu aceasta este elementul care poart informaia de baz. Pentru rezolvarea acestei probleme este necesar o analiz adnc a situaiilor i rezultatelor care pot aprea n timpul execuiei, a preciziei de reprezentare a numerelor, timpul de rulare i mrimea memoriei. Dup cum am vzut la reprezentarea numerelor, precizia numerelor reale scurte nu este de ajuns pentru orice aplicaie practic. Precizia numerelor reale lungi este mai mult ca sigur suficient, dar necesit un spaiu dublu de memorie. Arhitectura intern a coprocesorului Coprocesorul are dou pri funcionale distincte: Unitatea de execuie numeric: execut instruciunile aritmetice i de transfer specifice coprocesorului, are unitatea de execuie i blocul registrelor interne;

Unitatea de control: extrage instruciunile i operanzii din memorie i execut instruciunile de control, are un bloc logic i registrele indicatoare i de control;

Unitatea de execuie numeric Din punct de vedere al utilizatorului componenta cea mai important este blocul de registre generale, care este organizat sub forma unei stive interne. Toate registrele (elementele stivei) au o lungime de 80 de bii. Fiecare operaie adreseaz elementul din vrful stivei. Din acest motiv elementul stivei se noteaz cu ST (0), ST (1)... etc, unde ST (0) este capul stivei, ST (1) este elementul urmtor i aa mai departe. Este un inconvenient la programarea n limbaj de asamblare, trebuie s reinem n fiecare moment, poziia n stiv a fiecrei valori, iar la introducerea unui nou element pe stiv indicele elementelor introduse anterior se incrementeaz. Unitatea de control Registrul de control (Control Word) Registrul de control este un registru de 16 bii. Utilizatorul poate seta coninutul i astfel poate controla o serie de mecanisme fine ale coprocesorului ca de exemplu metoda utilizat la rotunjire etc. Dup cum se poate vedea registrul este mprit n dou, deoarece n timp ce primii 8 bii (cei mai semnificativi) determin strategia de funcionare a procesorului, restul de 8 bii se refer la comanda ntreruperilor n cazul erorilor. 15 x 14 X 13 X 12 ip 11 rc 10 rc 9 pc 8 pc 7 x 6 x 5 pm 4 um 3 om 2 zm 1 dm 0 im

Unde biii cu x sunt nefolosii. Ceilali bii sunt: IC - Infinit Control-modul de tratare a numerelor infinite. La mprirea cu zero coprocesorul scrie n locaia ctului infinit. n sens matematic avem dou tipuri de nchidere a axei numerelor: proiectiv i affin. n linii mari diferena este c nchiderea affin cunoate dou tipuri de infinit (pozitiv i negativ), iar cea proiectiv doar unul singur. Nici una din metode nu este mai bun. Semnificaia bitului: 0-proiectiv 1-affin RC - Rounding Control-controlul rotunjirii 00-rotunjire la cel mai apropiat element reprezentabil 01-rotunjire n jos 10-rotunjire n sus 11-trunchiere PC - Precision Control-controlul preciziei de calcul n unele cazuri nu se dorete ca s lucrm cu rezultatul reprezentat cu precizia reprezentrii interne dei el este reprezentat ntotdeauna la astfel. Dac lucrm cu proceduri scrise anterior care opereaz cumva cu erorile rotunjite a numerelor reprezentat clasic pe 4 octei atunci precizia mare poate cauza dificulti. Valorile perechilor de bii P. C. 00-24 bii-real scurt

01-ocupat 10-53 bii-precizia pt real lung 11-63 bii-precizia ridicat M. Mask - validarea sau invalidarea ntreruperii coprocesorului. La erorile intervenite n timpul execuiei operaiilor n virgul flotant, coprocesorul transmite ntreruperi procesorului. ntreruperea creat pe IBM-PC este NMI ntreruperea nemascabil a procesorului. Valorile bitului MASK: 0-validare cerere de ntrerupere; 1-invalidare cerere ntrerupere; Cu urmtorii bii specificm care din excepii (erori) s apeleze ntradevr ntreruperea. Acest lucru poate fi util n cazurile cnd nu ne intereseaz o anumit excepie sau dac vrem s controlm problema prin citirea strii coprocesorului din program. Urmtorii bii valideaz ntreruperea cu 0 i o invalideaz cu 1. PM Precision Mask -ntreruperea pentru semnalarea rotunjirii UM Underflow Mask - ntreruperea pentru semnalarea depirii inferioare OM Overflow Mask - ntreruperea pentru semnalarea depiriisuperioare ZM Zero Devide Mask - ntreruperea pentru semnalarea mpririi cu 0 DM Denormalized OM - ntreruperea pentru semnalarea operandului IM Invalid Operation Mask - ntreruperea pentru semnalarea operaiei invalide Registrul de stare (Status Word) Este un registru de 16 bii. Coninutul se seteaz conform ultimei operaii efectuate. Cu ajutorul lui avem informaii vitale pentru utilizator. Este important c din primii 8 bii (cel mai semnificativ) doi corespund exact cu biii de carry zero din registrul de stare a procesorului I 8086. Deoarece cu instruciunea SAHF putem ncrca orice valoare pe ultimii 8 bii a lui STATUS, dup o operaie de coprocesor putem citi i utiliza aceti bii cu instruciuni simple de predare condiionat de control. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 B C3 St St St St C2 C1 C0 Es X Pe Ue Ze De Ie i n acest caz avem mprit registrul de 16 bii n dou pri. Cei mai semnificativi opt bii ne arat dac operaia efectuat de coprocesor ar efectua ntrerupere i dac da atunci ne arat de care excepie e produs ntreruperea. Cei mai semnificativi opt bii reprezint starea aritmetic a coprocesorului: IR Interrupt Request-dac are valoarea 1 arat c coprocesorul prezint o cerere de ntreruperi. n acest caz unul din urmtorii ase bii va fi i el pe 1, el va arta clasa n care aparine eroarea. IE Invalid Operation Error-operaie invalid DE Denormalized Operand Error - eroarea e cauzat de operand nenormalizat sau rezultat care nu poate fi normalizat ZE Zero Devide Error - eroare cauzat de mprirea cu zero OE Overrflow Error - eroare cauzat de depirea superioar UE Underflow Error - eroare cauzat de depirea inferioar PE Precision Error - eroare de precizie, rezultatul a fost rotunjit C0 (bitul condiional 0)

C1 (bitul condiional 1) C2 (bitul condiional 2) C3 (bitul condiional 3) SP - cei trei bii arat vrful stivei. Valoarea 000 semnaleaz stiva goal, primul element ce se ncarc va fi n elementul 0 al stivei, iar valoarea 111 semnaleaz stiva plin. B Busy - semnaleaz faptul c coprocesorul lucreaz sau nu. Este activ pe 1, deci n acest caz nu avem voie s transmitem alt comand coprocesorului. Acest bit ne permite o sincronizare software a programului nostru cu coprocesorul. Semnificaia biilor C0, C1, C2, C3 este reprezentat n tabele. Dup cum se observa definirea acestor bii nu este simpl. n practic este necesara verificarea doar a unu sau doi bii, care este relativ simpla dac ne bazm pe observaia fcut la nceputul acestui capitol: putem utiliza faptul c pe poziia flag-urilor STATUS zero i Carry avem bii condiionali cu aceeai semnificaie. C3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 C2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 C0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 Semn + + + + + gol gol + gol gol Semnificaie Nenormalizat Nu e numr Nenormalizat Nu e numr Normalizat pozitiv Pozitiv infinit Normalizat Negativ infinit Zero (pozitiv) ............ zero (negativ) ............ Invalid, nenormalizat ............. Invalid, nenormalizat .............

Valoarea bitului C3 este 0 dac rezultatul operaiei (normalizat sau nenormalizat) este diferit de zero. dac valoarea bitului e 1 atunci rezultatul este ori zero ori invalid sau elementul respectiv al stivei e gol. Se poate spune c bitul C3 corespunde n linii mari cu bitul STATUS zero. Valoarea bitului C2 depinde de C3. Dac valoarea bitului C3 este zero bitul C2 indic rezultat normalizat pe 1, iar rezultatul nenormalizat pe 0. dac valoarea bitului C3 este 1 (deci rezultatul este 0 sau elementul e gol) atunci exact invers, valoarea 1 a lui C2 indic numr invalid, iar valoarea zeri indic zero. Bitul C1 dup cum am vzut din tabel se refer la semnul numrului. Dac rezultatul e negativ valoarea lui C1 este 1 altfel e 0. Bitul C0 se refer la faptul c rezultatul este valid sau nu. Dac acest bit este pe zero nu sunt erori grave dar dac este pe 1 rezultatul este oricum invalid (nu e numr, este infinit sau alt valoare special). Dac ns se efectueaz alte operaii dect cele obinuite n virgul flotant ca de ex. Operaii de comparare, atunci se schimb semnificaia biilor:

10

C3 0 0 1 1

C2 0 0 0 0

C1 X X X X

C1 0 1 0 1

Semnificaia ST (0) >op ST (0) <op ST (0) =op ST (0) i op nu se pot compara

Deci dac C3 este 0 atunci rezultatul comparaiei se va citi din bitul C0. Dac C3 este 1 atunci C2 va indica dac numerele sunt sau nu egale sau ST (0) nu este comparabil (e gol sau infinit). Dup operaia de creare a restului parial avem din nou alt semnificaie a acestor bii. n acest caz C0, C1 i C3 (de sus n jos n aceast ordine) vor conine cei unu, doi sau trei bii ai ctului la mprirea cu rest. Valoarea lui C2 este 0 dup crearea unui rest parial i este 1 n cazul unei erori. Semnificaie este (despre crearea de rest parial vom vorbi la descrierea comenzii) : Raportul mpritor/de mprit mpritor>de mprit/2 mpritor>de mprit/4 mpritor<=de mprit/4 C3 X X Bitul 2 C1 X Bitul 1 Bitul 1 C0 Bitul 0 Bitul 0 Bitul 0

X semnific faptul c n cazul respectiv biii respectivi i pstreaz valoarea anterioar. De exemplu, dac mpritorul e mai mare ca dempritul atunci restul parial este identic cu dempritul iar ctul este zero. n acest caz C3 i C1 rmn la valoarea anterioar, iar C0 va fi zero semnificnd c ctul este zero. Iar dac mpritorul este mai mic dect jumtatea dempritului dar mai mare dect un sfert din demprit atunci ctul va fi doi sau trei; avem acest numr n C1, C0 iar C3 pstreaz valoarea anterioar. Registrul indicator de deschidere a stivei (Tag Word) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 0 1 R7 R6 R5 R4 R3 R2 R1 R0 Perechile de bii alctuiesc de jos n sus regitri de descrierea elementelor 0. 1... etc ale stivei. O pereche de bii poate avea urmtoarele semnificaii: Valoarea perechilor Semnificaia de bii din reg. de descriere a stivei 00 Elementul corespunztor conine dat valid 01 Elementul corespunztor conine zero 10 Elementul corespunztor conine valoare special 11 Elementul corespunztor e gol Termenul de valoare special nseamn c elementul stivei conine infinit sau dintr-o cauz oarecare coninutul ca rezultat al unei operaii este invalid. Registrul de instruciuni (Instruction Pointer) Registrul de instruciuni conine adresa fizic i codul operaiei al ultimei operaii efectuate de coprocesor.

11

Acest registru ne ajut n cazurile n care scriem rutine de ntreruperi pentru tratarea erorilor ce apar n timpul operaiilor de coprocesor. n astfel de cazuri este important s cunoatem codul operaiei i adresa fizic (locaia de memorie intern unde se afl). Putem vedea uor importana acestuia gndindu-ne la faptul c programul nu este nevoit s atepte coprocesorul, n timp ce acesta lucreaz procesorul poate efectua alte operaii. Doar atunci trebuie s lum n considerare coprocesorul cnd avem nevoie de rezultat sau vrem s efectum o alt operaie. n acest moment ns (deoarece programul nostru a trecut de mult de instruciunea care a cauzat eroarea) nu putem afla altfel care a fost ultima instruciune trimis coprocesorului. Spaiul rezervat codului de instruciune este mai mare dect mrimea real a codului deci codul apare aliniat la dreapta. Registrul de date (Data Pointer) Registrul de date conine adresa fizic a datei externe utilizate de ultima instruciune n virgul flotant. Asemenea cu cel dinainte acest registru ne folosete la scrierea rutinelor de ntrerupere pentru tratarea erorilor aprute n timpul executrii instruciunilor de coprocesor. n acest caz trebuie s cunoatem adresa fizic a datei (externe pentru coprocesor) utilizat de instruciunea care a cauzat eroarea. Pentru utilizatorul care lucreaz n limbaj de asamblare este important s cunoasc condiiile din coprocesor adic mediul coprocesorului care definesc condiiile de lucru i stare la un moment dat. Acest mediu se definete pe baza elementelor cunoscute. Mediul coprocesorului (enviroment) nseamn registrele interne la care are acces utilizatorul. Coprocesorul matematic are un set de registre cu lungime totala de 14 octei, organizate ca n figur:
REGISTR DE COMAND REGISTRU DE STARE REGISTRU STIV REGISTRU DE INSTRUCIUNI (A15-0) | 0 | CODUL OPERAIEI (biii 10-0) REGISTRU DE DATE (A15-0) | 0 . . .. . . . . . . . . . . . .. . . . . .. . . . .. . . . . . .. . . . . . . . .. . . 0

A19-16 A19-16

Setul de instruciuni al coprocesorului Programarea coprocesorului se face n limbajul de asamblare cu ajutorul instruciunii ESC. Aceast instruciune trimite pe magistrala de date un cod de operaie pe 6 bii i dac este necesar trimite pe magistrala de date o adres de memorie. Coprocesorul sesizeaz i capteaz instruciunea ce i se adreseaz i ncepe execuia instruciunii. Exist dou posibiliti de resincronizare a procesorului cu coprocesorul, ambele la iniiativa procesorului: - procesorul testeaz starea coprocesorului; - procesorul lanseaz o instruciune WAIT;

12

Instruciuni de transfer de date Instruciunile de transfer de date asigur schimbul de date ntre memoria calculatorului i stiva coprocesorului. Ele se pot mpri n urmtoarele categorii: Instruciuni de ncrcare (LOAD) FILD adr FLD adr FBLD adr -ncarc pe stiv variabila ntreag de la adresa adr. Variabila din memorie de tipul definit la declararea lui (DB, DW, DD) se convertete n formatul intern al coprocesorului n timpul ncrcrii -ncarc pe stiv valoarea real (scurt sau lung) de la adresa de memorie adr. Variabila din memorie de tipul definit la declararea lui (DD, DQ, DT) se convertete n formatul intern al coprocesorului n timpul ncrcrii. -ncarc pe stiv variabila din memorie de tipul zecimal mpachetat (definit cu DT) de la adresa de memorie adr. Are loc convertirea n formatul intern al coprocesorului n timpul ncrcrii.

Instruciuni de memorare (STORE) FIST adr -memoreaz la adresa adr valoarea de pe stiv (ST (0) ) ca numr. Valoarea memorat poate fi numai ntreg pe cuvnt sau ntreg scurt, n funcie de definiia de la adresa adr (DW sau DD). indicatorul de stiv nu se modific n urma memorrii. n timpul memorrii are loc convertirea. FISTP adr -memoreaz la adresa adr valoarea de pe stiv (ST (0) ) ca numr ntreg. Valoarea memorat poate fi orice numr ntreg (pe cuvnt, scurt sau lung n funcie de definiia de la adresa adr DW, DD sau DQ). n timpul memorrii are loc convertirea necesar. Instruciunea afecteaz stiva: ST (0) este eliminat prin decrementarea indicatorului de stiv. FST adr -memoreaz la adresa adr valoarea de pe stiv (ST (0) ) ca numr ntreg. Valoarea memorat poate fi numr ntreg scurt sau dubl precizie n funcie de definiia de la adresa adr DD sau DQ. n timpul memorrii are loc convertirea necesar. Indicatorul de stiv i coninutul stivei nu se modific n urma memorrii. FSTP adr -memoreaz la adresa adr valoarea de pe stiv (ST (0) ) ca numr n reprezentarea n virgul mobil. Valoarea memorat poate numr real scurt, cu precizie dubl sau extins, n funcie de definiia de la adresa adr (DD, DQ sau DT). n timpul memorrii are loc convertirea necesar din formatul intern. Instruciunea afecteaz stiva: ST (0) este eliminat prin decrementarea indicatorului de stiv. FBSTP adr -memoreaz la adresa adr valoarea de pe stiv (ST (0) ) ca numr zecimal mpachetat (definit la adr de regul cu DT). Indicatorul de stiv este decrementat. n timpul memorrii are loc convertirea necesar din formatul inter. Observaie: Este de reinut faptul c se poate ncrca orice tip de date. La memorare sunt dou situaii: dac se elimin data de pe stiv se poate lucra cu cele 7 tipuri de date. Dac ns se menine valoarea memorat i pe stiv sunt permise numai cele 4 tipuri de baz.

13

Instruciuni transfer de date intern FLD ST (i) Pune pe stiv valoarea de pe ST (i). Deci valoarea din ST (i) se va gsi de dou ori: n ST (0) i ST (i+1). FST ST (i) Valoarea din ST (0) este copiat n elementul i din stiv. Valoarea veche din ST (i) se pierde. FSTP ST (i) Valoarea ST (0) este copiat n elementul i din stiv. Valoarea veche din ST (i) se pierde. ST (0) este eliminat prin decrementarea indicatorului din stiv. FXCH ST (i) Se schimb ntre ele ST (0) i ST (i). Instruciuni ncrcare a constantelor FLDZ FLD1 ncarc zero pe vrful stivei. ncarc 1. 0 pe vrful stivei.

FLDPIncarc pi pe vrful stivei FLDL2T FLDL2E FLDLG2 FLDLN2 ncarc pe vrful stivei log (10) ncarc pe vrful stivei log (e) ncarc pe vrful stivei log (2) ncarc pe vrful stivei ln (2)

Instruciuni aritmetice i de comparare Instruciunile aritmetice sunt n general cu doi operanzi. Unul din operanzi este totdeauna n vrful stivei i de regul tot aici se genereaz rezultatul. Operaiile de baz se pot executa fr restricii cu urmtoarele variante: -se scrie numai mnemonica instruciunii fr operand. n acest caz operanzii implicii sunt ST (0) i ST (1). -se scrie mnemonica instruciunii i operandul. Operandul poate fi o locaie de memorie sau un element de pe stiv (bineneles c i ST (1) se poate dar e inutil). -se scrie mnemonica instruciunii i doi operanzi: primul un element de pe stiv (nu ST (0), al doilea ST (0). n acest caz rezultatul se va depune n locul primului operand iar ST (0) se terge de pe stiv. (n mnemonica instruciunii apare litera P). Instruciuni aritmetice FADD FADD op ST (0) ST (0) +ST (1) ST (0) ST (0) +opdin memorie sau stiv

14

Operaie n virgul mobil FADD op ST (0) ST (0) +op din memorie sau stiva Operaie cu date ntregi FADD ST (i), ST (0) ST (i) ST (i) +ST (0) ;ST (0) se elimin FSUB ST (0) ST (0) -ST (1) FSUB op ST (0) ST (0) -op din memorie sau stiv Operaie n virgul mobil FISUB op ST (0) ST (0) -op din memorie sau stiva Operaie cu date ntregi FSUB ST (i), ST (0) ST (i) ST (i) -ST (0) ;ST (0) se elimin FSUBR ST (i) ST (i) ST (i) -ST (0) ;Este opusul instruciunii FSUB ST (i) FMUL ST (0) ST (0) XST (1) FMUL op ST (0) ST (0) xop din memorie sau stiv. Operaie n virgul mobil FIMUL op ST (0) ST (0) xop din memorie sau stiv Operaie cu date ntregi FMULP ST (i), ST (0) ST (i) ST (i) xST (0) ;ST (0) se elimin FDIV ST (0) ST (0) : ST (1) FDIV op ST (0) ST (0) : opdin memorie sau stiv Operaie n virgul mobil FDIV op ST (0) ST (0) : op din memorie sau stiv Operaie cu date ntregi FDIVP ST (i), ST (0) ST (i) ST (i) : ST (0) ;ST (0) se elimin FDIVR ST (i) ST (i) ST (i) : ST (0) ;Este opusul instruciunii FDIV ST (i). Instruciuni pentru compararea valorilor numerice FCOMSe compar valorile din ST (0) i ST (1) poziionnd indicatorii C3, C2 i C0 FCOM op Se compar valorile din ST (0) i din memorie sau stiv (variabil n virgul mobil) poziionnd indicatorii C3, C2 i C0. FICOM op Se compar valorile din ST (0) i din memorie sau stiv (variabil ntreag) poziionnd indicatorii C3, C2 i C0. FCOMP Se compar valorile din ST (0) si ST (1), poziionnd indicatorii C3, C2 i C0. Se elimin ST (0) de pe stiv. FICOMP op Se compar valorile din ST (0) i din memorie sau stiv (variabil ntreag) poziionnd indicatorii C3, C2 i C0. ST (0) se elimin de pe stiv. FCOMPP Se compar valorile din ST (0) i ST (1), poziionnd indicatorii C3, C2 i C0. Se elimin ST (0) i ST (1) de pe stiv. FTST Poziioneaz indicatorii C3, C2 i C0 n funcie de rezultatul comparrii valorii din ST (0) cu zero. FXAMPoziioneaz biii de condiie n funcie de valoarea din ST (0). Nu se face comparaie! Observaii:

15

- FCOMP i FCOMPP ofer posibilitatea cea mai facil de a elimina una sau dou elemente de pe stiv - FXAM se folosete pentru analiza condiiilor mai deosebite de erori de calcul. Funcii n virgul mobil FSQRT Radical rdcina ptrat a numrului din ST (0) se scrie n ST (0). Numrul trebuie s fie pozitiv, altfel rezultatul nu are sens. FSCALE Puterea lui 2. Scrie n ST (0) valoarea lui ST (0) nmulit cu 2 la puterea ST (1), adic: ST (0) ST (0) *2**ST (1) ST (1) trebuie s fie numr ntreg, iar valoarea absolut din ST (0) s fie mai mic de 2**15. FPREM Calculul restului parial. ST (0) se mparte cu ST (1) i pune n ST () ST (0) -ST (1) * (ntregul mai mic cel mai apropiat de ST (0) /ST (1) ). FRMDINT Rotunjire. n locul lui ST (0) se pune ST (0) rotunjit. Strategia de rotunjire se stabilete n cuvntul de comand. FXTRACT Valoarea din ST (0) se desface n caracteristic (n ST (0) ) i mantisa (n ST (1) ). FABS n locul lui ST (0) se pune valoarea lui absolut. FCHS Schimbarea semnului ST (0). FPTAN Tangenta parial. Tangenta unghiului din ST (0) este calculat ca o fracie ST (1) /ST (0). Valoarea iniial a unghiului din ST (0) trebuie s fie ntre 0 i pi/4. FPATAN Arctangent parial. n ST (0) se va ncrca arctangenta valorii ST (1) /ST (0). Iniial ST (0) trebuie s fie pozitiv, iar ST (1) mai mare ca ST (0). F2XM1 Calculul puterii lui 2. n locul lui ST (0) se va scrie 2**ST (0) -1. Iniial ST (0) trebuie s fie cuprins ntre 0 i 0. 5. FYL2X Logaritmare. ST (0) ST (1) *LOG2 (ST (0) ). ST (0) trebuie s fie pozitiv, iar ST (1) orice numr finit. FYL2XP1 Logaritmare. ST (0) ST (1) *LOG2 (ST (0) +1). ST (0) trebuie s fie pozitiv mai mic dect 0. 3, iar ST (1) orice numr finit. Observaii: - Cu ajutorul tangentei se pot calcula sin i cos - Cu F2XM1 so poate calcula orice exponent - Pentru calculul de exponent ST (0) la puterea ST (1) se recomand aplicarea succesiva a funciilor FYL2X apoi F2XM1! Instruciuni de comand Instruciunile de comand au ca sarcin coordonarea aciunilor coprocesorului. De obicei nu au o semnificaie aritmetic, dar exist cteva care influeneaz serios aciunile aritmetice ale coprocesorului, deoarece ele salveaz sau ncarc starea coprocesorului, adic toate registrele de lucru. n aceste registre este inclus i stiva, deci aceste instruciuni pot fi privite ca instruciuni gigantice de scriere i salvare.

16

FINIT Iniializare-aducerea coprocesorului ntr-o stare iniial cunoscut; software reset. Dup efectuarea instruciunii FINIT toate registrele coprocesorului se vor afla n starea iniial iar stiva va fi goal. FENI Acceptarea ntreruperilor-pentru ca coprocesorul s genereze o ntrerupere la apariia unei erori, pe lng poziionarea biilor corespunztori registrului de comand este nevoie de acceptarea explicit a ntreruperilor. FDISI Ignorarea ntreruperilor-aceast instruciune ignor ntreruperile indiferent de starea biilor corespunztori ai registrului de comand; pentru acceptarea unor noi ntreruperi trebuie s avem o nou instruciune FENI FLDCW adr ncrcarea din memorie a registrului de comand se ncarc n registrul de comand cuvntul de la adresa adr de memorie FSTCW adr Salvarea registrului de comand n memorie-salvarea registrului de comand n variabil pe un cuvnt aflat n memorie. FSTSW adr Salvarea registrului de stare-salvarea registrului de stare ntr-un cuvnt de memorie aflat la adresa adr de memorie. FCLEX tergerea biilor de definire a excepiilor instruciunea terge biii respectivi indiferent de starea biilor de eroare. FSTENV adr Salvarea mediului-se salveaz registrele interne ale coprocesorului ntr-o zon de memorie ncepnd de la adresa adr i avnd o lungime de 14 octei. FLDENV adr ncrcarea mediului-se ncarc din memorie de la adresa adr o zon de 14 octei n registrele interioare ale coprocesorului. FSAVE adr Salvarea strii-salvarea strii coprocesorului (registrele interioare i stiva) n zona de memorie care ncepe la adresa adr i are o lungime de 94 octei. FRSTOR adr ncrcarea strii ncrcarea strii coprocesorului (registrele interioare i stiva) din zona de memorie care ncepe la adresa adr i are o lungime de 94 octei. FINCSTP Incrementarea indicatorului de stiv-dup aciunea instruciunii se incrementeaz cu un indicator de stiv; elementul care a devenit astfel ST (0) rmne neschimbat (fapt semnalat de biii corespunztori ai registrului de descriere a stivei). FDECSTP Decrementarea indicatorilor de stiv-dup executarea instruciunii indicatorul de stiv e decrementat cu unu; elementele stivei rmnnd neschimbate (fapt semnalat de biii corespunztori ai registrului de descriere a stivei). FFREE ST (i) tergerea elementului i din stiv; operaia nu afecteaz indicatorul de stiv. FNOP Nici o operaie. FWAIT Ateptare terminare operaie curent (analog cu instruciunea WAIT pentru 8086). Exemplu de program simplu cu utilizarea coprocesorului matematic ;program pentru calculul ariei unui cerc de raz R ;i a volumului unei sfere de raz R
DATE SEGMENT PARA 'DATA' ;DECLARARE SEGMENT DATE

17

RAZA ARIE VOLUM PATRU TREI DATE COD CALCUL

DQ DQ DQ DD DD ENDS

8. 567 ? ? 4. 0 3. 0

;REZERVARE LOC ;REZULTATE

SEGMENT PARA 'CODE' PROC FAR ASSUME CS: COD, DS: DATE PUSH MOV MOV AX AX, DATE DS, AX

;DECLARARE SEGMENT COD ;DECLARARE PROCEDURA FAR ;REVENIRE IN DOS ;INCARCARE DS ;CU SEGMENT DATE ;INIIALIZARE COPROCESOR ;INCARCARE RAZA IN STIVA COPROC ;CALCUL RxR ;INCARCARE PI PE STIVA COPOC ;CALCUL RxRxPI ;SALVARE REZULTAT ;SINCRONIZARE ;ADRESA VLUM IN SI ;INITIALIZARE COPROCESOR ;CALCUL ;RxR ;RxRxR ;ICARCARE PI ;INMULIRE CU PI ;NMULIRE CU PATRU ;IMPRIRE CU TREI ;SALVARE REZULTAT ;SINCRONIZARE ;SFRIT PROCEDUR ;SFRIT SEGMENT DE COD

FINIT FLD RAZA FMUL RAZA FLDPI FMUL FSTP ARIE FWAIT LEA FINIT FLD FMUL FMUL FLDPI FMUL FMUL FDIV FSTP FWAIT CALCUL COD RET ENDP ENDS END CALCUL SI, VOLUM RAZA RAZA RAZA PATRU TREI QWORD PTR[SI]

;SFRIT DE PROGRAM

18