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

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 26 июн 2006.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Что-то очень мелкие задачки народ решать не стал (только leo предложил вариант с весьма оригинальным методом получения масок), то ли задачки оказались сложные или не интересные, то ли народ просто отдыхал, но рискну предложить еще одну задачку.



    В регистрах EAX,EBX и ECX находятся 3 различных числа в диапазоне от 0 до 2^32-1, нужно написать оптимизированный по размеру код без переходов, который запишет в EAX число от 0 до 5, в зависимости от того, как упорядочены EAX,EBX и ECX:

    Если EAX<EBX<ECX, то EAX=0

    Если EAX<ECX<EBX, то EAX=1

    Если EBX<EAX<ECX, то EAX=2

    Если EBX<ECX<EAX, то EAX=3

    Если ECX<EAX<EBX, то EAX=4

    Если ECX<EBX<EAX, то EAX=5

    Думаю что как использовать SBB и ADC народ еще не забыл ;)



    Усложнённая задачка: диапазон чисел от -2^31 до 2^31-1.



    Quantum

    Исправил.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Видимо, так:

    Если EBX<EAX<ECX, то EAX=2

    Если EBX<ECX<EAX, то EAX=3
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    37 байт
    Код (Text):
    1.     xor esi,esi
    2.  
    3. zn@0    db 50h      ;0
    4. @1  db 56h     
    5. @2  db 52h      ;2
    6. @3  db 53h      ;3
    7. @4  db 51h      ;1
    8. @5  db 54h      ;4
    9. @6  db 56h
    10. @7  db 55h      ;5
    11.  
    12.     push ecx   
    13.     sub ecx,ebx
    14.     rcl esi,1
    15.    
    16.     sub ebx,eax
    17.     rcl esi,1
    18.     pop ecx
    19.     sub ecx,eax
    20.     rcl esi,1
    21.     xor eax,eax
    22.     mov al,zn@0[esi]   
    23.     and al,0fh
    24.     add esp,8*4
    25.  
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Вместо
    Код (Text):
    1. push ecx
    2. sub ecx,edx
    3. ;...
    4. pop ecx


    достаточно cmp ecx,edx (-2 байта).



    И ещё -1, если вместо:
    Код (Text):
    1. xor eax,eax
    2. mov al,zn@0[esi]
    3. and al,0fh


    сделать так:
    Код (Text):
    1. mov al,zn@0[esi]
    2. and eax,0fh
     
  5. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    27 байт



    mov edx, ecx

    cmp eax, ebx

    rcl ecx, 1

    cmp ebx, edx

    rcl ecx, 1

    cmp eax, edx

    rcl ecx, 1

    and ecx, 7

    mov eax, 000001010011100101b

    shr eax, cl

    and eax, 7
     
  6. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    упс ошибочка вышла



    31 байт





    mov edx, ecx

    cmp eax, ebx

    rcl ecx, 1

    cmp ebx, edx

    rcl ecx, 1

    cmp eax, edx

    rcl ecx, 1

    and, ecx, 7

    lea cx, [ecx+2*ecx]

    mov eax, 000 000 001 101 010 011 000 110 b

    shr eax, cl

    and eax, 7
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Quantum

    А я и забыл про cmp:)



    29 байт

    xor esi,esi

    mov edi,50413200h



    cmp ecx,ebx

    rcl esi,1

    sub ebx,eax

    rcl esi,1

    sub ecx,eax

    rcl esi,3

    mov ecx,esi

    ror edi,cl

    mov eax,edi

    and eax,0fh
     
  8. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Я правильно понимаю, что равенство исключается в данных?
     
  9. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    asd



    тогда так:



    27 байт



    mov edx, ecx

    xor ecx, ecx

    cmp eax, ebx

    rcl ecx, 1

    cmp ebx, edx

    rcl ecx, 1

    cmp eax, edx

    rcl ecx, 3

    mov eax, 00142305h

    shr eax, cl

    and eax, 7
     
  10. Black_mirror

    Black_mirror Active Member

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

    Да, равенства быть не может.
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Кто не успел - тот опоздал:
    Код (Text):
    1.     mov edx,ecx
    2.     mov ecx,$9A1
    3.     cmp ebx,edx
    4.     adc ecx,ecx
    5.     cmp eax,ebx
    6.     adc ecx,ecx
    7.     cmp eax,edx
    8.     adc ecx,ecx
    9.     shr ecx,cl
    10.     xchg eax,ecx
    11.     and al,7


    Всего 24 байта!

    Внимательно изучите сдвиг и константу.
     
  12. leo

    leo Active Member

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

    В подобных задачках меня смущает неоптимальный выбор кодировки результатов выполнения условий.

    Казалось бы какая разница, поменяй местами 4-е и 5-е условие и результаты сравнения станут более упорядоченными и задачку можно решить проще без всяких хитрых констант:
    Код (Text):
    1. 1)
    2.   cmp eax,ebx
    3.   sbb edx,edx
    4.   inc edx
    5.   cmp ecx,ebx
    6.   rcl edx,1
    7.   cmp ecx,eax  
    8.   sbb eax,eax
    9.   neg eax
    10.   lea eax,[edx+eax*2]
    11.  
    12. 2)
    13.   cmp ecx,eax  
    14.   sbb edx,edx
    15.   cmp ebx,eax  
    16.   rcl edx,1
    17.   cmp ecx,ebx
    18.   rcl edx,1
    19.   xchg eax,edx
    20.   cdq
    21.   and edx,6
    22.   add eax,edx
    Или это чересчур просто и "мелко" ;)
     
  13. Black_mirror

    Black_mirror Active Member

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

    На счёт "опоздал" я поторопился :dntknw:

    Кодировка результатов была выбрана абсолютно произвольно, будем считать что это для совместимости с остальным кодом(которого не существует, как и матрицы ;) В начале я думал что самый которкий вариант решения - через таблицу, но мне так и не удалось загнать таблицу в 1 байт. Но даже предложенные тобой варианты не являются самыми мелкими, вот как нужно изменить первый вариант, чтобы сделать на 1 байт меньше.
    Код (Text):
    1.   cmp eax,ecx  
    2.   sbb eax,eax
    3.   inc eax