Assembly: How does fld st(0) duplicates the top stack value in the following code?

There’s a good guide to x87 FPU by Raymond Filiatreault. Chapter 1 explains how the FPU register stack works.

Yes, fld st(0) pushes a copy of the top of the stack. The Intel insn ref manual explicitly mentions this special-case use of fld st(n)

I believe you’re right that fstp does pop after the fild.

  • The first fild / fstp pair converts a global int (at L1000F140) to a float on the stack.
  • Then fld st(0) duplicates the top of the stack (i.e. the value that was there before the fild/fstp).
  • Then divide that value by another global, and multiply by another.
  • final stack:
st(0)=orig / global1 * global2
st(1)=orig

Leave a Comment