Задачка аналогична задачке №2 но здесь нам нужно посчитать колличество бинарных строк (определение см. в задачке 2) не в двойном слове а в огромном массиве. Дан указатель на массив и размер в байтах, на выходе дать количество бинарных строк. Замечание - не допустите детскую ошибку бинарные строки могут быть любой длины - т.е. сумма бинарных строк в двойных словах может (и чаще всего) не равна общему количеству строк в массиве. Наприме в двух рядом стоящих двойных словах 00FFFFFF FF000000 средняя (нулевая) строка занимает две старшие тетрады (сикс и септ тетры) младшего двойного слова и 6 младших (до квинт тетры включительно) тетрады следующего двойного слова.
Код (Text): bscnt:;(start +4, len +8):eax - число строк mov eax,1 mov ebx,[esp+4] mov edx,[esp+8] lea ecx,[edx*8] and ecx,3*8 jnz .l9 sub edx,4 .l9: sub ecx,32 neg ecx and edx,-4 mov esi,[ebx+edx] shl esi,cl sar esi,cl mov ebp,esi .next: mov ecx,esi shl ebp,1 rcr ecx,1 sbb ebp,ebp xor esi,ecx .l0: adc eax,0 .l1: add esi,esi ja .l1 jc .l0 sub edx,4 mov esi,[ebx+edx] jge .next ret 8
Код (Text): Вход: EDI = адрес массива, ECX = длина в байтах (лучше б была в битах). Выход: BL = число битовых строк mov ah, 1 xor ebx, ebx shl ecx, 3 dec ecx l1: bt [edi], ecx ; ! setc al test ebx, ebx jz l2 xor ah, al l2: add bl, ah mov ah, al dec ecx jnz l1
Важна скорость. Допустим сигнальная строка >= гигабиту. Сигнал непредсказуем. Но задача должна стремится хотя бы быть выполнена не более секунды. Понятно что могут быть участки (возможно большие) равномерного сигнала (низкого или высокого). И этим грех не воспользоваться.