如何检查寄存器是否可被7整除?

lia*_*iad 0 math x86 assembly division

我想检查寄存器ax的值是否可被7整除,余数= 0.我该怎么办?

har*_*old 7

您可以使用与本答案中所示相同的方式,当然使用不同的常量.

7 mod 2 16的模乘法逆是0x6db7,(根据定义)意味着表格的数字x = n * 7将服从x * 0x6db7 = n,其中n将小于或等于0xffff / 7.因此,如果你得到更大的东西x * 0x6db7,你知道它不是7的倍数.而且,7的非倍数也不能映射到低结果,因为乘以2的幂的奇数模乘是双射的.

所以你可以使用(未​​测试)

imul ax, ax, 0x6db7
cmp ax, 0x2492
ja not_multiple_of_7
Run Code Online (Sandbox Code Playgroud)

这当然是无符号数.

作为奖励,如果它是7的倍数,ax则将原始值除以7.