Wie kann ich den Assemblercode sehen, der von einem gcc-Compiler (beliebiger Geschmack) für ein C/C++-Programm generiert wird?
Lesezeit: 3 Minuten
vehomzzz
Ich versuche, viele Multiplikationen und Zeigerarithmetik zu optimieren, und würde gerne sehen, was der Compiler darunter tut, wenn ich Optimierungsflags einsetze.
–Bearbeiten–
Wie kann man es auf eine bestimmte Funktion oder einen Codeblock beschränken?
–Bearbeiten_2–
Wie lässt man gcc einen weniger ausführlichen Assembler-Code generieren?
Eine weniger ausführliche Versammlung? Was genau meinst du damit?
– anon
30. August 2009 um 21:29 Uhr
Sie möchten also, dass gcc generiert wird falsch Montagecode, der nur Ihren Sinn für Schönheit befriedigt? Nein Sir.
– P Schweb
30. August 2009 um 21:39 Uhr
LOL Ich möchte ein korrektes generieren, aber es für mich prägnant darstellen. Ist das zuviel verlangt? Keine große Sache, aber zusätzliche Informationen werden mich nicht umbringen. Ich habe mich nur gefragt, ob es überhaupt möglich ist oder ob es Tools gibt … Pavel, ich glaube, Sie verstehen meine Frage nicht ganz
– vehomzzz
30. August 2009 um 22:17 Uhr
Es ist ein bisschen viel verlangt, ja. Die generierte Assembly ist genau der Code, den die CPU ausführen wird. Wenn Sie nur den für Sie relevanten Code anzeigen möchten, schreiben Sie eine vereinfachte Funktion, die diese Operation ausführt, kompilieren Sie sie und zeigen Sie dann die Assembly an.
– Grauschimmer
30. August 2009 um 22:46 Uhr
Und natürlich existiert die ganze Vorstellung von “dem Code für eine bestimmte Funktion” nicht mehr, sobald ein Optimierer Assembler-Anweisungen eingefügt, neu geordnet, zusammengeführt und/oder eliminiert hat.
– MSalter
31. August 2009 um 8:09 Uhr
P Schwed
Hinzufügen -S Wechseln Sie zu Ihrer Befehlszeile.
Bearbeiten: Vergessen Sie nicht, dass die Baugruppe in den Dateien platziert wird, die Sie unter angegeben haben -o Schalter.
Sie können verwenden gcc -O3 -march=native foo.c -S -o- | less hineinzupfeifen less anstatt eine zu erstellen .s Datei. Siehe auch Wie entferne ich „Rauschen“ aus der GCC/Clang-Assembly-Ausgabe? für weitere Tipps zum Sehen des “interessanten Teils” der asm-Ausgabe, insbesondere Matt Godbolts Vortrag auf der CppCon2017: „Was hat mein Compiler in letzter Zeit für mich getan? Entriegeln des Deckels des Compilers“
– Peter Cordes
27. Februar 2018 um 20:00 Uhr
Wie kann man es auf eine bestimmte Funktion oder einen Codeblock beschränken?
Setzen Sie diese Funktion in eine separate Quelldatei (und verwenden Sie einen anderen Befehlszeilenparameter für diese eine Quelldatei).
Das habe ich getan. Ich bin gespannt, ob es nur mit Optionen möglich ist.
– vehomzzz
30. August 2009 um 21:24 Uhr
Dies spiegelt möglicherweise nicht wider, wie es wirklich optimiert ist, wenn es in Aufrufer eingebunden werden kann. (Besonders bei Link-Time-Optimierung). Wenn auch nur ein Parameter eine Kompilierzeitkonstante ist, kann dies einen großen Unterschied machen, oder wenn die Ausrichtung oder Größe eines Arrays bekannt ist, kann dies die Autovektorisierung stark verändern. Aber ja, das ist gut wenn du verstehst was du tust.
– Peter Cordes
27. Februar 2018 um 20:04 Uhr
Sie könnten dieses Programm auch in einem Debugger wie z gdb und verwenden Sie eine Disassembly-Ansicht. Im gdb Sie könnten den Befehl verwenden disass/m um die Assembly gemischt mit dem C-Code an der aktuellen Position anzuzeigen.
Können Sie ein Minimalbeispiel hinzufügen? disass/m druckt nur No frame selected.
– Clemens
11. April 2016 um 19:28 Uhr
Sie könnten Ihr Programm an einem Haltepunkt im Visual Studio-Debugger anhalten und “Assembly anzeigen” und sogar eine Anweisung nach der anderen durchlaufen.
14005000cookie-checkWie kann ich den Assemblercode sehen, der von einem gcc-Compiler (beliebiger Geschmack) für ein C/C++-Programm generiert wird?yes
Eine weniger ausführliche Versammlung? Was genau meinst du damit?
– anon
30. August 2009 um 21:29 Uhr
Sie möchten also, dass gcc generiert wird falsch Montagecode, der nur Ihren Sinn für Schönheit befriedigt? Nein Sir.
– P Schweb
30. August 2009 um 21:39 Uhr
LOL Ich möchte ein korrektes generieren, aber es für mich prägnant darstellen. Ist das zuviel verlangt? Keine große Sache, aber zusätzliche Informationen werden mich nicht umbringen. Ich habe mich nur gefragt, ob es überhaupt möglich ist oder ob es Tools gibt … Pavel, ich glaube, Sie verstehen meine Frage nicht ganz
– vehomzzz
30. August 2009 um 22:17 Uhr
Es ist ein bisschen viel verlangt, ja. Die generierte Assembly ist genau der Code, den die CPU ausführen wird. Wenn Sie nur den für Sie relevanten Code anzeigen möchten, schreiben Sie eine vereinfachte Funktion, die diese Operation ausführt, kompilieren Sie sie und zeigen Sie dann die Assembly an.
– Grauschimmer
30. August 2009 um 22:46 Uhr
Und natürlich existiert die ganze Vorstellung von “dem Code für eine bestimmte Funktion” nicht mehr, sobald ein Optimierer Assembler-Anweisungen eingefügt, neu geordnet, zusammengeführt und/oder eliminiert hat.
– MSalter
31. August 2009 um 8:09 Uhr