2009-09-03 5 views
3

Voici mon previous question à propos de la commutation des callstacks C. Cependant, C++ utilise une convention d'appel différente (thiscall) et peut nécessiter un code asm différent. Quelqu'un peut-il expliquer les différences et pointer vers ou fournir des extraits de code qui commutent les callstacks C++ (de préférence dans GCC inline asm)?Changement d'appel pour les fonctions C++

Merci, James

+1

Y a-t-il une raison pour rouler les vôtres plutôt que d'utiliser setjmp/longjmp? – moonshadow

Répondre

2

Le code donné à la question précédente devrait fonctionner correctement.

Le thiscall calling convention ne diffère que dans la personne responsable de l'extraction des arguments de la pile. Sous la convention d'appel thiscall, l'appelé affiche les arguments (et en plus, le pointeur this est passé en ecx); sous la convention d'appel C, l'appelant affiche les arguments. Cela n'affecte pas les changements de contexte. Cependant, si vous devez vous-même changer de contexte, notez que vous devez également sauvegarder et restaurer les registres (probablement sur la pile) en plus de changer de pile. Notez, en passant, que C++ n'utilise pas toujours thiscall - il est seulement utilisé pour les méthodes avec un nombre fixe d'arguments (et à part ça, c'est un Microsoftism ... g ++ ne l'utilise pas) .

+0

Euh, n'est-ce pas seulement la question de savoir où le paramètre caché 'this' est transmis à l'appelé? (Dans un registre, IIRC, mais je suis loin de ma profondeur avec ceci, alors ignorez-moi si je babillage incohérent ici ...) – sbi

+0

Êtes-vous sûr que vous ne confondez pas thiscall avec fastcall? thiscall est utile pour passer un pointeur this si je ne me trompe pas via ecx, quand fastcall est en effet parfois utilisé par les compilateurs pour passer des arguments via des registres au lieu de les pousser sur une pile. – Dmitry

+0

Oui, cela semble à peu près juste. J'ai ajouté un lien vers l'entrée MSDN avec les détails. –

1

Notez que l'ABI pour C++ n'est pas explicitement défini.

L'idée était que les fabricants de compilateurs puissent utiliser la convention d'appel optimale pour la situation et ainsi rendre le C++ plus rapide. L'inconvénient de ceci est que chaque compilateur a sa propre convention d'appel, ainsi le code de différents compilateurs n'est pas compatible (même le code de différentes versions (ou même des drapeaux d'optimisation différents) du même compilateur peut être incompatibles).

Questions connexes