La compilation de l'assemblée dans Visual Studio
Comment compiler le code d'assemblée à l'aide de Visual Studio?
Je veux compiler et exécuter un fichier source d'assembly dans Visual Studio; 2010.
J'ai créé un projet Visual C++ et inséré quelques assemblage de code 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
Toutefois, le problème est lorsque vous essayez de compiler, vous obtenez:
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
Je l'ai fait aller et permettre la construction de personnalisation masm.targets
(clic droit project > Build Personnalisations..), mais en vain.
- Et pour déboguer asm (vue registres et en une seule étape à partir des points d'arrêt) avec Visual Studio: stackoverflow.com/questions/46394685/.... Voir également les autres asm x86 liens dans le x86 balise wiki.
Vous devez vous connecter pour publier un commentaire.
Me semble que les règles de génération personnalisée pour .asm fichiers n'est pas activée. Cliquez-droit sur le projet, les Règles de génération Personnalisée, cocher "Microsoft Macro Assembler". Avec la "FIN de claire" de la directive et de la désactivation de la liaison incrémentielle je suis une construction propre.
C'est différent à partir de VS2010:
.asm
fichier, Propriétés, changement Type d'Élément à "Microsoft Macro Assembler".Ligne de commande:
Compiler le code avec:
Vous obtenez le code.obj que la sortie.
Lien avec:
Vous pouvez maintenant exécuter go.exe.
Vous pouvez aussi le faire en une seule fois avec:
Visual Studio (pas résolu)
ml /Cx /coff code.asm /link /SUBSYSTEM:console /out:go /entry:clear
pasml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear
Visual Studio inclut la MASM macro assembleur. Des petits fragments de code assembleur sont souvent écrits dans inline assemblée dans un programme C ou C++.
D'intégrer un fichier assembleur dans un projet Visual Studio, créez un régulier C/C++ du projet (ligne de commande ou l'interface utilisateur), et il suffit d'ajouter un fichier se terminant dans
.asm
à la liste des fichiers source.De spécifier clairement que le point d'entrée, suivez ces instructions:
Ouvrir les Pages de propriétés du projet
boîte de dialogue. Pour plus de détails, voir le Paramètre
Visual C++ Propriétés Du Projet.
Cliquez sur le dossier de l'éditeur de liens.
Cliquez sur la page de propriétés Avancé.
Modifier le Point d'Entrée de la propriété.
(Elle a été prise à partir de la La documentation de Visual Studio.)
Je peux confirmer Hans Passant de l'instruction. En outre, selon cet article, si vous ajoutez d'abord le construire "personnalisations" masm case à cocher, puis ajouter le fichier, il est automatiquement reconnu comme un assembleur de fichier. En outre, de ne pas spécifier le nom de point d'entrée dans la directive de FIN, mais au lieu de le spécifier dans les paramètres du projet travaille aussi pour moi.
voici comment faire pour compiler des msna de l'assemblée de code source avec vs20xx:
"Exclus De Construire" à "Non"
"Élément de Type" Personnalisé "Outil"
Cliquez Sur Appliquer
Personnalisée Outil Build -> Général> de la Ligne de Commande:
c:\nasm\nasm -f win64 my_asm.asm
Personnalisée Outil Build -> Général> Sorties:
my_asm.obj
appeler la fonction comme ceci:
extern "C" int foo(void); //écrit dans l'assemblée!
https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/
msna tutoriel:
http://cs.lmu.edu/~ray/notes/nasmtutorial/
Le problème, c'est que votre code assembleur est juste une fonction. Pour compiler et lier, vous devez disposer d'une procédure de départ tout comme
Main
en C/C++. Vous pouvez spécifier le symbole de démarrage en précisant dans votreEND
directive. Comme:Ou si vous le souhaitez, vous pouvez lier le .obj fichier généré avec le C/C++ généré .obj un.
END clear
, (à la place de justeEND
), pas de dés./entry:clear
à l'éditeur de liens.