Я работаю над проектом операционной системы для своей лаборатории, где я должен работать с указателем инструкций и инструкцией по операции. Сейчас все, что мне нужно знать, это тип обучения. Для этого я читаю данные по адресу, указанному указателем инструкции. Первый байт из этих данных дает мне тип инструкции. Например, если первый байт составляет 0xC6
, это инструкция MOVB
. Теперь есть некоторые случаи, когда первый байт указателя команды равен 0x0F
. Согласно документации 0x0F
, что означает, что это двухбайтная инструкция. Моя проблема связана с этим типом инструкции. Я не уверен, как узнать тип инструкции для двухбайтовой инструкции.Декодирование команд в архитектуре x86
После этого мой второй приоритет - два, чтобы узнать операнды инструкции. Я не знаю, как это сделать из кода. Любой пример кода будет оценен
В-третьих, необходимо выяснить размер инструкции. Поскольку x86 является переменной длиной, я хочу знать размер каждой инструкции. Сначала я планировал использовать таблицу поиска, в которой я буду поддерживать имя инструкции и ее размер. Но потом я обнаружил, что одна и та же инструкция может иметь переменную длину. Например, когда я использовал свалку объекта в файле .o
, я нашел две инструкции C6 00 62
, которая для MOVB $0x62,(%EAX)
& C6 85 2C FF FF FF 00
которая для MOVB $0x0,-0xD4(%EBP)
. Посмотрите здесь, оба типа инструкции одинаковы (C6
), но они имеют разную длину.
Итак, мне нужны ответы на эти вопросы. Будет очень признателен, если кто-то может дать мне некоторые решения.
То, что вы просите, довольно сложно и нелегко ответить в формате SO. Вы можете проверить, как это делают популярные дизассемблеры с открытым исходным кодом ('gdb',' objdump'). И [читать документы] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html)! – rodrigo
Дополнительный контекст, пожалуйста. Почему проект ОС включает эмуляцию процессора x86? –
@SevaAlekseyev. Мой проект включает в себя возможность возврата к предыдущему состоянию. Я должен сделать это, используя mprotect(). Идея состоит в том, чтобы защитить каждую страницу от операции записи. Поэтому, когда есть операция записи, я поймаю ее. Внутри функции обработчика я сохраню старые данные, извлеките новые данные из инструкции, сделайте страницу незащищенной, запустите инструкцию еще раз, а затем снова закройте страницу. Поскольку внутри обработчика я не знаю, какое значение должна была выполнить операция, поэтому я могу только выяснить IP, получить операнды команд и выполнить его снова. – azizulhakim