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 :

Mettre une racine dans un registre.


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Par défaut Mettre une racine dans un registre.
    Bonjour,

    J'aimerais mettre la racine carré de 37 dans un registre avec l'instruction mov. Mais comme ce n'est pas un entier, je ne vois pas vraiment.

    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
    Par défaut
    Bonjour,

    Citation Envoyé par Chacha35 Voir le message
    Bonjour,

    J'aimerais mettre la racine carré de 37 dans un registre avec l'instruction mov. Mais comme ce n'est pas un entier, je ne vois pas vraiment.

    Merci d'avance.
    Pour calculer la racine carrée d'un nombre tu es obligé de passer par le FPU (coprocesseur mathématique).

    Plus précisément il n'existe pas d'instruction calculant la racine carrée avec les registres généraux. Tu peux toujours tenter une approximation sur le CPU via quelques formules connues ([ame]http://en.wikipedia.org/wiki/Methods_of_computing_square_roots[/ame]).

    Pour le FPU, ça ressemble à ça (syntaxe MASM):

    Code Asm : 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
     
    .686
    .xmm
    .mmx
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
    assume fs:nothing
     
    .data
    Num WORD 37
     
    .code
    start:
    	finit				; init du coprocesseur
    	fild word ptr[Num]	; charge 37 sur le FPU ( ST(0) )
    	fsqrt				; calcule la racine carrée
    	sub esp, 8			; réserve 8 octets sur la pile
    	fstp qword ptr[esp]	; met la racine carrée sur la pile
     
    	; passe la racine carrée dans les registres généraux.
    	mov eax, dword ptr[esp]
    	mov ecx, dword ptr[esp+4]
     
    	; stack cleanup
    	add esp, 8
     
    	ret
     
    end start

    Il ne faut pas oublier que la racine carrée, puisqu'elle sort du FPU, est codée au format [ame="http://en.wikipedia.org/wiki/IEEE_754"]IEEE 754[/ame]. Ceci dit tu peux toujours tester les particularités du nombre flottant dans EAX et ECX (pour notre exemple), mais l'intérêt est vraiment très limité.

    tu peux obtenir la valeur entière de la racine carrée via le code suivant, qui se résumé à ceci:

    eax = 6 = round(sqrt(37))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    start:
    	finit				; init du coprocesseur
    	fild word ptr[Num]	; charge 37 sur le FPU ( ST(0) )
    	fsqrt				; calcule la racine carrée
    	frndint			; arrondi 
    	sub esp, 4			; réserve un DWORD
    	fistp dword ptr [esp]	; extrait l'entier du FPU vers la pile
    	mov eax, dword ptr [esp]; récupère l'entier depuis la pile
    	add esp, 4			; stack cleanup
     
    	ret
     
    end start

  3. #3
    Membre éclairé Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Par défaut
    Merci beaucoup. Très bonne réponse.

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

Discussions similaires

  1. Mettre une valeur dans un registre
    Par TWEESTY dans le forum x86 32-bits / 64-bits
    Réponses: 29
    Dernier message: 27/11/2013, 21h50
  2. Réponses: 5
    Dernier message: 03/02/2004, 14h20
  3. [Drag & Drop] Mettre une fiche dans un panel
    Par corwin_d_ambre dans le forum Composants VCL
    Réponses: 5
    Dernier message: 12/01/2004, 10h46
  4. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55
  5. Peut on mettre une image dans une BD MySQL ?
    Par maddog2032 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/07/2003, 16h18

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