Coprocesorul Matematic 8087
Permite efectuarea de calcule matematice mai rapide decit cele efectuatecu procesorul
principal. In principiu, opereaza in paralel cu un procesorprincipal, sincronizarea
lor facindu-se pe linia WAIT (instructiunea WAIT).Comunicarea intre 8086 - 8087
se poate face numai prin intermediul memoriei(incepind cu 80286, exista o instructiune
FSTSW care lucreaza cu registrul AX!!). Practic in utilizarea unui coprocesor
se disting 3 etape importante:
1. - preluare date din memorie (introduse aici in rutina 8086, C, sau PASCAL)in
registrele coprocesorului;2. - prelucrare date (etapa in care procesorul principal
poate face altceva);3. - stocare date din registrele coprocesorului in memorie,
deci posibilitateautilizarii lor in rutina 8086, C sau PASCAL.
Nota: etapele 1 si 3 necesita sincronizare cu procesorul principal!
Structura interna a coprocesorului 80x87 este reprezentata in FIG. 1.
Structura:
- 8 registre date de cite 80 biti organizate ca o stiva tip LIFO (notateST(0)
(ST(0) va fi intilnit in literatura scris simplu ST), ... ST(7));- 1 reg. stare
(SW);- 1 reg. control (CW).
CUVINT DE STARE 8087
Cuvintul de stare reflecta intreaga functionare a circuitului 8087. Acestregistru
poate fi accesat prin executarea instructiunii 8087, care citesteregistrul de
stare si il stocheaza in memoria sistemului astfel incit8086/8088 il poate analiza.
15 14 13 1211 10 9 8 7 6 5 4 3 2 1 0 B C3 STC2C1C0IRPEUEOEZEDEIO m6h10hc
B = BUSY -> 1 , 8087 executa un task 0 , 8087 liber
C3 C2 C1 C0 = CONDITION CODE, indica rezultatul unei comparari intre ST si un
operand (OP), astfel: C3 C2 C0 0 0 0 - ST > OP; 0 0 1 - ST < OP; 1 0 0
- ST = OP; 1 1 1 - eroare (nu se pot compara); C1 - neafectat in urma unei comparari
(ramine la valoarea binara 0) dupa o operatie;
ST (3 biti) = STACK TOP POINTER, indica registrul care este inmomentul curent
in virful stivei; stiva este o memorie ciclica. Initial STeste 0; daca se incarca
o valoare in ST(0) atunci ST devine 7 si scade lafiecare incarcare in registre,
respectiv creste la fiecare extragere dinregistre, cu o unitate (se poate spune
ca are valoarea negata a numarului deordine al registrului din virful stivei
in acel moment !!).
IR = INTERRUPT REQUEST
EXCEPTION FLAGS (1 = a fost detectata o exceptie)
PE = PRECISION UE = UNDERFLOW OE = OVERFLOW ZE = ZERODIVIDE DE = DENORMALIZED
OPERAND IO = INVALID OPERATIONBitul 6 este rezervat. Bitii 5 - 0 indica conditii
specifice in legatura cuexceptiile detectate de 8087 in timpul operarii. O exceptie
va determinagenerarea unei intreruperi (daca intreruperile sint validate), astfel:
acestiindicatori eroare sint legati intern printr-un SAU la IR, deci cind apare
oeroare, daca indicatorul respectiv nu este mascat, IR devine 1. De asemenea
bitii C3.. C0 sint pozitionati de instructiunea FXAM astfel:C3 - 0 -> not
empty; 1 -> empty;C2 - 0 -> nenormalizat; 1 -> normalizat;C1 - 0 ->
pozitiv; 1 -> negativ;C0 - 0 -> corect; 1 -> eronat; CUVINT DE CONTROL
8087
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 IC RC PCIEMPMUMOMZMDMIM
IC = INFINITY CONTROL (control infinitate) 0 -> +i = -i 1 ->
+i <> -i RC = ROUNDING CONTROL (control rotunjire) 00 ->
nearest or even 01 -> down (toward -i) 10 -> up (toward +i)
11 -> chop(truncate toward 0) PC = PRECISION CONTROL (control precizie) 00
-> mantisa 24 biti 01 -> rezervat 10 -> mantisa 53 biti 11 -> mantisa
64 biti IEM = INTERRUPT ENABLE MASK (masca generala indicatori eroare) 0 ->
Interrupts Enabled 1 -> Interrupts Disabled (Masked)PM,UM.....IM - masti
indicatori eroare, EXCEPTION MASKS =1 => a fost detectatao exceptie. PM =
PRECISION UM = UNDERFLOW OM = OVERFLOW ZM = ZERODIVIDE DM = DENORMALIZED OPERAND
IM = INVALID OPERATIONBitii 15,14,13 si bitul 6 sint rezervati.
Datele folosite de coprocesor sunt memorate in registrele lui de datein format
real temporar (format IEEE de 10 octeti): 70 0-------------------------------------------------
|S| Exponent |1.... Mantisa normalizata |-------------------------------------------------unde:
S - bit de semn Exponent - 8 biti ptr. numere reale format scurt 11 biti ptr.
numere reale format lung Mantisa - 23 biti ptr. numere reale format scurt 52
biti ptr. numere reale format lung(primul bit este pus pe 1, mantisa fiind normalizata)aformat
scurt --> 32 biti (DD), format lung --> 64 biti (DQ)i
Observatii importante pentru lucrul cu coprocesorul Registrele fiind organizate
ca o stiva, incarcarea unei date din memorieintr-un registru coprocesor are
efectul unei instructiuni PUSH. RegistrulST(0) este intotdeauna in virful stivei
si ca urmare orice data incarcataajunge in ST(0), iar datele deja existente
in registrul coprocesorului semuta, ca intr-o stiva, succesiv in registrele
cu un numar de ordine mai mareaflate "sub" ST(0).
Instructiunile coprocesoruluiPot fi: - cu 2 operanzi (unul din ei fiind, obligatoriu,
ST(0)) - cu 1 operand (unul din registrelec coprocesorului sau memorie),celalalt
opnd. fiind implicit ST(0) (virful stivei); - fara operanzi: cind sint implicati,
automat, ST(0) si ST(1).
Observatie comuna: Mnemonicile de instructiuni care incep cu FI presupun ca
operandul dinmemorie este un intreg pe 16, 32 sau 64 octeti generat respectiv
cu directivaDW, DD sau DQ, iar cele care incep cu FB presupun ca operandul este
pe 10octeti (generat cu DT) in format BCD impachetat. Tipuri de instructiuni
1.Instructiuni de transferA. memorie --> ST(0)
FLD mem32,64,80 FILD mem32,64,80 FBLD mem32,64,80 Efect: toate aceste instructiuni
incarca sursele aferente in ST(0), iar ST(0)->ST(1),......ST(6)->ST(7)
si ST(7) se pierde.
B. ST(0) ---> memorie FST mem32,64,80 FIST mem32,64,80 FBST mem32,64,80 FSTP
mem32,64,80 FISTP mem32,64,80 FBSTP mem32,64,80
Efect: primele trei instructiuni copiaza registrul ST(0) la adresa de memoriespecificata,
iar urmatoarele 3 (cu sufixul P) la fel insa, in plus face si ooperatie tip
POP, in urma careia ST(1)->ST(0),.... ST(7)->ST(6). In primul caz(primele
3) stiva registrelor ramine neschimbata. Instructiunile de copierein memorie
fac automat conversia din reprezentarea interna coprocesor inreprezentarea din
memorie conform formatului rezervat (DW, DD sau DQ).
C. Instructiuni de incarcare constante- FLDZ (constanta 0), FLDPI(nr. PI), FLD1
(constanta 1), FLDL2T (log210),FLDL2E(log2e), FLDLG2(log102), FLDLN2(ln 2)Efect:
acelasi efect ca si la A.
D. Interschimbare registre FXCH ST(0) <---> ST(1) FXCH ST(n) ST(0) <--->
ST(n)
2. Instructiuni aritmetice
Obs.:- primul operand este destinatia, iar al II-lea este sursa !!- instr. cu
sufixul "P" (deci, care fac si un POP) scot din stivadestinatia;-
(n) este numarul de ordine al registrului de date coprocesor implicatin instructiune;-
in principal numai destinatia este distrusa in urma operatiei, cuniste exceptii
ce vor fi punctate in continuare !!
A. Adunare FADD (echiv. cu FADDP ST(1),ST(0)---- > ST(1)+ST(0)--> ST(1)
+extragere din stiva astfel incit in final rezultatul ajunge in ST(0) (practicambii
operanzi sint distrusi in final) FADD ST(n),ST---- > ST(n)+ST(0)--> ST(n)
FADD ST,ST(n)---- > ST(0)+ST(n)--> ST(0) FADD mem32,64,80 ---> (mem)+ST(0)-->
ST(0) FIADD mem32,64,80 ---> (mem)+ST(0)--> ST(0) FADDP ST(n),ST --->
ST(n)+ST(0)--> ST(n) + extragere din stiva sise muta si restul registrilor
(vezi mai sus) - ambii operanzi sint distrusi;
B. Scadere - aceleasi tipuri de instructiuni ca la A, dar mnemonica este cuFSUB.
(se scade sursa din destinatie, iar rezultatul intra in destinatie)
Observatie: FSUB (echiv. cu FSUBP ST(1),ST(0))---- > ST(1)-ST(0) --->
ST(1) +extragere din stiva astfel incit in final rezultatul ajunge in ST(0)
- ambiioperanzi sint distrusi FSUB mem32,64,80 ----> ST(0)-(mem) --->
ST(0)B'. Scadere inversa - se scade destinatia din sursa, iar rezultatul intra
indestinatie)
FSUBR (FSUBRP ST(1),ST(0))) ---- > ST(0)-ST(1) --> ST(1) +extragere din
stiva astfel incit in final rezultatul ajunge in ST(0) FSUBR ST(n),ST---- >
ST(0)-ST(n)--> ST(n) FSUBR ST,ST(n)---- > ST(n)-ST(0)--> ST(0) FSUBR
mem32,64,80 ---> (mem)-ST(0)--> ST(0) (nr.din memorie este real) FISUBR
mem32,64,80 ---> (mem)-ST(0)--> ST(0) (nr.din memorie esteintreg) FSUBRP
ST(n),ST ---> ST(0)-ST(n)--> ST(n) + extragere din stiva sise muta si
restul registrilor (vezi mai sus).
C. Inmultire - aceleasi tipuri de instructiuni ca la A. dar mnemonica este cuFMUL
(comentariile ramin valabile !!)
D. Impartire - aceleasi tipuri de instructiuni ca la B. dar mnemonica este cuFDIV).
Se imparte destinatia la sursa, iar rezultatul intra in destinatie)Obs.: aceleasi
observatii ca la B. pentru mnemonicile cu 0 sau 1 operand.
D'. Impartire inversa - se imparte sursa la destinatie, iar rezultatul intrain
destinatie. Se pastreaza mnemonicile si comentariile de la B',inlocuindu-seFSUBR
cu FDIVR.
E. Comparare
FCOM (echiv. cu FCOM ST(1)) -- > ST : ST(1) FCOM ST(n)-- > ST : ST(n)
FCOM mem32,64 -- > ST : (mem) - nr.reale FICOM mem16,32 -- > ST : (mem)
- nr.intregi FTST-- > ST : 0
E'. Comparare si extragere din stiva
- aceleasi mnemonici ca la E. dar se adauga sufixul "P". In acest
caz operatiade comparare este urmata de o operatie de extragere din stiva (tip
POP). In locul ultimei instructiuni de la E. apare instructiunea:
FCOMPP ST(n) --> ST : ST(n) urmata de doua extrageri din stiva, astfelincit
ambii operanzi sint distrusi.Observatie:
Rezultatul oricarei comparari permite luarea unei decizii, insa coprocesorulnu
ofera instructiuni de salt. Solutia este utilizarea instructiunilor de saltale
procesorului principal, astfel:-la 8086 fstswmem16 ;incarc reg. SW (starea)
intr-o loc. ;memorie deja definita fwait ;ptr. sincro. movax,mem16 ;transfer
in AX sahf ;incarc flag-uri cu AH
"Artificiul" acesta merge, intrucit bitul C3 sta pe pozitia lui ZF
inPSW, C2 pe cea a lui PF, C1 pe a unui bit nedefinit, iar C0 pe cea a lui CF.
- flag-urile SF si AF vor primi valori nerelevante in urma acesteisecvente;-
in ceea ce priveste pozitionarea indicatorilor C3..C0, reveniti laprezentarea
registrului SW !!
- incepind cu 80286 avem instructiunea: FSTSW AX, care incarca DIRECT in AX,cuvintul
de stare (SW), deci inlocuieste primele 3 instructiuni din secventaprecedenta.
3. Instructiuni transfer date control
FLDCW mem16 (mem)-->CW FaNiSTCW mem16 CW --->(mem) FaNiSTSW mem16 SW --->(mem)
FLENV mem14*8 mediul DOS --> (mem) FaNiSTENV mem14*8 (mem) ---> mediul
DOS FaNiSAVE mem94*8 salvez starea (registrii SW, CW, registrii de date ai coprocesorului
etc. FRSTOR mem94*8 restaurez starea
Obs:- aNi - semnifica "NO WAIT" adica nu asteapta tratarea exceptiilor
deeroare numerice nemascate !!- de remarcat (cum, era si de asteptat) starea
(SW) pot numai sa ocitesc spre deosebire de cuv. de control (CW) pe care-l pot
si "seta" la oanumita valoare !!- o utilizare a acestor instr. ar
putea fi necesitatea salvarii stariiinainte de intrarea intr-o procdura si apoi
restaurarea ei.
4. Instructiuni pentru calcule transcedente
FSIN sinaST(0)i---> ST(0) FCOS cosaST(0)i---> ST(0) FPTAN tanaST(0)i--->
ST(0) FPATAN arctan(ST(0)-->ST(0) F2XM1 a2 ^ ST(0)i-1 ---> ST(0) FYL2X
ST(1) * log2ST(0) --> ST(0) FYL2XP1 ST(1) * log2aST(0)+1i --> ST(0)
5. Alte instructiuni
FABS ABSaST(0)i ---> ST(0) FCHS- ST(0) ---> ST(0) FRNDINT INTaST(0)i --->
ST(0) FSQRT SQRTaST(0)i---> ST(0) FSCALE ST(0)* a2 ^ST(1)i ---> ST(0)
FPREM ST(0) MOD ST(1)) ---> ST(0) (restul impartirii in ST) FXTRACT exponentaST(0)i
---> ST(0) si apoi impins in stiva FXAM pozitionare indicatoare de control
functie de numarul din virful stivei (vezi SW)
6. Instructiuni ptr.controlul coprocesorului
FaNiINIT- initializare coprocesor FaNiCLEX- stergere exceptie erori numerice
FINCSTP- adauga 1 la val. ST din SW FDECSTP- scade 1 din val. ST din SW FREE
ST(n)- marcheaza ST(n) ca fiin gol FNOP- ST(0)---> ST(0), deci nu face nimic
Aplicatii:
Mod de lucru cu instructiunile coprocesor: - se lanseaza emulatorul EM87.COM
cu EM87 /L;- se seteaza modul 8087 atit in PASCAL cit si in C (merge si Emulation);-
la depanarea cu TD pentru vizualizarea registrilor 8087 se va alegeoptiunea
"Numeric Processor" din submenu-ul VIEW.
1. Analizati programul AFPI.PAS si rutina aferenta AFPI.ASM care permiteafisarea
numarului a.2. Analizati programul ARIE.C (sau ARIE.PAS) si rutinele
aferenta ARIE.ASM siPI.ASM (respectiv AR1.ASM si PI.ASM) care calculeaza aria
unui cerc.
3. Sa se calculeze frecventa de rezonanta a unui circuit LC serie(F=1/(2*PI*SQRT(L*C))),
apelind din PASCAL (C) o functie in limbaj deasamblare care primeste L si C
ca parametri tip single (float) (<=> DD inlimbaj de asamblare). Afisarea
se va face in C (PASCAL)
Observatii importante !!
- se vor defini in rutina asamblare 2 variabile neinitializate ptr. L si Ccare
vor fi incarcate cu parametri trimisi din programul in limbaj de nivelinalt
prin metoda deja cunoscuta (??);- se va afisa in paralel si valoarea calculata
DIRECT in programul principal(PASCAL sau C).
4. Sa se rezolve o ecuatie de gradul II folosind instructiunilecoprocesorului.
Coeficientii (si afisarea solutiilor) vor fi trimisi (se vaface) dintr-un (in
acelasi) program Csau PASCAL.
Observatie redundanta comuna !!
Rutinele in limbaj de asamblare vor folosi instructiunile coprocesorpentru calcule.