Какой-то примитивный хеш. На выходе всего один ворд Вот нескошлько примеров (блок заполнен константой (она слева), а справа--результаты для блока длиной 1, 2, 3 и т.д. байт). 00:=0000,0000. АА:=AA00,AAAA,54AB,5555,FF55,FFFF,AA00. BB:=BB00,BBBB,76BC,7777,3278,3333,EE33,EEEE, A9EF,AAAA,65AB,6666,2167,2222,ED22,DDDD,, CC:=CC00,CCCC,, DD DD DD=DD00,DDDD,BADE,, EE:=EE00,EEEE,DCEF,DDDD,CBDE,CCCC,BACD,BBBB,, FF:=FF00,FFFF,FF00. Хотелось бы узнать формулу.
DD:=DD00,DDDD,BADE,BBBB,98BC,9999,769A,7777, 5478,5555,3256,3333,1034,1111,EE11,EEEE, CBEF,CCCC(A9CD,AAAA,87AB,8888,6589,6666, 4367,4444,2145,2222)FF22,FFFF,DD00.
Oxy Code (Text): char buf[N]; uint32 sum=0; for(i=0;i<(N&-2);i+=2) sum+=*(uint16*)(buf+i); if(N&1) sum+=*(uint8*)(buf+(N&-2)); sum%=65535;
Код для меня нечитабельный (Си наверное--так я его не знаю Но все равно спасибо! Я уже разобрался. Просто сразу не въехал, что суммируются слова, а не байты. Вот код, воспроизводящий цепочку (точне, ее четные звенья): (константу полдожить в Bx) Code (Text): 0050AFEE 66:03C3 ADD AX,BX 0050AFF1 66:83D0 00 ADC AX,0 0050AFF5 ^ EB F7 JMP SHORT 0050AFEE
Походу, оказалось, что всё не так просто. При большой длине блока последовательность нарушается! Вот пример: Code (Text): DD:[256k-5(626139)]:FD22,FEFF,DB00,DCDD,B9DE,BABB,97BC Какие есть идеи?
Небольшая ошибка в стартовой длине блока (в скобках, а 256к-5--правильно): DD:[256k-5(262139)]:FD22,FEFF,DB00,DCDD,B9DE,BABB,97BC
Oxy Просто в программе используется не совсем правильный алгоритм, который на блоках длинее 64К слов в общем случае может работать не правильно: Code (Text): xor eax,eax xor ebx,ebx jmp c s: mov bx,[edx] add eax,ebx add edx,2 c: sub ecx,2 jnc s test cl,1 jz e movzx ebx,byte [edx] add eax,ebx e: mov ebx,eax shr eax,16 add ax,bx adc ax,0
Oxy Попробуй конец моего кода заменить на: Code (Text): e: cdq mov ecx,65535 idiv ecx xchg eax,edx Возможно что там дело в переполнении.
Этот хвост совсем не подходит: с ним цепочка FF принимает вид: FF00,0000,FF00 Кроме того, два предыдущих моих поста оказались БРЕДОМ Как бы их удалить ??? На самом деле, цепочка FF мутирует гараздо раньше 32-х К, и после 64k эта мутация не отменяется, причем это не простое вычитание единицы FF00,FFFF,FF00,..FE00,FFFF,FE00,..(1082300F7FF,F600...
Oxy Тогда к хвосту нужно добавить cmp ax,1/adc ax,0. Вообще если считать по модулю 65535, то 0000 и FFFF эквивалентны. Чтобы выяснить где именно в функции баг, нужно посмотреть несколько элементов последовательности при количестве слов около 7FFFFFFF/W, FFFFFFFF/W,17FFFFFFF/W, где W это слово(не байт) которым заполнен буфер. Нечетное количество байт можно пока не рассматривать, как они обрабатываются можно будет определить потом. Вообще очень желательно увидеть код самой функции которая это считает. Вы его можете вытащить?
Black_mirror Он же код функции уже цитировал (адрес 0050AFEE). Непонятно, зачем тогда это соревнование на эрудицию?
Спасибо! Я, уже расковырял Все свелось к предложеному Вами коду, только без последнего adc. Кроме того, сразу я не учел, что при поблочной обработке большого массива (когда процедура вызывается многократно), коррекцию суммы следует делать не для каждого блока, а только один раз, после обработки всего массива.
crypto То был не код функции, а код, успешно воспроизводящий цепочку для малых блоков. Функцию я только сейчас расковырял.