Siehe die Seite "Erweiterter Asm" in der GCC-Dokumentation .
Sie können verhindern, dass eine asm
Anweisung gelöscht wird, indem Sie das Schlüsselwort volatile
nach dem schreiben asm
. [...] Das volatile
Schlüsselwort zeigt an, dass die Anweisung wichtige Nebenwirkungen hat. GCC löscht einen volatile
ASM nicht, wenn er erreichbar ist.
und
Ein asm
Befehl ohne Ausgangsoperanden wird identisch mit einem flüchtigen asm
Befehl behandelt.
In keinem Ihrer Beispiele sind Ausgabeoperanden angegeben, daher verhalten sich die Formulare asm
und asm volatile
identisch: Sie erstellen einen Punkt im Code, der möglicherweise nicht gelöscht wird (es sei denn, er ist nicht erreichbar).
Das ist nicht ganz dasselbe wie nichts zu tun. In dieser Frage finden Sie ein Beispiel für einen Dummy, der asm
die Codegenerierung ändert. In diesem Beispiel wird Code, der 1000 Mal eine Schleife umrundet, in Code vektorisiert, der 16 Iterationen der Schleife gleichzeitig berechnet. Das Vorhandensein eines asm
innerhalb der Schleife verhindert jedoch die Optimierung (die asm
muss 1000-mal erreicht werden).
Der "memory"
Clobber lässt GCC davon ausgehen, dass ein beliebiger Speicher vom asm
Block willkürlich gelesen oder geschrieben werden kann , sodass der Compiler keine Lasten oder Speicher darüber neu anordnen kann:
Dies führt dazu, dass GCC Speicherwerte nicht in Registern über den Assembler-Befehl zwischengespeichert hält und Speicher oder Ladevorgänge in diesem Speicher nicht optimiert.
(Dies hindert eine CPU jedoch nicht daran, Lasten und Speicher in Bezug auf eine andere CPU neu zu ordnen. Dafür benötigen Sie echte Anweisungen zur Speicherbarriere.)