【发布时间】:2023-03-28 10:29:01
【问题描述】:
我正在尝试在[0 ... n-1] 范围内获得模n (0
指令idiv n将EDX:EAX(64位)除以n,然后离开
EAX=商,EDX=余数。 (n 是我代码中的一个寄存器)
我的问题是当 EDX:EAX 的内容为负数时,我在 EDX 中得到一个负数结果。
我找到的最简单的解决方案是:
cdq ; extend EAX sign bit to EDX
idiv n ; edx = (possibly neg.) remainder
add edx, n
mov eax, edx ; eax = remainder + n
cdq
idiv n ; edx = positive remainder
是否有更清洁/更简单/更快的方法来获得正余数?
【问题讨论】:
-
称为余数。商是除法的结果。
-
现在我看到你没有明确指定
n为正数,我从 "edx:eax isnegative =>negative residual" 中扣除了一个,这可以只发生在正面n。 (“非负数”也是如此,因为n==0会更快失败:))。 -
@Ped7g,感谢您的 cmets。我将编辑并将“商”更改为“余数”。关于 n,我确实提到了 0
标签: assembly x86 integer-division