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 :

[8086] Diviser un réel par un entier


Sujet :

Assembleur

  1. #1
    Membre régulier

    Inscrit en
    Février 2004
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 120
    Points : 80
    Points
    80
    Par défaut [8086] Diviser un réel par un entier
    salut @ tous,
    comment faire cette division:
    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,

    en fait sur les x86 il existe deux unités de calcul, 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.

    Pour utiliser le FPU il faut faire appel au coprocesseur sur les anciens processeurs de la gamme x86 (comme le 8087). Sur les nouveaux (à partir du 486 [à vérifier, c'est peut être antérieur, je ne me rapelle plus]), le coprocesseur est dans la même unité.

    voilà un bout de code pour 486 (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
     
     
    .486
    .model flat, stdcall  ;modele mémoire 32 bits
    option casemap :none  ;sensible à la casse
     
    .data
    nombre1 REAL4 7.5 ; réel codé sur 4 bytes
    nombre2 DWORD 2 ; entier codé sur 4 bytes
     
     
    .code
    start:
     
        finit ; initialise le coprocesseur arithmétique
        fld nombre1 ; charge le réel sur le FPU (st0)
        lea ebx, nombre2 ; ebx = adresse de nombre2
        fidiv dword ptr [ebx] ; division d'un réel par un entier
     
    end start
    Il existe plusieurs formes pour FIDIV, ici j'utilise la forme "FIDIV mem32" ou mem32 est une adresse mémoire pointant sur le nombre entier.

    Une fois FIDIV exécutée, st0 (le registre du haut de la pile FPU) contient 3.75 codé au format IEEE754. (en hexadécimal, double précision : 4000 F0000000 00000000 )

    Pour plus d'info sur ce format voir http://en.wikipedia.org/wiki/IEEE_754

    J'espère que ca répond à la question

  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
    La question est légèrement floue :

    comment faire cette division:

    Code :
    7.5/2


    tu précises diviser un réel...

    Donc deux solutions : (syntaxe RosAsm)
    Soit tu codes en dur car il est question de constante (j'imagine que non... quand-même ) -> [MaVarReel: R$ 3.75]

    Soit effectivement, la fpu en vérifiant que tu rends la pile en état :

    Pour un float et en utilisant la pile pour compléter ce que Neitsa t'a indiqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [MaVarReel: R$ 7.5]
     
    push 2
     
    fld R$MaVarReel | fidiv D$esp | fist D$esp | fstp R$MaVarReel
     
    pop eax
    R$MaVarRell contient 3.75 au format réel et eax la valeur arrondie integer (selon la forme d'arrondi demandé à la FPU).

    La forme peu paraître compliquée dans un premier temps mais tu verras que c'est très utile pour le chargement de constantes temporaires sans déclarations préalables comme dans l’exemple bourrin suivant. De plus, dans certains cas, tu peux vouloir récupérer dans un registre un contenu du lifo fpu.

    fld1 fldz etc. permettent cependant de charger quelques constantes mais pas de fld2... désolé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [MaVarReel: R$ 7.5 ;(attention à l'alignement QWORD)
     MaConstanteFloat2: F$ 2 ] ;(attention à l'alignement DWORD
     
    fld R$MaVarReel
    fdiv F$MaConstanteFloat2
    fstp R$MaVarReel
    - fst retire un contenu du lifo
    - fstp idem mais pop le lifo


    Tu peux aussi, si le contenu ne t'intéresse pas utiliser fstp ST0


    voilivoilo
    @+

Discussions similaires

  1. [WD-2007] Remplacement abréviation par mot entier
    Par Le Méthanier dans le forum Word
    Réponses: 2
    Dernier message: 05/06/2010, 14h32
  2. Débutant : diviser un tableau de valeur par 1000
    Par sebest95 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 27/05/2008, 14h53
  3. Réponses: 4
    Dernier message: 01/02/2008, 18h13
  4. Division de deux réels avec un résultat entier
    Par Triste dans le forum Débuter
    Réponses: 7
    Dernier message: 30/11/2007, 14h23

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