Создать меньший набор инструкций из сборки x86 - PullRequest
2 голосов
/ 15 ноября 2009

У меня есть своего рода симулятор для инструкций по сборке x86, но дело в том, что он не принимает полный набор инструкций. Например, если дана команда INT, она прекратит работу. На симуляторе можно выполнить все двоичные представления (8-битные, 16-битные и 32-битные) команд и посмотреть, какие из них действительны, а какие нет.

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

Кажется, самое простое решение - просто посчитать их, но как будет работать функция преобразования между исходным и меньшим наборами команд?

1 Ответ

3 голосов
/ 15 ноября 2009

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

Если сегмент кода не может быть изменен, это все еще очень сложно, потому что с x86 можно перейти в середину инструкции и интерпретировать ее как другую инструкцию. Поэтому, хотя в принципе вы можете создать статический перевод для всех возможных начальных адресов и создать большую таблицу переходов, чтобы выяснить, какой статический перевод вам нужен, это все равно не стоит.

Я бы предложил вместо того, чтобы преобразовывать общий код x86 в это подмножество, вместо этого ограничить код, сгенерированный GA, чтобы он вписывался в подмножество. Вы можете попробовать использовать методы, подобные описанным в нативной клиентской статье google , чтобы еще больше ограничить код и избежать проблемы, связанной с переходом в середину инструкций.

Кроме того, всегда есть возможность использовать полный эмулятор x86 вместо ограниченного. У вас все еще будет проблема генерации незаконных кодов операций. Вы также можете рассмотреть возможность использования ISA , разработанного по заказу, чтобы его можно было легко эмулировать вместо x86 и эмулировать , что . Затем скомпилируйте в x86 (вы создали его так, чтобы его было легко компилировать, верно?), Когда у вас есть что-то, что вы хотите сохранить.

Эта ссылка также похожа на то, что вы делаете, возможно, вы захотите взглянуть:

  1. Нордин, Питер. « Компилирующая система генетического программирования, которая напрямую манипулирует машинным кодом. » Достижения в области генетического программирования. Cambridge, Mass: MIT, 1994. 311-32. Печать.
...