web-dev-qa-db-fra.com

Compilation d'un assemblage dans Visual Studio

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.

51
bobobobo

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:

  1. Cliquez avec le bouton droit Projet, Construire des personnalisations, cochez "masm".
  2. Cliquez avec le bouton droit sur .asm fichier, Propriétés, remplacez Type d'élément par "Microsoft Macro Assembler".
61
Hans Passant

Ligne de commande:

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 (non résolu)

11
bobobobo

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:

  1. 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++.

  2. Cliquez sur le dossier Linker.

  3. Cliquez sur la page de propriétés Avancé.

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

9
Martin v. Löwis

voici comment compiler le code source de l'assembly nasm avec vs20xx:

  1. "Exclus de la version" à "Non"

  2. "Type d'élément" à "Outil de création personnalisé"

  3. Appuyez sur Appliquer

  4. Outil de construction personnalisé -> Général -> Ligne de commande:

    c:\nasm\nasm -f win64 my_asm.asm

  5. Outil de construction personnalisé -> Général -> Sorties:

    my_asm.obj

  6. 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:

http://cs.lmu.edu/~ray/notes/nasmtutorial/

1
sailfish009

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.

0
Madhur Ahuja