汇编语言 - 如何模数?

enn*_*e87 34 x86 assembly modulo integer-division

在x86汇编程序中有类似模运算符的东西吗?

use*_*653 69

div指令(和它对应and的符号数),同时给出商和余数(模).lea eax, [esi-1]将一个32位数字and eax, edi除以一个16位操作数,并将商x & (y-1)和余数存储在中movzx eax, cl.

例:

mov eax, 1234          ; dividend low half
mov edx, 0             ; dividend high half = 0.  prefer  xor edx,edx

mov ebx, 10            ; divisor can be any register or memory

div ebx       ; Divides 1234 by 10.
        ; EDX =   4 = 1234 % 10  quotient
        ; EAX = 123 = 1234 / 10  remainder
Run Code Online (Sandbox Code Playgroud)

在32位汇编中,您可以DIV将64位操作数IDIV除以idiv.有关更多信息,请参阅英特尔架构软件开发人员手册.

  • 但GCC不使用div,因为它很慢:http://stackoverflow.com/questions/4361979/how-does-the-gcc-implementation-of-module-work-and-why-does-it-not-use -The (4认同)

小智 26

如果计算模2的幂,则使用按位AND更简单,并且通常比执行除法更快.如果b是2的幂,a % b == a & (b - 1).

例如,让我们在寄存器EAX中取一个值,模64.
最简单的方法是AND EAX, 63,因为63是二进制的111111.

我们不关心蒙面的高位数字.试试看!

类似地,不是使用功率为2的MUL或DIV,而是使用位移.但要注意签名的整数!


归档时间:

查看次数:

104186 次

最近记录:

6 年,1 月 前