Если сегмент кода является модифицируемым, будет очень трудно создать переводчик, потому что вам нужно будет учесть возможность самоизменения кода. Любой такой переводчик должен будет включить свою копию в сгенерированный код; в этот момент проще всего «закончить» симулятор.
Если сегмент кода не может быть изменен, это все еще очень сложно, потому что с x86 можно перейти в середину инструкции и интерпретировать ее как другую инструкцию. Поэтому, хотя в принципе вы можете создать статический перевод для всех возможных начальных адресов и создать большую таблицу переходов, чтобы выяснить, какой статический перевод вам нужен, это все равно не стоит.
Я бы предложил вместо того, чтобы преобразовывать общий код x86 в это подмножество, вместо этого ограничить код, сгенерированный GA, чтобы он вписывался в подмножество. Вы можете попробовать использовать методы, подобные описанным в нативной клиентской статье google , чтобы еще больше ограничить код и избежать проблемы, связанной с переходом в середину инструкций.
Кроме того, всегда есть возможность использовать полный эмулятор x86 вместо ограниченного. У вас все еще будет проблема генерации незаконных кодов операций. Вы также можете рассмотреть возможность использования ISA , разработанного по заказу, чтобы его можно было легко эмулировать вместо x86 и эмулировать , что . Затем скомпилируйте в x86 (вы создали его так, чтобы его было легко компилировать, верно?), Когда у вас есть что-то, что вы хотите сохранить.
Эта ссылка также похожа на то, что вы делаете, возможно, вы захотите взглянуть:
- Нордин, Питер. « Компилирующая система генетического программирования, которая напрямую манипулирует машинным кодом. » Достижения в области генетического программирования. Cambridge, Mass: MIT, 1994. 311-32. Печать.