web-dev-qa-db-fra.com

Comment voir le code d'assembly d'un programme C++?

Comment voir le code d'assembly d'un programme C++?

Quels sont les outils populaires pour le faire?

121
Geek

Demander au compilateur

Si vous construisez vous-même le programme, vous pouvez demander à votre compilateur d'émettre une source Assembly. Pour la plupart des compilateurs UNIX, utilisez le commutateur -S.

  • Si vous utilisez l'assembleur GNU, la compilation avec -g -Wa,-alh donnera une source entremêlée et Assembly sur la sortie (-Wa demande au pilote du compilateur de transmettre les options à l'assembleur, -al active le listage Assembly, et -ah ajoute le listage "source de haut niveau" ):

    g++ -g -c -Wa,-alh foo.cc

  • Pour Visual Studio, utilisez /FAsc .

Coup d'oeil dans la binaire

Si vous avez compilé binaire, 

Utilisez votre débogueur

Les débogueurs pourraient également montrer de façon désagréable 

  • Utilisez la commande disas dans GDB, 
  • ou la fenêtre de désassemblage de Visual Studio sous Windows.
154

Dans GCC/G ++, compilez avec -S. Cela produira un fichier something.s avec le code d'assemblage.

Éditer: si vous voulez que la sortie soit en syntaxe Intel (qui est IMO, beaucoup plus lisible, et que la plupart des tutoriels d’Assemblée l’utilisent), compilez avec -masm=intel.

31
Zifre

Dans Visual Studio

  1. définir un point d'arrêt
  2. lancez le programme jusqu'à ce qu'il s'arrête au point d'arrêt
  3. cliquez avec le bouton droit sur le code source et sélectionnez "Afficher le démontage".
21
Viktor Sehr

Pour gcc/g ++

gcc -save-temps -fverbose-asm prog.c

Cela générera des prog.s avec quelques commentaires sur les variables utilisées dans chaque ligne asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #
11
osgx

Beaucoup de gens ont déjà expliqué comment émettre du code Assembly avec un compilateur donné. Une autre solution consiste à compiler un fichier objet et à le sauvegarder avec un outil tel que objdump , readelf (sous Unix) ou DUMPBIN ( link ) (sous Windows) . Vous pouvez également vider un exécutable, mais il sera plus difficile de lire la sortie.

Cela a l’avantage de fonctionner de la même manière avec n’importe quel compilateur.

6

Quel que soit le débogueur que vous utilisez, vous devez avoir une vue Assemblage (Visual Studio, IDE Borland, gdb, etc.). Si vous n'utilisez pas de débogueur et que vous voulez simplement voir quel est l'assembly dans un programme, vous pouvez utiliser un désassembleur ou exécuter le programme et le joindre à l'aide d'un débogueur et effectuer le dump à partir de là. Voir les références à désassembleurs pour plus d'informations sur les options.

6
Adam Markowitz

Ce site fonctionne actuellement pour moi (2017): https://godbolt.org/

5
Carlo Wood

Comme quelqu'un l'a mentionné, le débogueur de votre plate-forme est un bon point de départ. Pour le marteau-piqueur de tous les débogueurs et désassembleurs, consultez IDA Pro.

Sur les plateformes Unix/Linux (y compris Cygwin), vous pouvez utiliser objdump --disassemble <executable>.

5
Ori Pessach

La plupart des compilateurs ont une option pour produire une liste d'assemblys. Par exemple. avec VisualStudio, vous pouvez utiliser quelque chose comme:

cl.exe /FAfile.asm file.c

Pour une meilleure lisibilité, la plupart des débogueurs offrent une vue qui entrelace le désassemblage avec le source d'origine, afin que vous puissiez comparer votre code avec la sortie du compilateur ligne par ligne.

5
Nik

PE Explorer Disassembler pour les fichiers PE 32 bits. IDA pour les autres.

4
Wylder

Vous pouvez également essayer ce site: http://Assembly.ynh.io/

Là, vous pouvez coller votre code C ou C++ et appuyer sur un bouton bleu pour voir la version équivalente à Assembly.

3
Gomes J. A.

Dans Visual Studio, vous pouvez générer la liste d'assembleurs pour un projet C++.

Accédez aux propriétés du projet, puis à C++/Output Files et définissez le paramètre Assembler Output et l'emplacement de la liste ASM sur un nom de fichier.

2

Sur un Intel Mac OS X 10.8 (Mountain Lion), la directive -masm=intel ne fonctionnait pas. Cependant, si vous avez Xcode , il devrait installer l'outil nommé 'otool':

otool code.o -tV

Vous devez fournir le code d'objet compilé en tant que paramètre.

1
gibertoni

Si vous êtes un utilisateur Eclipse, vous pouvez utiliser la vue Vue du désassemblage .

La vue Désassemblage montre le programme chargé en tant qu'assembleur instructions mélangées avec le code source à des fins de comparaison. Le moment La ligne d’exécution est indiquée par une flèche et mise en surbrillance dans le vue. Vous pouvez effectuer les tâches suivantes dans la vue Désassemblage:

  • Définir des points d'arrêt au début de toute instruction d'assembleur
  • Activer et désactiver les points d'arrêt et définir leurs propriétés
  • Suivez les instructions de désassemblage de votre programme
  • Aller à des instructions spécifiques dans le programme
0
Pieter