2010-02-13 45 views
8

我想在程序集中分两个数字。我正在为Irvine的intel计算机大会工作,我无法为我的生活做分工。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崩溃(程序会编译)。

+1

你能在Visual Studio调试器,通过它一步?如果你进入每条指令,你会得到多少? – 2010-02-13 00:24:52

+0

Project.exe中的0x00401075未处理的异常:0xC0000095:整数溢出。 在呼叫div后立即发生。 – 2010-02-13 00:26:19

+0

如果您除以2并且您对性能感兴趣,则可能需要考虑使用SHR。 – 2010-02-15 05:52:53

回答

13

您需要零扩展您的EDX做除法之前登记:

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

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

+0

是的!非常感谢你帮助我。 – 2010-02-13 00:30:00

+1

除了将EDX显式调零以外,还可以使用CDQ指令将扩展EAX签名为EDX。如果EAX非负数,则EDX填充零;如果EAX为负值,则EDX填充一位。 – 2010-02-18 18:25:15

+0

是的,在这方面你是对的,但是OP在做* un *签名的部门,所以我保持我的答案简单。 – slugster 2010-02-18 22:25:25

0

我认为上述原因是正确的,因为当你用ebx分割eax是32位数字,但股息需要是64位除数是32位,所以它认为EDX为MSB ...你可能会使edx 0或代替使用3bx只使用bx ..这样你将划分一个32位按16位数字编号

3

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

做到这一点,最简单的方法是:

xor edx, edx