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
相关产品推荐
相关产品推荐

