You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MASM汇编遇未处理除零错误,除数设为5却报错求原因

问题分析与解决

你遇到的“除以零”错误实际是除法溢出导致的——x86架构中,除法溢出会触发与除以零相同的异常。

错误原因

32位div指令的执行规则是:

  • 被除数由EDX:EAX组成64位值(EDX为高32位,EAX为低32位)
  • 除数为指定的寄存器/内存值
  • 计算出的商必须能完整存入EAX(32位范围),余数存入EDX

你的代码中:

mov eax,10    ; EAX = 0x0000000A
mov edx,5     ; EDX = 0x00000005
div edx       ; 被除数是 EDX:EAX = 0x000000050000000A,除以5

计算后商为0x100000002,这个数值超出了32位寄存器EAX的存储上限(最大为0xFFFFFFFF),触发除法溢出,系统将其识别为“除以零”异常抛出。

解决方案

如果只是执行32位范围内的除法(10÷5),需要先将高32位EDX清零,确保被除数是32位值扩展的64位(高32位为0),同时建议用其他寄存器存储除数,避免和EDX混淆:

mov eax,10
xor edx,edx   ; 清零EDX,此时被除数为 0x000000000000000A
mov ebx,5     ; 用EBX存储除数
div ebx

另外,代码还缺少str_input_format的定义,需在.data段补充:

.data
str_input_format db "%d",0

最后,main函数需要添加返回指令完成正确退出:

main PROC
    push ebp
    mov ebp,esp

    mov eax,10
    xor edx,edx
    mov ebx,5
    div ebx

    push eax
    push offset str_input_format
    call printf
    
    pop ebp
    ret  ; 函数返回指令
main ENDP

内容的提问来源于stack exchange,提问作者I_4m_Z3r0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:27:09