2010-02-13 10 views
8

J'essaie de diviser deux nombres dans l'assemblage. Je travaille sur l'assemblage d'Irvine pour le livre d'ordinateurs Intel et je ne peux pas faire de division pour la vie de moi.masm division overflow

Voici mon code

.code 
main PROC 
    call division 
    exit 
main ENDP 

division PROC 
    mov eax, 4 
    mov ebx, 2 
    div ebx 
    call WriteDec 
    ret 
divison ENDP 

END main 

Où WriteDec devrait écrire ce nombre est dans le registre eax (doit être réglé sur le quotient après l'appel de la division). Au lieu de cela, chaque fois que je l'exécute, le studio visuel plante (le programme compile cependant).

+1

Pouvez-vous parcourir dans le débogueur Visual Studio? Jusqu'où allez-vous si vous entrez dans chaque instruction? –

+0

Exception non gérée à 0x00401075 dans Project.exe: 0xC0000095: dépassement d'entier. Happens juste après l'appel à div. –

+0

Si vous divisez par 2 et vous êtes intéressé par la performance, vous pouvez envisager d'utiliser SHR. –

Répondre

13

Vous devez zéro étendre votre registre EDX avant de faire la division:

mov eax, 4 
mov ebx, 2 
xor edx, edx   ;set edx to zero 
div ebx 
call WriteDec 

le ;set edx to zero est un commentaire dans MASM. Je ne sais pas si cela fonctionnera si vous utilisez l'assemblage en ligne dans C, donc ne le copiez pas si vous êtes :)

+0

Oui! Merci beaucoup de m'avoir aidé avec ça. –

+1

Au lieu de mettre à zéro l'explicitation EDX, on utiliserait typiquement l'instruction CDQ pour signer l'extension EAX dans EDX. Si EAX est non négatif, EDX est rempli de zéros; si EAX est négatif, EDX est rempli avec un bit. –

+0

Oui, vous avez raison à cet égard, mais l'OP fait une division * un * signée, donc j'ai gardé ma réponse simple. – slugster

0

Je pense que la raison mentionnée ci-dessus est correcte parce que lorsque vous divisez eax par ebx à la fois sont des nombres de 32 bits mais le dividende doit être diviseur de 64 bits est de 32 bits et donc il considère edx comme le msb ... u peut faire edx 0 ou au lieu d'utiliser 3bx utiliser seulement bx .. de cette façon, vous diviserez un 32bit nombre par un nombre de 16 bits

3

Oui, vous devez définir edx à zéro.

La meilleure façon de le faire est la suivante:

xor edx, edx