12.1 Arhitectura coprocesorului 8x87 Coprocesoarele 8x87/80287/80387, corespunzatoare celor trei game ale microprocesoarelor IN!" 80x8#, sint mo$ule procesor specializate pentru calcule matematice, care lucreaza cu numere reprezentate in %irgula &lotanta '()*. +icroprocesoarele 80,8# -i .entium au integrat in ele si mo$ulul $e() 80387 alaturi $e un mo$ulul /inar 8038#. Coprocesorul asigura cresterea considerabila a vitezei de eec!tie a o"eratiilor arit#etice$ calc!l!l %!nctiilor tri&ono#etrice sa! lo&arit#ice si o crestere a "reciziei de calc!l 'n!#ar!l de ci%re se#ni%icative*. !l este o extin$ere a resurselor procesorului $e /aza 80x8#, ca registre si set $e instructiuni, &olosin$ in comun memoria centrala. Cele do!a "rocesoare "ot l!cra in "aralel, programul putin$ contine atit instructiuni $e /aza cit si in (). .entru sincronizarea lor in program se %a &olosi instructiunea )0AI,inaintea instructiunilor 8x8#, care &olosesc $ate rezultate in memorie $in prelucrari in 8x87. +nemonicele coprocesorului incep cu litera ) ')"1,)A11,..*.
+ ! + 2 3 I ! C ! N 3 A " A .rograme 8x8#/87 1ate 8x8#/87 .32C!423 8 x8 # .32C!423 () 8 x 8 7 Cele $oua procesoare %olosesc aceleasi #a&istrale de date si adresa '564*. Co"rocesor!l n! are #ecanis# "ro"ri! de calc!l al adreselor 'segment,/aza,in$ex*, acest calcul se &ace in 8x8#, care7i &urnizeaza a$resa instructiunii curente 'I.7instr.pointer* si a$resa operan$ului '2.7operan$ pointer* in &orma reala. 4unt a$mise toate mo$urile $e a$resare, $ar adresa se calc!leaz( )n "rocesor!l de baz( **+. Co"rocesor!l **, n! are instr!c-i!ni "ro"ri de salt. .azele eec!tiei unei instructiuni 8x87 sint8 7 Citire instructiune $e catre 8x8# 7 Calcul a$resa operan$ in 8x8# 7 Comunicare a$resa operan$ si co$ instructiune spre 8x87 7 !xecutie instructiune () in 8x87 si memorare rezultat 7 Anuntare procesor 8x8# ca s7a terminat executia Instructiunile $e () sint recunoscute $upa primii 9 /iti $in co$ul operatiei, care sint aceeasi 11011 si se numesc !4CA.!. Cin$ lucreaza coprocesorul pune /US011 'primul /it $in status :or$*, pentru a putea &i testat $e procesorul 8x8# in 2AIT. 1 Co"rocesor!l **, contine8 7 6nitatea $e coman$a si control a trans&erurilor $e in&ormatii 7 6nitatea $e executie a instructinilor in %irgula &lotanta 7 3egistre generale $e () organizate ca sti%a 4'0*,4'1*,..4'7* 3egistrele si caile interne ale coprocesorului () sint $e mare %iteza si 80 /iti '17 semn,197exponent,#,7mantisa*. Unitatea de co#anda si control contine 9 registre '1, octeti*, care pastreaza starea momentana a lui 8x87 '!N(I32N+!N*. !le pot &i memorate la a$rese consecuti%e prin )4!N( 'store en%ironment* si ulterior incarcate prin )"1!N( 'loa$ en%ironment*.
19 0 ;0 C O 3 T R O L 2 O R 4 7precizie,masti $e intrerupere ;2 S T A T U S 2 O R 4 7 in$icatori,stare si intrerupere ;, T A 5 2 O R 4 7 in$icatori reg ;# ;8 I 3 S T R U C T I O 3 P O I 3 T E R 7 a$resa reala, co$ instructiune curenta ;10 ;12 O P E R A 3 4 P O I 3 T E R 7 a$resa reala operan$ 4tarea completa a coprocesorului cuprin$e si cele 8 registre generale 'sti%a* $e 10 octeti &iecare '1,;8<10=>, octeti*,se poate memora prin )4A(! si restaura prin )3423!.4al%area registrelor se &ace cu octetii mai putin semni&icati%i in &ata si in or$inea 4'0*,4'1*,....4'7*, $upa registrele !N(I32N+!N. Re&istr!l I3STRUCTIO3 POI3TER pastreaza pe 20 /iti a$resa reala si co$ul instructiunii curente ' &ara primii 9 /iti 11011*. 19 0 I3STRUCTIO3 POI3TER 6lo7 'bitii 1869: IP 6;i&; < 9 < OPERATIO3 CO4E 19 12 10 0
Re&istr!l OPERA34 POI3TER contine pe 20 /iti a$resa reala 'calculata $e 8x8#* a operan$ului $in memorie utilizat in instructiunea curenta. 19 0 OPERA34 POI3TER 6lo7 adress 'bitii 1869: OP ;i&; < 9 9 9 19 12 0
Re&istrele &enerale organizate ca sti%a circulara are &iecare 80 /iti,pentru precizie maxima '17semn,197exponent, #,7 mantisa sau ?signi&ican$?*. oate $atele primite $in memorie se con%ertesc si se pastreaza in () &ormat lung 'temporar@*.1in memorie se pot incarca numere intregi /inare,numere in zecimal co$i&icat /inar '5C1* $e 18 ci&re si numere co$i&icate in (). Con%ersiile necesare se &ac la citirea sau scrierea in memorie utilizin$ instructiuni speci&ice. 2 19 /iAi #, /iAi S E=PO3E3T M A 3 T I S A R9 ST'+: R1 ST',: R2 ST'9: >66TOP12 R? ST'1: ST'2: R, ST'8: 7> #3 0 "a un moment $at oricare registru poate &i %ir&ul sti%ei 4'0*, iar urmatorul 4'1*.Celelalte registre %or a%ea o a$resa relati%a &ata $e 4'0*. Numarul registrului %ir& $e sti%a se gaseste memorat in zona 2. $in 4A64 0231. O"eratiile de incarcare decre#enteaza TOP c! 1 si incarca in no!l re&istr! ST'9:. 2peratiile $e memorare cu ?pop? memoreaza $in 4'0* si incrementeaza 2. cu 1. Re&istr!l STATUS 2OR4 contine8 7 in$icatorii $e con$itii, pozitionati $upa e&ectuarea instructiilor $e comparatie/test, care se pot memora cu )440 'store status :or$* pentru a &i analizate $e 8x8#, cin$ tre/uie sa se &aca salturi con$itionate '8x87 nu are instructiuni $e salt*. 7 /itii care in$ica aparitia unor cereri intreruperi spre 8x8#, sau $atorate rezultatelor o/tinute 7 in$icatorul registrului %ir& $e sti%a 2. 19 1, 13 10 > 8 7 # 9 , 3 2 1 0 / C? TOP C2 C1 C9 IR P U O Z 4 I / =1 7 coprocesor 8x87 ocupat C?66C9 7 in$ica rezultatul unei comparatii sau test C0 =1 7 4'0* B sursa 'echi%alent cu 4 la 8x8#* C3 =1 7 4'0* C sursa 'echi%alent cu D la 8x8#* TOP =0...7 7 in$ica nr. registru %ir& $e sti%a IR =1 7 cerere intrerupere la 8x8# 'intrerupt reEuest* P U O Z 4 I 7 in$icatori intreruperi $atorate rezultatului . =1 7 precision 7s7a pier$ut un /it si rezultatul rotunFit 6 =1 7 un$er&lo: 7exponent prea mic '$epasire in&erioara* 0 =1 7 o%er&lo: 7 prea mare '$epasire superioara* D =1 7 zero $i%i$e 7 impartire numar G 0 cu zero 1 =1 7 $enormalize$ 7 numar nenormalizat I =1 7 in%ali$ operation 7 0/0, in&init/in&init,nenumeric Intreruperea se poate anula cu )C"!H 'clear 8x87*. Re&istr!l CO3TROL 2OR4 contine in$icatori $e sta/ilire precizie si masti $e intrerupere8 19 12 11 > 7 9 , 3 2 1 0 rezervat IC R C P C IEM PM UM OM ZM 4M IM IC 6 In%init Control 0 7 nu &ace $istinctie intre ; si 7 in&init 1 7 &ace $istinctie intre ; si 7 in&init RC 6 Ro!ndin& Control 7 sta/ileste mo$ul $e rotunFire 3 00 7 rotunFire la cel mai apropiat ' implicit * 01 7 rotunFire in sus 10 7 rotunFire in Fos 11 7 trunchiere PC 6 Precizion Control 7 precizie $e lucru prescrisa'rotunFire* 00 7 2, /iti pentru mantisa 7 short real 01 7 rezer%at 10 7 93 /iti 7 long real 11 7 #, /iti 7 temporar@ real ' implicit * IEM 6 Intrer!"t Enable Mas@ 7 implicit = 1 'mascate* 0 7 intreruperile nemascate,tratate prin proce$ura utilizator 1 7 toate intreruperile sint tratate stan$ar$ $e 8x87 7 rezer%at '/it #* Mastile s"eci%ice intrer!"erilor pot a%ea %alorile8 0 7 intrerupere exceptie tratata prin proce$ura utilizator 1 7 intreruperea exceptie este mascata 'implicit* 3aspunsurile la &iecare exceptie mascata 'masca = 1*sint8 PM 7 .recision +asI 7 &urnizeaza rezultatul rotunFit UM 7 6n$er&lo: +asI 7 rezultat = 0 OM 7 2%er&lo: +asI 7 rezultat = numar maxim cu semn ZM 7 Dero $i%i$e +asI 7rezultat = numar maxim cu semn 4M 7 1enormalize$ 7 continua calculul cu nr.nenormalizat IM 7 In%ali$ operation +asI 7 rezultatul este %aloarea nenumerica a operan$ului 'ex8 ra$ical $in numar negati%* Re&istr!l TA5 2OR4 contine 8 grupe $e 2 /iti numite AJ'0*, AJ'1*,...AJ'7* corespunzatoare celor 8 registre generale 4'0*, 4'1*,....4'7*. )iecare AJ'I* in$ica continutul lui 4'I* 8 AJ'I* = 00 7 %aloare %ali$a in 4'I* normalizata sau nu 01 7 zero in 4'I* 10 7 continut special nenumeric,; sau 7 in&init,anormal 11 7 %aloare zero $e initializare 12.2 ipuri $e $ate 4int a$mise 7 tipuri $e $ate, care pot &i operanzi $in memorie si care prin incarcare se con%ertesc in &ormat intern (irgula )lotanta '()* pe 80 /iti numit emporar@ 3eal.In registrele interne se pastreaza $atele numai in &ormat () $e un$e se pot memora in alte &ormate prin instructiuni speci&ice, care asigura si con%ersia. 4peci&icarea a$resei operan$ului se poate &ace in toate mo$urile a$mise $e 8x8#, care asigura calcularea a$resei. In toate tipurile primul /it este consi$erat semn, iar /itii $in stinga sint cei mai semni&icati%i. Caracteristicile tipurilor a$mise sint $ate in ta/elul urmator8 ip $ate 5iti Ci&re zec. .recizie !xponent< 2OR4 I3TE5ER 1+ A68 1+ biti n! , SBORT I3TE5ER ?2 C ?2 biti n! LO35 I3TE5ER +A 1* +A biti n! PACDE4 4ECIMAL *9 1* 1* ci%.zec n! SBORT REAL ?2 +6, 2A biti 12, '*: LO35 REAL +A 1861+ 8? biti 192? '11: TEMPORAR0 REAL *9 1C629 +A biti 1+?*? '18: <!xponentul este utilizat ca putere a lui 2, iar in paranteza se $a puterea corespunzatoare a lui 10 pentru $omeniul maxim. In real #antisa este "ozitiva si da "recizia$ iar se#n!l este al #antisei '4 = 1 negati%*. 5itii $e exponent $au caracteristica 'CA3*, care este poziti%a. (aloarea exponentului '!H.* se calculeaza8 E=P 1 CAR 6 ,.B 7 pentru 4K23 3!A" 7 3))K 7 pentru "2NJ 3!A" 7 3)))K 7 pentru !+.23A3L 3!A" (aloarea unui numar real 7 N 'reprezentat in %irgula &lotanta* se calculeaza $upa &ormula8 3 1 ME2EEE=P un$e8 + 7 este %aloarea mantisei 1 > M > 2 !H. 7 %aloare calculata exponent Ti"!rile intre&i cu semn sint cele acceptate $e procesorul 8x8# si $e +acroasam/lor prin $irecti%ele $e $e&inire $ate8 42 7 $e&ine :or$ 7 pentru 0231 IN!J!3 ' 1# /iti * 44 7 $e&ine $ou/le7:or$ 7 pt. 4K23 IN!J!3 ' 32 /iti * 4F 7 $e&ine Eua$7:or$ 7 pt. "2NJ IN!J!3 ' #, /iti * Ti"!l PACDE4 4ECIMAL utilizeaza 10 octeti si este un numar zecimal co$i&icat /inar cu semn '5C1*, a%in$ 18 ci&re zecimale, co$i&icate &iecare pe , /iti '$oua pe octet*. .rimul octet contine $oar semnul pe primul /it. 7> 71 #3 9# .......... 19 7 0 S E 41,41+ 41841A 41? .......... 4A 4?42 4149 ipul este recunoscut $e macroasam/lor prin $e&initia8 4T 7$e&ine ten7/@te in care %aloarea se speci&ica in hexa Ti"!rile reale sint numere co$i&icate in %irgula &lotanta un$e reprezentarea se &ace prin mantisa poziti%a 'signi&icant*, caracteristica si semn. +antisa se trece intot$eauna intr7o &orma normalizata 1 B + B 2 $e &orma8 1G%%%%%%%% un$e8 M 7 este punctul zecimal %irtual & 7 sint /iti &ractionari '23, 92 sau #3* 5itul intreg este implicit $ar nu exista in memorie pentru &ormatul 4K23 si "2NJ, el existin$ &izic numai la !+.23A3L 3!A". SBORT REAL 31 30 22 0 S E, .. . EO %1 %2 .... %22 %2? 7 in #antisa 1 este i#"licit 7 E=P > 12, '7)K* e"onent #antisa 6 #antisa +6, ci%re zeci#ale
TEMPORAR0 REAL 7> 78 #3 0 S E1A.... E1 E9 1G%1 %2 %? %1A ...... %+2 %+? E=P > 1+?*? '?...B: 6 #antisa 1C629 ci%re zeci#ale 12.3 Asam/larea programelor .entru generare $e co$ pentru coprocesor +acroasam/lorul se poate lansa in $oua mo$uri +A4+ ...... /3 7 genereaza co$ real executa/il pe 8x87 existent /! 7 emulare 7 genereaza chemari $e su/programe $in /i/lioteca pentru mnemonice 8x87 intilnite Co$urile instructiunilor 8x87 generate in mo$ul /3 pot &i executate &ara a exista &izic coprocesorul $aca se lanseaza inainte 8 !+87 /" Acesta incarca un emulator 8x87 rezi$ent in memorie, care se apeleaza prin intreruperile $e exceptie instructiune inexistenta, $eclansate $e co$urile 8x87 $in program. "a terminarea programelor care utilizeaza mnemonici 8x87 emulatorul se elimina prin8 !+87 /6 7 $escarcare emulator 8x87 $in memorie .entru ca macroasam/lorul sa recunoasca mnemonicele 8087 in program, tre/uie inainte sa se $ea coman$a8 .8087 1aca se utilizeaza alte coprocesoare se %or $a comenzile8 .287 7 pentru 80287 .387 7 $aca se utilizeaza 80387 sau procesorul 80,8# .entru speci&icarea setului $e instructiuni se utilizeaza8 .28#C 7 set comun nepri%ilegiat 8028# .28#. 7 set pri%ilegiat 8028# .38# 7 set instructiuni 8038# .entru testarea programelor care utilizeaza coprocesorul, $epanatorul A)1 nu poate &i &olosit, $eoarece nu recunoaste setul $e instructiuni al coprocesorului si se recoman$a C21(6!. O/SERHATIE In macroasam/lor n! eista de%initii de ti"!ri speciale $e $ate pentru coprocesorul 8x87, ele &iin$ recunoscute prin lungimea $e&inita $e instructiunile $e () ce le utilizeaza8 H1 $: ,930 7 intreg pe 2 oct. utiliza/il $e 8x8# sau 8x87 H2 $$ ,930 7 intreg pe , oct. utiliza/il $e 8038# sau 8x87 H3 $E ,930 7 intreg pe 8 oct. utiliza/il $e 8x87 '"2NJ* H, $t ,930K 7 pacIe$ $ecimal '10 oct.* utiliza/il $e 8x87 H9 $$ ,9.30 7 short real ', oct.* utiliza/il $e 8x87 H# $E ,.93!;, 7 long real '8 oct.* utiliza/il $e 8x87 H7 $t ,930.0 7 temporar@ real '10 oct.* $irect utiliz. 8x87 # 12., Instructiuni pentru trans&er $e $ate la 8x87 Coprocesorul 8x87 executa #> instructiuni '72 la 80287*. Instructiunile $e trans&er 8x87 executa incarcarea'sau memorarea* $atelor, $e tipurile precizate, $in memorie in registrul 4'0*, sau intre registrele 8x87. 4chim/ul $e $ate cu memoria este insotit $e con%ersia lor in temporar@ real $aca e cazul, sau aFustarea mantisei si exponentului,pentru 4K23 si "2NJ 3!A". Toate instr!cti!nile de incarcare decre#enteaza inainte stiva.3! eista instr!cti!ni i#ediate. .entru trans&erul $atelor intre locatii $e memorie se &olosesc instructiunile 8x8# cunoscute. .entru precizarea unei a$rese $e operan$ $in memorie se pot &olosi toate mo$urile $e a$resare. 3eg. 4'0* se poate nota 4. .rezentam sintetic instructiunile $in aceasta grupa8 Trans%er!ri de n!#ere intre&iI )I"1 intreg 7 integer loa$ 7 incarca $in memorie in 4 )I4 intreg 7 integer store 7 memorare 4 ca intreg )I"1. intreg 7 i$em )I"1 urmat $e $ecrem. sti%a reg. 'pop* )3N1IN 7 rotunFire la intreg a lui 4 Trans%er!ri de n!#ere zeci#ale codi%icate binarI )5"1 $ecimal 7 5C1 loa$ 7 incarcare nr. zecimal $in memorie )54 $ecimal 7 5C1 store 7 memorare 4 ca nr.zecimal Trans%er!ri de n!#ere reale intre ST si #e#orieI )"1 real 7 incarcare numar real $in memorie in 4 )4 real 7 memorare 4 la o a$resa $e memorie )4. real 7 i$em ca )"1 urmat $e $ecrem. sti%a registre Trans%er!ri intre ST si re&istrele stivaI )"1 4'I* 7 4'I* 7C 4 )"1 4 7 copiaza 4 in sus in sti%a $e registre )4 4'I* 7 4 7C 4'I* )4. 4'I* 7 4 7C 4'I* si incrementare sti%a reg.'pop* )HCK 7 4 B=C 4'1* interschim/ )HCK 4'I* 7 4 B=C 4'I* )H3AC 7 exp'4* =C 4 , mantisa'4* =C 4'1* si push )1!C4. 7 $ecrementare stacI pointer registre )INC4. 7 incrementare stacI pointer Incarcari de constante in STI .entru a suplini lipsa incarcarilor ime$iate exista instructiuni care incarca in 4 anumite constante, $es &olosite in calculele matematice. Incarcarea incepe cu $ecrement )"1D 0.0 =C 4 7 constanta zero in () )"11 1.0 =C 4 7 constanta 1. )"1.I 3.1,.. =C 4 7 constanta .I )"1"2! log in /aza 2 $in ! =C 4 )"1"2 log in /aza 2 $in 10 =C 4 7 )"1"J2 log in /aza 10 $in 2 =C 4 )"1"N2 log natural $in 2 =C 4 .entru incarcarea altor %alori $e constante, ele se %or $e&ini in memorie cu un tip recunoscut in () si %or &i incarcate prin instructiunile corespunzatoare tipului. Instr!cti!ni "entr! re&istrele de stare )440 $est 7 memorare 4A64 0231 la o a$resa $e memorie )440 AH 7 memorare 4A64 0231 in AH 'la 80287* )C"!H 7 sterge &lag7uile exceptie,intrerupere,/us@ .rin instructiunea )440 in$icatorii $e con$itii 8x87, pozitionati $upa executia instructiunilor $e (), se $epun in memorie sau AH $e un$e se pot $epune in reg. )"AJ4 al lui 8x8# prin 4AK) 'instructiune 8x8#*. (aloarea acestor in$icatori se poate testa prin instructiunile $e salt con$itionat 'Ncon$*, uzuale pentru a realiza rami&icari ale programului. +entionam ca **, n! are instr!cti!ni "ro"rii de salt. In$icatorii C3 7 C0 se %or memora automat peste D si 4. 3eg. )"AJ4 se poate incarca in AK prin "AK).
)4C0 $est 7 memoreaza reg. C2N32" 0231 )"1C0 sursa 7 incarca $in memorie reg. C2N32" 0231 )4!N( $est 7 memorare reg. !N(I32N+!N '1, octeti* )"1!N( sursa 7 incarca $in memorie reg. !N(I32N+!N )4A(! $est 7 sal%are !N(I32N+!N ; reg.generale '>,oct* )3423! sursa 7 restaurare !N(I32N!+!N si reg.generale oate unstructiunile $in aceasta clasa inclu$ un )0AI pentru sincronizare cu 8x8#. !le au si &orma &ara )0AI cin$ au pre&ixul )N 'ex8 )N440,)N4C0, ...)N4A(!, )N3423!*. 12.9.Instructiuni aritmetice in () Aceasta grupa cuprin$e instructiuni puternice $e calcul matematic, pentru care a &ost conceput coprocesorul matematic. "a 80287 &ata $e 8x87, se a$auga $oar 3 instructiuni pentru control in mo$ proteFat. 4etul lui 80387 cuprin$e cite%a instructiuni in plus care %or &i in$icate. )0AI 7 asteapta terminarea unei instructiuni 8x87 )N2. 7 nici o operatie )A54 7 %aloare a/soluta $in 4 O4O =C 4 Ad!nari real 6 real )A11 4'1* ; 4 =C 4'1* 7a$unare registre )A11 4,4'I* 4 ; 4'I* =C 4 )A11 4'I*,4 4 ; 4'I* =C 4'I* )A11 real 4 ; real =C 4 7real $in memorie )A11. 4'I*,4 4 ; 4'I* =C 4'I* 7a$unare urmata $e incrementare sti%a registre 'pop* Scaderi real 6 real )CK4 7 schim/a semnul lui 4 'change sign* )465 4'1* 7 4 =C 4'1* 7 sca$ere reg. )465 4,4'I* 4 7 4'I* =C 4 )465 4'I*,4 4'I* 7 4 =C 4'I* 8 )465 real 4 7 real =C 4 7real $in memorie )465. 4'I*,4 4'I* 74 =C 4'I* 7sca$ere si pop
Scaderi reale inverse 'reversed: )4653 4 7 4'I* =C 4'I* 7su/stract real re%erse$ )4653 4'I*,4 4 7 4'I* =C 4'I* )4653 4,4'I* 4'I* 7 4 =C 4 )4653 real real 7 4 =C 4 7real $in memorie )4653. 4'I*,4 4 7 4'I* =C 4'I* 7sca$ere si pop reg Co#"aratii n!#ere reale )C2+ 4 7 4'1* =C pozitionare in$icatori $e con$itie )C2+ 4'I* 4 7 4'I* =C pozit.in$ic.con$itie )C2+ real 4 7 real =C pozit.in$ic.con$itie )C2+. 4'I* 4 7 4'I* 7comparatie si apoi pop reg )C2+.. 7compara 4 cu 4'1* si apoi $u/la incrementare'pop* )4 7compara 4 cu 0 4 7 0 =C pozit.in$ic.'test 4* )HA+ 7examineaza 4 si poz.in$icatorii C3,C2,C1,C0 pentru cazul unor rezultate anormale'$epasiri in&erioare sau superioare* Comparatia consta $intr7o sca$ere a operan$ului speci&icat $in %aloarea lui 4 si pozitionarea in$icatorilor $e con$itie, &unctie $e rezultat '%aloarea operanzilor nu se shim/a* ast&el8 C3'D* C0'4* 0 0 pt. 4 C re&erinta 'rezultat C 0* 0 1 4 C re&erinta 'rezultat B 0* 1 0 4 = re&erinta 'rezultat = 0* 1 1 7rezultat ;in&init sau 7in&init In$icatorii C377C0 &ac parte $in primul octet $in 4A64 0231, se memoreaza cu )440 AH, in AH $e un$e se $epun cu 4AK) in reg )"AJ4 si se pot testa cu instructiuni $e salt con$itionat.
O"eratii real 6 intre& )IA11 intreg 4 ; intreg =C 4 7intreg $in memorie )I465 intreg 4 7 intreg =C 4 )I4653 intreg intreg 7 4 =C 4 7su/stract re%erse$ )IC2+ intreg 4 7 intreg =C pozitioneaza in$icatorii )IC2+. intreg comparatie 4 cu intreg si pop reg )I+6" intreg 4<intreg =C 4 7inmultire cu intreg 2peran$ul intreg, $e orice lungime, este citit $in memorie, con%ertit in () 'real* si utilizat in instructiune. O"eratii de in#!ltire si i#"artire in H. )+6" 4'1*<4 =C 4'1* 7inmultire real 7 real )+6" 4'I*,4 4'I*<4 =C 4'I* )+6" 4,4'I* 4<4'I* =C 4 )+6" real 4<real =C 4 7real $in memorie )+6". 4'I*,4 4'I*<4 =C 4 7inmultire si pop )1I( 4'1*/4 =C 4'1* 7impartire real 7 real )1I( 4'I*,4 4'I*/4 =C 4'I* )1I( 4,4'I* 4/4'I* =C 4 )1I( real 4/real =C 4 7real $in memorie > )1I(.4'I*,4 4'I*/4 =C 4 7impartire si pop )1I(3 4/4'1* =C 4'1* 7$i%i$e re%erse$ )1I(34'I*,4 4/4'I* =C 4'I* )1I(34,4'I* 4'I*/4 =C 4 )1I(3real 4/real =C 4 7real $in memorie )1I(3. 4'I*/4 4'I*/4 =C 4'I* 7$i%i$e re%. si pop Instr!cti!ni s"eciale In aceasta grupa am cuprins instructiuni $e calcul &unctii exponentiale, logaritmice si trigonometrice usuale8 ).3!+ pentru 4/4'1* $a restul partial 'mo$ul* in 4 )4P3 ra$icalul $in 4 =C 4 pt. 4 C 0 )C24 cos'4* =C 4 7 calcul cos'x* numai 80387 )4IN sin'4* =C 4 7 calcul sin'x* numai 80387 ).AN tang'a* 7 pentru 0 B a B .I/, 7 rezultatul su/ &orma x/@ in 4 si 4'1* ).AAN arctg'x/@* =C 4 7 un$e x in 4 si @ in 4'1* 7 rezultatul in noul 4 care este $upa pop in locul lui @ )4CA"! calculeaza &= 4<2<<4'1* =C 4 7 interpreteaza 4'1* ca intreg si il a$auga la exponentul lui 4 pentru a o/tine inmultirea cu 2 la puterea N )L"2H calculeaza &= L<log2'H* =C4 'peste L $upa pop* 7 se cere HC0 in 4 si L 7real in 4'1* )L"N2H.1 calculeaza &= L<log2'H;1* =C4 'peste L $upa pop* 7 se cere HC0 in 4 si L 7real in 4'1* pt.HBra$'2*/2 '0.79* )2H+1 calculeaza &= 2<<H71 =C4 7un$e H in 4 Aceasta &unctie permite calculul &unctiilor exponentiale pentru orice /aza prin &ormulele cunoscute8 10<<H = 2<<H<log2'10* e<<H = 2<<H<log2'e* 7 un$e e este /aza log. naturali L<<H = 2<<H<log2'L* Constantele logaritmice se incarca prin )"1"2 si )"1"2!. 12.# !xemple $e programe cu instructiuni 8x87 )olosin$ instructiunile prezentate si exemplele $e program se %or scrie programe, care sa utilizeze numere reale, intregi si zecimale co$i&icate /inar '5C1* pentru calcule matematice utizin$ coprocesorul 8x87, real s7au emulat cu !+87 /". 7 4e %a asam/la programul si pentru $atele constante generate cu $i&erite lungimi se %a stu$ia mo$ul $e co$i&icare si se %or calcula %alorile in zecimal pentru numerele reale. 7 4e %a stu$ia mo$ul $e co$i&icare a instructiunilor $e () 7 4e %a scrie un program pentru una $in pro/lemele8 7 rezol%area unei ecuatii $e gra$ul 2, 7 calcul sin'x* si cos'x* prin $ez%oltare in serie, 7 extragerea ra$acinii patrate $upa &ormula iterati%a8 10 H'i*= QN/H'i71*;H'i71*R/2 7 un$e H'1*=N/2 7 calculul unei integrale $e&inite cu meto$a trapezelor .rezentam mai Fos listingul unui exemplu $e program simplu in care se $eclara $i&erite tipuri $e %aria/ile si se executa cite%a instructiuni. .rogramul %a tre/ui lansat $in 124 sau Co$e(ie:. !l %a a&isa pe ecran rezultatul a$unarii a $oua numere zecimale co$i&icate /inar L3 = L1 ; L2. Cele $oua numere au &ost alese incit rezultatul sa &ie $e ?tip A4CII? pentru a putea &i a&isat $irect pentru %eri&icare. 4e %a a&isa 879,. !+87 / l 7incarcare emulator rezi$ent in memorie +A4+ ex1&.asm,ex1&,ex1& /r 7 macroasam/lare cu instr.() reale 7777777777777777777777777777777777777777777777777777777777777777 +icroso&t '3* +acro Assem/ler (ersion 9.00 #/>/>3 2382>81, .age 171 a$resa co$ generat etic. instructiuni .mo$el small 0100 .stacI 29# < segment $e $ate < 0000 .$ata 0000 152)91,0 x1 $$ 3.,9# 000, 333383,0 x2 $$ ,.1 0008 0807090,000000000000 @1 $t ,090708h 0012 30303030000000000000 @2 $t 30303030h 001C 00000000000000000000 @3 $t 0 002# 2, $/ STS 0027 00000000 x3 $$ 0 0025 0000803) x, $$ 1.0 002) 0000A0,0 x9 $$ 9.0 < segment $e co$ cu speci&icare coprocesor < .8x87 0000 .co$e 0000 58 7777 3 st18 mo% ax,U$ata 0003 8! 18 mo% $s,ax 0009 >5 1> 0# 0000 3 &l$ x1 000A >5 18 0# 000, 3 &a$$ x2 000) >5 1> 1# 0027 3 &st x3 001, >5 1) 2# 0008 3 &/l$ @1 001> >5 1) 2# 0012 3 &/l$ @2 001! >5 18 C1 &a$$ st,st'1* 0021 >5 1) 3# 001C 3 &/stp @3 < a&isare text pe ecran < 002# 5A 001C 3 mo% $x,o&&set @3 002> 5, 0> mo% ah,> 0025 C1 21 int 21h 0021 5, ,C mo% ah,,ch 002) C1 21 int 21h 0031 en$ st1 +icroso&t '3* +acro Assem/ler (ersion 9.0 #/>/>3 2382>81, 11 4egments an$ Jroups8 N a m e "ength Align Com/ine Class 1J326. .. . . . . . . . . . . J326. V1AA . . . . . . . . . . 0033 0231 .65"IC S1AAS 4ACW . . . . . . . . . . 0100 .A3A 4ACW S4ACWS V!H . . . . . . . . . . . 0031 0231 .65"IC SC21!S 4@m/ols8 N a m e @pe (alue Attr 41 . . . . . . . . . . . . " N!A3 0000 V!H H1 . . . . . . . . . . . . . " 10231 0000 V1AA H2 . . . . . . . . . . . . . " 10231 000, V1AA H3 . . . . . . . . . . . . . " 10231 0027 V1AA H, . . . . . . . . . . . . . " 10231 0025 V1AA H9 . . . . . . . . . . . . . " 10231 002) V1AA L1 . . . . . . . . . . . . . " 5L! 0008 V1AA L2 . . . . . . . . . . . . . " 5L! 0012 V1AA L3 . . . . . . . . . . . . . " 5L! 001C V1AA UC21! . . . . . . . . . . . . . !H V!H UC21!4ID! . . . . . . . . . . . !H 0 U1AA4ID! . . . . . . . . . . . !H 0 U)I"!NA+! . . . . . . . . . . . !H ex1& 30 4ource "ines 30 otal "ines 23 4@m/ols 90>,0 ; 30>8>2 5@tes s@m/ol space &ree 0 0arning !rrors 0 4e%ere !rrors 7777777777777777777777777777777777777777777777777777777777777777777 4e o/ser%a ca numerele zecimale L1 si L2 se aliniaza la stinga un$e ci&rele au si pon$erea cea mai mare. Numerele H1 si H2 care sint reprezentate in () 'reale* au octetii in%ersati, incit exponentul si pon$erile mai mari apar in $reapta. (aria/ila H3=0 are atit mantisa cit si exponentul 0. H, = 1. are reprezentarea 00 00 80 3) care in registru %a &i8 3) 80 00 00 1eoarece primul /it $in octetul 2 este $in exponent printr7o $eplasare spre stinga o/tinem8 7) 00 00 00 $eci !H. = 7) 7 7) = 0 +antisa este aparent 0 $ar contine un 1. care in 4K23 3!A" nu se reprezinta. !a este pentru numerele normalizate8 1 =B +antisa B 2 $eci +antisa = 1 pentru H, (aloarea lui H, %a &i8 H, = +<2<<!H. = 1.<2<<0 = 1. 12 .roce$am la &el pentru H9 = 9. care e reprezentat 00 00 A0 ,0 In registru %a &i ,0 A0 00 00 si $upa o $eplasare stinga $e%ine8 81 ,0 00 00 a%in$ $eci !H. = 81 7 7) = 2 +antisa este + = 1. ; ,/1# ; 0/29# = 1.29 H9 = +<2<<!H. = 1.29<2<<2=1.29<, = 9. care e %aloarea corecta 4e o/ser%a ca pentru a simpli&icarea calculului mantisei lucram cu puterile negati%e a lui 1# si cu ci&rele hexa $in mantisX. Calculam si %aloarea lui H2 = ,.1 care se reprezinta prin8 33 33 83 ,0 si $e%ine $upa in%ersarea ci&relor ,0 83 33 33 iar $upa o $eplasare $reapta 81 0# ## ## .3ezulta exponentul8 !H. = 81 7 7) = 2 iar mantisa8 + = 1. ; 0/1# ; #/'1#<1#* ; #/'29#<1#* ; #/'29#<29#* ; ... H2 = 2<<2 <+ = ,<+ = , ; 2,/29# ; 2,/'29#<1#* ;..=,.0>379;0.0098# H2 = ,.0>>#1 cu o aproximatie su/ $estul $e /una su/ 1Y $esi am negliFat ultimele 3 ci&re hexa $in mantisa Pro&ra# de calc!l "entr! %!nctia e"onentiala Calculam %aloarea &unctiei exponentiale prin $escompunerea in serie $upa &ormula8 !<<x = 1 ; x/1Z ; x<<2/2Z x<<3/3Z ; x<<,/,Z ; .... Calculam suma iterati% 4 = 4 ; pina cin$ termenul $e%ine mai mic $ecit !.4 = 0.0001 6n termen i il calculam $upa &ormula = <H/I (aria/ilele &olosite si %alorile initiale sint8 4 7 suma partiala, initial 4 = 1 7 %aloarea termenului curent, initial = 1 I 7 rangul termenului curent, initial I = 1 In $reapta programului se %e$e structura consi$erata pentru sti%a $e registre a coprocesorului in momentul initial. ; ----------------------------------------------- ; PROGRAM DE CALCUL EXP(X) ; ------------------------------------------------ .MODEL SMALL .STACK 256 .80287 .DATA EPS DD 0.00001 ;precizie X DD 2.541 EX DD 0. ;valoare calculata .CODE START: MOV AX!DATA MOV DSAX ; Fiecare incarcare de registru e precedata de decrem. stiva reg. "LD X ; incarcare X real "LD1 ; incarcare constanta 1. 477777C ;0 ;1 ;2 ;3 ;, ;9 =1 I=1 4=1 1 H 13 "LD ST ; S=1 "LD ST ; I=1 "LD ST ; T=1 C#CLU: "MUL STST(4) ; T=T*X =>ST "D#V STST(1) ; T=T*X/I "ADD ST(2)ST ; S=S+T "#$CSTP ; incrementare pointer reg. "ADD STST(2) ; I=I+1 "DECSTP ; reacere pointer reg. "COM EPS ; T ! "#S $ "STS% AX ; salvare indicatori si test "%A#T ; asteptare terminare instr. %F SA&" ; memorare indicatori in reg. F&'(S 'L GATA ; test S=1 )indicator *+, 'MP C#CLU "LD STST(2) ; memorare rezultat "ST EX GATA: MOV A&4C& #$T 21& ; iesire in -.S E$D START 12.7. Con%ersie numere $in intreg in &lotant Consi$eram un numar /inar intreg pe , octeti '32 /iti*, care il %om con%erti in %irgula &lotanta '()* pe , octeti '4K23 3!A"* 23c./. 3!#ar intre& 3 $ 6 vir&!la "entr! #antisa H. $ 6 vir&!la intre& CAR 12,J2? 6 caracteristica initiala n!#ar intre&
Consi$eram numarul poziti% intreg N, care are %irgula %irtuala in $reapta, ca o mantisa supraunitara cu o caracteristica CA3 asociata8 3 1 3E2EE9 =C E=P 1 9 1K CAR 1 E=PJ12, 1 12, 1aca N este consi$erat o mantisa pentru reprezentarea () short real, atunci %irgula %a &i %azuta $eplasata cu 23 c./. spre stinga. .entru a nu schim/a %aloarea numarului, care $e%ine N<2<<'723*, tre/uie sa marim caracteristica cu 23. .astrin$ separat mantisa si caracteristica %om a%ea un numar in () cu8 M 1 3E2EE'62?: si CAR 1 12,J2? 1 189 6caracteristica initiala Cum numarul nostru in () este in general nenormalizat, il %om supune unei normalizari, utilizin$ o macroinstructiune N),, pe care o %om $e&ini si care apeleaza un su/program 4N),. Numarul ce se normalizeaza %a &i $at prin mantisa +1 si caracteristica C1 separate. !le %or &i incarcate in 1H8AH si respecti% in 5H $e macroinstructiunea N),, care 1, $upa chemarea su/programului 4N), o/tine numarul in &lotant in 1H8AH si il memoreaza peste mantisa initiala '%ezi programul alaturat*. 4u/programul 4N), consi$era ca mantisa este nenormalizata, existin$ 2 cazuri8 a* 7 !ste ocupata zona caracteristicii 'primul octet*, caz in care se &ac $eplasari spre $reapta a mantisei si incrementari corespunzatoare ale caracteristicii, pentru a nu mo$i&ica %aloarea numarului. /* 7 +antisa are zerouri pe primele pozitii $upa %irgula si in acest caz se &ac $eplasari spre stinga si $ecrementari ale caracteristicii, pina cin$ primul /it $in octetul 2 al mantisei $e%ine 1. 1eplasarile spre stinga sau $reapta ale mantisei, ce se gaseste in registrele 1H8AH se &ace com/inin$ o $eplasare a unui registru cu rotirea prin carr@ a celuilalt. 1upa ce mantisa a &ost normalizata, primul /it care este 1 implicit se sterge si mantisa se concateneaza cu caracteristica. 1aca a%em macroinstructiunea $e normalizare N),, atunci con%ersia unui numar intreg in () se re$uce la o normalizare cu o caracteristica initiala CA3=190 .entru exempli&icare consi$eram numarul intreg N = 9 N = 00 00 00 09 si CA3 = 127 ; 23 = 190 = >#K .entru normalizare sint necesare 21 $eplasari spre stinga8 + = 00 A0 00 00 si CA3 = 190 7 21 = 12> = 81K .rin suprimarea /itului 1 implicit rezulta8 + = 00 20 00 00 A$augin$ caracteristica o/tinem numarul in &lotant8 N) = ,0 A0 00 00 care reprezinta in &lotant numarul intreg 9. ; -------------------------------- ; PROGRAM DE CO$VERS#E #$TREG REAL ; --------------------------------- .286( .287 )*++,- ..*),/ +.0// .+10(2100 .)010 3 )) 51420 ; nr intreg 34 )) 51420. ; nr in v (31 )5 127627 ; caracteristica implicita .(*), ; -einitie macro pt normalizare v 844 MACRO (1.1 ; caract. si mantisa PUS&A ; salvare registre .*9 035*:) ;1: .1 ; mantisa pe / octeti .*9 )35*:) ;1: .162 .*9 <3(1 ; caract. pe 0 octeti CALL S$"4 ; su1program normalizare .*9 5*:) ;1: .103 ; memorare nr. normalizat .*9 5*:) ;1: .162)3 ; peste mantisa initiala POPA E$DM 19 ; --------------------------- ; S=<;:*-:0. 8*:.0/>?0:, V" ; - >81:0:, .081>+0 4 *(1 >8 DX:AX +> (0:0(1 >8 @X ; - >,+>:, 8: >8 94 ;, 4 *(1 >8 DX:AX ; --------------------------- +844 PROC8,0: ; normalizare prin depl dreaapta mantisa si increm. *'2 (11: (.; )A0 ; test octet1 din mant =+ B? (2 ; octet1=+ depl. stinga >8( <3 ; car =car+1 si depl. dreapta -X3'X +A: )31 ; -X 4> *F 4> 'X :(: 031 B.; (11 ; normalizare prin depl. stinga mantisa si decrem. *'2 (2: .*9 (/80A ; veri. 1it1 din octet0 mantisa 08) (/)/ ; selectie 1it1 (.; (/80A B? (7 ; terminare normalizare ),( <3 ; car=car41 si depl. stinga mantisa +A/ 031 ; -X !4 *F !4 'X :(/ )31 B.; (2 ; *oncatenare *'2 cu mantisa normalizata (7: 08) )/74A ; sterge 1it 1 din mantisa )implicit=1, +A/ )31 *: )A</ ; concatenare *'2 si mantisa +A: )31 :,1 +844 E$DP ; ------------------------------ ; ;:*-:0. ;:>8(>;0/ (*89,:+>, >81:,- 4/*1081 ; ------------------------------ +11: .*9 03!)010 .*9 )+03 ; (>4: 844 (313 ; conversie intreg real ; ,8) +11 --------------------------------------------------- 1# 12.8. Con%ersia numerelor $in () in intreg 4i in acest caz separam caracteristica 'CA3* $e mantisa '+*. +antisa %a &urniza ci&rele semni&icati%e ale numarului ' #77 la short real*, iar caracteristica %a $a or$inul $e marime. Algoritmul %a &i in%ers $ecit la con%ersia intreg 7 &lotant. 8c./. 23c./. + A N I 4 A S7 %irgula mantisa %& S 7%irgula pt.numar intreg CA3 7 caracteristica (aloarea numarului in () este8 N) = +<2<<!H. .entru a a%ea $eplasari numai intr7un singur sens, $eplasam initial mantisa la stinga cu 8 c./. si completam 1 implicit pe primul /it. (om consi$era numarul intreg rezultat $upa mutarea %irgulei mantisei 'care se gaseste acum $upa primul /it*, spre $reapta cu nr. $e pozitii in$icate $e exponent ' !H. = CA37127 *. !xponentul speci&ica nr. $e ci&re /inare intregi ale numarului, iar restul &iin$ /iti ce $au zecimale, care se pier$ in cazul numerelor intregi. (om a%ea urmatoarele cazuri8 a* !H. = 31 7 %irgula se %a $eplasa cu 31 c./. spre $reapta, chiar peste %irgula corespunzatoare numerelor intregi. +antisa %a reprezenta chiar numarul intreg. /* !H. B 0 7 %irgula %a tre/ui mutata spre stinga si numarul %a &i B 1, $eci intregul rezultat %a &i N = 0. c* !H. C 31 7 %irgula tre/uie mutata cu mai mult $e 31 pozitii spre $reapta, rezultin$ $epasire 'numar cu mai mult $e 32 c./.* $* 0 =B !H. B 31 7 %irgula se %a $eplasa spre $reapta cu mai putin $e 31 c./. si %a tre/ui a$usa pe ultima pozitie $in $reapta, corespunzatoare numerelor intregi. Aceasta se realizeaza cu 31 7 !H. $eplasari spre $reapta. (om exempli&ica algoritmul pe numarul N) = 3.,9# care in hexa este N) = ,0 91 2) 15 CA3 = ,0K =C !H. = CA3 7 7)K = 80K 7 7)K = 1 + = 00 91 2) 15 7 mantisa 1upa $eplasarea stinga cu 8 c./. si completare 1 implicit8 + = 11 2) 15 00 .entru trans&ormarea in numar intreg sint necesare 31 7 !H. = 31 7 1 = 30 $eplasari spre $reapta si rezulta8 N = 00 00 00 03 restul /itilor &ractionari s7au pier$ut ; ------------------------------------- ; PROGRAM DE CO$VERS#E "LOTA$T - #$TREG ; --------------------------------------- 17 .286( .287 )*++,- ..*),/ +.0// .+10(2100 .)010 .),; )< 1017CD,;0+>:,DD $:. >8 V" ;:,0 .0:, EC 34 )) 51420. ; numar in %F 5 )) 0 ; numar convertit intreg 3: )) 51420 ; numar intreg de reerinta ; -einitie macro pentru conversie pozitiv lotant 4 intreg C"# MACRO $$" ; numar intreg si lotant ;=+A0 ; salvare registre .*9 )3 5*:) ;1: 8462 ; nr. lotant pe / oct. in -X3'X .*9 035*:) ;1: 84 CALL SC"# ; c6emare su1pr. conv. lotant 4intreg .*9 5*:) ;1: 862)3 ; memorare numar intreg .*9 5*:) ;1: 803 E$DM ; ------------------------------------------- ; S=<;:*-:0. (*89,:+>, 4/*1081 - >81:,- ; - >81:0:, DX:AX 8=.0: 4/*1081 ; - >,+>:, DX:AX 8=.0: >81:,- (*89,:1>1 ; -------------------------------------------- SC"# PROC$EAR .*9 <3)3 ; veriicare 7F=+ *: <303 B8? (1 ; 7F > + RET ; 7F = + => 7 = 7F (1: .*9 <3)3 ; 15 = *'2 +A/ <31 ; 16 = *'2 .*9 (38 ; 8 depl. stinga mantisa )8: +A/ 031 ; -X !4 *F !4 'X :(/ )31 /**; )8 *: )A80A ; ortare 1it implicit 1 mantisa +=< <A127 ; "X# = *'24109 (.; <A71 ; comparare "X# cu :1 B8? (7 RET ; "X# = :1 => 7=7F nu se ac deplasari (7: B+ (4 ; "X# ! :1 .*9 )3*44+,1 .),; ; "X# >:1 4 mesa; depasire .*9 0AF >81 21A RET (4: (.; <A0 ; comparare "X# cu + B8+ (5 ; + =! "X# ! :1 3*: 0303 ; "X#!+ => 7=+ .*9 )303 RET 18 (5: .*9 (/71 ; + =! "X# ! :1 +=< (/<A ; *& = :14"X# nr.deplasari dreapta .*9 (A0 (6: +A: )31 ; :14"X# deplasari dreapta mantisa :(: 031 ; -X 4> *F 4> 'X /**; (6 RET SC"# E$DP ; ------------------------------------------- ; P:*-:0. ;:>8(>;0/ (*89,:+>, 4/*1081 >81:,- ; ------------------------------------------- ST1: .*9 03!)010 .*9 )+03 ; (*89: C"# 334 ; conversie X 4> XF ; >81 7 ; terminare E$D ST1 ------------------------------------------------------------------ 1>