2010-01-15 29 views
5

Ich muss eine Schnittstelle (sagen wir, einen Wrapper), die einen Aufruf von X86_64 Assembly-Code mit seiner Aufrufkonvention zu C-Funktion, mit anderen Aufruf Konvention ermöglichen. Die beste Sache wäre, ziemlich "compilerunabhängig" zu sein (juste ändert den Wrapper), also suche ich nach etwas, das Register/Stacks auf Compiler zurückbringt. Ich habe schon hier nachgesehen: Custom calling convention for P/Invoke and C# und es kommt mir nahe, was ich zu tun habe. Derzeit verwende ich GCC, aber Hinweise von anderen Compilern sind willkommen!Benutzerdefinierte X86_64 Aufrufkonvention zu C-Funktionsaufruf

So, hier ist die Sache, für eine beste Sicht auf das Problem (die benutzerdefinierte Codierung Konvention ist seltsam):

pushq %r11 # saves r11 for call 
movq 64bits_address %r11 # move a 64 bits address that points on a data structure 
callq *8(%r11) # calls an address in the data structure 
popq %r11  # restores %r11 ; return value is in the structure 

Ich brauche eine „besondere“ (Wrapper) C-Funktion aufrufen zu können, ; Hier wird Aufgabe sein, Anrufe zwischen anderen C-Funktionen zu versenden. Also muss dieser Wrapper% r11 finden, alle Register speichern und den Stack für den weiteren Aufruf vorbereiten. Gibt es einen geeigneten Weg, dies in C (mit einigen Inline-Asm) zu tun?

Vielen Dank

+0

Visual C++ hat einen Modifizierer '__declspec (naked)', der verhindert, dass der Compiler Prolog und Epilog generiert. –

+0

__declspec (nackt) wird nicht unterstützt beim Kompilieren für x64-Ziele (und auch Inline-Assembly). – Andrey

Antwort

3

Für die Dokumentation über Konventionen und wie Aufrufen sind die Parameter an eine Funktion übergeben (in den Registern? Das? Was auf dem Stapel ist usw.) bei Agner Fog's document einen Blick.

Dann können Sie sehen, libffi Quellcode, um zu sehen, wie sie es tun.

+0

Danke für die Antwort; Ich wusste nicht libffi, ich werde das überprüfen, es klingt großartig. – Matthieu

+0

Wenn ich Sie wäre, würde ich mich, wenn möglich, nur auf libffi verlassen. Es ist stabil, gepflegt und behandelt viele Ecken Fällen –

+0

OK, Agner Fogs Dokument ist sehr nützlich. Aber libffi speichert nicht alle Register, insbesondere YMM-Register (noch nicht?). Übrigens sollte ich damit etwas anfangen können! Vielen Dank. – Matthieu

Verwandte Themen