Wenn Sie eine C / C ++ - Funktion von einer Inline-Assembly aufrufen möchten, können Sie Folgendes tun:
%Vor%GCC wird dann Code aussenden, der wie folgt aussieht:
%Vor%Dies kann problematisch sein, da der indirekte Aufruf die Pipeline auf älteren CPUs zerstört.
Da die Adresse von callee
letztendlich eine Konstante ist, kann man sich vorstellen, dass es möglich wäre, die i
Einschränkung zu verwenden. Zitate aus den GCC-Online Dokumenten :
'i'
Ein direkter Ganzzahl-Operand (einer mit konstantem Wert) ist erlaubt. Dies enthält symbolische Konstanten, deren Werte werden nur bei der Montage bekannt sein Zeit oder später.
Wenn ich versuche, es so zu benutzen:
%Vor%Ich bekomme den folgenden Fehler vom Assembler:
Fehler: Suffix oder Operanden ungültig für 'Anruf'
Dies liegt daran, dass GCC den Code
ausgibt %Vor%Anstelle von
%Vor% Meine Frage ist also, ob es möglich ist, GCC die korrekte call
ausgeben zu lassen.
Ich habe die Antwort von der GCC-Mailingliste erhalten:
%Vor% Jetzt muss ich nur herausfinden, was %P0
eigentlich bedeutet, denn es scheint ein undokumentiertes Feature zu sein ...
Bearbeiten : Nach dem Betrachten des GCC-Quellcodes ist nicht genau klar, was der Code P
vor einer Einschränkung bedeutet. Aber unter anderem verhindert es, dass GCC ein $
vor konstante Werte setzt. Was genau ich in diesem Fall brauche.
Vielleicht vermisse ich hier etwas, aber
%Vor%sollte gut funktionieren. Sie brauchen extern "C", damit der Name nicht auf C ++ - Benennungsregeln basiert.
Wie wäre es?
%Vor%da Sie den Namen des Symbols sowieso kennen.
Bearbeiten: Der Punkt, den ich machen wollte, ist, dass Sie nicht die gcc-Konventionen für asm
-Argumente hier durchgehen müssen, sondern dass Sie nur Textverarbeitung durchführen müssen, um den Job zu erledigen.
Der Trick ist String-Literal-Verkettung. Bevor GCC beginnt, eine echte Bedeutung aus Ihrem Code zu bekommen, wird es benachbarte String-Literale verketten. Obwohl Assembly-Strings nicht mit anderen Strings identisch sind, die Sie in Ihrem Programm verwenden, sollten sie zusammengefügt werden, wenn Sie Folgendes tun:
%Vor%Da Sie GCC verwenden, können Sie auch
verwenden %Vor%Wenn Sie nicht bereits wissen, sollten Sie sich bewusst sein, dass das Aufrufen von Dingen aus Inline-Assembly sehr schwierig ist. Wenn der Compiler eigene Aufrufe an andere Funktionen generiert, enthält er Code zum Einrichten und Wiederherstellen von Dingen vor und nach dem Aufruf. Es weiß jedoch nicht, dass es das für Ihren Anruf tun sollte. Sie müssen entweder das selbst hinzufügen (sehr schwierig, um richtig zu machen und können mit einem Compiler-Upgrade oder Kompilierungsflags brechen) oder sicherstellen, dass Ihre Funktion so geschrieben ist, dass sie anscheinend keine Register oder Bedingungen geändert hat Stapel (oder Variable darauf).
Wenn Sie 32-Bit-Code (z. B. die Option -m32 gcc) generieren, gibt die folgende asm-Inline einen direkten Aufruf aus:
%Vor%Tags und Links c c++ gcc inline-assembly function-call