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

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

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    даны переменные a,b,c типа int 32 бита

    установить значение в a в зависимости от равенства переменных b,c нулю:

    a <- 0 if b != 0 & c != 0

    a <- 1 if b == 0 & c != 0

    a <- 2 if b != 0 & c == 0

    a <- 3 if b == 0 & c == 0



    Безбранчевая оптимизация по размеру.
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Быстрое решение:
    Код (Text):
    1. xor eax,eax
    2. neg ecx
    3. rcl eax,1
    4. neg edx
    5. rcl eax,1
    6. xor al,3


    12 байт.

    a: eax

    b: edx

    c: ecx
     
  3. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Тоже 12 байт



    a - eax, b - ebx, c - ecx



    xor eax,eax

    sub ecx,1

    adc eax,eax

    sub ebx,1

    adc eax,eax
     
  4. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    А так 10 байт



    xor eax,eax

    neg ecx

    adc eax,eax

    neg ebx

    adc eax,eax
     
  5. Quantum

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

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

    Во втором варианте результаты соответствуют условию задачи в обратном порядке. Поэтому я и добавил xor в своё решение.
     
  6. dinoweb

    dinoweb Дмитрий

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

    Да, я уже заметил. Поспешил немного
     
  7. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если устроит 8-битный результат, то можно сэкономить 2 байта:
    Код (Text):
    1. test ecx,ecx
    2. sete al
    3. sub edx,1
    4. adc eax,eax


    10 байт

    a: al

    b: edx

    c: ecx



    ЗЫ: Для полного соответствия условию следует добавить xor eax,eax в самом начале (опять 12 байт). В таком случае единственным плюсом будет сохранение регистра ecx.
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1.     neg ecx
    2.     sbb eax,eax
    3.     neg ebx
    4.     inc eax
    5.     cmc
    6.     adc eax,eax


    10 байт
     
  9. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Код (Text):
    1. neg ecx
    2. sbb eax,eax
    3. inc eax
    4. sbb ebx,eax
    5. adc eax,eax


    9 байт