CLI очищает бит IF в EFLAGS, так что это имеет смысл.
Похоже, что XED включает в себя неявные операнды, а не только те, которые явно указаны в машинном коде.т.е. все изменения в архитектурном состоянии.
XOR записывает флаги, а XCHG - нет.Таким образом, REG2, вероятно, EFLAGS.Но ваш код содержит только case XED_OPERAND_REG0
и ...REG1
в выражении switch
, поэтому, вероятно, у него есть имя (возможно, EFLAGS), но ваш код решил не печатать его.
Мне было любопытнопоэтому я прочитал для вас документы по XED: XED классифицирует операнды в соответствии с их видимостью: либо явные (например, bx
в xor bx,bx
), либо неявные, либо "IMPLICIT SUPPRESSED (SUPP
)".Операнды SUPP:
Операнды SUPP:
- не используются при выборе кодировки, (это отличие от неявного простого)
- не распечатывается при разборке,
- не представляется с использованием битов операндов в кодировке.
Таким образом, вы должны проверить xed_operand_visibility_enum_t
и распечатать только явные операнды.
Кстати, вы, кажется, собрали свой код в 32-битном или 64-битном режиме, потому что ваши 16-битные инструкции, такие как xor bx,bx
, имеют длину 3 байта.В 16-битном режиме это был бы просто код операции + modrm.Префикс размера операнда (66
), добавленный ассемблером (и правильно декодированный дизассемблером), объяснит это.
[CPU 8086]
не означает [BITS 16]
.Если по какой-то причине вам действительно не нужен 16-битный режим, вам, вероятно, следует продолжать использовать 32-битный режим.(Ваш дизассемблер уже декодировал его в том же режиме, для которого собирал ассемблер. Использование BITS 16
позволит вам поместить 16-битный машинный код в 32-битный объектный файл, что приведет к неправильному декодированию.