Мелкие задачки для крупных мозгов №17

Тема в разделе "WASM.A&O", создана пользователем The Svin, 1 май 2006.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Три задачки на перевод результатов сравнений в индексы.

    Подобные задачки используются в "нечётких сравнениях".

    Когда даётся величина отклонения, допустимый предел и направления отклонения.

    Так же это схоже с задачами на диапозоны.

    Во всех задачах предел даётся положительным числом и означает максимально допустимое отклонение (т.е. значение предела допускается как отклонение)

    Для простоты пусть во всех задачах

    eax - отклонение

    ebx - абсолютная величина предела.

    Индекс помещается в eax.

    Значение индексов

    0 - если eax = 0

    1 - если eax <> 0 но находится в допустимом пределе,и

    стороне отклонения

    2 - если сторона отклонения недопустима или отклонение выходит за предел.

    Условие - безбранчевый код. Оптимизация по размеру.

    Минимизация использования регистров.





    Задача1. Допускается отклонение в обе стороны.

    т.е.

    if eax = 0 eax <- 0

    if |eax| <= ebx eax <- 1

    if |eax| > ebx eax <- 2

    Задача2. Допускается отклонение только в отрицательную сторону. т.е.

    if eax = 0 eax <- 0

    if (eax > 0) or (|eax| > ebx) eax <-2

    else eax <- 1

    Задача3. Допускается отклонение только в положительную сторону

    т.е.

    if eax = 0 eax <- 0

    if (eax < 0) or eax > ebx eax <- 2

    else eax <- 1

    if eax
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    The Svin

    Спасибо за интересные задачки!!!



    После if'ов имеются ввиду те значения, которые были при входе в функцию.
    Код (Text):
    1. range1:
    2.     cdq
    3.     and edx,eax
    4.     sub eax,edx
    5.     sub eax,edx ;eax=|eax|
    6.  
    7.         cmp ebx,eax    
    8.     sbb ebx,ebx ;ebx=0 if |eax|>ebx
    9.             ;ebx=-1 if |eax|<=ebx
    10.  
    11.     neg eax    
    12.     sbb eax,eax ;eax=0 if |eax|=0
    13.             ;eax=-1 if |eax|>0
    14.  
    15.     add eax,ebx ;eax=0 if |eax|=0
    16.             ;eax=-1 if |eax|>0 && |eax|<=ebx
    17.             ;eax=-2 if |eax|>ebx
    18.  
    19.     neg eax
    20.     ret
    21.  
    22. range2:
    23.     neg eax    
    24.  
    25.         cmp ebx,eax    
    26.     sbb ebx,ebx ;ebx=0 if -eax>ebx
    27.             ;ebx=-1 if -eax<=ebx
    28.     neg eax    
    29.     sbb eax,eax ;eax=0 if -eax=0
    30.             ;eax=-1 if -eax>0
    31.  
    32.     add eax,ebx ;eax=0 if -eax=0
    33.             ;eax=-1 if -eax>0 && -eax<=ebx
    34.             ;eax=-2 if -eax>ebx
    35.     neg eax
    36.     ret
    37.  
    38. range3:
    39.         cmp ebx,eax    
    40.     sbb ebx,ebx ;ebx=0 if eax>ebx
    41.             ;ebx=-1 if eax<=ebx
    42.     neg eax    
    43.     sbb eax,eax ;eax=0 if eax=0
    44.             ;eax=-1 if eax>0
    45.  
    46.     add eax,ebx ;eax=0 if eax=0
    47.             ;eax=-1 if eax>0 && eax<=ebx
    48.             ;eax=-2 if eax>ebx
    49.     neg eax
    50.     ret