Как найти остаток без использования div в сборке - PullRequest
2 голосов
/ 17 февраля 2012

Мне интересно, как можно найти остаток от целого числа, если нельзя использовать операнд div.Например:

mov eax, 400    ; 400 / 4 
shr eax, 2      ; Remainder : 0


mov eax, 397    ; 397 / 4
shr eax, 2      ; Remainder : 1


mov eax, 394    ; 394 / 4
shr eax, 2      ; Remainder : 2

При сдвиге обрезается остаток.

Итак, без использования div (который сохраняет остаток в edx), что можно сделать, чтобы выяснить, что это был за остаток?

1 Ответ

5 голосов
/ 17 февраля 2012

Если вы просто хотите получить остаток от деления на степень двойки, как в вашем примере, тогда остаток на самом деле - это просто младшие биты вашего входа (те биты, которые вы сместили).Итак, примените оператор маскирования битов, и вы можете немедленно получить остаток без какой-либо дополнительной арифметики.

В языке ассемблера Microsoft x86, я думаю, ваш первый пример будет выглядеть так:

mov eax, 400    ; 400 / 4 
and eax, 3h     ; Masking with hex 3 (the lowest two bits) retrieves the remainder
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...