27 votes

Apprendre à lire la sortie de l'assembleur GCC

J'envisage d'acquérir des connaissances très rudimentaires en matière d'assemblage. Mon objectif actuel est simple : TRES BASE compréhension de la sortie de l'assembleur GCC lors de la compilation de C/C++ avec le commutateur -S pour x86/x86-64.

Juste assez pour faire des choses simples comme regarder une seule fonction et vérifier si GCC optimise les choses qui devraient disparaître.

Est-ce que quelqu'un a/sait une introduction vraiment concise à l'assemblage, pertinente pour GCC et spécifiquement destinée à être lue, ainsi qu'une liste des instructions les plus importantes que toute personne lisant l'assemblage de manière occasionnelle devrait connaître ?

18voto

Wyzard Points 16284

Vous devez utiliser la fonction -fverbose-asm option. Elle permet au compilateur de produire des informations supplémentaires (sous forme de commentaires) qui facilitent la compréhension de la relation entre le code assembleur et le code C/C++ d'origine.

15voto

Yktula Points 2629

Si vous utilisez gcc ou clang, l'argument -masm=intel indique au compilateur de générer l'assemblage avec la syntaxe Intel plutôt que la syntaxe AT&T, et l'argument --save-temps indique au compilateur de sauvegarder les fichiers temporaires (source prétraité, sortie de l'assemblage, fichier objet non lié) dans le répertoire à partir duquel GCC est appelé.

Obtenir une compréhension superficielle de l'assemblage x86 devrait être facile avec toutes les ressources disponibles. Voici une de ces ressources : http://www.cs.virginia.edu/~evans/cs216/guides/x86.html .

Vous pouvez aussi simplement utiliser disasm et gdb pour voir ce que fait un programme compilé.

3voto

dash-tom-bang Points 9384

J'ai l'habitude de rechercher la documentation du processeur lorsque je suis confronté à un nouveau dispositif, puis de rechercher les codes d'opération lorsque je rencontre ceux que je ne connais pas.

Sur Intel, heureusement, les opcodes sont plus raisonnables. Sur PowerPC, pas tellement à mon avis. MIPS était mon préféré. Pour MIPS, j'ai emprunté le petit livre de référence de mon voisin, et pour PPC, j'avais de la documentation d'IBM dans un PDF qui était pratique à parcourir. (Et pour Intel, la plupart du temps je devine et ensuite je regarde les registres pour m'assurer que je devine bien ! heh)

En gros, l'assemblage lui-même est facile. Il fait essentiellement trois choses : déplacer des données entre la mémoire et les registres, opérer sur les données dans les registres et modifier le compteur du programme. La correspondance entre le langage de votre choix et l'assembleur nécessitera un peu d'étude (par exemple, apprendre à reconnaître un appel de fonction virtuelle), et pour cela une vue "intégrée" des sources et du désassemblage (comme celle que vous pouvez obtenir dans Visual Studio) est très utile.

1voto

pm100 Points 8303

"lecture occasionnelle de l'assemblée" lol (joliment)

Je commencerais par suivre dans gdb au moment de l'exécution ; vous aurez une meilleure sensation de ce qui se passe. Mais peut-être que ce n'est que moi. Il désassemble une fonction pour vous (disass func) et vous pouvez ensuite la parcourir pas à pas.

Si vous faites cela uniquement pour vérifier les optimisations - ne vous inquiétez pas.

a) le compilateur fait un bon travail

b) vous ne serez pas en mesure de comprendre ce qu'il fait de toute façon (personne ne le peut).

1voto

Dan Story Points 4836

Contrairement aux langages de niveau supérieur, il n'y a pas vraiment de différence (si tant est qu'il y en ait une) entre être capable de lire l'assembleur et être capable de l'écrire. Les instructions ont une relation univoque avec les opcodes du CPU - il n'y a pas de complexité à sauter tout en gardant une compréhension de ce que fait la ligne de code. (Ce n'est pas comme un langage de plus haut niveau où vous pouvez voir une ligne qui dit "print $var" et ne pas avoir besoin de savoir ou de se soucier de la façon dont il s'y prend pour le sortir à l'écran).

Si vous voulez toujours apprendre l'assemblage, essayez le livre Le langage d'assemblage étape par étape : Programmer avec Linux par Jeff Duntemann.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X