Delphi - база знаний


Функция вычисления степени


Функция вычисления степени




function Degree(const DegBasis, DegParam: Extended): Extended; 
asm 
   // Вход: DegBasis, DegParam --> в стеке 
   // Выход: Result --> ST(0) 
   // Примечание: 
   // В случае некорректных данных в ST(0) возвращается DegParam 
 
   XOR     EDX, EDX 
   FLD     DegParam 
   FTST 
   FNSTSW  AX 
   SAHF 
   JNZ     @@DegParam_is_not_0 
   FFREE   ST 
   FLD1 
   JMP     @@exit 
@@DegParam_is_not_0: 
   JC @@DegParam_is_less_than_0 
   JMP     @@cmp_DegBasis_to_0       
@@DegParam_is_less_than_0: 
   OR EDX, 1 
@@cmp_DegBasis_to_0: 
   FLD     DegBasis 
   FTST 
   FNSTSW  AX 
   SAHF 
   JNZ     @@DegBasis_is_not_0 
   TEST    EDX, 1 
   JZ @@DegParam_is_greater_than_0 
   FSTP    ST 
   JMP     @@exit 
@@DegParam_is_greater_than_0: 
   FSTP    ST(1) 
   JMP     @@exit 
@@DegBasis_is_not_0: 
   TEST    BYTE PTR DegBasis + 9, 80H 
   JZ @@DegBasis_is_greater_than_0 
   FABS 
   FXCH 
   OR EDX, 2 
   FLD     ST 
   FRNDINT 
   FSUB    ST, ST(1) 
   FTST 
   FNSTSW  AX 
   SAHF 
   FSTP    ST 
   JZ @@DegParam_is_integer 
   FLD1 
   FDIV    ST, ST(1) 
   FABS 
   FLD1 
   FCOMP     
   FNSTSW  AX 
   SAHF 
   JC @@1_div_Abs_DegParam_greater_or_equal_to_1 
   JZ @@1_div_Abs_DegParam_greater_or_equal_to_1 
   FSTP    ST 
   FSTP    ST(1) 
   JMP     @@exit 
@@1_div_Abs_DegParam_greater_or_equal_to_1: 
   FISTP   QWORD PTR @@Int_64 
   TEST    BYTE PTR @@Int_64, 1 
   JNZ     @@continue 
   FSTP    ST(1) 
   JMP     @@exit 
@@DegParam_is_integer: 
   FLD     ST 
   FISTP   QWORD PTR @@Int_64 
   TEST    BYTE PTR @@Int_64, 1 
   JNZ     @@continue 
   XOR     EDX, EDX 
@@continue: 
   FXCH 
@@DegBasis_is_greater_than_0: 
   FYL2X 
   FLD     ST 
   FRNDINT 
   FSUB    ST(1), ST 
   FXCH    ST(1) 
   F2XM1 
   FLD1 
   FADD 
   FSCALE 
   FSTP    ST(1) 
   TEST    EDX, 2 
   JZ @@exit 
   FCHS 
   JMP     @@exit       
@@Int_64:          
   DQ 0 
@@exit: 
   FWAIT 
 
end

Автор ___ALex___





Начало  Назад  Вперед