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

