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

Тема в разделе "WASM.ZEN", создана пользователем The Svin, 23 мар 2005.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Дано x dword

    Округлить x вверх до кратной степени двойки
     
  2. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Код (Text):
    1.  
    2. fasm:
    3.   bt   [x],0
    4.   adc  [x],0
    5.  
     
  3. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Код (Text):
    1.  
    2. а так короче:
    3.   mov  eax,x
    4.   bt   dword [eax],0
    5.   adc  dword [eax],0
    6.  




    PS. надеюсь я все правильно понял
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    А что значит до кратной степени двойки ?

    Как я понял условие, 3 округляется к 4, 6 к 8, 13 к 16, etc. Так ?
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если так, то у Уоррена есть несколько глав по округлению к степени двойки
    Код (Text):
    1. dec  eax
    2. mov  ecx,eax
    3. shr  eax,1
    4. or   eax,ecx
    5. mov  ecx,eax
    6. shr  eax,2
    7. or   eax,ecx
    8. mov  ecx,eax
    9. shr  eax,4
    10. or   eax,ecx
    11. mov  ecx,eax
    12. shr  eax,8
    13. or   eax,ecx
    14. mov  ecx,eax
    15. shr  eax,16
    16. or   eax,ecx
    17. inc  eax
     
  6. The Svin

    The Svin New Member

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


    До показательной кратности разумеется. До 2<sup>2</sup>, 2<sup>4</sup>,....,2<sup>2n</sup> (где n любое натуральное)
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Значит, 6 надо округлять не к 8 (2<sup>3</sup>), а к 16 (2<sup>4</sup>) ?
     
  8. The Svin

    The Svin New Member

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




    Да.
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    На ум приходит добавить такие строки, но что-то уже слишком много кода :), должен быть простой вариант!
    Код (Text):
    1. test eax,01010101010101010101010101010101b
    2. setz cl
    3. shl  eax,cl
     
  10. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    да, блин, опять не внимательно прочитал и округлил до кратности 2.

    пол пятого утра было, надо было спать =(
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "должен быть простой вариант!"



    Что-то очень просто не получается
    Код (Text):
    1.     ;eax <- x
    2.     xor   ecx,ecx
    3.     xor   edx,edx
    4.     bsr   ecx,eax
    5.     setnz dl       ;контроль x = 0
    6.     shl   edx,cl
    7.     cmp   edx,eax  ;контроль x = 2^k
    8.     setb  bl
    9.     and   cl,1     ;чет\нечет степень
    10.     xor   cl,bl
    11.     add   cl,bl    ;нечет -> +1, чет -> 0 или +2
    12.     shl   edx,cl
    13.     ;x <- edx
     
  12. BLOb

    BLOb New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2004
    Сообщения:
    9
    Адрес:
    Russia
    Код (Text):
    1.  
    2.  
    3.    xor  edx, edx
    4.    inc  edx
    5.    bsr  ecx, eax
    6.    jz   @3
    7.    test ecx, edx
    8.    jnz  @1
    9.    bsf  eax, eax
    10.    cmp  eax, ecx
    11.    je   @2
    12.    inc  ecx
    13. @1:inc  ecx
    14. @2:xchg eax, edx
    15.    shl  eax, cl
    16. @3:
    17.  
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. cmp  eax,2
    2. sbb  eax,1
    3. bsr  ecx,eax
    4. or   ecx,1
    5. mov  eax,2
    6. rol  eax,cl
     
  14. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Вход - EAX, выход - EDX :)


    Код (Text):
    1.     xor edx, edx
    2.     bsf ebx, eax
    3.     jz  done
    4.     bsr eax, eax
    5.     sub ebx, eax
    6.     adc al, 1
    7.     and al, 0FEh
    8.     bts edx, eax
    9. done:
     
  15. leo

    leo Active Member

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

    По условию: "До 2<sup>2</sup>, 2<sup>4</sup>,....,2<sup>2n</sup> (где n любое натуральное)", т.е. 0..3 округляется до 4 и никаких нулей и единиц ?

    Тогда все варианты придется подправлять...



    PS: bogrus нашел таки простой вариант :)

    А я как пень бродил вокруг да около декремента, да как всегда свернул на дубовый путь :dntknw:
     
  16. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Код (Text):
    1.     xor ecx, ecx
    2.     xor edx, edx
    3.     mov eax, [b]X[/b]
    4.     bsr ecx, eax
    5.     bsf edx, eax
    6.     cmp edx, ecx
    7.     adc ecx, 1
    8.     and ecx, -2
    9.     mov eax, 1
    10.     shl eax, cl
     
  17. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Да, похоже 0..1 надо к 4 округлять. Кстати, макс. значение x = 40000000h. Если больше, то на выходе получится 33 бита.

    Вход - eax, выход - edx


    Код (Text):
    1.     cdq
    2.     mov dl, 2
    3.     cmp eax, edx
    4.     cmovb   eax, edx
    5.     dec eax
    6.     bsr ecx, eax
    7.     or  cl, 1
    8.     shl edx, cl




    bogrus, не забывай проверять на числах 0 и 1.
     
  18. leo

    leo Active Member

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

    CMOVcc - вещь полезная, но старички i486 и P\PMMX не знают о ее существовании :)



    Если 1 -> 4, а 0 и переполнение -> 0, то вариант bogrus'а только упрощается (уменьшается число комплексных инструкций):
    Код (Text):
    1.     dec  eax
    2.     xor  ecx,ecx  ;! not documented см.PS
    3.     bsr  ecx,eax
    4.     or   cl,1
    5.     mov  eax,2
    6.     shl  eax,cl
    Если 0 -> 4, то нужно заменить shl на rol и добавить коррекцию 0..3 -> 4:
    Код (Text):
    1.  
    2.     ...........
    3.     rol  eax,cl
    4.     add  eax,3
    5.     and  eax,-4


    PS: Я считал, что BSR ecx,eax при eax = 0 оставляет ecx unchanged и по жизни так оно и есть. Перечитал на всякий случай IA-32, а там "destination operand is undefined" ?!. Это что - интеловская перестраховка ?
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    _BC_




    Точно, а я это упустил из виду, наоборот мучался, чтобы из нуля и 1 получить единицу :)



    leo




    Ага, но чую это ещё не самый простой вариант
    Код (Text):
    1. mov  ecx,1
    2. bsr  ecx,eax
    3. or   ecx,1
    4. mov  eax,2
    5. rol  eax,cl
     
  20. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    bogrus, куда 16 округлится ? :)