Я сталкиваюсь с неоднозначным случаем в отношении декодирования инструкций x87 FPU. Взгляните на следующую инструкцию, взятую на странице 3-380 тома 2A руководства по набору команд Intel [1].
D9 /0 --> FLD m32fp --> Push m32fp onto the FPU register stack.
D9 C0+i --> FLD ST(i) --> Push ST(i) onto the FPU register stack.
Обе эти инструкции имеют одинаковый однобайтовый базовый код операции 0xD9
. Первая инструкция имеет код операции расширения 0x00
. Код операции расширения будет указан в поле 'reg' байта ModR / M. Но вторая инструкция - это 2-байтовый код операции с функцией «Добавить, чтобы получить регистр». Это означает, что:
D9 C0 --> FLD ST0
D9 C1 --> FLD ST1
(and so on)
У меня есть небольшая проблема, связанная с разграничением этих двух инструкций. Небольшой пример:
Теперь, предположим, я получил последовательность кода операции "D9 C1"
. Если мне нужно проверить, является ли это инструкция "FLD m32fp"
, я должен проверить, является ли поле 'reg' байта ModR / M 0x00 или нет. Если это так, то действительно используется инструкция "FLD m32fp"
.
Двоичное представление C1
равно "1100 0001"
. Предполагая, что бит 0 равен LSB, тогда бит 3-бит 5 (включительно) образуют поле 'reg' байта ModR / M "C1"
. Мы видим, что это действительно 0x00
(3 нуля).
Поэтому я сопоставляю последовательность кода операции "D9 C1"
с инструкцией "FLD m32fp"
. Расшифровывая далее, мы видим, что операнд на самом деле становится "ecx"
в этом случае. Но мы видим, что "FLD ST1"
также имеет последовательность кода операции "D9 C1"
, и это фактическая инструкция, используемая для этой последовательности кода операции.
По сути, как я могу быть уверен, что последовательность кода операции "D9 C1"
соответствует инструкции "FLD ST1"
, а не "FLD ecx"
?
Очень похожие проблемы возникают и для инструкции "FMUL"
, так как принимает операнды так же, как здесь "FLD"
.
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
Спасибо и всего наилучшего,
Хришикеш Мурали