Pergunta

Estou tentando dividir dois números na montagem. Estou trabalhando fora da Assembléia de Irvine para o Intel Computers Book e não posso fazer a divisão funcionar para a minha vida.

Aqui está o meu 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

Onde o WritedEC deve escrever qualquer número no registro da EAX (deve ser definido como o quociente após a chamada da divisão). Em vez disso, toda vez que eu executar o Visual Studio trava (o programa compila).

Foi útil?

Solução

Você precisa zero estender seu registro EDX antes de fazer a divisão:

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

a ;set edx to zero é um comentário na MASM. Não sei se funcionará se você estiver usando a montagem embutida em C, então não copie se for :)

Outras dicas

Sim, você precisa definir edx a zero.

A maneira mais fácil de fazer isso é:

xor edx, edx

Eu acho que a razão acima mencionada está correta porque, quando você divide o EAX pelo EBX, ambos são números de 32 bits, mas o dividendo precisa ser de 64 bits divisor é de 32 bits e, portanto, considera o edx como o msb ... você pode fazer Edx 0 ou, em vez disso, de usar 3bx Use apenas BX..ENTA PORTA, você dividirá um número de 32 bits por um número de 16 bits

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top