Comment voir le code d'assembly d'un programme C++?
Quels sont les outils populaires pour le faire?
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
.
Si vous avez compilé binaire,
objdump -d a.out
sous UNIX (fonctionne également pour cygwin), dumpbin /DISASM foo.exe
sous Windows.Les débogueurs pourraient également montrer de façon désagréable
disas
dans GDB, 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
.
Dans Visual Studio ;
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 #
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.
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.
Ce site fonctionne actuellement pour moi (2017): https://godbolt.org/
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>
.
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.
PE Explorer Disassembler pour les fichiers PE 32 bits. IDA pour les autres.
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.
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.
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.
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