11

我正在尝试在汇编中划分两个数字。我正在为 Irvine 计算机书的 Irvine 组装工作,我无法为我的生活做除法工作。

这是我的代码

.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

WriteDec 应写入 eax 寄存器中的任何数字(应在除法调用后设置为商)。相反,每次我运行它时,Visual Studio 都会崩溃(但是程序确实会编译)。

4

3 回答 3

17

在进行除法之前,您需要对 EDX 寄存器进行零扩展:

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

;set edx to zero是 MASM 中的评论。如果您在 C 中使用内联汇编,我不知道它是否会起作用,所以如果您是,请不要复制它:)

于 2010-02-13T00:28:52.543 回答
4

是的,您需要设置edx为零。

最简单的方法是:

xor edx, edx
于 2010-05-22T01:20:21.550 回答
0

我认为上述原因是正确的,因为当你将 eax 除以 ebx 时,两者都是 32 位数字,但被除数需要是 64 位除数是 32 位,因此它认为 edx 作为 msb ...u 可能使 edx 0 或代替使用 3bx 只使用 bx ..这样你将把一个 32 位数字除以一个 16 位数字

于 2010-03-01T12:58:15.893 回答