汇编语言 - 如何模数?

时间:2011-11-05 17:07:53

标签: assembly x86 modulo

x86汇编程序中是否存在模运算符?

4 个答案:

答案 0 :(得分:63)

DIV指令(对于带符号的数字,它的对应IDIV)给出商和余数(模数)。 DIV r16DX:AX中的32位数字除以16位操作数,并将商存储在AX中,余数存储在DX中。

示例:

mov dx, 0     
mov ax, 1234
mov bx, 10
div bx       ; Divides 1234 by 10. DX = 4 and AX = 123

在32位汇编中,您可以div ebxEDX:EAX中的64位操作数除以EBX。有关详细信息,请参阅英特尔Architectures Software Developer’s Manuals

答案 1 :(得分:22)

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

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

屏蔽的高位数对我们不感兴趣。试试吧!

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

答案 2 :(得分:1)

查看模数运算符在各种体系结构上的外观的简单方法是使用Godbolt编译器资源管理器。

https://godbolt.org/z/64zKGr

答案 3 :(得分:0)

如果您不太在意性能,而是想使用简单的方法,则可以使用DIVIDIV

DIVIDIV仅将一个操作数除以 该操作数的某个寄存器,操作数可以 只能注册存储位置

当操作数是字节时: AL = AL /操作数,AH =余数(模数)。

例如:

MOV AL,31h ; Al = 31h

DIV BL ; Al (quotient)= 08h, Ah(remainder)= 01h

当操作数是单词时: AX =(AX)/操作数,DX =余数(模数)。

例如:

MOV AX,9031h ; Ax = 9031h

DIV BX ; Ax=1808h & Dx(remainder)= 01h