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

在AsmJit库中实现64位有符号整数除法出错,如何修复?

64位有符号整数除法代码修复

你的代码问题出在对x86_64架构下有符号整数除法的规则理解有误,以下是具体问题和修复方案:

问题分析

  • x86_64的64位有符号除法idiv指令,要求被除数是RDX:RAX(RDX存高64位,RAX存低64位),且需要对被除数进行符号扩展(而非清零EDX)
  • 你的代码错误使用了32位寄存器操作,且没有使用目标计算值R8,反而用了无关的R10
  • xor_ (EDX, EDX)是无符号扩展操作,会破坏有符号数的符号位,导致负数除法结果错误

修复后的代码

a.mov(RAX, R8);       // 将被除数R8移入RAX(低64位)
a.cqo();              // 将RAX的符号位扩展到RDX,组成RDX:RAX的64位有符号被除数
a.idiv(R9);           // 执行有符号除法,RAX=RDX:RAX/R9,RDX=余数
a.mov(R8, RAX);       // 将结果存入R8

关键说明

  • cqo指令是x86_64特有的,专门用于将RAX中的64位有符号数扩展为128位的RDX:RAX,替代32位模式下的cdq指令
  • 执行idiv R9后,商自动存在RAX中,余数存在RDX中,按需取用即可
  • 全程使用64位寄存器(RAX、RDX而非EAX、EDX),确保操作的是64位整数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:38:13