Question

Je me souviens de certaines règles d’antan (processeurs Intel pré-32 bits), où il était assez fréquent (du moins pour moi) d’analyser la sortie d’ensemble générée par les compilateurs C / C ++ (dans mon cas, Borland / Turbo à à ce moment-là) pour trouver les goulots d’étranglement liés aux performances et pour mélanger en toute sécurité les routines d’assemblage avec du code C / C ++. Des choses comme utiliser le registre SI pour le ce pointeur, AX étant utilisé pour les valeurs de retour, registres à conserver lors du retour d’une routine d’assemblage, etc.

Maintenant, je me demandais s’il existait une référence pour les compilateurs C / C ++ les plus populaires (Visual C ++, GCC, Intel ...) et les processeurs (Intel, ARM, ...). Sinon, où trouver le morceaux pour en créer un. Des idées?

Était-ce utile?

La solution

Vous parlez de " interface binaire d'application " (ABI) et conventions d’appel. Ils sont généralement définis par les systèmes d'exploitation et les bibliothèques, et appliqués par les compilateurs et les lieurs. Google pour " ABI " ou " convention d'appel. " Quelques points de départ tirés de Wikipedia et Debian pour ARM .

Autres conseils

Agner Fog's " Conventions d’appel " Ce document résume, entre autres, les ABI Windows et Linux 64 et 32 ??bits: http: // www .agner.org / optimise / calling_conventions.pdf . Voir le tableau 4 à la p.10 pour un résumé de l’utilisation des registres.

Un avertissement de l’expérience personnelle: n’incluez pas d’hypothèses concernant l’ABI dans l’assemblage en ligne. Si vous écrivez une fonction dans un assemblage en ligne qui suppose le retour et / ou le transfert de paramètres dans des registres particuliers (par exemple, eax, rdi, rsi), elle se rompra si / lorsque la fonction est insérée par le compilateur.

Le compilateur Open Watcom C / C ++ prend en charge deux conventions d’appel, basées sur les registres (par défaut) et sur la pile (très proches de ce que les autres compilateurs utilisent). Le guide de l’utilisateur de ce compilateur décrit les deux et est disponible gratuitement en ligne . , avec le compilateur lui-même . Vous pouvez trouver ces rubriques dans le Guide de l'utilisateur particulièrement utiles:

  • 10.4.1 Transmission d'arguments à l'aide de conventions d'appel basées sur le registre
  • 10.4.6 Utilisation des conventions d'appel basées sur une pile
  • 10.5 Conventions d’appel pour les applications 80x87

Eh bien, si l'optimisation est activée aujourd'hui, il n'y en a pas. Mais GCC vous permet de déclarer que votre instruction d’assemblage doit utiliser une variable particulière, qu’elle soit dans le registre ou non, ou même de forcer GCC à mettre cette variable dans un registre utilisable avec votre instruction. Vous pouvez également déclarer les registres de vos réserves de blocs d'assemblage en ligne (le compilateur doit donc générer le code de sauvegarde / restauration approprié autour de votre pièce en ligne, si nécessaire)

Je crois mais je ne suis absolument pas sûr que GCC utilise le Itanium ABI pour la plupart de ses fonctions; les incompatibilités entre elle et l’ABI qu’elle utilise sont documenté .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top