2010-06-19 1 views
2

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

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

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

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

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


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

ответ

1

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

+0

Спасибо. Как насчет окон? – Cam

+0

Извините, я, должно быть, пропустил мысль о Windows. Это должно быть почти то же самое, есть функция CreateProcess(), а исполняемые файлы ассемблера и компоновщика установлены как часть дистрибутива VS (al.exe и link.exe). Я бы рекомендовал вам обратиться к документации MSDN для CreateProcess() также. – iksemyonov

+0

Прохладный, спасибо. Я на самом деле не упоминал окна в своем вопросе - наверное, должен был :) – Cam

0

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

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

0

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

How Do Assemblers Map x86 Instruction Mnemonics to Binary Machine Instructions?