2010-02-13 12 views
8

Estoy tratando de dividir dos números en el ensamblaje. Estoy trabajando en la asamblea de Irvine para el libro de computadoras inteligentes y no puedo hacer que la división funcione por mi vida.overm division overflow

Aquí está mi código

.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 

Dónde WriteDec debe escribir cualquier número que se encuentra en el registro EAX (debe estar configurado en el cociente después de la llamada división). En cambio, cada vez que lo ejecuto, se bloquea el estudio visual (sin embargo, el programa sí compila).

+1

Puede usted paso a través de él en el depurador de Visual Studio? ¿Qué tan lejos llegar si ingresas en cada instrucción? –

+0

Excepción no controlada en 0x00401075 en Project.exe: 0xC0000095: desbordamiento de enteros. sucede justo después de la llamada a div. –

+0

Si divide por 2 y le interesa el rendimiento, puede considerar usar SHR. –

Respuesta

13

Necesitas cero ampliar su registro EDX antes de hacer la división:

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

la ;set edx to zero es un comentario en MASM. No sé si funcionará si está utilizando ensamblado en línea en C, así que no lo copie si está :)

+0

¡Sí! Muchas gracias por ayudarme con esto. –

+1

En lugar de poner a cero el carácter explícito de EDX, normalmente se usaría la instrucción CDQ para firmar la extensión de EAX a EDX. Si EAX no es negativo, EDX está lleno de ceros; si EAX es negativo, EDX se llena con un bit. –

+0

Sí, tienes razón en ese aspecto, pero el OP está haciendo una división * un *, así que mantuve mi respuesta simple. – slugster

0

Creo que el motivo mencionado es correcto porque cuando divide eax por ebx ambos son números de 32 bits, pero el dividendo debe ser de 64 bits, el divisor es de 32 bits, por lo que considera edx como el msb ... u puede hacer edx 0 o en lugar de usar 3bx, use solo bx..de esa forma dividirá un 32bit número por un número de 16 bits

3

Sí, debe configurar edx en cero.

La forma más sencilla de hacerlo es:

xor edx, edx 
Cuestiones relacionadas