home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / LordLucifer / win32asm / tutorials / fpu1.txt < prev    next >
Text File  |  2000-05-25  |  8KB  |  224 lines

  1. Introduction to Floating Point Programming
  2. By Lord Lucifer
  3.  
  4.  
  5. This article will give a general overview of the Intel Architcture Floating
  6. Point Unit (FPU).  It will cover the FPU's architecture and instruction set.
  7.  
  8.  
  9. FPU Data Formats
  10. -----------------------------------------------------------------------------
  11.                   Length   Precision  Range (Approx)
  12.   Single Real     32 bit   24 bit     1.18e-38 to 3.40e38
  13.   Double Real     64 bit   53 bit     2.23e-308 to 1.79e308
  14.   Extended Real   80 bit   64 bit     3.37e-4932 to 1.18e4932
  15.   Word Integer    16 bit   15 bit     -32768 to 32768
  16.   Short Integer   32 bit   31 bit     -2.14e9 to 2.14e9
  17.   Long Integer    64 bit   63 bit     -9.22e18 to 9.22e18
  18.   Packed BCD      80 bit   18         (-1e18 + 1) to (1e18 - 1)
  19.  
  20.  
  21.  
  22. FPU Data Registers
  23. -----------------------------------------------------------------------------
  24.  
  25.   Data Registers
  26.       _ _________ _______________________________________
  27.   R7 |_|_________|_______________________________________|
  28.   R6 |_|_________|_______________________________________|
  29.   R5 |_|_________|_______________________________________|
  30.   R4 |_|_________|_______________________________________|
  31.   R3 |_|_________|_______________________________________|
  32.   R2 |_|_________|_______________________________________|
  33.   R1 |_|_________|_______________________________________|
  34.   R0 |_|_________|_______________________________________|
  35.     80 79        63                                      0
  36.     Sign  Exponent                             Significand
  37.  
  38.                            ______________________________
  39.   FPU Instruction Pointer |______________________________|
  40.   FPU Operand Pointer     |______________________________|
  41.                          47                              0
  42.                                           _______________
  43.   Control Register                       |_______________|
  44.   Status Register                        |_______________|
  45.   Tag Register                           |_______________|
  46.   Opcode                                     |___________|
  47.                                         15   10          0
  48.  
  49.  
  50.  
  51.  
  52. FPU Data Register Stack:
  53.      ___________________________
  54.   7 |___________________________|                    Stack 
  55.   6 |___________________________| ST(2)              Growth
  56.   5 |___________________________| ST(1)                |
  57.   4 |___________________________| ST(0)  TOP=100b      |
  58.   3 |___________________________|                     \|/
  59.   2 |___________________________|                      `
  60.   1 |___________________________|
  61.   0 |___________________________|
  62.  
  63.  
  64. Status Register:
  65.    ___________________________________________________________
  66.   |___|___|___________|___|___|___|___|___|___|___|___|___|___|
  67.     B   C3     TOP      C2  C1  C0  ES  SF  PE  UE  OE  ZE  IE 
  68.     
  69.   B     - FPU Busy
  70.   C0-C3 - Condition Codes
  71.   TOP   - Top of Stack Pointer
  72.   ES    - Error Summary Status
  73.   SF    - Stack Fault
  74.   PE    - Precision Exception
  75.   UE    - Underflow Exception
  76.   OE    - Overflow Exception
  77.   ZE    - Zero Divide Exception
  78.   DE    - Denormailzed Operand Exception
  79.   IE    - Invalid Operation Exception
  80.  
  81.  
  82.  
  83. FPU Instruction Set
  84. -----------------------------------------------------------------------------
  85.  
  86. Data Transfer Instructions:
  87.  
  88.   FLD    src = [st(), mem32, mem64]
  89.          Load Real
  90.          Pushes real operand (from memory or FPU data register) onto
  91.          the top of the FPU stack.  If the operand is a single or double real
  92.          number, it is automatically converted to extended real formt.
  93.  
  94.   FST    dest = [mem32, mem64, mem80, st()]
  95.          Store Real
  96.          Copies the value on top of the FPU stack to the destination operand.
  97.  
  98.   FSTP   dest = [mem32, mem64, mem80, st()]
  99.          Store Real and Pop
  100.          Copies the top of the FPU stack to the destination operand and pops
  101.          the value off of the stack.
  102.  
  103.   FXCH   [st()]
  104.          Exchange Register Contents
  105.          Exchanges the top of the FPU stack with another FPU register.
  106.  
  107.   FILD   src = [mem32, mem64, mem80]
  108.          Load Integer
  109.          Converts integer operand to extended real format, the pushes it onto
  110.          the top of the FPU stack.
  111.  
  112.   FIST   dest = [mem32, mem64, mem80]
  113.          Store Integer
  114.          Converts value at the top of the FPU stack to an integer value, and
  115.          stores it in the destination.
  116.  
  117.   FISTP  dest = [mem32, mem64, mem80]
  118.          Store Integer and Pop
  119.          Converts the top of the FPU stack to an integer value, stores it in
  120.          the destination, and pops the value off the stack.
  121.  
  122.   FBLD   src = [bcd80]
  123.          Load Packed Decimal
  124.          Converts BCD source to extended real format and pushes it to the top
  125.          of the FPU stack.
  126.  
  127.   FBSTP  dest = [mem80]
  128.          Store Packed Decimal and Pop
  129.          Converts top of FPU stack to BCD format, stores it in destination,
  130.          and pops value off of the stack.
  131.  
  132.  
  133. Constant Load Instructions:
  134.   
  135.   These instructions push commonly used constants on to the top of the FPU 
  136.   stack (ST(0)).  These constants have extended real precision and are accurate
  137.   to approximately 19 digits.
  138.  
  139.   FLDZ      Load +0.0
  140.   FLD1      Load +1.0
  141.   FLDPI     Load PI
  142.   FLDL2T    Load log(2) 10  [log(base 2) of 10]
  143.   FLDL2E    Load log(2) e
  144.   FLDLG2    Load log(10) 2
  145.   FLDLN2    Load log(e) 2
  146.  
  147.  
  148. Arithmetic Instructions:
  149.  
  150.   The following instructions operate on the following types of operands:
  151.   - 2 FPU register values
  152.   - A Register value and a real or integer value in memory
  153.  
  154.   FADD(P)   Add Real [FADDP = Add real and pop]
  155.   FIADD     Add Integer
  156.   FSUB(P)   Subtract Real
  157.   FISUB     Subtract Integer from Real
  158.   FSUBR(P)  Reverse Subtract Real
  159.   FISUBR    Reverse Subtract Real from Integer
  160.   FMUL(P)   Multiply Real
  161.   FIMUL     Multiply Integer by Real
  162.   FDIV(P)   Divide Real
  163.   FIDIV     Divide Integer by Real
  164.   FDIVR(P)  Reverse Divide Real
  165.   FIDIVR    Reverse Divide Integer by Real
  166.  
  167.  
  168. Comparison Instructions:
  169.  
  170.   FCOM      Compare real and set FPU condition code flags
  171.   FUCOM     Unordered compare real and set FPU condition code flags
  172.   FICOM     Compare Integer
  173.   FCOMI     Compare real and set EFLAGS status flags
  174.   FUCOMI    Unordered compare real and set EFLAGS status flags
  175.   FTST      Test (Compare real with 0.0)
  176.   FXAM      Examine
  177.  
  178. Trigonometric Instructions:
  179.  
  180.   FSIN      Sine
  181.   FCOS      Cosine
  182.   FSINCOS   Sine and Cosine
  183.   FPTAN     Tangent
  184.   FPATAN    ArcTangent
  185.  
  186.   These instructions operate on the top one or two FPU Stack registers.
  187.   They return their results to the stack.
  188.   The operands must be given in radians.
  189.  
  190. Logarithm, Exponential, and Scale:
  191.  
  192.   FYL2X     Compute log (y * log[2] x)
  193.   FYL2XPI   Compute log epsilon (y * log[2] x)
  194.   F2XMI     Compute exponential (2^x - 1) 
  195.   FSCALE    Scale - multiplies source operand by power of 2
  196.  
  197. FPU Control Instructions:
  198.  
  199.   FINIT/FNINIT   Initialize FPU
  200.   FLDCW          Load FPU control word
  201.   FSTCW/FNSTCW   Store FPU control word
  202.   FSTSW/FNSTSW   Store FPU status word
  203.   FCLEX/FNCLEX   Clear FPU exception flags
  204.   FLDENV         Load FPU environment
  205.   FSTENV/FNSTENV Store FPU environment
  206.   FRSTOR         Restore FPU state
  207.   FSAVE/FNSAVE   Save FPU state
  208.   FINCSTP        Increment FPU register stack pointer
  209.   FDECSTP        Decrement FPU register stack pointer
  210.   FFREE          Free FPU register
  211.   FNOP           No operation
  212.   WAIT/FWAIT     Check for and handle pending unmasked FPU exceptions
  213.  
  214.  
  215. Conclusion
  216. -----------------------------------------------------------------------------
  217.  
  218. This is a very basic overview of the Floating Point Processor.
  219. Future articles will describe the actual use of the FPU and its
  220. instruction set.
  221.  
  222. Copyright (C) 1999
  223. Lord Lucifer  (lord-lucifer@usa.net)
  224.