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

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

  1. The Svin

    The Svin New Member

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



    Пример пусть первые 16 байт входного массива (бинарно)

    10010001

    10101010

    11110000

    10101000

    10101011

    01010101

    01010101

    11111111



    10010001

    10101010

    11110000

    10101000

    10101011

    01010101

    01010101

    01111111



    Значит в нулевом выходном массиве первые два байта должны быть

    10011111 00011111

    в первом выходном

    11100100 11100100

    и т.д.
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    это банальное транспонирование, лень значения вбивать, скопировал из своих проектов
    Код (Text):
    1.     movq mm0, a
    2.     movq mm1, b
    3.     movq mm2, mm0
    4.     punpcklbw mm0, mm1
    5.     punpckhbw mm2, mm1
    6.     movq mm1, mm0
    7.     movq mm3, mm2
    8.     punpcklbw mm0, mm2
    9.     punpckhbw mm1, mm3
    10.     movq mm2, mm0
    11.     psrld mm2, 16
    12.     pslld mm0, 16
    13.     por mm0, mm2
    14.     movq mm2, mm1
    15.     psrld mm2, 16
    16.     pslld mm1, 16
    17.     por mm1, mm2
     
  3. The Svin

    The Svin New Member

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

    Вход lpMemIn - адресс входной массив lpMemOut - адресс для 8и выходных массивов.
     
  4. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    на входе a и b - 64-битные значения, на выходе mm0, mm1 транспонированные, ну типа такого должно быть:
    Код (Text):
    1. mov edi, lpMemIn
    2. movq mm0, [edi]
    3. movq mm1, [edi+8]
    4. ...
    5. mov edi, lpMemOut
    6. mov [edi], mm0
    7. mov [edi+8], mm1
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. a_split:;(a_in +4, a_out +8, len +12)
    2.     xchg esi,[esp+4];a_in      
    3.     xchg edi,[esp+8];a_out
    4.     push ebx
    5.     push ebp    ;+8
    6.     mov ebp,[8+esp+12]  ;len
    7.     shr ebp,3
    8.     lea edi,[edi+ebp*8]
    9.     sub edi,ebp
    10.     .next:
    11.     mov eax,[esi]
    12.     mov ebx,[esi+4]
    13. repeat 8
    14.     mov ecx,1010101h
    15.     mov edx,1010101h
    16.     and ecx,eax
    17.     and edx,ebx
    18.     imul ecx,01020408h
    19.     imul edx,10204080h
    20.     or ecx,edx
    21.     shr ecx,24
    22.     mov [edi],cl
    23.     sub edi,ebp
    24.     shr eax,1
    25.     shr ebx,1
    26. end repeat 
    27.     add esi,8
    28.     lea edi,[edi+ebp*8+1]
    29.     sub dword [8+esp+12],8
    30.     ja .next
    31.     pop ebp
    32.     pop ebx     ;+0
    33.     mov esi,[esp+4]    
    34.     mov edi,[esp+8]
    35.     ret 12