2010-01-15 21 views
5

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

+0

Visual C++ possède un modificateur '__declspec (nu)' qui empêche le compilateur de générer un prologue et un épilogue. –

+0

__declspec (nu) n'est pas pris en charge lors de la compilation pour les cibles x64 (et l'assemblage en ligne également). – Andrey

Répondre

3

Pour la documentation sur les conventions d'appel, et comment le paramètre passé à une fonction (dans des registres? Qui? Ce qui est sur la pile, etc.) ont un oeil à Agner Fog's document.

Ensuite, vous pouvez jeter un oeil au code source libffi pour voir comment ils le font.

+0

Merci d'avoir répondu; Je ne connaissais pas libffi, je vais vérifier ça, c'est très bien. – Matthieu

+0

Si j'étais vous, si possible, je voudrais juste compter sur libffi. Il est stable, entretenu et gère de nombreux cas d'angle –

+0

OK, le document d'Agner Fog est très utile. Mais libffi ne sauvegarde pas tous les registres, en particulier les registres YMM (pas encore?). Au fait, je devrais pouvoir faire quelques trucs avec ça! Merci beaucoup. – Matthieu