Comment compilez-vous le code Assembly à l'aide de Visual Studio?
Je veux compiler et exécuter un fichier source d'assembly dans Visual Studio 201 .
J'ai créé un projet Visual C++ et inséré du code d'assembly dans un fichier code.asm
:
.586 ;Target processor. Use instructions for Pentium class machines
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions
.STACK ;Define a stack segment of 1KB (Not required for this example)
.DATA ;Create a near data segment. Local variables are declared after
;this directive (Not required for this example)
.CODE ;Indicates the start of a code segment.
clear PROC
xor eax, eax
xor ebx, ebx
ret
clear ENDP
END
Cependant, le problème est que lorsque vous essayez de compiler cela, vous obtenez:
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
Je suis allé activer la personnalisation de la construction masm.targets
(projet de clic droit> Construire des personnalisations ..), mais en vain.
Cela me semble que les règles de construction personnalisées pour les fichiers .asm ne sont pas activées. Cliquez avec le bouton droit sur le projet, Règles de génération personnalisées, cochez "Microsoft Macro Assembler". Avec la directive "END clear" et la désactivation de la liaison incrémentielle, je reçois une version propre.
C'est différent à partir de VS201:
.asm
fichier, Propriétés, remplacez Type d'élément par "Microsoft Macro Assembler".Compilez le code avec:
ml /c /Cx /coff code.asm
Vous obtenez code.obj en sortie.
Lier avec:
link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear
Vous pouvez maintenant exécuter go.exe.
Vous pouvez également tout faire en une seule fois avec:
ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear
Visual Studio inclut l'assembleur de macros MASM . De plus petits fragments de code assembleur sont souvent écrits en assemblage en ligne dans un programme C ou C++.
Pour intégrer un fichier assembleur dans un projet Visual Studio, créez un projet C/C++ normal (ligne de commande ou interface graphique) et ajoutez simplement un fichier se terminant par .asm
à la liste des fichiers source.
Pour spécifier clear comme point d'entrée, suivez ces instructions:
Ouvrez la boîte de dialogue Pages de propriétés du projet. Pour plus d'informations, consultez Définition des propriétés d'un projet Visual C++.
Cliquez sur le dossier Linker.
Cliquez sur la page de propriétés Avancé.
Modifiez la propriété Point d'entrée.
(Il provient de la documentation de Visual Studio .)
Je peux confirmer les instructions de Hans Passant. De plus, selon cet article , si vous ajoutez d'abord la case à cocher "masquer les personnalisations", puis ajoutez le fichier, il sera automatiquement reconnu comme un fichier assembleur. De plus, ne pas spécifier le nom du point d'entrée dans la directive END, mais le spécifier à la place dans les paramètres du projet fonctionne également pour moi.
voici comment compiler le code source de l'assembly nasm avec vs20xx:
"Exclus de la version" à "Non"
"Type d'élément" à "Outil de création personnalisé"
Appuyez sur Appliquer
Outil de construction personnalisé -> Général -> Ligne de commande:
c:\nasm\nasm -f win64 my_asm.asm
Outil de construction personnalisé -> Général -> Sorties:
my_asm.obj
appeler la fonction comme ceci:
extern "C" int foo (vide); // écrit en Assemblée!
https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/
tutoriel nasm:
Le problème est que votre code d'assemblage n'est qu'une fonction. Pour compiler et lier, vous devez avoir une procédure de démarrage comme Main
en C/C++. Vous pouvez spécifier le symbole de début en spécifiant dans votre directive END
. Comme:
END clear
Ou si vous le souhaitez, vous pouvez lier le fichier .obj généré avec celui généré en C/C++ .obj.