11
votes

Division de la division MASM

J'essaie de diviser deux chiffres en montage. Je travaille hors de l'Assemblée d'Irvine pour le livre d'ordinateurs Intel et je ne peux pas faire de la division pour la vie de moi.

Voici mon code P>

.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


7 commentaires

Pouvez-vous passer à travers cela dans le débogueur Visual Studio? Jusqu'où obtenez-vous si vous entrez dans chaque instruction?


Exception non conventionnelle à 0x00401075 dans Project.exe: 0xc0000095: Overflow entier. Arrive juste après l'appel à Div.


Si vous divisez par 2 et que vous êtes intéressé par la performance, vous voudrez peut-être envisager d'utiliser SHR.


@Greghewgill Comment pouvez-vous parcourir chaque instruction d'assemblage à l'aide de Visual Studio Debugger? Je n'ai toujours pas compris cela après quelques recherches Google.


@Andersongreen: Ils continuent à changer le nom de l'élément de menu et de la touche de raccourci pour y arriver. Recherchez quelque chose comme "Voir le démontage". Il y a une vue avec une fenêtre de registre, une fenêtre de mémoire, une visionneuse de pile, un démontage, etc. pour VS 2012 Voici les instructions: msdn.microsoft.com/en-us/library/a3cwf295.aspx


@Greghewgill sont des instructions équivalentes disponibles pour VS 2010?


@Andersongreen: Certainement, voir Google.com/Search?q=VS+2010+ Démontage


3 Réponses :


17
votes

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

le ; définir edx sur zéro est un commentaire dans MASM. Je ne sais pas si cela fonctionnera si vous utilisez un assemblage en ligne en C, alors ne le copiez pas si vous êtes :)


3 commentaires

Oui! Merci beaucoup de m'aider avec ça.


Au lieu de la mise à zéro Edx Explicity, on utiliserait généralement l'instruction CDQ pour signer étendre EAX dans EDX. Si EAX est non négatif, EDX est rempli de zéros; Si EAX est négatif, EDX est rempli d'un bits.


Oui, vous avez raison à cet égard, mais l'OP est en train de faire UN SIGNÉ DIVISION, j'ai donc gardé ma réponse simple.



0
votes

Je pense que la raison mentionnée ci-dessus est correcte, car lorsque vous divisez EAX par EBX, les deux 32 bits sont des nombres 32 bits, mais le dividende doit être de 32 bits de 32 bits et qu'il considère ainsi EDX comme msb ... u peut faire de l'EDX 0 ou au lieu d'utiliser 3BX Utilisez uniquement BX..Dans de cette façon, vous diviserez un nombre 32 bits par un nombre de 16 bits


0 commentaires

4
votes

Oui, vous devez définir EDX code> à zéro.

Le moyen le plus simple de le faire est le suivant: P>

xor edx, edx


0 commentaires