машинный код Intel для сборки вопрос код
эксперты, интересно, преобразование Intel x86 machineCode / assemblyCode является singleSide или bothSide?
средства: assemblyCode - - - > machineCode и machineCode - - - > assemblyCode оба доступны.
с machineCode x86 это различаются по размеру (1-15 байт),и операции различаются в (1-3 байта),как определить один опкод-это 1 байт или 2byte или 3byte ?
и я никогда не находил пример префикса инструкций x86, если здесь префикс 1byte,как определить, что это префикс или код операции?
конечно, assemblyCode - - - > machineCode, идентичность мнемоники + oprand[w / b] может определить, что такое машинный код ответа, сопоставляя определенную MappingTable.
но, когда процесс обращен вспять:
{ bbbbbbbb,bbbbbbbb,bbbbbbbb, //instruction1 bbbbbbbb,bbbbbbbb, bbbbbbbb, bbbbbbbb, bbbbbbbb, / / instruction2 bbbbbbbb,bbbbbbbb//instruction3 }
----> {bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb}
Я не знаю, какие значимые биты или byts определяют, как долго(какой размер) одна инструкция.
кто-нибудь скажет мне, как это определить?(размер кода операции, пример префикса.) спасибо за помощь.
3 ответов
детали, необходимые в руководство разработчика Intel® 64 и IA-32 ArchitecturesSoftware том 2B: Справочник по набору инструкций, N-Z. Посмотрите на приложение а, оно включает все, что вам нужно.
Не уверен, что вы хотите выполнить, но поскольку инструкции имеют переменную длину, единственный способ убедиться, что вы вернетесь правильно разобранный код-начать с известного начального адреса. Обычно дизассемблеры начинаются с начальной точки программы, а затем рекурсивно разбирают все вызываемые методы.
однако это приводит к ситуациям, когда некоторые фрагменты кода не разбираются, потому что их можно вызвать из таблицы функций или аналогичных ситуаций, поэтому обычно требуется помощь человека, чтобы увидеть, являются ли оставшиеся разделы кодом или данными.
С machineCode х86 меняться в размер (1-15 байт), и код операции различаются в (1-3 байт), как определить один код операции это 1byte или 2byte или 3byte?
размер инструкции неявно определяется инструкцией и режимом адреса, вам придется проверять ISA по одному байту за раз, что может и должно следовать за указанным байтом.
и я никогда не находил пример префикс инструкций x86, если здесь Префикс 1byte, как его определить есть префикс или код операции?
например, префикс переопределения размера операнда (66h) всегда является префиксом.