SII » 27.11.2010 11:10:26
Вообще, деление элементарно заменяется на сдвиг только в том случае, если делитель является степенью двойки (1, 2, 4, 8, 16 и т.д.). Если он -- не степень двойки, но константа, тогда операцию деления можно заменить на группу операций сложения-вычитания, сдвига и умножения. Наконец, если делитель во время трансляции неизвестен, ни на что заменить деление нельзя.
В Вашем примере используются команды деления (idivl). Транслятор, судя по всему, считает, что делитель заранее неизвестен, ведь Вы заносите его в переменную (т.е. он не может определить, что в переменной находится всегда одна и та же величина).
Что же касается скорости, то деление -- очень медленная операция по той причине, что она в принципе не поддаётся ускорению. Поэтому самые что ни на есть современные процессоры тратят на неё примерно столько же времени в тактах, что и процессоры полувековой давности (другое дело, что продолжительность самого такта стала намного меньше).