Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Discussion: nasm division signé

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

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

    Informations forums :
    Inscription : juin 2002
    Messages : 131
    Points : 282
    Points
    282

    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
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 628
    Points
    628

    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
    52
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 52
    Points : 7
    Points
    7

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •