Есть такая задача по проверке байт строки..

Тема в разделе "WASM.ASSEMBLER", создана пользователем Asterix, 13 авг 2004.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    masquer

    > А чем тебя тут скорость не нравится?



    Я ее не мерял, но мне казалось если операнд читается из памяти то это всегда медленнее, в данном случае адрес прыжка из таблицы.



    Всем спасибо за участие, вариантов у меня теперь достаточно, есть над чем подумать :derisive:
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix

    Да, я невнимательно прочитал условие. Сорри. :)
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    Поскольку у тя тут цикл, то таблица после первого обращения к ней попадёт в кеш (если таблица большая как в моём примере, то для процев где строки кеша 16 байт, потребуется максимум 2 обращения), после этого работа с ней не будет медленнее, чем чтение [ESI]





    >




    Вот, кстати, как твой "чистый синтаксис" переварил MSVC:<font face="monospace]
    Код (Text):
    1.  
    2.     mov dl, BYTE PTR [ecx-1]
    3.     test    dl, dl
    4.     mov al, BYTE PTR [ecx]
    5.     jne $L543
    6.     test    al, al
    7.     je  @exit
    8. $L541:
    9.     test    dl, dl
    10.     je  @1
    11.     test    al, al
    12.     jne @2
    13. $L543:
    14.     test    al, al
    15.     jne $L541
    16.     mov bl, BYTE PTR [ecx+1]
    17.     test    bl, bl
    18.     jne $L541
    </font><!--face-->
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    S_T_A_S_

    > Вот, кстати, как твой "чистый синтаксис" переварил MSVC



    Судя по всему не правильно, но это видимо ты не правильно ему указал :derisive:



    Кстати вот так это сделал masm(вообще-то не лучшим образом, потому что напихал лишних переходов,

    которые вообще не используются :):


    Код (Text):
    1. 00401000 > $ 807E FF 00     CMP BYTE PTR DS:[ESI-1],0
    2. 00401004   . 75 05          JNZ SHORT 0040100B
    3. 00401006   . 803E 00        CMP BYTE PTR DS:[ESI],0
    4. 00401009   . 74 0B          JE SHORT 00401016
    5. 0040100B   > 803E 00        CMP BYTE PTR DS:[ESI],0
    6. 0040100E   . 75 0A          JNZ SHORT 0040101A
    7. 00401010   . 807E 01 00     CMP BYTE PTR DS:[ESI+1],0
    8. 00401014   . 75 04          JNZ SHORT 0040101A
    9. 00401016   > EB 15          JMP SHORT @exit
    10. 00401018   . EB 11          JMP SHORT @1
    11. 0040101A   > 807E FF 00     CMP BYTE PTR DS:[ESI-1],0
    12. 0040101E   . 74 05          JE SHORT 00401025
    13. 00401020   . 803E 00        CMP BYTE PTR DS:[ESI],0
    14. 00401023   . 75 04          JNZ SHORT 00401029
    15. 00401025   > EB 04          JMP SHORT @1
    16. 00401027   . EB 02          JMP SHORT @1
    17. 00401029   >^EB D5          JMP SHORT @2
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Где не правильно? я просто взял твой код и подправил.

    Другое дело, что от этих Jcc в глазах рябит :)
    Код (Text):
    1. void main(){
    2.     char *esi;
    3.  
    4.     if( (*(esi-1)==0 && *esi==0) || (*esi==0 && *(esi+1)==0) )
    5.         goto _exit;
    6.     else if ( *(esi-1)==0 || *esi==0 )
    7.         goto _1;
    8.     else   
    9.         goto _2;
    10.  
    11.     _exit:  __asm int 3
    12.     _1: __asm int 3
    13.     _2: __asm int 3
    14. }
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    S_T_A_S_

    У меня MSVC++6 генерит совсем другой код из твоего исходника, не очень оптимальный(хотя стоит ключ максимальной оптимизации), но более похожий на правильный.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Asterix



    Это MSVC из toolkit2k3.

    Что-то я перемудрил, когда вырезал всякий дополнительный stuff, должно быть так: (положение метки @1 важно)
    Код (Text):
    1.     jne @2
    2. @1:  ; или jmp @1
    3. $L543:
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Black_mirror



    Вот избавился от одного jcc
    Код (Text):
    1.   mov eax,[esi-1]
    2.   test eax,0ffffh
    3.   jz .exit
    4.   test eax,0ffff00h
    5.   jz .exit
    6.   neg al
    7.   sbb ecx,ecx
    8.   test ah,cl
    9.   jz .l1
    10. .l2:
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    Ты уверен, что корректно составил условие?

    Например, если выполняется условие - byte ptr [esi] == 0 && byte ptr [esi+1] == 0, то тебе не важно знать, что byte ptr [esi-1] не обязательно равняется нулю?
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q

    > то тебе не важно знать, что byte ptr [esi-1] не обязательно равняется нулю?

    Оно(byte ptr [esi-1]) тогда не может быть равно 0.

    Ты меня не путай, я и сам запутаюсь :derisive:

    Короче я уже поменял логику определения конца строки, и двойной ноль буду искать в другом месте, а сам конец подстроки будет искать такой код:


    Код (Text):
    1.   mov eax,[esi-1]
    2.   neg al
    3.   sbb ecx,ecx
    4.   adc esi,-1
    5.   test ah,cl
    6.   jz @label