нужны числа 0x00000000 - 0x99999999, не содержащие буквы [A..F]

Тема в разделе "WASM.A&O", создана пользователем Nitroz, 1 фев 2005.

  1. Nitroz

    Nitroz New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    16
    Адрес:
    Russia
    нужны числа 0x00000000 - 0x99999999, не содержащие буквы [A..F], делаю примерно так:
    Код (Text):
    1.                 xor edx,edx
    2.                 dec edx
    3. @lll:
    4.                 inc edx
    5.                 mov ecx,7
    6.                 mov eax,edx
    7. @ddd:
    8.                 mov bl,al
    9.                 and bl,0Fh
    10.                 cmp bl,0Ah
    11.                 jge @lll
    12.                 ror eax,4
    13.                 loop @ddd
    14.  
    15. @l:
    16.                 cmp edx,99999999h
    17.                 jnz  @lll
    18.  


    как улучшить?
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Это вместо inc edx:
    Код (Text):
    1.     lea eax,[edx+66666667h]
    2.     not eax
    3.     and edx,eax
    4.     and edx,88888888h
    5.     not eax
    6.     shr edx,1
    7.     xor eax,edx
    8.     shr edx,1
    9.     xor eax,edx
    10.     sub eax,66666666h
    11.     mov edx,eax


    Позволяет получить сразу следующее число не содержащее букв.



    Возможно в коде есть баги!
     
  3. Nitroz

    Nitroz New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    16
    Адрес:
    Russia
    снимаю шляпу! это просто супер скорость по сравнению с тем, что я родил
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Если простым перебором :)
    Код (Text):
    1.  
    2.       xor eax, eax
    3.       mov ecx, 5F5E100h
    4. @ll:
    5.       inc eax
    6.       daa
    7.       loop @ll
    8.  
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вариант Black_mirror можно сократить на 2 байта без потерь:
    Код (Text):
    1.  
    2.  
    3.         lea eax,[edx+66666667h]
    4.         or  edx, eax
    5.         xor edx, eax
    6.         and edx,88888888h
    7.         shr edx,1
    8.         xor eax,edx
    9.         shr edx,1
    10.         xor eax,edx
    11.         sub eax,66666666h
    12.         mov edx,eax
     
  6. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Black_mirror, S_T_A_S_

    Не первый раз вижу в вашем исполнении подобные алгоритмы, но не могу понять принцип действия. Может поведете небольшой ликбез (как вы избавляетесь от условных переходов)?

    Буду очень благодарен.
     
  7. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Смысл первого сложения в том, чтобы заменить 9 на F, тогда при увеличении на единицу там где должны были быть переносы, они произойдут, и останется только заменить цифры 6-F,0 на 0-9,0. Если до сложения старший бит тетрады был установлен, а после сброшен, значит здесь была цифра F(9) которая должно превратиться в 0. Два сдвига и два xor'а именно это с ней и делают(вернее превращают 0 в 6 из которого потом 6 вычитается).



    Ну а алгоритм избавления от условных переходов выглядит так:)


    Код (Text):
    1. начало
    2. если в алгоритме есть условные переходы, то
    3.   взять первый условный переход
    4.   если от него можно избавиться, то
    5.     избавиться от условного перехода
    6.     перейти в начало
    7.   иначе
    8.     взять другой алгоритм
    9.     перейти в начало
    10. иначе перейти в конец
    11. перейти в начало
    12. конец
     
  8. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Black_mirror

    О, спасибо. Вроде понял, осталось попробовать применить :)



    Ну а алгоритм избавления от условных переходов выглядит так

    :) слишком универсальный ;)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если ловить блох, то можно сэкономить еще 1 байт и несколько тиков, исключив один сдвиг:
    Код (Text):
    1.     lea eax,[edx+66666667h]
    2.     or  edx,eax
    3.     xor edx,eax
    4.     and edx,88888888h
    5.     xor eax,edx        ;0 -> 8
    6.     shr edx,2          ;8 -> 2
    7.     sub eax,66666666h  ;8 -> 2
    8.     xor eax,edx        
    9.     mov edx,eax
     
  10. S_T_A_S_

    S_T_A_S_ New Member

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

    imho в самом лучшем случае будет 1.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "в самом лучшем случае будет 1"

    Ага, попался :)

    Для пентиумов в самом худшем случае получается 2, т.к. shr и sub независимы и выполняются параллельно.

    Реально в цикле на P3 получается на 3 тика меньше, а на P4 на 5 тиков (т.к. у него латентность shr = 4 тика).



    PS: Сомневающиеся могут проверить на wintest.exe by bogrus
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Точно, пусть те, кто сомневается и проверят =)

    У меня как всегда есть картиночки с анализом pipeline на которых всё видно:

    [​IMG]



    >




    А откуда такие сведения относительно реальной задачи ??? звёзды мне говорят, что Nitroz этот код воткнёт в куда-нибудь в брутфорсер (зачем гонять такой цикл в холостую, можно же сразу делать mov edx,99999999h ;)





    [​IMG] _1893018622__ds.png
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ты только забыл отметить, что твои картиночки это эмуляция для атлона. А я говорил о пентиумах, на которых возможно xor eax,edx и shr edx,imm8 не параллелятся, поэтому реально получается разница не менее 2 тиков. Ну а с тем, что на P4 shr съедает 4 тика, наверное никто спорить не будет.

    Насчет задачи я ничего и не предполагал, и слово реально у меня означало "на практике" - в отличие от рассуждений и эмуляций. А циклы просто тестируются проще и точнее, чем кусок кода из 9 тиков. Так что лишний 3-й тик на P3 можно отдать на разницу исполнения кода в цикле и при однократном проходе (выравнивание, декодирование и т.п.)
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Картиночки - это в первую очередь результат измерений.

    Глядя на них, можно увидеть сколько тактов уходит на выполнение определённого кода.

    Видно даже адреса инструкций.

    То, что результат для атлона, не опровергает факта, что этот результат -

    вполне конкретные цифры, которые можно сравнивать и делать выводы.



    А
    ,
    - это какие-то относительные величины,

    сами по себе никакой ценности не имеющие.

    Неясно, как были произведены измерения, нет даже их результатов!

    Что с чем будет параллелиться, сколько тиков будет съедать и куда можно отдать лишний тик - это отдельный филосовский вопрос.

    (например, сложные (vector path) инструкции на атлоне могут выполняться быстрее, чем указано в документации - это зависит от окружающих команд)



    Я, например, могу предположить, что разница в скорости на P6 вызвана тем, что в более длинном варианте jmp пересекает границу 16 байт. Хотя, нет не могу. Даже не вижу код для этого процессора ;)



    Я надеюсь понятно, о чём я говорю.

    Не о том, сколько и где тактов занимает код.

    А о том, что если уж говорить о цифрах, хорошо бы эти цифры подтверждать чем-то.

    И imho вот такой трюк:


    называется "отказ от ответственности"

    Т.е. как бы неявно подразумевается, что если измерения ошибочны, то притензии - автору теста.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    S_T_A_S_

    Из искры возгориться пламя ???



    "Вы хочите тестов, их есть у меня" :)

    [​IMG] _1616302696__IncBCD.zip
     
  16. S_T_A_S_

    S_T_A_S_ New Member

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

    Я их уже делал, результаты выше :).



    пока медитирую над уравнением:

    x - y = 5



    ЗЫ:
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    leo Вместо "xor eax,edx/mov edx,eax" можно "xor edx,eax"
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bogrus

    Согласен. Это можно сделать и в исходных вариантах: xor edx,eax + sub edx,6..6h. Хотя этот мув уже не относится к алгоритму, т.к. результат можно оставить и в eax.
     
  19. S_T_A_S_

    S_T_A_S_ New Member

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



    я уже голову сломал, чему же равны x и y ?????

    (отняв которые получаем 5 тиков)
     
  20. Nitroz

    Nitroz New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    16
    Адрес:
    Russia
    S_T_A_S_

    звезды тебе правильно подсказывают :)

    софт с spbsoftwarehouse.com в инсталяторе хранит md5-хэши сернумов.. серийник "12345678"=>0x12345678