Старые GDB декодируют F3 0F 1E FA ENDBR64
как repz nop edx
.
Однократный переход на Core 2 (Merom) в 64-битном режиме не приводит к изменению архитектурного состояния, а также к ошибкам / исключениям. (Проверено в GDB 7.10 на старой установке Ubuntu 15.10).
Согласно https://gist.github.com/Quasilyte/b60c94b9cb608d5b1a359d54f1be8aca,
0f 1e /r
- это 2-байтовый код операции, который принимает ModRM , NOP r/m32, r32
, то же самое, что и стандартный многобайтовый 0f 1f
NOP, который Intel документирует .
В нем говорится, что он был добавлен с Pentium Pro, поэтому подойдет любой PII / PIII или более поздние версии.
https://github.com/NationalSecurityAgency/ghidra/issues/197#issuecomment-472906147 говорит, что AMD документирует эти дополнительные коды операций NOP; Intel перечисляет их как «зарезервированные».
rep
префиксы обычно игнорируются для опкодов, к которым они не применяются. Это дает Intel / AMD возможность использовать REP как часть обязательных префиксов для будущих инструкций по созданию кодировок, которые выиграли неисправен на старых процессорах.
Процессоры старше, чем PPro, например Оригинальный Pentium, возможно, будет неисправен. Так же, как для 0f 1f
длинной NOP.
Кстати, ваша попытка расшифровки не имеет смысла. 0f
является байтом «escape» для 2-байтовых кодов операций, поэтому 1e push ds
не имеет отношения к тому, как это будет декодироваться. Вот как 1e
декодирует сам по себе, без 0f
escape-байта. (За исключением 64-битного режима, где он недопустим.)