7
votes

Détecter l'architecture à la compilation de MASM / MASM64

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: xxx

aussi, si nécessaire, je peux exécuter ml.exe et ml64.exe avec différentes options de ligne de commande. < / p>

merci!


1 commentaires

Petite NIT: Vous assemblez des fichiers ASM, vous ne les compilez pas :)


3 Réponses :


6
votes

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é.

Cependant, il est assez facile de définir votre propre, par exemple. AMD64 EQU 1 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 . Puis utiliser ifdef / ifndef , comme vous le suggérez.


2 commentaires

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 ..." - Qu'est-ce que MASM définit? Pour cl, il définit _m_ix86 pour x86 et _m_x64 pour x64.



1
votes

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.

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.


2 commentaires

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 ..." - 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.



12
votes
IFDEF RAX

  ECHO "WIN64"

ELSE

  ECHO "WIN32"

ENDIF

1 commentaires

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)