Utilisation du code assembleur inline

De RAD Studio
Aller à : navigation, rechercher

Remonter à Code assembleur inline - Index


L'assembleur intégré vous permet d'écrire du code assembleur dans les programmes Delphi. Il possède les fonctionnalités suivantes :

  • Permet l'assemblage inline.
  • Supporte toutes les instructions trouvées dans le Pentium 4 d'Intel, les extensions Intel MMX, les extensions SSE (Streaming SIMD Extensions) et AMD Athlon (notamment 3D Now!).
  • Supporte l'architecture Intel 64, avec quelques limitations.
  • Permet l'utilisation des identificateurs Delphi, tels que les constantes, les types et les variables dans les instructions assembleur.
  • Ne fournit aucun support des macros, mais accepte les procédures et les fonctions en pur assembleur.

Au lieu d'utiliser l'assembleur intégré, vous pouvez lier des fichiers objet contenant des procédures et fonctions externes. Pour de plus amples informations, voir la rubrique Déclarations externes. Si vous voulez utiliser du code assembleur externe dans vos applications, vous devez envisager de le réécrire en langage Delphi ou au moins de le réimplémenter en utilisant l'assembleur inline.

L'assembleur inline est disponible sur :

Toutefois, l'assembleur inline n'est pas supporté par les compilateurs Delphi pour les périphériques iOS et Android.

Utilisation de l'instruction asm

L'accès à l'assembleur intégré se fait par le biais des instructions asm qui ont la forme suivante :

asm statementList end

statementList est une suite d'instructions assembleur séparées par des points-virgules, des caractères de fin de ligne ou des commentaires Delphi.

Les commentaires placés dans une instruction asm doivent être de style Delphi. Un point-virgule n'indique pas que le reste de la ligne est un commentaire.

Le mot réservé inline et la directive assembler ne sont conservés que dans un souci de compatibilité ascendante. Ils sont ignorés par le compilateur.

Utilisation des registres

X64 GPR.pngX64 SSE.png

32 bits

En général, les règles d'utilisation de registre dans une instruction asm sont les mêmes que celles d'une procédure ou d'une fonction external. Une instruction asm doit préserver les registres EDI, ESI, ESP, EBP et EBX, mais peut librement modifier les registres EAX, ECX et EDX. A l'entrée d'une instruction asm, EBP pointe sur le cadre de pile en cours et ESP pointe sur le haut de la pile. A l'exception de ESP et EBP, une instruction asm peut ne rien supposer sur le contenu du registre à l'entrée de l'instruction.

64 bits

En ligne avec l'interface ABI (Application Binary Interface) x64, le contenu des registres suivants doit être conservé et rétabli dans les fonctions assembleur inline : R12, R13, R14, R15, RDI, RSI, RBX, RBP, RSP, XMM4, XMM5, XMM6, XMM7, XMM8, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, et XMM15.

Les quatre premiers paramètres des fonctions assembleur inline sont passés respectivement via RCX, RDX, R8 et R9, à l'exception des arguments à virgule flottante qui utilisent XMMO, XMM1, XMM2, XMM3. Le coprocesseur mathématique n'est pas normalement utilisé depuis le code x64. Les registres utilisés pour les paramètres de fonctions peuvent être librement modifiés.

Utilisation des définitions conditionnelles pour le code multiplate-forme

Pour les fonctions existantes avec du code assembleur inline, des définitions conditionnelles doivent être utilisées pour gérer les différences entre les plates-formes. Les fonctions doivent avoir un prototype de fonction commun entre les plates-formes. Exemple :

function Power10(val: Extended; power: Integer): Extended; 
{$IFDEF PUREPASCAL}
begin
  // Pascal implementation here...
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
  asm
    // ASM implementation here...
  end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}

Exemple sans $ELSE :

  {$IFDEF CPUX86}
  asm
    // ...
  end;
  {$ENDIF CPUX86}
  {$IFDEF CPUX64}
  asm
    // ...
  end;
{$ENDIF CPUX64}

Pour de plus amples informations sur les conditions prédéfinies, voir Compilation conditionnelle (Delphi)#Conditions prédéfinies.

Voir aussi