Direkter Aufruf mit Inline-Assembly von GCC

8

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.

    
Job 12.08.2010, 11:36
quelle

5 Antworten

10

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.

    
Job 13.08.2010, 09:56
quelle
1

Vielleicht vermisse ich hier etwas, aber

%Vor%

sollte gut funktionieren. Sie brauchen extern "C", damit der Name nicht auf C ++ - Benennungsregeln basiert.

    
markpapadakis 13.01.2016 13:13
quelle
0

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.

    
Jens Gustedt 12.08.2010 12:23
quelle
0

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).

edit Dies funktioniert nur für C-Funktionsnamen - nicht für C ++, da sie fehlerhaft sind.

    
nategoose 12.08.2010 15:39
quelle
0

Wenn Sie 32-Bit-Code (z. B. die Option -m32 gcc) generieren, gibt die folgende asm-Inline einen direkten Aufruf aus:

%Vor%     
Andre Guedes 11.06.2015 20:06
quelle