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
Visual C++ hat einen Modifizierer '__declspec (naked)', der verhindert, dass der Compiler Prolog und Epilog generiert. –
__declspec (nackt) wird nicht unterstützt beim Kompilieren für x64-Ziele (und auch Inline-Assembly). – Andrey