Язык ассемблера - как сделать по модулю? - PullRequest
34 голосов
/ 05 ноября 2011

Есть ли что-то вроде оператора по модулю в ассемблере x86?

Ответы [ 2 ]

65 голосов
/ 05 ноября 2011

Инструкция DIV (и ее аналог IDIV для чисел со знаком) дает как частное, так и остаток (по модулю). DIV r16 делит 32-разрядное число в DX:AX на 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 ebx, чтобы разделить 64-битный операнд в EDX:EAX на EBX. Для получения дополнительной информации см. Руководства разработчика программного обеспечения Intel для архитектуры .

25 голосов
/ 21 декабря 2014

Если вы вычисляете по модулю степени два, использование побитового И проще и обычно быстрее, чем выполнение деления. Если b является степенью двойки, a % b == a & (b - 1).

Например, возьмем значение в регистр EAX, по модулю 64 .
Простейшим способом будет AND EAX, 63, потому что 63 - это 111111 в двоичном формате.

Маскированные старшие цифры нам не интересны. Попробуйте!

Аналогично, вместо использования MUL или DIV со степенями два, сдвиг битов - это путь. Остерегайтесь целых чисел со знаком, хотя!

...