Procédures et fonctions assembleur

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Code assembleur inline - Index

Vous pouvez écrire des procédures et des fonctions complètes en utilisant le code du langage assembleur inline, sans inclure une instruction begin...end.

Optimisations du compilateur

Voici un exemple de type de fonction que vous pouvez écrire :

function LongMul(X, Y: Integer): Longint;
asm
  MOV	EAX,X
  IMUL    Y
end;

Le compilateur effectue plusieurs optimisations sur ces routines :

  • Aucun code n'est généré pour copier des paramètres valeur dans des variables locales. Ceci affecte tous les paramètres valeur de type chaîne et les autres paramètres valeur dont la taille n'est pas 1, 2 ou 4 octets. Dans la routine, de tels paramètres doivent être traités comme s'ils étaient des paramètres var.
  • A moins qu'une fonction ne renvoie une chaîne, un variant ou une référence d'interface, le compilateur n'alloue pas une variable résultat de fonction. Une référence au symbole @Result est une erreur. Pour les chaînes, les variants et les interfaces, l'appelant alloue toujours un pointeur @Result.
  • Le compilateur génère seulement des cadres de pile pour les routines imbriquées, les routines ayant des paramètres locaux ou les routines ayant des paramètres sur la pile.
  • Locals est la taille des variables locales et Params est la taille des paramètres. Si Locals et Params sont nuls, il n'y a pas de code d'entrée et le code de sortie se limite à une instruction RET.

Le code d'entrée et de sortie généré automatiquement pour la routine a la forme suivante :

PUSH	EBP			;Present if Locals <> 0 or Params <> 0
MOV	EBP,ESP			;Present if Locals <> 0 or Params <> 0
SUB	ESP,Locals		;Present if Locals <> 0
.
.
.
MOV	ESP,EBP			;Present if Locals <> 0
POP	EBP			;Present if Locals <> 0 or Params <> 0
RET	Params			;Always present

Si dans les variables locales il y a des variants, des chaînes longues ou des interfaces, ils sont initialisés à zéro mais pas finalisés.

Résultats de fonction

Les fonctions du langage assembleur renvoient leurs résultats de la manière suivante :

32 bits

  • Les valeurs ordinales sont renvoyées dans AL (valeurs 8 bits), AX (valeurs 16 bits) ou EAX (valeurs 32 bits).
  • Les valeurs réelles sont renvoyées dans ST(0) sur la pile des registres du coprocesseur. (Les valeurs Currency sont multipliées par 10000.
  • Les pointeurs, notamment les chaînes longues, sont renvoyés dans EAX.
  • Les chaînes courtes et les variants sont renvoyés dans un emplacement temporaire pointé par @Result.


64 bits

  • Les valeurs sur 8 octets ou de taille inférieure sont renvoyées dans RAX.
  • Les valeurs réelles sont renvoyées dans XMM0.
  • Les autres types sont renvoyés par une référence dont la valeur de pointeur réside dans RAX, dont la mémoire est allouée par la routine appelante.

Spécificités Intel 64 (Pseudo-Ops)

Les fonctions x64 doivent être écrites complètement en assembleur ou en Pascal, c'est-à-dire que les instructions assembleur ne sont pas supportées, seulement les fonctions assembleur inline.

Des pseudo-ops ont été fournis pour la gestion de l'usage de la pile dans x64 : .PARAMS, .PUSHNV, .SAVENV et .NOFRAME.

Pseudo-op

Description

.PARAMS <nombre>

Utilisé lors de l'appel de fonctions externes pour configurer le paramètre de registre "backing store" conformément à la convention d'appel x64, comme cela n'est pas normalement effectué par défaut. Si ce pseudo-op est utilisé, la pseudo-variable @params est disponible pour le passage de paramètres de pile aux fonctions appelées. Utilisez @params en tant que tableau d'octets où le premier paramètre de pile sera @params[32], les emplacements 0-31 représentent les 4 paramètres de registre.

.PUSHNV <registre>

Génère le code permettant d'enregistrer et de rétablir le registre non volatile à usage général dans le prologue et l'épilogue.

.SAVENV <registre XMM>

Même fonctionnalité que .PUSHNV pour les registres XMM non volatiles.

.NOFRAME

Désactive la génération d'un cadre de pile tant qu'il n'y a pas de variables locales déclarées et que le nombre de paramètres est <= 4. A usage seulement pour les fonctions leaf.

Déroulement de la pile pour les exceptions mappées -PC (Program Counter)

Voir Exceptions mappées - PC (Program Counter)#Déroulement des routines assembleur.

Voir aussi