Давайте разберемся с этим.
> dc 82 04 08 0d 00 faddl 0xd0804(%edx)
| | \____ ____/
| | V
| | |
| | +---------> 32-bit displacement
| +-----------------> ModRM byte
+--------------------> Opcode
Если подробно рассмотреть документы, dc
действительно для m64real
аргумента с плавающей запятой в качестве источника.Он добавит этот 64-битный аргумент в регистр с плавающей запятой ST(0)
.
Однако, это секунда байт 82
, который решает, откуда поступит это 64-битное значение.Это преобразуется в двоичный байт ModRM:
+---+---+---+---+---+---+---+---+
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+---+---+---+---+---+---+---+---+
| MOD | REG/OPCD | R/M |
Если вы посмотрите на таблицу 2.2 в вашем связанном документе (для 32-битных режимов адресации), вы увидите, что это преобразуется в disp32[EDX]
.
Другими словами, он принимает следующие 32 бита (четыре байта), добавляет их в регистр edx
и использует этот адрес для извлечения 64-битного значения из памяти.