programmers resources
  http://www.intel-assembler.it/  (c)2017 intel-assembler.it   info@intel-assembler.it
 
Search :  
Lingua Italiana    English Language   
Index
 
just an empty assembly space
just an arrow Intel Platform
just an arrow Article & Guides
just an arrow Download Software


23/01/2009 Featured Article: How to remove Buzus Virus (permalink)




:::3173479:::
Bottone Scambio Directory Pubblicitaonline.it
Home Page | Articles & Guides | Download | Intel Platform | Contacts

Google
 


Bookmark and Share
Download 
Tell a friend



FPULIB - a library for coprocessor programming

A set of asm files for handling math operations

(by raymond filiatreault)

A handy set of functions for math coprocessor programming. These FPU functions make life easier for complex operations. The 37 functions are completed with a CHM guide and a testing executable.
This article is online from 2542 days and has been seen 5286 times





FpuLib 
Copyright Raymond Filiatreault 2002-2010 


This library contains functions to perform high precision floating point 
computations with the FPU coprocessor, without the need to learn all the 
intricacies of the coding syntax and limitations of the FPU. The obvious 
drawback is some code overhead to decipher the meaning of parameters. 

For occasional use, the speed should not be affected significantly when 
compared to directly programming the FPU. When used repeatedly in a time 
critical loop, it may be wise to learn how to access the FPU directly.


--- content example FPUABS.ASM -------------------------------------------------

; #########################################################################
;
;                             FpuAbs
;
;##########################################################################

  ; -----------------------------------------------------------------------
  ; This procedure was written by Raymond Filiatreault, December 2002
  ; Modified March 2004 to avoid any potential data loss from the FPU
  ; Revised January 2005 to free the FPU st7 register if necessary.
  ; Revised January 2010 to allow additional data types from memory to be
  ;    used as source parameter and allow additional data types for storage. 
  ;
  ;                           |Src| -> Dest
  ;
  ; This FpuAbs function changes the sign of a REAL number (Src) to
  ; positive with the FPU and returns the result at the specified
  ; destination (the FPU itself or a memory location), unless an invalid
  ; operation is reported by the FPU or the definition of the parameters
  ; (with uID) is invalid.
  ;
  ; The source can only be a REAL number from the FPU itself or either a
  ; REAL4, REAL8 or REAL10 from memory. (The absolute value of integers can
  ; be easily obtained with CPU instructions.)
  ;
  ; The source is not checked for validity. This is the programmer's
  ; responsibility.
  ;
  ; Only EAX is used to return error or success. All other CPU registers
  ; are preserved.
  ;
  ; IF the source is specified to be the FPU top data register, it would be
  ; removed. It would then be replaced by the result only if the FPU is
  ; specified as the destination.
  ;
  ; IF the source is from memory
  ; AND the FPU is specified as the destination for the result,
  ;       the st7 data register will become the st0 data register where the
  ;       result will be returned (any valid data in that register would
  ;       have been trashed).
  ;
  ; -----------------------------------------------------------------------

    .386
    .model flat, stdcall  ; 32 bit memory model
    option casemap :none  ; case sensitive

    include Fpu.inc

    .code

; #########################################################################

FpuAbs proc public lpSrc:DWORD, lpDest:DWORD, uID:DWORD
        
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;
; Because a library is assembled before its functions are called, all
; references to external memory data must be qualified for the expected
; size of that data so that the proper code is generated.
;
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LOCAL content[108] :BYTE
LOCAL tempst       :TBYTE

      test  uID,SRC1_FPU      ;is Src taken from FPU?
      jz    continue

;-------------------------------
;check if top register is empty
;-------------------------------

      fxam                    ;examine its content
      fstsw ax                ;store results in AX
      fwait                   ;for precaution
      sahf                    ;transfer result bits to CPU flag
      jnc   continue          ;not empty if Carry flag not set
      jpe   continue          ;not empty if Parity flag set
      jz    srcerr1           ;empty if Zero flag set

continue:
      fsave content

;----------------------------------------
;check source for Src and load it to FPU
;----------------------------------------

      test  uID,SRC1_FPU
      .if   !ZERO?            ;Src is taken from FPU?
            lea   eax,content
            fld   tbyte ptr[eax+28]
            jmp   dest0       ;go complete process
      .endif
      
      mov   eax,lpSrc
      test  uID,SRC1_REAL
      .if   !ZERO?            ;Src is an 80-bit REAL10 in memory?
            fld   tbyte ptr[eax]
            jmp   dest0       ;go complete process
      .endif
      test  uID,SRC1_REAL8
      .if   !ZERO?            ;Src is a 64-bit REAL8 in memory?
            fld   qword ptr[eax]
            jmp   dest0       ;go complete process
      .endif
      test  uID,SRC1_REAL4
      .if   !ZERO?            ;Src is a 32-bit REAL4 in memory?
            fld   dword ptr[eax]
            jmp   dest0       ;go complete process
      .endif

srcerr:
      frstor content
srcerr1:
      xor   eax,eax
      ret

dest0:
      fabs

      fstsw ax                ;retrieve exception flags from FPU
      fwait
      shr   al,1              ;test for invalid operation
      jc    srcerr            ;clean-up and return error

; store result as specified

      test  uID,DEST_FPU      ;check where result should be stored
      .if   !ZERO?            ;destination is the FPU
            fstp  tempst      ;store it temporarily
            jmp   restore
      .endif
      mov   eax,lpDest
      test  uID,DEST_MEM4
      .if   !ZERO?            ;store as REAL4 at specified address
            fstp  dword ptr[eax]
            jmp   restore
      .endif
      test  uID,DEST_MEM8
      .if   !ZERO?            ;store as REAL8 at specified address
            fstp  qword ptr[eax]
            jmp   restore
      .endif
      fstp  tbyte ptr[eax]    ;store as REAL10 at specified address (default)

restore:
      frstor  content         ;restore all previous FPU registers

      test  uID,SRC1_FPU      ;was Src taken from FPU
      jz    @F
      fstp  st                ;remove source

   @@:
      test  uID,DEST_FPU      ;check where result should be stored
      .if   !ZERO?            ;destination is the FPU
            ffree st(7)       ;free it if not already empty
            fld   tempst      ;return the result on the FPU
      .endif

      or    al,1              ;to insure EAX!=0
      ret
    
FpuAbs endp

; #########################################################################

end

--------------------------------------------------------------------------------

Original release. December 2002

Modified January 2004 to free all registers required by the function to avoid 
any potential FPU stack overflow.

Modified March 2004 to preserve all FPU registers while avoiding any stack 
overflow. Also corrected a minor flaw in the FpuSize function and added the 
FpuState function.

Modified January 2005 to trash the FPUs ST(7) data register whenever necessary 
to prevent reporting an error if a register is not available for returning a 
result on the FPU.

Updated this Help file May 2006 to cover the addition of a parameter for the 
FpuState function.

Updated this Help file December 2006 to cover the modification of the FpuAtoFL 
function which allows a modified range of input characters.

Modified January 2010 to:
- allow REAL4 and REAL8 data to be used as parameters for source and/or 
  destination
- allows the use of a QWORD integer for source and/or destination where integers
 
  could be used
- add functions to convert signed/unsigned DWORD and QWORD to ascii decimal 
  strings
- fix a few potential bugs




Top
Download 
Tell a friend
Bookmark and Share



Similar Articles

Everything You Want To Know About Math Coprocessor
A detailed document about x86 coprocessors
(by Norbert Juffa)

FPU assembler programming
68881/68882/040 command reference
(by Erik H. Bakke)

FPU timing
8087-Pentium coprocessor timing and pairing
(by Quantasm)

Set of 8087 macros for use with masm
Source code of a set of FPU macros
(by Byte)

Simply FPU - A guide on coprocessor programming
13 chapters on x86 FPU unit
(by Raymond Filiatreault)

The 8087 Instruction Set
A one-line description of x87 instructions
(by unknown)

 Tags: fpu, coprocessor


webmaster jes
writers rguru, tech-g, aiguru, drAx

site optimized for IE/Firefox/Chrome with 1024x768 resolution

Valid HTML 4.01 Transitional


ALL TRADEMARKS ® ARE PROPERTY OF LEGITTIMATE OWNERS.
© ALL RIGHTS RESERVED.

hosting&web - www.accademia3.it

grossocactus
find rguru on
http://www.twitter.com/sicurezza3/
... send an email ...
Your name

Destination email

Message

captcha! Code