Direkter Aufruf mit der Inline-Assembly von GCC
Wenn Sie eine C / C ++ - Funktion aus einer Inline-Assembly aufrufen möchten, können Sie Folgendes tun:
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
GCC gibt dann folgenden Code aus:
movl $callee, %eax
call *%eax
Dies kann problematisch sein, da der indirekte Aufruf die Pipeline auf älteren CPUs zerstört.
Seit der Adresse voncallee
ist irgendwann eine Konstante, man kann sich vorstellen, dass es möglich wäre, das @ zu verwendi
Einschränkung. Zitat aus dem GCC online docs:
`i '
Ein unmittelbarer ganzzahliger Operand (einer mit konstantem Wert) ist zulässig. Dies schließt symbolische Konstanten ein, deren Werte erst zur Assemblierungszeit oder später bekannt werden.
Wenn ich versuche, es so zu benutzen:
asm("call %0" : : "i"(callee));
Ich erhalte die folgende Fehlermeldung vom Assembler:
Error: Suffix oder Operanden ungültig für `call '
Das liegt daran, dass GCC den Code @ ausgib
call $callee
Anstatt vo
call callee
So meine Frage ist, ob es möglich ist, die GCC-Ausgabe auf das richtige @ zu setzcall
.