Comment puis-je voir le code d'assemblage d'un programme C ++?
Quels sont les outils populaires pour y parvenir?
c++
assembly
disassembly
Geek
la source
la source
Alt +8
Réponses:
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,-alh
donnera une source et un assemblage mélangés sur stdout (-Wa
demande au pilote du compilateur de transmettre les options à l'assembleur,-al
active la liste des assembleurs et-ah
ajoute 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,
objdump -d a.out
sous UNIX (fonctionne également pour cygwin),dumpbin /DISASM foo.exe
sur Windows.Utilisez votre débogueur
Les débogueurs pourraient également afficher de manière disassable.
disas
commande dans GDB,la source
Dans GCC / G ++, compilez avec
-S
. Cela produira unsomething.s
fichier 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
.la source
-fverbose-asm
optionDans Visual Studio ;
la source
Pour gcc / g ++
Cela générera des prog.s avec quelques commentaires sur les variables utilisées dans chaque ligne asm:
la source
Ce site travaille actuellement pour moi (2017): https://godbolt.org/
la source
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.
la source
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.
la source
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>
.la source
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:
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.
la source
Désassembleur PE Explorer pour les fichiers PE 32 bits. IDA pour les autres.
la source
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.
la source
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.
la source
Sur un Intel Mac OS X 10.8 (Mountain Lion), la
-masm=intel
directive ne fonctionnait pas. Cependant, si Xcode est installé, il devrait avoir installé l'outil nommé 'otool':Vous devez fournir le code objet compilé en tant que paramètre.
la source
Si vous êtes un utilisateur Eclipse, vous pouvez utiliser la vue Désassemblage .
la source