Réponse acceptée !
Bonjour didoux95,
Lorsque tu veux réaliser un fichier exécutable tu dois effectuer les opérations suivantes:
1) Ecrire un programme (format texte) contenant les instructions (mnémoniques) devant être exécutées pas le microprocesseur. Pour des questions de commodité les adresses ne sont généralement pas écrites en dur mais font références à des labels du style
jne fin
xxx
yyy
zzz
fin suite du programme
Si le résultat est différent de zéro alors va à fin sinon exécute xxx, yyy et zzz
Si tu utilises des labels appartenant à un autre morceau de programme (assemblé par ailleur), il faudra que tu déclares ces label comme provenant d'un fichier externe.
2) Compiler le programme
C'est là que Nasm intervient, son rôle est de transformer les instructions sous forme de mnémoniques en octets. Par exemple
mov dx,hello devient BA 0C 01 (écriture dont la compréhension est moins évidente). BA correspond à mov dx et 0C 01 correspond à l'adresse de hello, en l'occurence l'adresse d'offset 010C. L'offset 0100 correspond au début du programme .com (c'est la directive org 0x100) et 0C (soit 12 en décimal) est la distance entre le début du programme et l'étiquette hello (c'est en fait la longueur de la section programme car hello est la première étiquette de la section de données).
Si ton programme n'utilise pas de références externes la compilation (format -fbin) te donnera quelque chose de directement exécutable (si le nom du programme compilé est xxx.com. Dans le cas contraire tu devras passer par un fichier objet qui contiendra la conversion mnémoniques/octets mais aussi les références externes nécessaires (labels externes, bibliothèques, fonctions importées).
3) Effectuer l'édition des liens.
C'est là qu'alink (ou un autre linker) intervient. Son rôle est de rassembler les différents morceaux compilés, par exemple programme principal et sous programmes, ressources et de résoudre les problèmes de références aux étiquettes. Tu pourras avoir par exemple:
alink -oPE programmeprincipal.obj sousprogramme.obj ressource.res win32.lib
Ce qui se traduit en:
crééer un exécutable windows (format PE) en rassemblant programmeprincipal.obj (déjà compilé)
sousprogramme.obj (déjà compilé)
ressourse.res (ressource compilée format .res - elle peut aussi être compilée en .obj pas GoRC)
win32.lib librairie contenant des tas de déclarations,
Si le programme déclare une référence comme extern, il faut que cette même référence ait été déclarée comme global pas le module où elle se situe (pour qu'elle soit vue pas les autres modules.
J'espère que j'ai pu t'éclairer sur ce point.
Nota: dans la souce citée en référence j'ai mis les instructions de compilation et pour l'édition des liens. Ce qui est entre crochets (facultatif) sert à donner un nom de sortie spécifique (dans ce cas il faut enlever les crochets)
A+