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

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

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Дано двойное слово и два битовых индекса (переменные)

    младший и старший.

    Привести биты в двойном слове

    младше младшего индекса в состояние бита по данному младшему индексу

    старше старшего индекса в состояние бита по старшему индексу.

    Пример

    младший индекс 8 старший 24

    двойное слово

    01011101 01010000 100111100 01010001

    значение бита по млашему индексу 0

    значение бита по старшему индексу 1

    Значит нужно привести двойное слово к виду

    11111111 01010000 100111100 00000000



    Повторюсь все три значения на входе - переменные.

    Задачка под номером 3. Sorry - не знаю как поправить тему
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    Код (Text):
    1.     mov edx, 0BAA13C51h ; initial value
    2.     mov ecx, 8+1 ; low index
    3.     or eax, -1
    4.     shl eax, cl
    5.     and edx, eax
    6.     not eax
    7.     bt edx, ecx
    8.     sbb edi, edi
    9.     and edi, eax
    10.     add edx, edi
    11.     mov ecx, 24+1 ; high index
    12.     or eax, -1
    13.     shl eax, cl
    14.     bt edx, ecx
    15.     sbb edi, edi
    16.     and edi, eax
    17.     not eax
    18.     and edx, eax
    19.     add edx, edi
    20.     mov eax, edx
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. mov eax,num
    2. mov cl,high_index
    3. xor cl,31
    4. shl eax,cl
    5. sar  eax,cl
    6. mov  cl,low_index
    7. bt eax,cl
    8. rcr eax,1
    9. sar eax,cl
    10. inc cl
    11. rol eax,cl
     
  4. _BC_

    _BC_ БЦ

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



    Вместо xor cl, 31 можно написать not cl



    -1 байт
     
  5. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    а нет такой команды bt eax,cl
     
  6. Black_mirror

    Black_mirror Active Member

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

    Это опечатка ;)
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. shr   eax,low_index+1
    2. sbb   ecx,ecx
    3. shld  eax,ecx,low_index+1
    4. shl   eax,32-high_index
    5. sbb   ecx,ecx
    6. shrd  eax,ecx,32-high_index
    Так можно исключить один сдвиг
    Код (Text):
    1. shr   eax,low_index+1
    2. sbb   ecx,ecx
    3. shld  eax,ecx,32-high_index+low_index+1
    4. sbb   ecx,ecx
    5. shrd  eax,ecx,32-high_index
    Или пару байт
    Код (Text):
    1. shl   eax,31-high_index
    2. cdq
    3. shrd  eax,edx,32-low_index
    4. sbb   edx,edx
    5. shld  eax,edx,low_index+1
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Можно ешё сдвиг исключить (не предел?), вместо него пусть лучше будет вычитание индекса
    Код (Text):
    1. shl   eax,31-high_index
    2. sar   eax,32-low_index
    3. sbb   ecx,ecx
    4. shld  eax,ecx,low_index+1