In meinen laufenden Experimenten mit GCC Inline Assembly ist mir ein neues Problem bezüglich Etiketten und Inline Code aufgefallen.Etiketten in GCC Inline Assembly
Betrachten Sie den folgenden einfachen Sprung:
__asm__
(
"jmp out;"
"out:;"
:
:
);
Dies tut nichts, außer Sprung zum out
Label. Wie es ist, kompiliert dieser Code gut. Wenn Sie es jedoch in eine Funktion einfügen und dann mit Optimierungsflags kompilieren, beschwert sich der Compiler: "Fehler: Symbol 'out' ist bereits definiert".
Was scheint zu geschehen ist, dass der Compiler diesen Assemblercode jedes Mal wiederholt, wenn er die Funktion einfügt. Dies führt dazu, dass das Label out
dupliziert wird, was zu mehreren out
Etiketten führt.
Also, wie kann ich das umgehen? Ist es wirklich nicht möglich, Etiketten in der Inline-Montage zu verwenden? Diese tutorial on GCC inline assembly erwähnt, dass:
Thus, you can make put your assembly into CPP macros, and inline C functions, so anyone can use it in as any C function/macro. Inline functions resemble macros very much, but are sometimes cleaner to use. Beware that in all those cases, code will be duplicated, so only local labels (of 1: style) should be defined in that asm code.
Ich habe versucht, mehr Informationen über diese „lokalen Labels“ zu finden, aber kann nicht scheinen, etwas zu finden, in Bezug Montage Inline. Es sieht so aus, als würde das Tutorial sagen, dass eine lokale Bezeichnung eine Zahl gefolgt von einem Doppelpunkt ist (wie 1:
), also habe ich versucht, eine solche Bezeichnung zu verwenden. Interessanterweise kompilierte der Code, aber zur Laufzeit löste er einfach einen Segmentierungsfehler aus. Hmm ...
Also irgendwelche Vorschläge, Hinweise, Antworten ...?
@MichaelGraczyk Lokale Beschriftungen sind keine x86-spezifische Funktion. GAS unterstützt sie unabhängig vom CPU- oder Objektdateiformat, und so auch fast alle anderen Unixy-Assembler (wie ich es noch nie gesehen habe, auch 1995). – zwol
Tatsächlich würde 'jmp 1' als Sprung zu Position 1 betrachtet, also der Segfault. – greggo