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都会崩溃(但是该程序确实可以编译)。
I'm trying divide two numbers in assembly. I'm working out of the Irvine assembly for intel computers book and I can't make division work for the life of me.
Here's my code
.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
Where WriteDec should write whatever number is in the eax register (should be set to the quotient after the division call). Instead everytime I run it visual studio crashes (the program does compile however).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在进行除法之前,您需要对 EDX 寄存器进行零扩展:
;set edx to Zero
是 MASM 中的注释。我不知道如果您在 C 中使用内联汇编它是否会起作用,所以如果您是,请不要复制它:)You need to zero extend your EDX register before doing the division:
the
;set edx to zero
is a comment in MASM. I don't know if it'll work if you are using inline assembly in C, so don't copy it if you are :)是的,您需要将 edx 设置为零。
最简单的方法是:
Yes, you need to set
edx
to zero.The easiest way to do this is:
我认为上述原因是正确的,因为当你将 eax 除以 ebx 时,两者都是 32 位数字,但被除数需要是 64 位,除数是 32 位,因此它将 edx 视为 MSB...你可以使 edx 为 0 或者改为使用 3bx 时仅使用 bx..这样你就可以将 32 位数字除以 16 位数字
i think the above mentioned reason is correct because when u divide eax by ebx both are 32 bit numbers but the dividend needs to be 64 bit divisor is 32 bit and so it considers edx as the msb...u may make edx 0 or instead of using 3bx use only bx..in that way u will divide a 32bit number by a 16 bit number