Есть ли что-то вроде modulo-оператора в x86 Assembler?
Язык ассемблера - Как сделать Modulo?
Ответ 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 с полномочиями двух, бит-сдвиг - путь. Остерегайтесь знаковых целых чисел, хотя!