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

Assembleur Discussion :

[Débutant] [8086] Conversion d'entier en virgule flottante [FAQ]


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Débutant] [8086] Conversion d'entier en virgule flottante
    Bonjour,

    Je suis un novice en Assembleur (étudiant) et j'ai des problèmes en qui concerne la virgule flottante, voilà :

    comment transformer un entier (16 bits) signé ou non en virgule flottante( la mantisse sur 12 bits 5 pour le biais et 1 pour le signe.

    Quelqu'un peut m'aider , au moins des indications?

    Merci.

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    .data?
    MonReelAConvertir dw ? ; 16 bits alloués et non-initialisés
    MonReel dw ?
     
    .code
    ; en supposant que l'entier soit dans le low word d'EAX
    mov MonReelAConvertir,ax
    FINIT ;operation sur les FPU's
    FILD MonReelAConvertir ; pousse sur le pile FPU
    FIST MonReel ; "POP" le reel en mémoire
    il est imprtant de mettre la valeur à convertir en mémoire avant de la poussé sur la pile FPU. Il est impossible de faire un FILD avec un registre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILD eax ; IMPOSSIBLE !
    la taille de récupération dépend de la taille de l'emplacement où l'on récupère.(voir ce sujet pour plus de précision: Sujet sur les réels )

    FIST ne sert que pour les entiers (sa contrepartie pour les réels est FSTP). L'instruction FISTP est semblable à FIST mais permet aussi de récupérer sur un Quadword.

    Voilà.

    Neitsa

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Si tu tiens à travailler sur de la virgule flottante, l'indispensable, est d'avoir une référence du fpu. Tu aurais toutes les instructions fpu, et tu pourrais voir les différentes voies pour arriver à cette conversion. Ceux qui ont crée le fpu ne sont pas illogiques non plus, ton problème est un problème qui se pose à tous ceux qui utilisent le fpu. Donc il y a une instruction rien que pour cela. Seulement, le format des données qu'elle attend n'est pas aussi simple lui. Le post de Neitsa répond parfaitement à ta question.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    marci beaucoup de m'aider
    moi je cherche le prog qui transforme un entier en virgule flottante sur assembleur 8086
    ( la mantisse sur 12 bits 3 pour le biais et 1 pour le signe. .

    aider moi stp c urgent merci

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    il n'y a pas de fpu ?

    N'aurait-ce pas un rapport avec cela :

    http://www.developpez.net/forums/viewtopic.php?t=191962

    ?

    Je veux dire, tu veux convertir à la cro magnon ?
    Je ne connais pas du tout les réel 16 bits, suis-ce les mêmes règles que le format IEEE 32, 64 et 80 bits ?

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    oui c les même règle ( norme IEEE,)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Alors, si c'est une simple conversion de format, c'est relativement facile.

    tu as un nombre 16 bits, que tu dois transformer en une mantisse 12 bits, donc, supprimer quatre bits les moins significatifs. Mais règle très importante, le premier chiffre doit être un 1. A vrai dire, les autres chiffres ne t'intressent que peu. Donc, déterminer où est le premier 1. Exemple :

    001a bcde fghi jkl (base 2)

    (a, b, c, d, e, f, g, h, i, j, k, l = {0, 1})

    devra être converti en

    1,abcdefghijkl (base 2)

    le 1 sera implicite, mais il reste 13 x à écrire. La mantisse ne peut contenir que 12 chiffres. Il faut donc suppimer le moins important le dernier.

    1,abcdefghijk (base 2)

    Deuxième exemple :

    0000 0001 abcd efgh
    sera converti de même en

    1,abcdefgh

    Mais il y a trop peu de x. Peu importe, ca tombe juste, remplacons les chiffres manquant par des 0 :

    1,abcdefgh0000


    L'algorithme est donc simple :


    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
     
    Exposant = 16
     
    ; Trouver le premier bit non nul 
     
    Décaler de 1 bit vers la gauche, en insérant un 0 à droite
    |
    | Exposant = Exposant - 1
    | 
    Tant que le bit sortant n'est pas 1
     
     
    ; Revenir sur 12 bits :
     
    Décaler vers la droite de 4 bits
    Remarquons que la boucle risque de ne jamais finir, si le nombre est nul, donc il faut insérer un test au préalable.

    L'exposant, obtenu doit juste être "biased" (connais pas la traduction française), donc lui ajouter 16 si je ne me trompe pas, puisque si l'on prend un nombre ou le bit de poid fort est à 1 on à :

    1abc defg hijk lmno

    que l'on décale d'un bit vers la gauche :

    abcd efgh ijkl mno0

    on a obtenu un 1 donc la boucle va s'arreter et l'exposant est 16 décrémenté de 1 soit 15, ce qui nous donne :

    1,abcdefghijkl * 2 ^ 15

    soit

    1abcdefghijkl000

    ce qui est bien notre nombre emputé de ses derniers chiffres.


    Maintenant, il faut s'occuper du signe. La méthode que j'ai écrite marche pour des nombres non signés. On peut généraliser aux nombres signés, en notant le signe en récupérant le bit de signe, et en prenant la valeur absolue. (Je triche dans mon écriture d'algorithme pour que ce soit directment retranscriptible en asm ^^)


    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
    29
    30
    31
    32
    33
    34
     
    Si (Nombre = 0)
    |
    | Fin de la fonction, plus rien à faire, la représentation IEEE est 0
     
    Si (Nombre < 0)
    |
    | Signe = Négatif
    | Nombre = -Nombre
    |
    Sinon
    |
    | Signe = Positif 
     
     
    Exposant = 16
     
    ; Trouver le premier bit non nul
     
    Décaler de 1 bit vers la gauche, en insérant un 0 à droite
    |
    | Exposant = Exposant - 1
    | 
    Tant que le bit sortant n'est pas 1
     
     
    ; Revenir sur 12 bits :
     
    Décaler vers la droite de 4 bits
     
     
    ; Biased Exponant 
     
    Exposant = Exposant + 16
    soit en asm

    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
    29
    30
     
      xor ax, ax ; Resultat
      mov bx, Nombre
      test bx, bx
      jz Zero
      mov cx, 20h ; Biased Exponant
      jns Boucle
     
      ; Nombre Négatif
      or bx, 8000h ; Bit de signe
     
    Boucle:
      dec cx ; Exposant = Exposant - 1
      shl bx, 1
      jnc Boucle
     
     
      ; Revenir sur 12 bits :
     
      shr bx, 4
     
     
      ; Composition du nombre :
     
      shl cx, 12
      or ax, cx
      or ax, bx
     
    Zero:
      ret

    Bon, j'espère que c'était la question :/ En tout cas, il y a certainement une dizaine d'erreur, donc à bien comprendre pour vérifier.

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

Discussions similaires

  1. Conversion Image 32 bit virgule flottante en 8 bit niveaux gris
    Par magid31 dans le forum Général Java
    Réponses: 37
    Dernier message: 05/06/2012, 13h33
  2. Conversion virgule fixe - virgule flottante
    Par Doug0 dans le forum Débuter
    Réponses: 4
    Dernier message: 29/02/2012, 11h27
  3. [Débutant] Imprécision des nombres à virgule flottante
    Par Saturnin123 dans le forum Général Python
    Réponses: 6
    Dernier message: 31/08/2011, 21h21
  4. Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)
    Par vinssieux dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 15/05/2008, 09h40
  5. [débutant mais pas trop] conversion string->entier
    Par Biosox dans le forum Débuter
    Réponses: 5
    Dernier message: 06/01/2006, 22h41

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