|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 25, 2003 12:03:35 · Поправил: chigevara Значит так. Сначала инициализирую на стеке массив t(i)и добавляю j&s на каждый раунд следующим образом push 000000020h //занесли 32 fild dword ptr [esp] pop ecx add ecx, ecx start_init: push ecx fild dword ptr [esp] //t(i)= целая часть от 2^32 * abs(sin(i)), где i в радианах fsin fabs fscale fistp dword ptr [esp] loop start mov ebp, esp push 0150F0A06h push 000000709h push 017100B04h push 000000312h push 0140E0905h push 000000411h push 016110C07h push 000000512h Вопрос как настроить FPU по округлению- надо чтобы дробная часть отбрасывалась. И вообще в каком состоянии я этот FPU получаю. Далее на стек заносится пустое двойное слово, в нём будет храниться адрес подпрограммы, после длина сообщения в 512р блоках и переменные сцепления в регистрах(либо результаты от предыдущего хеширования если идет хешинг потока либо большого файла) start_hash: call next_cop next_cop: pop [ebp-24h] push edi push ebx push ecx push eax jmp short init_transit xor ebx, edi and ecx,ebx xor ecx, edi xor ebx, edi ret xor ecx,ebx and ecx,edi xor ecx, ebx ret start_transit: jmp short start_hash xor ecx, ebx xor ecx, edi ret init_transit: xor edx,edx jmp short next_round not edi or ecx, edi xor ecx, ebx not edi ret next_round: add [ebp-24h], 09h //перевелись на текущую подпрограмму next_step: push ecx call [ebp-24h] add eax, ecx // eax= a+f(b,c,d) add eax, [ebp+edx*4] //eax=a+f(b,c,d)+t(i) push edx shr edx, 04h mov ecx, [ebp+edx*8-20h] add cl, ch and cx, 000Fh add eax,[esi+ecx*4] //eax=a+f(b,c,d)+t(i)+M(j) mov [ebp+edx*8-20h], cl mov ecx,[ebp+edx*8-1Ch] rol eax,cl //(eax=a+f(b,c,d)+t(i)+M(j))<<<s ror ecx, 08h //next s mov [ebp+edx*8-1Ch],ecx //save s pop edx inc edx pop ecx xadd ecx, eax //сдвиг операндов, см. алгоритм MD5 xchg eax, ebx xchg eax, edi test dl, 0Fh //счётчик шагов jnz short next_step cmp dl,40h //счётчик раундов jnz short next_round pop edx add eax, edx pop edx add ecx, edx pop edx add ebx, edx pop edx add edi, edx add esi, 40h dec[ebp-28h] // счётчик блоков jnz short start_transit ret Вопрос- всё ли у меня в порядке с грамматикой и какие мысли по сокращению кода желательно без потери производительности(хеширование у меня в 138 байт уместилось) P.S Я тут у вас на сайте видел MD5 реализацию, блин, короче это не дзен.http://www.wasm.ru/src/5/md5asm.zip Совсем забыл переменные A-eax B-ecx C-ebx D-edi(да, edi) esi смотрит на хешируемую строку |
|
|
Дата: Ноя 26, 2003 10:09:56 · Поправил: chigevara Я дико извиняюсь, в код вкрались кое какие обознатки. Всё исправлено, особое внимание-расположение переменных в регистрах. Прикололся как урезать на 4 байта, но криво выходит-лишние прыжки и код некрасивый. Хе-х. Срезал таки 2 байта.Было push edx and dl, 0Fh //счётчик шагов pop edx стало test dl, 0Fh Итого 136 байт вроде. Ё. В памяти храним так, пишем обратно понимаем посередине. Нельзя писать числа как они в памяти хранятся?с младших разрядов. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.130 |