2011-11-05 59 views

回答

54

DIV指令(以及它对应的有符号数IDIV)给出了商和余数(模)。 DIV r16用一个16位操作数将DX:AX中的一个32位数除,并将商存储在AX中,其余部分存储在DX中。

实施例:

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

在32位组件可以做div ebx通过EBX划分在EDX:EAX 64位操作数。有关更多信息,请参阅英特尔Architectures Software Developer’s Manuals

+2

但GCC不使用div,因为它很慢:http://stackoverflow.com/questions/4361979/how-does-在-GCC-与实施的模块,工作和为什么 - 做 - 它 - 不使用,该 –

13

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

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

被掩盖的高位数对我们没有兴趣。试试看!

类比而言,不是使用MUL或DIV的二次幂,而是使用位移。不过,请注意签名的整数!