Как скомпилировать код, сгенерированный приложением Java или C ++ - PullRequest
2 голосов
/ 19 июня 2010

Я изучал теорию и сборку компилятора и сумел создать компилятор, который генерирует код сборки x86.

Как я могу взять этот код сборки и превратить его в .exe?Есть ли какой-нибудь магический API или инструмент, с которым мне нужно взаимодействовать?Или это проще, чем я думаю?

Я не совсем уверен, что находится в .exe, или какая абстракция лежит между ассемблерным кодом и самим .exe.

Мой «компилятор»был написан на Java, но я хотел бы знать, как это сделать и в C ++.

Обратите внимание, что если я возьму сгенерированную сборку, она прекрасно скомпилируется в .exe, например с vc ++.


Редактировать: Точнее, я уже знаю, как компилировать ассемблерный код, используя компилятор.Я хочу, чтобы моя программа выводила .exe.

Ответы [ 3 ]

1 голос
/ 19 июня 2010

Похоже, вам нужно порождать процесс ассемблера и процесс компоновщика.В UNIX это так же просто, как вызвать функцию fork(), которая создаст новый процесс, и функцию exec(), указав имена исполняемых файлов ассемблера и компоновщика в качестве параметра функции с соответствующими аргументами для этих исполняемых файлов, чтобыть именами ваших сгенерированных сборок и объектных файлов.Это все, что вам нужно сделать в системе UNIX.

0 голосов
/ 19 июня 2010

В принципе, каждая сборочная строка соответствует машинной инструкции, которая составляет всего несколько байтов в исполняемом файле.Вы можете найти их в спецификации для процессора.Таким образом, вы можете написать свой собственный asembeler, если вы знаете коды и формат exe (заголовок, информация о перемещении и т. Д.).

Как ассемблеры отображают мнемонику команд x86 в двоичные машинные инструкции?

0 голосов
/ 19 июня 2010

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

Компилятор VC ++ делает это изнутри.Вы можете немного поиграть в Linux, так как вы можете лучше увидеть механизм, работающий на платформах Unix.Это в основном то же самое, но это просто трудно просматривать пользовательский интерфейс в Windows.

...