Написание JIT-компилятора на ассемблере

Я написал виртуальную машину на C, которая имеет приличную производительность для виртуальной машины без JIT, но я хочу узнать что-то новое и улучшить производительность. Моя текущая реализация просто использует переключатель для преобразования байт-кода виртуальной машины в инструкции, которые компилируются в таблицу переходов. Как я уже сказал, приличная производительность для того, что есть, но я столкнулся с препятствием, которое можно преодолеть только с помощью JIT-компилятора.

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

Итак, моя цель - написать JIT-компилятор для этого C виртуальная машина, и я хочу сделать это в сборке x86. (Я использую NASM в качестве ассемблера) Я не совсем уверен, как это сделать. Я хорошо разбираюсь в ассемблере, и я просмотрел несколько примеров самомодифицирующегося кода, но я пока не пришел к пониманию того, как генерировать код.

Мой основной блок пока что копирует инструкции в исполняемый фрагмент памяти, с моими аргументами. Я знаю, что могу пометить определенную строку в NASM и скопировать всю строку с этого адреса с помощью статических аргументов, но это не очень динамично и не работает для JIT-компилятора. Мне нужно иметь возможность интерпретировать инструкцию из байт-кода, скопировать ее в исполняемую память, интерпретировать первый аргумент, скопировать его в память, затем интерпретировать второй аргумент и скопировать его в память.

Мне сообщили о нескольких библиотеки, которые упростят эту задачу, такие как GNU lightning и даже LLVM. Однако я хотел бы сначала написать это от руки, чтобы понять, как это работает, прежде чем использовать внешние ресурсы.

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

23
задан jakogut 17 February 2011 в 23:23
поделиться