пишем на це

Тема в разделе "WASM.ZEN", создана пользователем icent, 7 май 2009.

  1. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    Задача: преоброзовать dword в ASCII представлние. Т.е. например:
    in: 0x00786F72 (хм.. почему именно этот дворд пришел в голову^^)
    out: 0x30, 0x30, 0x37, 0x38, 0x36, 0x46, 0x37, 0x32

    Решение на асме:

    Код (Text):
    1.         __asm{
    2.         push ecx
    3.         mov ecx, 4
    4.         lea esi, dwIn
    5.         add esi, 3
    6.         mov edi, strOut
    7.  
    8. loop1:
    9.         dec ecx
    10.         js   fin
    11.  
    12.         movzx eax, byte ptr [esi]
    13.         rol eax, 4
    14.         ror al, 4          
    15.         cmp ah, 9            
    16.         jbe digit
    17.  
    18.         add ah, 7        
    19.  
    20. digit:
    21.         add ah, 30h
    22.         mov [edi], ah
    23.         cmp al, 9    
    24.         jbe digit2
    25.  
    26.         add al, 7      
    27.  
    28. digit2:
    29.         add al, 30h
    30.         mov [esi+1], al
    31.         add edi, 2
    32.         dec esi
    33.         jmp loop1
    34.  
    35. fin:
    36.         mov byte ptr [edi],0
    37.         pop ecx
    38.         };
    (с) Bitfry & me

    Мое решение на це:

    Код (Text):
    1. void  DW2STR    ( DWORD dwIn, CHAR* strOut){
    2.  
    3.     BYTE    b;
    4.     int i;
    5.  
    6.     for( i=0; i<8; i++ ) {
    7.         b  = ( dwIn >> 28-(i*4) );
    8.         b  &= 0x0F;
    9.         if ( b <= 9 ) b += 0x30; else b += 0x37;        // digit +0x30, A-F +0x37
    10.         *( BYTE* )( strOut+i ) = b;
    11.     };
    12. }
    Студия компелирует без цикла и это понятно. Интересно более красивое решение, а именно со сдвигом _одного_ байта влево.
    Т.о. можно сократить кол-во проходов вдвое. Фактически, как на це скомпелировать аналог "rol eax, 4; ror al, 4". Может я просто не знаю.
    Кому нечего делать, ваши решения в студию (вижуал студию всмсле) :))
    з.ы. интересно именно с помощью операций сдвига.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    _lrotr / _lrotl доставляют.
     
  3. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    эт че такое вообще?оО
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Классический сдвиг делается так: (val<<shift)|(val>>(32-shift));
     
  5. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    censored
    Да, только вот что получается:

    Код (Text):
    1.     b = (dwIn >> 28-(i*4));
    2.     b = _lrotl( b, 4 );
    3.     w = _lrotr( b, 4 );
    4.     *(WORD*)(strOut) = w;
    даёт:

    Код (Text):
    1. shr eax, 18
    2. rol eax, 4
    3. movzx ecx, al
    4. ror ecx, 4
    в итоге нужный нам word состоит из ah и cl, а я хочу чтобы было:

    Код (Text):
    1. shr eax, 18
    2. rol eax, 4
    3. ror al, 4
    ...
     
  6. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    Booster, щас попробую по твоему.
     
  7. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    Не, че-то не то получается..
    не происходит.
     
  8. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    значит делаешь что то не так
    сдвиг
    работает нормально
    и юзается в таком виде в многих криптоалгоритмах
     
  9. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    Код (Text):
    1. w = ( dwIn >> 24 );
    2. w = ( w << 4)|( w >> 28 );
    :

    Код (Text):
    1. shr eax, 28
    2. shl eax, 4
    выход - ax %)
     
  10. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    *shr eax, 18 конечно)

    з.ы. верните редактирование =\
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    icent
    надо хотя бы слегка понимать формулы, перед тем как их применять, да.
     
  12. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    censored, ну я формул как бе не знаю у меня простая конкретная задача. Покажи пример тогда.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    icent
    Если у тебя 8 бит, то юзай char + размерность само собой не 32 бита, а 8.
    Но це по оптимальности с ассемблером всё равно тягаться тяжело. Не даром в том же OpenSSL используются вставки.
     
  14. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    iceint
    замени
    на
    Неплохо бы еще добавить возможность использовать этот формат: 00786F72h
    У меня есть свой пример, но мне его стыдно показывать :).
     
  15. icent

    icent New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2009
    Сообщения:
    154
    изначально так и было, как в асмовском примере, но я почему-то подумал, что так лучше, ибо прыжок один остается, а операций сложения, в случае, если буквы, а не цифры.. а смысл тогда?
     
  16. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    _snprintf алсо доставляет