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 :

Calcul flottant


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut Calcul flottant
    Bonjour

    J'aimerais savoir simplement comment placer une valeur flottante dans un registre de manière immédiate. C'est à dire, je cherche à faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MOV eax, 1.2
    MOV DWORD[__myFloat], eax
    FLD DWORD[__myFloat]
     
    ou mieux
     
    MOV DWORD[__myFloat], 1.2
    FLD DWORD[__myFloat]
    Bien sûr, je n'aimerais pas avoir à déclarer __myFloat: dd 1.2 dans le segment de donnée... Ou alors si je le fais, je voudrais pouvoir réassigner une nouvelle valeur à [__myFloat] durant l'exécution.

    Merci d'avance.

  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,

    A ma connaissance, impossible de faire plus court qu'ne passant par le data segment.
    Parce que:
    1) FLD n'accepte que les emplacements mémoires ou les registres ST(x).
    2) MOV eax, 1.2 <= l'opérande de droite ne peut être un réel ou un BCD
    3) MOV DWORD[__myFloat], 1.2 <= Même chose ici.

    En passant par le DS, si vous souhaitez pouvoir changer [__myFloat] durant l'execution, vous pouvez declarer cette variable en tant qu'initialisée et la passer pendant l'exécution dans un emplacement non initialisée. Libre a vous ensuite de changer la valeur de l'emplacement du data segment non-initialisé.

    (Exemple, syntaxe masm)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    .data
            MYFLOAT        dd 1.2
            TRASHDATA   dd 0.2
     
    .data?
            MYFLOAT_UNKNOWN dd ?
     
    .code
            MOV EAX,MYFLOAT
            MOV MYFLOAT_UNKNOWN,EAX
            FLD MYFLOAT_UNKNOWN                ; ST(0) = 1.2
            FADD  TRASHDATA                        ; ST(0) = 1.4
            FISTP MYFLOAT_UNKNOWN                ; emplacement data = 1.4
    Il est tout a fait possible que je me trompe, et je ne suis pas très familier avec les calculs FPU...

    Amicalement, Neitsa.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Merci pour la réponses, mais ça nécessite de définir des valeurs flottantes ce que je ne veux pas faire...

    En fait, j'ai dû me résoudre à écrire directement la valeur flottante en hexa et ça marche parfaitement bien pour ce que je veux faire Du coup, je peux utiliser mov EAX pour charger mon nombre.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    Attention Neitsa dans le code tu as montré, à la fin tu fais
    fistp MYFLOAT_UNKNOWN
    fistp c'est integer store, en clair ton MYFLOAT sera stocké comme un int, pas un float, il faut faire fstp. Pour ton prob ColdHand ya deux solutions
    Soit si tu utilises masm tu utilises la macro fpc, qui donne l'illusion de pouvoir utiliser des immediats avec les instructions fpu
    ex : FLD fpc(1.5)
    mais comme je dis, ce n'est qu'une illusion qui procure un certain confort de codage, mais en fait la macro déclare la valeur passée dans le segment data. Si cette solution t'intéresse, je te file une version plus évoluée de cette macro, elle fait la même chose sauf qu'elle évite les valeurs dupliquées ( si tu mets deux fois FLD fpc(1.5) dans ton programme, avec la macro d'origine tu déclares 2 fois 1.5, alors qu'avec celle là les deux instructions iront chercher le 1.5 au même endroit )

    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
    35
    36
    37
    38
    39
    40
    41
    42
     
    fpc MACRO val:REQ			; this is BitRAKE's fpc macro
    	LOCAL w,x,y,z,zz,ww
     
    	;; split type and value, defaulting to REAL4
    	z INSTR 1,<&val>,<! >
    	IF z EQ 0
    		y TEXTEQU <REAL4>
    		x TEXTEQU <&val>
    	ELSE
    		y TEXTEQU @SubStr(<&val>,1,z-1)	;; Type
    		x TEXTEQU @SubStr(<&val>,z+1,)	;; Value
    	ENDIF
     
    	;; replace . with _
    	z INSTR 1,x,<!.>
    	IF z EQ 0
    		w TEXTEQU x
    		x CATSTR x,<.0> ;; prevent error message
    	ELSE
    		w CATSTR @SubStr(%x,1,z-1),<_>,@SubStr(%x,z+1,)
    	ENDIF
     
    	;; replace - with _
    	zz INSTR 1,w,<!->
    	IF zz EQ 0
    		ww TEXTEQU w
    	ELSE
    		ww CATSTR @SubStr(%w,1,zz-1),<_>,@SubStr(%w,zz+1,)
    	ENDIF
     
    	;; figure out global name for constant
    	z SIZESTR y ;; use last char for size distiction
    	ww CATSTR <__>,ww,<r>,@SubStr(%y,z,1)
     
    	IF (OPATTR(ww)) EQ 0 ;; not defined
    		CONST$fpu SEGMENT
    			ww y x
    		CONST$fpu ENDS
    	ENDIF
          EXITM ww
    ENDM
    l'autre solution, c'est comme tu l'as dit d'écrire directement la valeur en hexa dans le registre. Là encore je peux un peu t'aider, car j'ai écrit un pti prog tout con tout laid qui converti un float "littéral" (par ex 1.2) en son codage hexadécimal (en simple ou double au choix).
    http://perso.club-internet.fr/jeannin.jeanpaul/Conv.zip

  5. #5
    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
    ,

    Attention Neitsa dans le code tu as montré, à la fin tu fais
    fistp MYFLOAT_UNKNOWN
    Ah oui, pardon, merci de m'avoir corrigé Chris_hks. Il est temps pour moi de m'investir dans les calculs FPU...

    Très intéressante cette macro, merci Chris.

    Pour rester dans MASM et les FPU, il y a une lib spéciale pour ces deux dernier:

    http://www.masmforum.com/viewtopic.php?t=1535

    Vous trouverez dans ce topic un service pack pour MASM32 et la dernière version de la fpulib (tout en bas dans le message).

    Amicalement, Neitsa.

Discussions similaires

  1. Calcul flottant
    Par electron22 dans le forum VHDL
    Réponses: 16
    Dernier message: 12/03/2014, 09h00
  2. Faire des calculs flottants précis
    Par shared_ptr dans le forum C++
    Réponses: 6
    Dernier message: 17/08/2011, 00h25
  3. petit problème de calcul flottant
    Par fred_sell dans le forum Débuter
    Réponses: 19
    Dernier message: 02/07/2010, 15h03
  4. Erreur de calcul flottant
    Par saimonn dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/08/2007, 16h26
  5. Calcul avec des flottants
    Par tarzent dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/12/2005, 11h20

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