Умножение на константу

Тема в разделе "WASM.BEGINNERS", создана пользователем d0rki, 9 июл 2005.

  1. d0rki

    d0rki New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    Вот есть у меня умножение на константу в цикле. И все те imul мне не нравятся. Как вариант думал разбить константу на суму степеней двойки. Но как-то громоздко все. Используется так:



    mov ecx, 7AB7h ; 8000h - 400h - 100h - 40h - 8h - 1h = 7AB7h

    mov edi, 6A2Fh ; 4000h + 2000h + 800h + 200h + 20h + 8h + 4h + 2h + 1h = 6A2Fh

    mov esi, [ esp + 24h ]

    mov ebp, [ esp + 28h ]

    @@:

    mov bl, byte [ esi ]

    inc esi

    test bl, bl

    jz @F

    imul ecx

    add al, bl

    and eax, ebp

    push eax

    mov eax, ecx

    imul edi

    and eax, ebp

    mov ecx, eax

    pop eax

    jmp @B

    @@:



    Можно ето как-то организовать без умножения? Или зря парюсь.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Обычно заменителем mul является конструкция c lea.

    Например умножение на 27:
    Код (Text):
    1. lea     eax,[eax*8+eax]    ;eax=eax*9
    2. lea     eax,[eax*2+eax]    ;eax=eax*3




    Это имеет смысл при не очень больших множителях. Иначе imul гораздо быстрее и короче получится.
     
  3. zobot1

    zobot1 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2005
    Сообщения:
    55
    ну в целом-то ещё можно двигать влево по степеням двойки, а концы прибавлять...



    а ещё имхо через фпу прогнать когда очень много умножений