Intel машинный код для сборки кода вопрос - PullRequest
8 голосов
/ 09 марта 2010

экспертов, мне интересно, преобразование Intel x86 machineCode / AssemblyCode является односторонним или двусторонним?

означает, что ассемблер ---> machineCode и machineCode ---> AssemblyCode оба доступны.

поскольку машинный код x86 различается по размеру (1-15 байт), а код операции варьируется (1-3 байт), как определить, что один код операции равен 1 байт, 2 байт или 3 байт?

и я так и не нашел пример префикса инструкций x86, если здесь 1-байтовый префикс, как определить, что это префикс или код операции?

конечно, assemblyCode ---> machineCode, тождество мнемоники + oprand [w / b] может определить ответ машинного кода путем сопоставления определенной MappingTable.

но, когда процесс обратный:

{bbbbbbbb, bbbbbbbb, bbbbbbbb, // инструкция1 BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, // instruction2 BBBBBBBB, BBBBBBBB // instruction3 }

----> {BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB, BBBBBBBB}

я не знаю, какие значащие биты или байты определяют, какова длина (какой размер) одной инструкции.

Кто-нибудь скажет мне, как это определить? (Размер кода операции, пример префикса.) спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

Детали, которые вам нужны, содержатся в Руководство разработчика Intel® 64 и IA-32 ArchitecturesSoftware, том 2B: Справочник по наборам инструкций, N-Z . Посмотрите на Приложение А, оно включает в себя все, что вам нужно.

3 голосов
/ 09 марта 2010

Не уверен, что вы хотите выполнить, но поскольку инструкции имеют переменную длину, единственный способ убедиться, что вы вернули правильно разобранный код, - это начать с известного начального адреса. Обычно дизассемблеры запускаются с начальной точки программы, а затем рекурсивно разбирают все вызываемые методы.

Однако это приводит к ситуациям, когда некоторые куски кода не разбираются, потому что они могут быть вызваны из таблицы функций, или аналогичным ситуациям, поэтому обычно требуется помощь человека, чтобы выяснить, являются ли остальные разделы кодом или данными.

2 голосов
/ 09 марта 2010

, поскольку машинный код x86 различается в размер (1-15 байт) и код операции могут различаться (1-3 байта), как определить один код операции 1 байт или 2 байта или 3 байта?

Размер инструкций неявно определяется режимом инструкций и адресов, вам придется проверять ISA по одному байту за раз, что может и должно следовать за этим байтом.

и я так и не нашел пример префикс инструкций x86, если здесь 1-байтный префикс, как его определить префикс или код операции?

Например, префикс переопределения размера операнда (66h) всегда является префиксом.

...