Comment puis-je voir le code d'assemblage d'un programme C ++?

133

Comment puis-je voir le code d'assemblage d'un programme C ++?

Quels sont les outils populaires pour y parvenir?

Geek
la source
Microsoft Visual C ++ Express vient de définir un point d'arrêt et appuyez surAlt +8
jyz
Duplicata possible: stackoverflow.com/questions/137038/…
legends2k

Réponses:

167

Demandez au compilateur

Si vous créez vous-même le programme, vous pouvez demander à votre compilateur d'émettre le code source de l'assembly. Pour la plupart des compilateurs UNIX, utilisez le-S commutateur.

  • Si vous utilisez l'assembleur GNU, la compilation avec -g -Wa,-alhdonnera une source et un assemblage mélangés sur stdout ( -Wademande au pilote du compilateur de transmettre les options à l'assembleur, -alactive la liste des assembleurs et -ahajoute la liste des «sources de haut niveau»):

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

  • Pour Visual Studio, utilisez /FAsc.

Jetez un œil dans le binaire

Si vous avez compilé le binaire,

Utilisez votre débogueur

Les débogueurs pourraient également afficher de manière disassable.

Employé russe
la source
35

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

Edit: Si vous voulez que la sortie soit dans la syntaxe Intel (qui est IMO, beaucoup plus lisible, et la plupart des tutoriels d'assemblage l'utilisent), compilez avec -masm=intel.

Zifre
la source
5
ajouter aussi une -fverbose-asmoption
osgx
23

Dans Visual Studio ;

  1. définir un point d'arrêt
  2. exécuter 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 choisissez "afficher le désassemblage"
Viktor Sehr
la source
14

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  #
osgx
la source
6

Beaucoup de gens ont déjà expliqué comment émettre du code d'assemblage avec un compilateur donné. Une autre solution consiste à compiler un fichier objet et à le vider 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.

Bastien Léonard
la source
6

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

Adam Markowitz
la source
5

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, jetez un œil à IDA Pro.

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

Ori Pessach
la source
S'il existe une option pour que le compilateur génère l'assembleur (comme gcc -S, ou l'option VS / FA ci-dessous), c'est préférable au désassemblage. C'est plus symbolique.
Marco van de Voort
Bien sûr, si vous avez la source.
Ori Pessach
2
En passant, vous seriez surpris de la quantité d'informations de symboles pouvant être déduites par IDA Pro.
Ori Pessach
5

La plupart des compilateurs ont une option pour générer une liste d'assembly. Par exemple, avec VisualStudio, vous pouvez utiliser quelque chose comme:

cl.exe /FAfile.asm file.c

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

Nik
la source
3

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 de l'assembly.

Gomes JA
la source
Pour info, échec de chargement
kaiwan
Ouais, en 2015, ça fonctionnait bien, puis ça s'est soudainement arrêté. Puis vint ctoassembly.com, mais cela ne fonctionnait que pour un petit sous-ensemble de C. La même chose s'est produite: ne plus se charger. Dommage.
Gomes JA
2

Dans Visual Studio, vous pouvez générer la liste de l'assembleur pour un projet C ++.

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

Cătălin Pitiș
la source
1

Sur un Intel Mac OS X 10.8 (Mountain Lion), la -masm=inteldirective ne fonctionnait pas. Cependant, si Xcode est installé, il devrait avoir installé l'outil nommé 'otool':

otool code.o -tV

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

Gibertoni
la source
0

Si vous êtes un utilisateur Eclipse, vous pouvez utiliser la vue Désassemblage .

La vue Désassemblage montre le programme chargé sous forme d'instructions assembleur mélangées à du code source à des fins de comparaison. La ligne en cours d'exécution est indiquée par une flèche et mise en surbrillance dans la 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 leurs propriétés
  • Suivez les instructions de démontage de votre programme
  • Aller aux instructions spécifiques dans le programme
Pieter
la source
Pouvez-vous élaborer un peu?
Peter Mortensen
Il existe également une vue d'assemblage lors du débogage dans
MSVC
Je n'ai pas d'environnement de développement Eclipse C ++ fonctionnel pour le moment, mais voici la documentation officielle: help.eclipse.org/kepler/…
Pieter