masm除法溢出

发布于 2024-08-21 13:08:57 字数 351 浏览 5 评论 0原文

我正在尝试在汇编中除两个数字。我正在用英特尔计算机书的尔湾大会工作,我无法让部门为我的一生工作。

这是我的代码

.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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紅太極 2024-08-28 13:08:57

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

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

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

You need to zero extend your EDX register before doing the division:

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

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 :)

心碎的声音 2024-08-28 13:08:57

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

最简单的方法是:

xor edx, edx

Yes, you need to set edx to zero.

The easiest way to do this is:

xor edx, edx
挽容 2024-08-28 13:08:57

我认为上述原因是正确的,因为当你将 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文