Program počíta časovo náročné matematické operácie za pomoci inštrukcií koprocesora 80387 a asembleru

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategória: KMP (Klub mladých programátorov)

Autor: Ľuboš Saloky
Program: 80387.pas
Súbor exe: 80387.exe

Program počíta časovo náročné matematické operácie za pomoci inštrukcií koprocesora 80387 a asembleru.
Operácie
- násobenie
- odčítanie
- odmocnina
- sinus
- argustangens
- faktoriál
{ 80387.PAS                                                         }
{ Program počíta časovo náročné matemtické operácie za pomoci       }
{ inštrukcií koprocesora 80387 a asembleru.                         }
{ Operácie:                                                         }
{  - násobenie                                                      }
{  - odčítanie                                                      }
{  - odmocnina                                                      }
{  - sinus                                                          }
{  - argustangens                                                   }
{  - faktoriál                                                      }
{                                                                   }
{ Author: Ľuboš Saloky                                              }
{ Datum: 01.01.1996                           http://www.trsek.com  }
 
program Instrukcie_koprocesora;
const Fakt:word=1000;
var x,y,z:extended;
    pomocna:word;
BEGIN
{ ----- pozor, pri vypoctoch moze nastat 8087 stack overflow !!! ----- }
{rychlost: 2.250.000 nasobeni za sekundu
           1.800.000 odcitani za sekundu (???)
           1.000.000 odmocnin za sekundu
           4.500.000 absolutnych hodnot za sekundu
           6.000.000 sinusov za sekundu (???)
           4.500.000 arcustangensov za sekundu (???)
 
  rychlosti su zle urcene, lebo po chvíli je argument blízky k nule.}
 
  x:=0.224;
  y:=1.432;
  asm
             fld x
             fld x
             fmul           {x^2}
             fldpi
             fdiv           {(x^2)/pi}
             fld y
             fadd           {(x^2)/pi+y}
             dw 0FFD9h      {cos ((x^2)/pi+y)}
             fstp x         {uloz hodnotu}
 
             fldln2
             fld y
             fyl2x          {prirodzeny logaritmus}
             fstp y         {uloz}
 
             fld1           {pocitanie faktorialu - nahraj jednotku}
             xor ax,ax
@Znova:      inc ax
             mov Pomocna,ax
             fild Pomocna
             fmulp ST(1),ST {nasob}
             cmp ax,Fakt
             jl @Znova
             fstp z
  end;
  writeln(x);
  writeln(cos(0.224*0.224/pi+1.432));
  writeln(y);
  writeln(Ln(1.432));
  writeln('1000! je ',z);
  x:=2.4564878E+0041;
  y:=-8.4326534609E-0023;
  asm
             mov bx,300
             fld x
@ZvonkaZnova:mov cx,60000
@Znova:      {fld y}      {vyrad pri unarnych operaciach}
             fptan {dw 0FED9h} {fabs} {fsqrt} {fsubp st(1),st} {fmulp st(1),st}
             loop @Znova
             dec bx
             jnz @ZvonkaZnova
  end;
 
{ zoznam instrukcii:   BINARNE
    fadd            scita dve cisla na vrchole zasobnika
    fmul,fdiv,fsub  analogicky
                       UNARNE
    fld x           nahra cislo do zasobnika koprocesora
    fstp            ulozi cislo, vyznam toho P neviem
    fabs            absolutna hodnota vrcholu zasobnika
    fsqrt           2. odmocnina
    fptan           arcus tangens
    dw 0FED9h       sinus (LEN 386)
    dw 0FFD9h       cosinus (LEN 386)
                       BEZ OPERATOROV
    fldpi           pi na vrchol zasobnika
    fldln2          ln(2)
    fldl2e          log2(e)
    fld1            1
                       NIEKTORE DALSIE
    fild,fst,fsubr,fcom,fcomp,f2xmar,fbld,fbstp,fchsr,fdecstpr,ffreeva,
    fincstpr,fld1r,fldcw,fpremr,fptan,fsqrtr,fstcw}
END.