IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Assembleur et type de variable delphi


Sujet :

Langage Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Assembleur et type de variable delphi
    Bonjour,


    Je précise tout de suite que mon application tourne sur Win98 et que j'ai fait appel à une petite routine en assembleur bien connue permettant d'accéder directement au port parallèle. Cependant en voulant bien faire les choses j'ai voulu passer un paramètre à ma fonction pour indiquer sur quel registre du port // je veux écrire. Ce paramètre contient l'adresse du registre ($378 pour l'adresse de base).

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const ADRESSE_BASE = $378;
     
    {-----------------------------------------------------------------}
    { Méthode d'émission des bits en assembleur }
    procedure aout(adresse : word ; dat : byte);assembler;
    asm
      mov al,dat
      mov dx, adresse
      out dx,al
    end;
    Mon problème est que ça ne marche pas lorsque j'appelle la méthode en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aout(ADRESSE_BASE, 2); //exemple
    Je ne comprends pas alors que si dans le code assembleur je met la valeur $378 directement à la place de la varibale asdresse ça fonctionne.

    Je suppose que c'est un problème de code non ? Mais je n'arrive pas à identifier le problème.

    Quelqu'un aurait une idée ? Le type de la variable de convient pas au registre dx ?? Je ne comprends pas.

    Merci

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Ca ne fonctionne pas à cause du passage des paramètre par registre ( qui est faite par défaut quand les optimisations sont en marche )

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure aout(adresse : word ; dat : byte);assembler;
    Va mettre Adresse dans AX et dat dans DX.
    Or ensuite tu fais MOV AL,DAT qui va écraser la valeur de Adresse contenue dans AX...

    Deux solution :
    Tu forces la passage par la pile au lieu des registres à l'aide de la directive Pascal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure aout(adresse : word ; dat : byte);Pascal;
    asm 
      mov al,dat 
      mov dx, adresse 
      out dx,al 
    end;
    Tu reste en passage par registre, et dans ce cas il est préférable de le forcer afin de ne pas dépendre des optimisations, à l'aide de la directive Register. Par contre simplement en inversant l'ordre des paramètres tu vas avoir les données déjà en place !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure aout(dat:Byte; adresse : word);Register;
    asm 
      // ici dat est dans AL et Adresse dans DX automatiquement
      out dx,al 
    end;
    PS : le mot clef Assembler ne sert plus à rien. Dans la mesure ou le Begin de début de procédure est remplacé par Asm, c'est implicite.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Merci pour la réponse et merci pour la rapidité

    Je ne trouvé pas d'explication Juste une question ? Comment tu sais, en fonction de l'optimisation, dans quel registre sont placés les paramètres ?
    Comment forcé le passage par la pile ? (Je ferai une recherche si tu n'as pas la réponse sous la main, pas de pb )

    Je teste ça dès que mon betatesteur sera disponible

    En tout cas merci pour le coup de main, fallait le savoir tout ça

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Si tu utilises l'assembleur en ligne regarde ici : http://nono40.developpez.com/delphi/asm/

    Quand les optimisations sont actives, c'est la directive Register qui est utilisée par défaut. Sinon, c'est la directive Pascal. Pour connaitre la différence et le passage exact des paramètres suivant la convention d'appel, je te conseille le chapitre suivant du même article :
    http://nono40.developpez.com/delphi/asm/#LIII-D
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par declencher
    Comment forcé le passage par la pile ?
    Relis ma première réponse, c'est dedans
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    zut milles excuses J'avais pas vu :o

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des types de variables en Assembleur
    Par AsmCode dans le forum Assembleur
    Réponses: 13
    Dernier message: 17/10/2005, 20h34
  2. Equivalent C -> Delphi des types de variables
    Par jobe dans le forum Langage
    Réponses: 3
    Dernier message: 13/09/2005, 23h21
  3. Comparer les types de variable
    Par onipif dans le forum ASP
    Réponses: 11
    Dernier message: 27/05/2004, 18h07
  4. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35
  5. Types de variables entre mysql/php et flash
    Par ramses83 dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2003, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo