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 :

Un nombre à virgule !


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Un nombre à virgule !
    Dites moi, sous purebasic, je déclare une variable float "xx1.f". Cette variable peux donc contenir un quelconque nombre a virgule.
    Je voudrais en assembleur ne prendre que la partie entiere (avant la virgule quoi !)
    Alors, je fais :
    mov eax,[v_xx1]

    je met ma valeur dans Eax. Donc, je pense qu'il y a la partie entiere dans un registre précis, et la virgule autre part !

    Dites moi dans quel registre dois-je mettre xx1 et l'endroit où se trouvera le nombre entier ??

    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,

    Je crois qu'il y a mécompréhension entre les différents modes de calcul sur un processeur.

    sur les x86 il existe deux unités de calcul principales, l'ALU (Arithmetic-logic unit ) qui sert au calcul sur les entiers et le FPU (Floating point unit) qui sert au calcul sur les réels.(Sans parler des MMX, SSE, 3DNOW!).

    Bien que c'est différentes unités puissent travailler ensembles, la représentation des nombres est totalement différentes : Binaire "simple" (faute de trouver un autre mot) sur l'ALU et format IEEE 754 sur le FPU.

    Si tu souhaites extraire la partie entière d'un nombre réel, il faut :

    1) placer le réel sur la pile FPU
    2) Changer le mode de "rounding" (arrondi) du FPU.
    3) Arrondir le réel
    4) Extraire le réel en tant qu'entier

    Exemple de code (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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    .486
    .model flat, stdcall  ;modele mémoire 32 bits
    option casemap :none  ;sensible à la casse
     
    .data
    Troncation	WORD		0FFFh 
    ALIGN DWORD
    nombreReel	REAL4		-4.6 ; réel simple précision
     
    .data?
    Entier				DWORD ?
    MotDeControl 		   WORD ? 
     
    .code
    start:
     
    	finit				; initialisation du FPU
    	fstcw MotDeControl	; sauvegarde du mot de control
    	fldcw Troncation	; chargement du mode de troncation
    	fld nombreReel		; placement du réel sur le FPU
    	frndint				; arrondi
    	fistp Entier		; extraction en tant qu'entier
    	fldcw MotDeControl	; remise en place du mot de control sauvegardé
    	mov eax, Entier		; EAX contient maintenant l'entier !
     
    end start
    Ici EAX, à la fin de l'exemple, vaut 0xFFFFFFFC soit -4 en valeur signée. Si l'on avait mis un réel comme 5.46 par exemple, le résultat dans EAX aurait été 5.

    Le seul problème dans code est la manipulation du mot de controle, très coûteuse en terme de temps processeur, mais on est obligé de sauvegarder et restaurer le mot de controle sans quoi il peut y avoir des problèmes par la suite...

    Pour plus d'infos sur les différentes instructions, et notamment la manipulation du mot de controle (Floating Point Control Word) pas toujours facile à appréhender, voir les manuels intel.

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Juste pour compléter le propos (parfaitement complet pour la virgule flottante), tu peux aussi travailler en virgule fixe (vraiment fixe en utilisant ax pour la partie décimale et ax+2 pour la partie entière). En fait tout est question de contexte, que tu ne précises pas...

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

Discussions similaires

  1. insertion d'un nombre a virgule dans un champ avec un requete sql
    Par sundjata dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/05/2006, 16h29
  2. 50.00 n'est pas un nombre en virgule flottante correct
    Par Merfolk dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/01/2006, 00h44
  3. [debutant] limiter nombre apres virgule
    Par tony_big_guy dans le forum Langage
    Réponses: 6
    Dernier message: 11/01/2006, 14h29
  4. Probleme de requete, clause where et nombre a virgule..
    Par forest82 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/12/2005, 19h19
  5. sum avec des nombres avec virgule
    Par Bruno2000 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/09/2004, 15h01

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