Integer по модулю может быть реализовано двумя способами:
Во-первых, используя DIV
или IDIV
, где остаток будет помещен в EDX
, но сначала вам нужно обнулить EDX
, или заключить в кавычки intel:
Operand Size -----------| Dividend | Divisor | Quotient | Remainder
Quadword/doubleword | EDX:EAX | r/m32 | EAX | EDX.
Например:
eax = eax % 9
когда без знака становится:
XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder
MOV ECX,9
DIV ECX
MOV EAX,EDX
когда подписано, это:
MOV ECX,9
CDQ ;this will clear EDX due to the sign extension
IDIV ECX
MOV EAX,EDX
Второй способ - это оптимизация, используемая, когда по модулю используется степень двойки, в этом случае вы AND
на единицу меньше, чем степень двух, например: eax = eax % 8
становится AND EAX,7
.