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

amd64架构idiv指令异常:负数除法返回大正数问题咨询

AMD64架构下IDIV指令负数除法异常问题解决

问题原因

AMD64的idiv指令执行带符号整数除法时,被除数是128位的rdx:rax组合(rdx为高64位,rax为低64位)。当被除数是64位负数时,必须对rdx进行符号扩展,而非直接清零。

你原代码中用xor rdx, rdx将rdx置为0,此时rdx:rax被解析为一个128位的大正数(rax是-10的64位补码0xFFFFFFFFFFFFFFF6,加上rdx=0后,整体为0x0000000000000000FFFFFFFFFFFFFFF6,最高位为0,属于正数),因此idiv计算出的结果是这个大正数除以5的商,也就是你得到的3689348814741910321。

修复方案

使用cqo指令替代xor rdx, rdx,cqo会自动将rax的符号位扩展到rdx的所有位,让rdx:rax正确表示128位的带符号被除数:

mov rax, -10
mov rbx, 5
cqo ; 将rax的符号位扩展到rdx,形成正确的128位带符号被除数
idiv rbx
push rax ; 此时rax的值为-2,符合预期

补充说明

  • 对于32位带符号除法(使用eax作为被除数低32位),对应的符号扩展指令是cdq,会将eax的符号位扩展到edx。

内容的提问来源于stack exchange,提问作者les-citrons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 14:52:06