2011-11-05 186 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的二次冪,而是使用位移。不過,請注意簽名的整數!