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

x86 32-bits / 64-bits Assembleur Discussion :

[FASM] Afficher un nombre à virgule flottante


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Points : 34
    Points
    34
    Par défaut [FASM] Afficher un nombre à virgule flottante
    Hello,

    Voici un code ASM très court que je tente depuis quelques heures de rendre fonctionnel. Sans succès, malheureusement.

    Je tente (désespérément) d'afficher un nombre à virgule flottante via printf. J'ai réussi à afficher tout et n'importe quoi avec ce printf, de l'entier, de la chaîne de caractères, pas de soucis. Mais dès qu'il faut introduire de la virgule, ça ne va plus. Et je doute que ce soit le printf qui ait un problème. Plutôt mon code ASM.

    J'ai tenté du fld à tout va, du fst & co en veux-tu en voilà, sans succès. C'est franchement casse-pieds. J'apprends l'ASM, donc j'ai besoin de me rendre compte visuellement que mon code fonctionne comme je le veux quand j'effectue des opérations sur des nombres à virgule flottante. Et si je ne peux pas l'afficher... C'est gênant. Un peu.

    Note : j'utilise FASM pour assembler mon code.

    Quelqu'un saurait-il donc me dire quel code ajouter/modifier pour afficher ce '4.5' dans ma console ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    format PE Console
    entry start
    include '../include/win32a.inc'
     
    section '.data' data readable writeable
     
    _printFloat db '%f',10,0	; formattage printf
     
    float dd 4.5
     
    section '.code' code readable executable
    start:
     
    ccall [printf],_printFloat,[float]
    ccall [getchar]
     
    ret
     
    section '.idata' import data readable writeable
    library msvcrt,'msvcrt.dll'
     
    import msvcrt,\
           printf,'printf',\
           getchar,'_fgetchar'

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Qu'obtiens-tu à la place de la valeur attendue ?

    Et ça fait quoi si tu nomme ton étiquette autrement que « float » (vraie question) ?

  3. #3
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    printf() ne reçoit jamais vraiment de float en argument (comme toutes les fonctions en C), il faut utiliser double. Et là il faut savoir comment dans quel ordre pousser les deux dwords du double sur la pile (à moins que la macro ccall s'en sorte toute seule). Le plus simple c'est d'essayer les deux possibilités et voir laquelle marche.
    :wq

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    @ Obsidian : A la place de 4.5, j'obtiens au choix 0 avec le formatage float sur un PC. Là, sur une autre machine, j'obtiens un très joli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    5437691321811921600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
    J'ai bien sûr essayé différents formatage de chaîne juste au cas où.

    Et le nom "float" n'a rien à voir, non. J'ai essayé avec toute sorte de noms auparavant. Et si d'aventure j'utilise un mot-clé (j'ai eu la surprise avec "test"), FASM me gueule dessus.


    @ dapounet : float ou double, même combat, j'obtiens dans les deux cas un affichage erroné, sauf qu'avec le '%e', c'est avec la puissance.

    Par rapport à call ou ccall, j'obtiens strictement le même résultat avec chacun, et quelque soit la manière dont je pousse mon double dword sur la pile.


    Merci de vos réponses en tout cas .

  5. #5
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Ce code fonctionne chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    format PE console
    entry start
     
    include 'win32a.inc'
     
    section '.text' code readable executable
    start:
            push dword[double+4]
            push dword[double]
            push format_f_NL
            call [printf]
            pop ecx ecx
     
            push 0
            call [ExitProcess]
     
    section '.rdata' data readable
            format_f_NL db '%f', 10, 0
            double      dq 5.0
     
    section '.idata' data readable import
            library kernel32, 'kernel32.dll', \
                    msvcrt,   'msvcrt.dll'
            import kernel32, \
              ExitProcess, 'ExitProcess'
            import msvcrt, \
              getchar, 'getchar', \
              printf,  'printf'
    :wq

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Argh. Je viens de remarquer grâce à ton code que je restais sur un double dword... Une baffe pour moi.

    Un grand merci, ça fonctionne à merveille !


    (prochaine étape intéressante : tenter de faire des... *tadam* additions de nombres à virgule flottante)

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 15h33
  2. Nombres à virgule flottante
    Par visiwi dans le forum Scheme
    Réponses: 6
    Dernier message: 19/06/2008, 16h46
  3. nombre à virgule flottante
    Par new_wave dans le forum Langage
    Réponses: 1
    Dernier message: 14/01/2008, 11h16
  4. Réponses: 3
    Dernier message: 01/08/2007, 12h49

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