masm师溢出

时间:2010-02-13 00:21:05

标签: assembly x86 masm

我正在尝试在汇编中划分两个数字。我正在为英特尔计算机书的欧文大会工作,我无法为我的生活做分工。

这是我的代码

.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崩溃(程序确实会编译)。

3 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:4)

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

最简单的方法是:

xor edx, edx

答案 2 :(得分:0)

我认为上面提到的原因是正确的,因为当你通过ebx划分eax时,两者都是32位数,但是除数需要是64位除数是32位,所以它认为edx是msb ...你可以使edx 0或代替使用3bx只使用bx ..就这样你将32位数除以16位数