p
u
b
l
i
c
i
t
é
publicité

Discussion: nasm division signé

  1. #1
    Invité régulier
    Inscrit en
    mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 61
    Points : 9
    Points
    9

    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 éclairé
    Profil pro
    Inscrit en
    juin 2002
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 149
    Points : 343
    Points
    343

    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 chevronné
    Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    476
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 476
    Points : 627
    Points
    627
    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
    Invité régulier
    Inscrit en
    mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 61
    Points : 9
    Points
    9

    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, 17h54
  2. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 21h37
  3. division de "double" par "0"
    Par ickis dans le forum C
    Réponses: 14
    Dernier message: 31/08/2003, 19h09
  4. Fonction divisant argument de type inconnu
    Par Nasky dans le forum C
    Réponses: 9
    Dernier message: 29/07/2003, 00h32
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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