Let me break it.
> dc 82 04 08 0d 00 faddl 0xd0804(%edx) | | \____ ____/ | | V | | | | | +---------> 32-bit displacement | +-----------------> ModRM byte +--------------------> Opcode
Looking in detail at the docs, dc indeed a m64real floating point argument as the source. It will add this 64-bit argument to the ST(0) floating-point register.
However, this is the second byte 82 , which decides where this 64-bit value comes from. This results in a binary ModRM byte:
+---+---+---+---+---+---+---+---+ | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | +---+---+---+---+---+---+---+---+ | MOD | REG/OPCD | R/M |
If you look at table 2.2 in a related document (one that is designed for 32-bit addressing modes), you will see that this means disp32[EDX] .
In other words, it takes the next 32 bits (four bytes), adds this to the edx and uses this address to extract the 64-bit value from memory.
source share