Дан массив байт (размер в байтах кратен 8и) трансформировать его в восемь массивов каждый из которых будет содержать бит только определённого индекса каждого байта. Т.е. массив содержащий все нулевые биты (бины) входного, следующий массив содержащий унбины и т.д. Пример пусть первые 16 байт входного массива (бинарно) 10010001 10101010 11110000 10101000 10101011 01010101 01010101 11111111 10010001 10101010 11110000 10101000 10101011 01010101 01010101 01111111 Значит в нулевом выходном массиве первые два байта должны быть 10011111 00011111 в первом выходном 11100100 11100100 и т.д.
это банальное транспонирование, лень значения вбивать, скопировал из своих проектов Код (Text): movq mm0, a movq mm1, b movq mm2, mm0 punpcklbw mm0, mm1 punpckhbw mm2, mm1 movq mm1, mm0 movq mm3, mm2 punpcklbw mm0, mm2 punpckhbw mm1, mm3 movq mm2, mm0 psrld mm2, 16 pslld mm0, 16 por mm0, mm2 movq mm2, mm1 psrld mm2, 16 pslld mm1, 16 por mm1, mm2
Значения можно не вбивать но задачку, пожалуйста, если можно решить полностью т.е. Вход lpMemIn - адресс входной массив lpMemOut - адресс для 8и выходных массивов.
на входе a и b - 64-битные значения, на выходе mm0, mm1 транспонированные, ну типа такого должно быть: Код (Text): mov edi, lpMemIn movq mm0, [edi] movq mm1, [edi+8] ... mov edi, lpMemOut mov [edi], mm0 mov [edi+8], mm1
Код (Text): a_split:;(a_in +4, a_out +8, len +12) xchg esi,[esp+4];a_in xchg edi,[esp+8];a_out push ebx push ebp ;+8 mov ebp,[8+esp+12] ;len shr ebp,3 lea edi,[edi+ebp*8] sub edi,ebp .next: mov eax,[esi] mov ebx,[esi+4] repeat 8 mov ecx,1010101h mov edx,1010101h and ecx,eax and edx,ebx imul ecx,01020408h imul edx,10204080h or ecx,edx shr ecx,24 mov [edi],cl sub edi,ebp shr eax,1 shr ebx,1 end repeat add esi,8 lea edi,[edi+ebp*8+1] sub dword [8+esp+12],8 ja .next pop ebp pop ebx ;+0 mov esi,[esp+4] mov edi,[esp+8] ret 12