можно ли оптимизировать по скорости данную функцию?

Тема в разделе "WASM.CRYPTO", создана пользователем KiNDeR, 5 окт 2007.

  1. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    подскажите, можно ли данную функцию оптимизировать по скорости?
    реализую Blowfish алго, притормаживает это место?
    Код (Text):
    1.               mov     edi,[Input]
    2.               mov     esi,0xFF
    3.  
    4.               ; d = (Input AND $000000ff); Input:= Input SHR 8;
    5.               mov     edx,edi
    6.               and     edx,esi
    7.               shr     edi,8
    8.  
    9.               ; c = (Input AND $000000ff) + 1; Input:= Input SHR 8;
    10.               mov     ecx,edi
    11.               and     ecx,esi
    12.               shr     edi,8
    13.  
    14.               ; b = (Input AND $000000ff); Input:= Input SHR 8;
    15.               mov     ebx,edi
    16.               and     ebx,esi
    17.               shr     edi,8
    18.  
    19.               ; a = (Input AND $000000ff); Input:= Input SHR 8;
    20.               mov     eax,edi
    21.               and     eax,esi
    22.  
    23.               ; F = ((sbox[1,a] + (sbox[2,b] AND $0000001f)) XOR sbox[3,c]) + (sbox[4,d] AND $0000001f);
    24.               mov     eax,dword [sbox0+eax*4]
    25.               mov     ebx,dword [sbox1+ebx*4]
    26.               and     ebx,0x1F
    27.               add     eax,ebx
    28.               mov     ecx,dword [sbox2+ecx*4]
    29.               xor     eax,ecx
    30.               mov     edx,dword [sbox3+edx*4]
    31.               and     edx,0x1F
    32.               add     eax,edx
    33.               retn
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1.  mov     edi,[Input]
    2.               mov     esi,0xFF
    3.  
    4.               mov     edx,edi
    5.               mov     ecx,edi
    6.  
    7.               and     edx,esi
    8.               shr     ecx,8
    9.  
    10.               mov     ebx,edi
    11.               mov     eax,edi
    12.               shr     ebx,16
    13.  
    14.               and     ecx,esi
    15.               shr     eax,24
    16.  
    17.               and     ebx,esi
    18.  
    19.  
    20.               ; F = ((sbox[1,a] + (sbox[2,b] AND $0000001f)) XOR sbox[3,c]) + (sbox[4,d] AND $0000001f);
    21.               mov     ebx,dword [sbox1+ebx*4]
    22.               and     ebx,0x1F
    23.               mov     eax,dword [sbox0+eax*4]
    24.               mov     ecx,dword [sbox2+ecx*4]
    25.               add     eax,ebx
    26.               mov     edx,dword [sbox3+edx*4]
    27.               xor     eax,ecx
    28.               and     edx,0x1F
    29.               add     eax,edx
    30.               retn
    где-то так

    P.S. поправил
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Чёт
    В коде не вижу
    А по существу - думаю, что компилер лучше бы цепочку зависимостей устранил.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    t00x
    and edx, esi - 2 раза
    and eax,esi - излишне
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    asmfan
    какой?
    KeSqueer
    исправлено :)
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    icc ;)
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    KiNDeR
    Важный момент:
    как Вы осуществили переход от
    sbox[1,a], sbox[2,b], sbox[3,c], sbox[4,d]
    к
    sbox0, sbox1, sbox2, sbox3?
    Ну, или, короче, ширина таблицы фиксирована?
     
  8. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    это опечатка, формула для паскаля была, а там счет с 1 а не с 0

    фиксирована, каждый блок по 256 32-битных
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1.         mov     edi, Input
    2.         mov     eax, 0x1F
    3.         movzx   ecx, byte [edi+1]
    4.         mov     edx, eax
    5.         movzx   ebx, byte [edi]
    6.         and     eax, [sbox1+ecx*4]      ; b&0x1F
    7.         movzx   ecx, byte [edi+2]
    8.         add     eax, [sbox0+ebx*4]      ; a+b&0x1F
    9.         movzx   ebx, byte [edi+3]
    10.         xor     eax, [sbox2+ecx*4]      ; (a+b&0x1F)^c
    11.         and     edx, [sbox3+ebx*4]      ; d&0x1F
    12.         add     eax, edx                ; (a+b&0x1F)^c+d&0x1F
    У меня так нЕмного быстрее. Можно edi не использовать, если Input - стековая переменная.
     
  10. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    KeSqueer, t00x - огромное спасибо, всем респект и уважуха! :)