|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : mars 2006 Messages : 51 ![]() |
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
|
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Inscription : juin 2002 Messages : 113 ![]() |
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 ... |
|
|
00
|
|
|
#3 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
cbw :al étendu dans ax
cwd ;signe de ax etendu à dx cwde ;ax étendu dans eax cdq ;signe de eax étendu dans edx |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : mars 2006 Messages : 51 ![]() |
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 |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com