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


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.


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.


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"

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  #


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.


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.


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


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.



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.


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.


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.