Деление на FF

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

  1. ZEQ

    ZEQ New Member

    Публикаций:
    0
    В общем делаю чёта типа AlphaBlend
    т.е. тожа самое но + ещё некоторые опции проскальзвать будут это в будущем.

    эт кусок рутинного кода

    Код (Text):
    1.    
    2.                   mov DL, byte ptr [ESI][3]   ; 0 - RED, 1- GREEN, 2- BLUE, 3- ALPHA
    3.                   movzx AX, DL
    4.                   mul byte ptr [ESI][0]
    5.                   push AX
    6.                   not DL
    7.                   movzx AX, DL
    8.                   mul byte ptr [EDI][0]                                    
    9.                   pop BX
    10.                   add AX, BX
    11.                   div HALFWORD    ; 0FFh
    12.                   mov byte ptr [EDI][0], AL
    работаю по формуле (a*s+(not a)*t)\0FFh
    ну есть ещё t + (s-t)*a\0FFh - только косяк с минусами при реализации,

    ну мне не нравится div .... ну чувствую есть ещё способ .... или иной метод ...

    а то готовая функция у меня в разы медленней виндовской стандартной :dntknw: даже простая пробежка по циклу больше времени занимает ((( а тут ведь ещё разные размеры иходной и целевой части .....
    может кто сталкивался с подобными вещами??
    пошарил по инету уже, ... ничего вразумительного ненашел ((((
    весь день голову ломал ... выдераеш из старшего байта значение а оно \ 256 ... +/- 1 разница с \255,
    меня уже на работе непонимают ....
     
  2. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Дык глянь что там в виндовой функции, и поймеш что у тебя тормозит.
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    windows.inc
     
  4. ZEQ

    ZEQ New Member

    Публикаций:
    0
    хе, просто сказать .... когда диасемблил уже qdi32 .... так там потярялся ((( ща конечно ещё раз полезу, но помойму там уже основа более высокого уровня была....
     
  5. ZEQ

    ZEQ New Member

    Публикаций:
    0
    а мне структуры ненада ... сам их могу напридумывать
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    ; 0 - BLUE, 1- GREEN, 2- RED, 3- ALPHA
     
  7. ZEQ

    ZEQ New Member

    Публикаций:
    0
    ну чесна - мне удобнее с цифрами ... я уже эти массивы вдоль и поперек изучил ...
     
  8. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Ясен-красен, винда это все в режиме ядра делает. А ты небось из юзермода запускаешь :)
     
  9. G13

    G13 New Member

    Публикаций:
    0
    С чего вдруг?


    Полез ковыряться - в msimg32.dll, откуда экспортируется AlphaBlend, на самом деле переходник на GdiAlphaBlend из gdi32.dll… Всё забавнее и забавнее…
     
  10. leo

    leo Active Member

    Публикаций:
    0
    ZEQ
    Я бы еще добавил мусорного ;) К чему тут movzx и push\pop - для обфускации ?! :)))
    Деление на 255 для чисел < 256^2
    Код (Text):
    1.   add ax,bx
    2.   movzx eax,ax
    3.   mov edx,1010101h  ;=2^32/255
    4.   mul edx
    5.   mov byte ptr [edi], dl ;edx = eax/255
     
  11. ntcdm

    ntcdm New Member

    Публикаций:
    0
    взято здесь: http://www.homepc.ru/offline/2003/82/26076/
     
  12. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    ZEQ
    у мне не нравится div .... ну чувствую есть ещё способ .... или иной метод ...
    может есть смысл пренебречь небольшой ошибкой и делить на 100h (например: shr AX, 8 или mov AL, AH)?
     
  13. ZEQ

    ZEQ New Member

    Публикаций:
    0
    Всем спасибо....
    leo - вообще спасибо, отвечаю - я не оптимизировал ещё как надо, решил начать с острых моментов типа деления ...
    а возможно выполнять свой код в режиме ядра ..?