CRÉATION DE DIFFÉRENTS EXÉCUTABLES AVEC NASM ET ALINK

BLUEBIBUBBLE Messages postés 116 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 10 avril 2013 - 15 avril 2006 à 09:12
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 - 26 sept. 2006 à 09:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37036-creation-de-differents-executables-avec-nasm-et-alink

cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
26 sept. 2006 à 09:30
Bonjour OEIL_DE_TAUPE,

Je n'ai pas essayé toutes les types de fichiers avec Nasm mais je vais tenter de répondre à tes questions.

A ma connaissance, le format objet est le seul qui permette d'exporter des noms, que ce soit des noms de sections ou des noms de fonctions ou variables.

La directive USE32 ou BITS 32 a pour but d'indiquer à Nasm que le code doive être interprété comme du 32 bits. Pour certaines instructions c'est chose évidente (exemple mov eax,ecx), pour d'autres la taille n'est pas indiquée (LODSB).
En 16 bits cette instruction chargera al avec le contenu de DS:SI et DS:ESI en 32 bits.
Par défaut Nasm compile en 16 bits. Si tu veux éxécuter une instruction 32 bit dans une section 16 bits tu peux forcer le mode 32 bits pour l'instruction en ajoutant le préfixe a32 (préfixe 0x66).
Ainsi en 16 bits pour charger al avec le contenu de DS:ESI tu feras:
a32 LODSB qui sera codé en 0x66 0xAC

Pour les instructions 32 bits implicites le a32 n'est pas nécessaire dans le fichier source mais un préfixe sera ajouté

Exemple (Pas de déclaration - mode 16 bits par défaut)
mov ax,32 est codé en B8 20 00 et
mov eax,32 est codé en 66 B8 20 00 00 00 (66 indique que l'on change de mode)

Avec bits 32 ces deux instructions seront codées
mov ax,32 est codé en 66 B8 20 00 et
mov eax,32 est codé en B8 20 00 00 00 (pas de 66 car l'instruction correspond au mode de la section)

Ainsi l'utilisation d'instructions 32 bits ne signifie pas que le programme est en 32 bits, cela indique seulement que le microprocesseur necessaire est au moins un 386.
Avec Nasm, s'il n'y a pas de directive BITS XX alors le programme est en 16 bits. Avec l'exécutable si on a 66 B8 20 00 00 00
celà indique que l'on charge un registre 32 bits (valeur 0x00000020)mais avec changement de mode (66) ainsi le mode de la section est de 16 bits.

J'espère t'avoir éclairé

A+
Oeil_de_taupe Messages postés 150 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 16 février 2009
25 sept. 2006 à 22:48
Bravo pour cette source!

Elle m'a énormément aidé parce que je bloquais un peu sur le chapitre 6-7-8 de la doc NASM. J'ai juste deux petites questions parce que je ne suis pas sûr d'avoir bien compris.

Pourquoi utilises-tu "USE16" et "USE32" lorsque tu ne passes pas par des fichiers objet? Parce que selon la doc de NASM ces deux directives ne peuvent être utilisées que pour la création de fichier objet (je crois que c'est le seul format de fichier qui permettent de mêler 32 et 16 bits). Idem pour le "CLASS=". Ce qui est intriguant c'est que ça compile...


Et autres question peut-être plus importante. J'ai lu des dizaines de pages sur l'assembleur, suivi plusieurs tutorials mais je ne comprends toujours pas. Quel est la différence entre un programme 16 bits et un programme 32 bits?
Pour moi, la différence était simple: les programmes 32 bits utilisent les registres étendus (EAX
, EBC, ECX, EDX, EDI, EBP, ESS...) et les 16 bits se cantonnent aux AX/BX/CX/DX/BP... Une autre personnes dans un forum a dit: le 32 bits est utilisés par le mode protégé et le 16 pour le mode réel.

Et voilà que je vois dans le doc de NASM: "You do not need to specify BITS 32 merely in order to use 32-bit instructions in a 16-bit DOS program; if you do, the assembler will generate incorrect code because it will be writing code targeted at a 32-bit platform, to be run on a 16-bit one."

Mais alors? Comment peut-on "trier" entre programmes 16 bits et programmes 32 bits?
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
18 avril 2006 à 08:45
Bonjour BLUEBIBUBBLE,

Le problème auquel je suis confronté c'est que alink ne semble pas accepter les fichiers .DEF - du moins je n'ai pas trouvé le moyen. La définition des fonctions exportées doit pouvoir se faire de deux façons:
- au niveau du programme en assembleur (directive export de Nasm - uniquement acceptée en format OMF)
- lors de l'éditions des liens avec une déclarations des fonctions exportées dans un fichier annexe (.DEF). alink ne le permettrait pas ?

Si quelqu'un a un tuyau...
BLUEBIBUBBLE Messages postés 116 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 10 avril 2013 1
15 avril 2006 à 09:12
Hugh Nasman,

Pour créer une DLL avec MASM (à adapter pour NASM):



c:\masm32\bin\ml /c /coff source.asm
c:\masm32\bin\link /dll /DEF:source.def source.obj

Le fichier .def doit contenir le nom de la dll et le nom des procédures exportées:

LIBRARY NomLib
EXPORTS Procedure1
EXPORTS Function2
EXPORTS Sub3


Le fichier .asm doit contenir DLLMain:

.CODE
DLLMain PROC p1,p2,p3 ;Params DWORD (par défaut)
mov eax,1
ret
DLLMain ENDP
...
END DLLMain

Pas besoin des directives GLOBAL, EXPORT, EXTERN ou IMPORT!
Rejoignez-nous