Альтернативная форма для операции по модулю в сборке x86

Есть ли способ вычислить операцию мода без использования DIV или IDIV на языке ассемблера x86?

Например, можно использовать DIV, чтобы взять остаток от деления. Но вместо того, чтобы использовать DIV, есть другие варианты?


person Giuseppe Canto    schedule 27.11.2016    source источник
comment
Да, но какие из них хорошие, зависит от ситуации. Есть ли у этого вопроса больше контекста или он более теоретический?   -  person harold    schedule 27.11.2016
comment
Да, для упражнения @harold. 8-битное значение, деленное на 8-битное значение.   -  person Giuseppe Canto    schedule 27.11.2016
comment
Интересно, почему вы не видите наивно-математический неэффективный способ (вы бы упомянули об этом в вопросе, верно?): while (divisor <= number) number -= divisor; уменьшит number до диапазона 0 - divisor-1, что означает, что это будет остаток (конечно, требуется начальная проверка значений для угловых случаев). Что должно быть легко закодировано на ASM.   -  person Ped7g    schedule 28.11.2016


Ответы (1)


  • Алгоритм деления всегда можно написать самостоятельно, совершенно не используя инструкции DIV или IDIV.

  • Конечно, есть ряд модулей, где вам просто нужна инструкция AND:

    and eax, 255    ;Gives modulo 256
    and eax, 15     ;Gives modulo 16 
    
person Sep Roland    schedule 27.11.2016
comment
Спасибо. Это именно то, что я искал! Возможно, использование побитового И работает лучше с точки зрения производительности. Это правильно? - person Giuseppe Canto; 27.11.2016
comment
Мало что может превзойти одну инструкцию and с точки зрения производительности. - person Sep Roland; 27.11.2016
comment
@GiuseppeCanto: см. /40355466#40355466" title="почему этот код c быстрее, чем моя написанная вручную сборка для тестирования сопоставления">stackoverflow.com/questions/40354978/, чтобы узнать, насколько медленнее DIV, чем SHR или AND, когда делитель или модуль является степенью двойки. Это как минимум в 20-30 раз быстрее. - person Peter Cordes; 28.11.2016