2010-06-19 8 views
2

J'ai appris la théorie et l'assemblage du compilateur et j'ai réussi à créer un compilateur qui génère du code assembleur x86.Comment compiler du code généré par une application Java ou C++

Comment puis-je prendre ce code d'assemblage et le transformer en .exe? Y a-t-il une API ou un outil magique avec lequel interagir? Ou est-ce plus simple que je ne le pense?

Je ne suis pas vraiment sûr de ce qu'il y a dans un fichier .exe, ou de la quantité d'abstraction entre le code d'assemblage et le fichier .exe lui-même.

Mon 'compilateur' a été écrit en Java, mais j'aimerais aussi savoir comment le faire en C++.

Notez que si je prends l'assembly généré, il compile à un .exe très bien par exemple avec vC++. Edit: Pour être plus précis, je sais déjà comment compiler du code assembleur à l'aide d'un compilateur. Ce que je veux, c'est que mon programme génère un fichier .exe.

Répondre

1

Il semble que vous ayez besoin de générer un processus assembleur et un processus de liaison. Sous UNIX, c'est aussi simple qu'appeler la fonction fork(), qui créerait un nouveau processus, et la fonction exec(), en spécifiant l'assembleur et les noms des exécutables du lieur comme paramètre de la fonction, avec des arguments appropriés à ces exécutables, qui seraient les noms des vos fichiers d'assemblage et d'objet générés. C'est tout ce que vous devez faire sur un système UNIX.

+0

Merci. Qu'en est-il des fenêtres? – Cam

+0

Désolé, j'ai dû manquer le point sur Windows. Il devrait être à peu près le même, il y a la fonction CreateProcess(), et les exécutables assembleur et éditeur de liens sont installés dans le cadre de la distribution VS (al.exe et link.exe). Je vous recommande de consulter la documentation MSDN pour CreateProcess() ainsi que. – iksemyonov

+0

Cool, merci. En fait, je n'avais pas mentionné les fenêtres dans ma question - devrait probablement avoir :) – Cam

0

Normalement, vous utilisez un assembleur et un éditeur de liens pour créer un fichier exe. Il n'y a pas de magie impliquée. Les différentes parties sont assemblées, un en-tête et un autre passe-partout sont ajoutés pour que le système d'exploitation sache où se trouve le code bootstrap pour le programme et pour organiser la mémoire.

Le compilateur VC++ fait cela sous le capot. Vous pourriez envisager de jouer un peu sur Linux car vous pouvez mieux voir les machines qui fonctionnent sur les plates-formes Unix. C'est fondamentalement la même chose, mais il est juste difficile de regarder à travers l'interface utilisateur sur Windows.

0

En principe, chaque ligne d'assemblage correspond à une instruction machine de quelques octets dans le fichier exe. Vous pouvez les trouver dans les spécifications pour le processeur. Vous pouvez donc écrire votre propre fichier d'inscription si vous connaissez les codes et le format exe (en-tête, informations de relocalisation, etc.).

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