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.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage