Comment puis-je détecter au moment de la compilation à partir d'un fichier source ASM si l'architecture cible est i386 ou AMD64?
J'utilise masm (ml.exe) / masm64 (ml64.exe) pour assembler file32.asme et fichier64 .asas. Il serait agréable de créer un seul fichier, fichier.asm, qui devrait inclure soit FILE32.ASM, ou File64.ASM, en fonction de l'architecture. Idéalement, je voudrais être capable d'écrire quelque chose comme: p> aussi, si nécessaire, je peux exécuter ml.exe et ml64.exe avec différentes options de ligne de commande. < / p> merci! p> p>
3 Réponses :
Si je vous comprends correctement, vous recherchez une sorte de définition intégrée qui a une valeur différente entre les versions MASM 32 et 64 bits. J'ai déjà cherché quelque chose comme ça, mais je n'ai rien trouvé approprié. p>
Cependant, il est assez facile de définir votre propre, par exemple. AMD64 EQU 1 CODE> Au début de votre fichier source Pour sélectionner le chemin de code souhaité ou sur la ligne de commande ML / ML64, comme
/ damd64 code>. Puis utiliser
ifdef code> /
ifndef code>, comme vous le suggérez. P>
Merci! Je n'ai pas vu / dmacro option de la ligne de commande, même si j'ai examiné les options de ligne de commande et même s'il est identique à l'option utilisée par le compilateur C :))
"Vous cherchez une sorte de définition intégrée ..." I> - Qu'est-ce que MASM définit? Pour cl, il définit _m_ix86 code> pour x86 et
_m_x64 code> pour x64.
Les ensembles d'instructions x86 et x64 (non même mentionnant l'utilisation et les restrictions de la pile) sont SOOOOOO différent que je me demande si cela aurait un sens, de toute façon ... IOW, l'écriture de code de l'architecture efficace: le code X86 / x64 indépendant est proche de l'impossible à moi. Ceci est l'assemblage, pas du HLL portable. P>
C'est aussi probablement la raison pour laquelle il y a deux assembleurs spécifiques, ml.exe et ml64.exe, plutôt qu'un seul ml.exe qui le gérerait tout à l'aide de certaines directives supplémentaires. P>
Pour une raison quelconque, j'ai vraiment besoin d'exposer un seul fichier ASM pour 32 et 64 cibles. Ce fichier n'inclut que FILE32.ASM ou File64.asm et rien de plus.
"Je me demande si cela aurait un sens ..." I> - une source unique avec une implémentation X86 et X64 surveillé avec une macro de pré-exprocesseur de type C .... c'est Pourquoi je suis ici.
IFDEF RAX ECHO "WIN64" ELSE ECHO "WIN32" ENDIF
La chose étrange est Ifndef Rax ne semble pas fonctionner ... Rax est toujours considéré comme non défini par IFNDEF dans ML ou ML64. Donc, apparemment, on ne doit donc pas que IFDEF Rax / 64 bit seulement / else / 32 bit seulement / endif (c.-à-d. Utiliser uniquement IFDEF, pas son inverse)
Petite NIT: Vous assemblez des fichiers ASM, vous ne les compilez pas :)