Подтвердить что ты не робот

Язык ассемблера - Как сделать Modulo?

Есть ли что-то вроде modulo-оператора в x86 Assembler?

4b9b3361

Ответ 1

Инструкция 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. Подробнее см. В разделе "Интеллекты" Руководства разработчиков программного обеспечения для архитектуры.

Ответ 2

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

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

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

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