· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› MD5 hash

Посл.отвђт Сообщен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