Ich versuche Assemblersprache zu lernen. Ich habe gesucht und gefunden, wie man eine .c
Datei zerlegt , aber ich denke, sie erzeugt eine optimierte Version des Programms. Gibt es eine Möglichkeit, den genauen Assembler-Code zu sehen, der meiner C-Datei entspricht?
76
Antworten:
Die Option gcc
-O
ermöglicht verschiedene Optimierungsstufen. Verwenden Sie-O0
diese Option, um sie zu deaktivieren und die-S
Assembly auszugeben.-O3
ist die höchste Optimierungsstufe.Ab gcc 4.8 steht die Optimierungsstufe
-Og
zur Verfügung. Es ermöglicht Optimierungen, die das Debuggen nicht beeinträchtigen, und ist die empfohlene Standardeinstellung für den Standardzyklus zum Bearbeiten, Kompilieren und Debuggen.Um den Dialekt der Versammlung in Intel oder Att zu ändern, verwenden Sie
-masm=intel
oder-masm=att
.Sie können bestimmte Optimierungen auch manuell mit aktivieren
-fname
.Weitere Informationen finden Sie im gcc-Handbuch .
quelle
-O0
ist die Standardeinstellung (keine Optimierung), wenn Sie keine -O-Flags angegeben haben.Für gcc möchten Sie alle an den Compiler übergebenen Optionen -O1 -O2 oder -O3 weglassen. Wenn Sie diese bereits haben, können Sie die Option -O0 anhängen , um sie wieder zu deaktivieren . Es kann Ihnen auch helfen, -g für das Debuggen hinzuzufügen, damit Sie die c-Quelle und den zerlegten Maschinencode in Ihrem Debugger sehen können.
Siehe auch: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
quelle
Um ohne Kopierelision zu testen und zu sehen, wie Sie Konstruktoren / Operatoren in Aktion kopieren / verschieben, fügen Sie "-fno-elide-Konstruktoren" hinzu.
Selbst ohne Optimierungen (-O0) führen GCC und Clang die Kopierelision durch, was in einigen Fällen dazu führt, dass Kopier- / Verschiebungskonstruktoren übersprungen werden. In dieser Frage finden Sie Details zur Kopierentfernung.
In Clang 3.4 wird jedoch ein Fehler ausgelöst (ein ungültiges temporäres Objekt ohne Aufruf des Konstruktors), der in 3.5 behoben ist.
quelle
Verwenden Sie die Befehlszeilenoption
-O0
(- [Großbuchstabe o] [Null]), um die Optimierung zu deaktivieren und-S
die Assembly-Datei abzurufen. Weitere gcc-Befehlszeilenoptionen finden Sie hier .quelle
Vor langer Zeit, aber immer noch gebraucht.
info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html list - gcc -Q --help=optimizers test.c | grep enabled disable as many as you like with: gcc **-fno-web** -Q --help=optimizers test.c | grep enabled
quelle
Sie können Optimierungen auch intern mit #pragma GCC push_options steuern
#pragma GCC push_options /* #pragma GCC optimize ("unroll-loops") */ .... code here ..... #pragma GCC pop_options
quelle
Sie können Optimierungen deaktivieren, wenn Sie -O0 mit der Befehlszeile gcc übergeben.
Zum Beispiel, um eine .C-Datei in einen .S-Dateiaufruf umzuwandeln:
gcc -O0-S test.c
quelle
-O0
ist redundant, da dies die Standardeinstellung ist.