我正在尝试获取 [0 ... n-1]
范围内的模 n (0 < n)。
指令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
是否有更清洁/更简单/更快捷的方法来获得正余数?
最佳答案
-5 mod 3 = -2(余数,-1 商)
修补余数:-2 + 3 = +1,这就是你想要的,对吧?
那么商是 -1 - 1 = -2。
验证:-2 * 3 + +1 = -5
cdq ; extend EAX sign bit to EDX
idiv n ; edx = (possibly neg.) remainder
mov eax, edx ; eax = copy of remainder
add edx, n ; negative remainder modified to positive one (for --quotient)
; when going from negative to positive, CF will be set (unsigned overflow)
cmovc eax,edx ; when CF, load eax with modified remainder
; eax = to-be-positive-adjusted remainder
我没有在debugger里验证,只是醒了,所以先测试一下。
关于assembly - 我如何获得负股息的正模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40861023/