Je dois faire une interface (par exemple, un wrapper) qui permet un appel du code d'assemblage X86_64 en utilisant sa convention d'appel à la fonction C, avec d'autres conventions d'appel. La meilleure chose à faire serait d'être plutôt "compilateur indépendant" (en modifiant simplement le wrapper), donc je cherche quelque chose qui remettrait des choses sur le compilateur. J'ai déjà regardé ici: Custom calling convention for P/Invoke and C# et c'est venu près de ce que j'ai à faire. Actuellement, j'utilise GCC, mais les suggestions d'autres compilateurs sont les bienvenues!Appel conventionnel de la convention X86_64 à l'appel de fonction C
Donc, voici la chose, pour une meilleure vue du problème (la convention de codage personnalisé est étrange):
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
Je dois être en mesure d'appeler un « spécial » (emballage) fonction C ; ici le travail sera d'expédier des appels entre d'autres fonctions de C. Donc, ce wrapper doit trouver% r11, enregistrer tous les registres et préparer la pile pour un appel ultérieur. Y a-t-il une bonne façon de faire cela en C (avec un peu d'asm inline)?
Merci beaucoup
Visual C++ possède un modificateur '__declspec (nu)' qui empêche le compilateur de générer un prologue et un épilogue. –
__declspec (nu) n'est pas pris en charge lors de la compilation pour les cibles x64 (et l'assemblage en ligne également). – Andrey