Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 32-bits / 64-bits
x86 32-bits / 64-bits Architectures x86 32/64 bits et leurs outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/03/2012, 19h10   #1
zakuza
Invité régulier
 
Inscription : mars 2006
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 51
Points : 6
Points : 6
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
zakuza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 19h44   #2
Prof
Membre confirmé
 
Inscription : juin 2002
Messages : 113
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2002
Messages : 113
Points : 217
Points : 217
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 ...
Prof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 19h47   #3
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
cbw :al étendu dans ax
cwd ;signe de ax etendu à dx
cwde ;ax étendu dans eax
cdq ;signe de eax étendu dans edx
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 20h54   #4
zakuza
Invité régulier
 
Inscription : mars 2006
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 51
Points : 6
Points : 6
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
zakuza est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h43.


 
 
 
 
Partenaires

Hébergement Web