Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres

        


La convention d'appel
auteur : Hdd34
En informatique, il existe différentes convention d'appel pour les procédures et fonctions.


Le passage des paramètres


Diverses solutions existent pour passer les paramètres aux procédures. On peut :

  • Les passer sur la pile
  • Les passer avec les registres

Turbo Pascal utilise exclusivement le passage par la pile. Mais d'autres compilateurs, comme Delphi, peuvent utiliser les registres pour passer les paramètres.

Si on passe les paramètres sur la pile, encore deux conventions :

  • Les paramètres sont passés de gauche à droite (le premier paramètre est le premier empilé) - Convention Pascal
  • Les paramètres sont passés de droite à gauche (le premier paramètre est le dernier empilé) - Convention C/C++



La suppression des paramètres


Une fois la procédure terminée, il faut détruire les paramètres, devenus inutiles. S'ils ont été passés par les registres, aucun problème ne se pose. Les registres seront utilisés tout de suite après, sans se préoccuper de leur contenu précédent.
Par contre, s'ils ont été passés par la pile, alors il faut nettoyer celle-ci, sans quoi elle "exploserait" tôt ou tard après un certain nombre d'appels à des procédures.
Dans ce cas, deux conventions existent encore :

  • C'est l'appelé (la procédure) qui nettoie la pile - Convention Pascal
  • C'est l'appelant qui nettoie la pile - Convention C/C++

Par conséquent, on retiendra que pour Turbo Pascal, les paramètres sont passés dans leur ordre de déclaration sur la pile.


Les fonctions et l'assembleur
auteur : Hdd34
La principale difficulté lorsque que l'on écrit une fonction en assembleur, c'est de savoir comment renvoyer la valeur de sortie.

Si votre fonction n'utilise qu'un bloc en assembleur, alors vous pouvez vous servir de la variable locale déclarée implicitement @Result :


function Test: Integer; begin ... asm ... mov @Result, ax ... end; ... end;


Si par contre toute votre fonction est en assembleur, alors il y a plusieurs cas de figure :


Type de résultat

Valeur de retour

Type scalaire (entier, caractère, booléen, énuméré) sur 8 bits AL
Type scalaire sur 16 bits (Integer, Word)

AX
Type scalaire sur 32 bits (Longint, Pointer)

DX:AX
Chaîne de caractères (string)

@Result (cas particulier)

Nombre réel flottant (type Real)

DX:BX:AX
Nombre réel flottant (type Single, Double, ...)

ST(0) (premier registre FPU)


On notera que pour le cas des fonctions retournant un type chaîne, la variable locale @Result est toujours définie.

lien : Qu'est-ce que l'assembleur ? A quoi peut-il servir ?

Paramètres par adresse et assembleur
auteur : Hdd34
Pour accéder à un paramètre par adresse (transmis avec var), vous devrez toujours utiliser un pointeur, en général ES:DI ou bien DS:SI.


procedure TestAsm(var P: Integer); assembler; asm ... les di, P ... end;
lien : Qu'est-ce que l'assembleur ? A quoi peut-il servir ?

Comment désactiver les combinaisons Ctrl+Break/Pause et Ctrl+C ?
auteurs : Prof. Timo Salmi, Hdd34
Par défaut, il est possible de quitter une application Turbo Pascal en appuyant sur les touches Ctrl+Break (la touche Break est aussi notée Pause) ou Ctrl+C. Il peut dans certains cas être intéressant de désactiver cette fonctionnalité afin d'utiliser ces touches pour ses propres besoins.
Le rôle de ces touches est défini à l'aide de la variable CheckBreak présente dans l'unité Crt.

Désactivation de Break
uses Crt; begin { Désactive la capture de la touche Break par TP } CheckBreak := False; ...
Une fois la capture de la touche Break désactivée, on peut tester l'appui sur Ctrl+Break avec Readkey :

Capture de Ctrl+Break
uses Crt; begin ... case ReadKey of #3: begin WriteLn('Ctrl+Break pressé !'); end; end; ... end.
Attention !
  • L'IDE de Turbo Pascal contient un intercepteur personnel pour Ctrl+Break. Par conséquent, pour tester la désactivation de Ctrl+Break, il convient de quitter l'IDE au préalable.
Remarques :
  • Il est possible de passer par une redéfinition des interruptions au lieu de se servir de l'unité Crt. Pour cela, il suffit de remplacer les vecteurs d'interruption 23h et 1B.

Remplacement des vecteurs d'interruption
uses Dos; var { Pour sauver les anciens vecteurs d'interruption } OldInt1B, OldInt23: Pointer; { L'interruption nulle qui va remplacer les vecteurs actuels } {$F+} procedure NullInt(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt; begin end; {$F-} begin { On sauve les anciens vecteurs } GetIntVec($1B, OldInt1B); GetIntVec($23, OldInt23); { On installe la procédure nulle } SetIntVec($1B, @NullInt); SetIntVec($23, @NullInt); ... { Ici, Ctrl+Break est désactivé } ... { On rétablit les anciens vecteurs } SetIntVec($1B, OldInt1B); SetIntVec($23, OldInt23); end.
  • Il ne faut pas confondre la désactivation de Ctrl+Break à l'intérieur d'un programme Pascal et la désactivation pour les opérations d'I/O, contrôlées à l'aide de SetCBreak dans l'unité Dos.

lien :  L'erreur 200 - Division par zéro
lien :  Comment détecter l'appui sur les touches de direction ?
lien :  Tutoriel sur les interruptions

        

Consultez les autres F.A.Q's

Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2005 www.developpez.com