деление / умножение

Тема в разделе "WASM.BEGINNERS", создана пользователем Everon, 25 ноя 2006.

  1. Everon

    Everon Ronny

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    8
    Здравствуйте. Наставьте на путь истинный, пожалуйста.

    В обработчике WM_LBUTTONUP помещаю в AX координату курсора Y (из lParam). Далее нужно содержимое AX разделить на 32, и полученное целое умножить на 4. Поскольку от остатка нужно избавиться, то вариант только сдвинуть всё вправо на три бита не годится, остаются установленными ненужные биты. Вот хотел спросить как бы это лучше организовать? Сдвинуть сначала на пять бит вправо, а потом на два влево, или сдвинуть сразу на три вправо, а после/до этого обнулить ненужные биты эндом? Как будет грамотрнее/быстрее, и кого лучше двигать/эндить AX (а потом CWDE) или EAX (очистив его перед копированием координаты в AX), если конечный результат должен быть в EAX? Или же я вообще чушь пишу и есть лучший способ?

    И вот ещё что. Мне кажется или я действительно где-то встречал быстрые способы нахождения остатка от деления числа на двойку в степени? Что-то никак не вспомню где...
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну во-первых, обработчик WM_LBUTTONUP это не место для мелочной оптимизации ;)
    Если же говорить в общем, то для большинства процев сдвиги выполняются также быстро, как и логические операции. Исключением являются только первые 2 модели P4 (Willamette и Northwood), в которых shl\shr выполняются за 4 такта (на MMX_ALU), а логика за 0.5-1 такта, поэтому для них вариант shr+and будет выполняться быстрее. Что касается AX\EAX, то лучше всего сразу грузить операнд в EAX: movzx eax,word [X]
    Остаток от деления на степень двойки получается простым AND. Если задано само число, например 16, то просто and eax,16-1. Если же задана степень, в данном сл. 4, то нужно сформировать маску для and - сдвинуть единицу вверх на 4 и вычесть 1
     
  3. Everon

    Everon Ronny

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    8
    Огромное спасибо, всё усвоил.
    Само собой, но зато, когда найду для неё место, одним вопросом уже будет меньше =)