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 :

nasm division signé


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut nasm division signé
    Bonjour à tous,
    je cherche à diviser deux entier signé codé sur 16 bits , logiquement lorsque j'utilise
    par exemple : idiv bx , si j'ai bien compris l'opération est dx:ax / bx .
    Le quotient est stocké dans ax et le reste dans dx .

    Déjà je ne comprend pas comment fonctionne dx:ax pour le numérateur, du coup je me suis contenté de mettre mon mot de 16 bits dans ax , ça fonctionne pour mon exemple 32000 / 30 ou 32000 / -30 .

    Mais par contre si je fait -32000 / -30 j'obtiens un chiffre négatif , j'ai compris que c'est du au fait le signe de ax n'est pas étendu à dx pour le numérateur, du coup il est toujours considéré comme positif à moins d'initialiser dx avec des 1 , mais la çà devient du chipotage .

    comment faire ? manipuler directement dx:ax ou alors étendre le signe de ax à dx .

    Est aussi à quoi sert ce fameux reste stocke dans dx, la division entière n'est pas censé ne laisser aucun reste ? comme en C

    Merci d'avance pour vos éclaircissement

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    INTEL a tout prévu : il existe une instruction pour étendre ax dans la paire dx:ax en conservant le signe éventuel de ax.
    C'est l'instruction : CWD.
    Si ax est " positif ", c'est-à-dire entre 0000h et 7FFFh, alors dx est mis à 0.
    Sinon, dx est mis à 1111111111111111b = FFFFh.

    Notez qu'il faut toujours remplir dx avant de diviser par bx, puisque le dividende est la paire dx:ax et non ax seul.
    Si vous ne pensez pas à remplir dx avant la division et si dx contenait une valeur non nulle suite à un calcul antérieur, le résultat ne sera pas celui escompté ...

    En ce qui concerne le reste, il n'a aucune raison d'être nul.
    Par exemple, la division de 150 par 7 donne un quotient de 21 et un reste de 3, car 150 = 21*7 +3.
    Il s'agit de la division entière complète, avec quotient et reste.
    Dans un langage de haut niveau, il est possible d'oublier le reste et de ne conserver que l'essentiel, à savoir le quotient.
    Mais ici, au niveau Assembleur, il n'y a aucune approximation.
    Tout est à disposition du programmeur, à lui de choisir ce qu'il veut garder ...

  3. #3
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    cbw :al étendu dans ax
    cwd ;signe de ax etendu à dx
    cwde ;ax étendu dans eax
    cdq ;signe de eax étendu dans edx

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup pour vos réponses ! J'ai le bon résultat désormais
    ok donc c'est intéressant d'avoir le reste si on veut calculer les chiffres décimaux par exemple .
    Enfin je n'ai pas encore vu la gestion des nombres a virgules par le processeur, je fais mes premiers pas en assembleur et je préfère ne pas mettre la charrue avant les bœufs

Discussions similaires

  1. nasm division d'un nombre en facteur de nombre premier
    Par Stanouf dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 10/01/2012, 18h54
  2. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 22h37
  3. division de "double" par "0"
    Par ickis dans le forum C
    Réponses: 14
    Dernier message: 31/08/2003, 20h09
  4. Fonction divisant argument de type inconnu
    Par Nasky dans le forum C
    Réponses: 9
    Dernier message: 29/07/2003, 01h32
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 19h14

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