Оптимизировал код получения md5-хэша для строки длиной 8 байт. Производительность кода составляет 5,5 млн хэшей/c на Athlon 64 3000+ (2,6 ГГц). Функция создана для использования в Delphi. Перед вызовом функции компилятор Delphi в eax помещает указатель на начало входной строки, а в edx - указатель на 16-тибайтный выходной массив md5-хэша. Код (Text): type PByteArray = ^TByteArray; TByteArray = array[0..0] of Byte; TMD5Digest = record case Integer of 0: (A, B, C, D: LongInt); 1: (v: array[0..15] of Byte); end; function MD5Buffer8(const Input: PByteArray): TMD5Digest; asm pushad push edx add esp, -4 mov ebp, [eax] //x0 mov eax, [eax + 4] mov [esp], eax //x1 mov eax, $67452301 mov ebx, $EFCDAB89 mov ecx, $98BADCFE mov edx, $10325476 //FF1_1 mov esi, ebx not esi and esi, edx mov edi, ebx and edi, ecx or edi, esi add eax, edi add eax, $D76AA478 add eax, ebp //x0 rol eax, 7 add eax, ebx //FF1_2 mov esi, eax not esi and esi, ecx mov edi, eax and edi, ebx or edi, esi add edx, edi add edx, $E8C7B756 add edx, [esp] //x1 rol edx, 12 add edx, eax //FF1_3 mov esi, edx not esi and esi, ebx mov edi, edx and edi, eax or edi, esi add ecx, edi add ecx, $2420715B rol ecx, 17 add ecx, edx //FF1_4 mov esi, ecx not esi and esi, eax mov edi, ecx and edi, edx or edi, esi add ebx, edi add ebx, $C1BDCEEE rol ebx, 22 add ebx, ecx //FF2_1 mov esi, ebx not esi and esi, edx mov edi, ebx and edi, ecx or edi, esi add eax, edi add eax, $F57C0FAF rol eax, 7 add eax, ebx //FF2_2 mov esi, eax not esi and esi, ecx mov edi, eax and edi, ebx or edi, esi add edx, edi add edx, $4787C62A rol edx, 12 add edx, eax //FF2_3 mov esi, edx not esi and esi, ebx mov edi, edx and edi, eax or edi, esi add ecx, edi add ecx, $A8304613 rol ecx, 17 add ecx, edx //FF2_4 mov esi, ecx not esi and esi, eax mov edi, ecx and edi, edx or edi, esi add ebx, edi add ebx, $FD469501 rol ebx, 22 add ebx, ecx //FF3_1 mov esi, ebx not esi and esi, edx mov edi, ebx and edi, ecx or edi, esi add eax, edi add eax, $698098D8 rol eax, 7 add eax, ebx //FF3_2 mov esi, eax not esi and esi, ecx mov edi, eax and edi, ebx or edi, esi add edx, edi add edx, $8B44F7AF rol edx, 12 add edx, eax //FF3_3 mov esi, edx not esi and esi, ebx mov edi, edx and edi, eax or edi, esi add ecx, edi add ecx, $FFFF5BB1 rol ecx, 17 add ecx, edx //FF3_4 mov esi, ecx not esi and esi, eax mov edi, ecx and edi, edx or edi, esi add ebx, edi add ebx, $895CD7BE rol ebx, 22 add ebx, ecx //FF4_1 mov esi, ebx not esi and esi, edx mov edi, ebx and edi, ecx or edi, esi add eax, edi add eax, $6B901122 rol eax, 7 add eax, ebx //FF4_2 mov esi, eax not esi and esi, ecx mov edi, eax and edi, ebx or edi, esi add edx, edi add edx, $FD987193 rol edx, 12 add edx, eax //FF4_3 mov esi, edx not esi and esi, ebx mov edi, edx and edi, eax or edi, esi add ecx, edi add ecx, $A67943CE rol ecx, 17 add ecx, edx //FF4_4 mov esi, ecx not esi and esi, eax mov edi, ecx and edi, edx or edi, esi add ebx, edi add ebx, $49B40821 rol ebx, 22 add ebx, ecx //GG1_1 mov esi, edx not esi and esi, ecx mov edi, ebx and edi, edx or edi, esi add eax, edi add eax, $F61E2562 add eax, [esp] //x1 rol eax, 5 add eax, ebx //GG1_2 mov esi, ecx not esi and esi, ebx mov edi, eax and edi, ecx or edi, esi add edx, edi add edx, $C040B340 rol edx, 9 add edx, eax //GG1_3 mov esi, ebx not esi and esi, eax mov edi, edx and edi, ebx or edi, esi add ecx, edi add ecx, $265E5A51 rol ecx, 14 add ecx, edx //GG1_4 mov esi, eax not esi and esi, edx mov edi, ecx and edi, eax or edi, esi add ebx, edi add ebx, $E9B6C7AA add ebx, ebp //x0 rol ebx, 20 add ebx, ecx //GG2_1 mov esi, edx not esi and esi, ecx mov edi, ebx and edi, edx or edi, esi add eax, edi add eax, $D62F105D rol eax, 5 add eax, ebx //GG2_2 mov esi, ecx not esi and esi, ebx mov edi, eax and edi, ecx or edi, esi add edx, edi add edx, $02441453 rol edx, 9 add edx, eax //GG2_3 mov esi, ebx not esi and esi, eax mov edi, edx and edi, ebx or edi, esi add ecx, edi add ecx, $D8A1E681 rol ecx, 14 add ecx, edx //GG2_4 mov esi, eax not esi and esi, edx mov edi, ecx and edi, eax or edi, esi add ebx, edi add ebx, $E7D3FBC8 rol ebx, 20 add ebx, ecx //GG3_1 mov esi, edx not esi and esi, ecx mov edi, ebx and edi, edx or edi, esi add eax, edi add eax, $21E1CDE6 rol eax, 5 add eax, ebx //GG3_2 mov esi, ecx not esi and esi, ebx mov edi, eax and edi, ecx or edi, esi add edx, edi add edx, $C3370816 rol edx, 9 add edx, eax //GG3_3 mov esi, ebx not esi and esi, eax mov edi, edx and edi, ebx or edi, esi add ecx, edi add ecx, $F4D50D87 rol ecx, 14 add ecx, edx //GG3_4 mov esi, eax not esi and esi, edx mov edi, ecx and edi, eax or edi, esi add ebx, edi add ebx, $455A14ED rol ebx, 20 add ebx, ecx //GG4_1 mov esi, edx not esi and esi, ecx mov edi, ebx and edi, edx or edi, esi add eax, edi add eax, $A9E3E905 rol eax, 5 add eax, ebx //GG4_2 mov esi, ecx not esi and esi, ebx mov edi, eax and edi, ecx or edi, esi add edx, edi add edx, $FCEFA478 rol edx, 9 add edx, eax //GG4_3 mov esi, ebx not esi and esi, eax mov edi, edx and edi, ebx or edi, esi add ecx, edi add ecx, $676F02D9 rol ecx, 14 add ecx, edx //GG4_4 mov esi, eax not esi and esi, edx mov edi, ecx and edi, eax or edi, esi add ebx, edi add ebx, $8D2A4C8A rol ebx, 20 add ebx, ecx //HH1_1 mov edi, ebx xor edi, ecx xor edi, edx add eax, edi add eax, $FFFA3942 rol eax, 4 add eax, ebx //HH1_2 mov edi, eax xor edi, ebx xor edi, ecx add edx, edi add edx, $8771F681 rol edx, 11 add edx, eax //HH1_3 mov edi, edx xor edi, eax xor edi, ebx add ecx, edi add ecx, $6D9D6122 rol ecx, 16 add ecx, edx //HH1_4 mov edi, ecx xor edi, edx xor edi, eax add ebx, edi add ebx, $FDE5384C rol ebx, 23 add ebx, ecx //HH2_1 mov edi, ebx xor edi, ecx xor edi, edx add eax, edi add eax, $A4BEEA44 add eax, [esp] //x1 rol eax, 4 add eax, ebx //HH2_2 mov edi, eax xor edi, ebx xor edi, ecx add edx, edi add edx, $4BDECFA9 rol edx, 11 add edx, eax //HH2_3 mov edi, edx xor edi, eax xor edi, ebx add ecx, edi add ecx, $F6BB4B60 rol ecx, 16 add ecx, edx //HH2_4 mov edi, ecx xor edi, edx xor edi, eax add ebx, edi add ebx, $BEBFBC70 rol ebx, 23 add ebx, ecx //HH3_1 mov edi, ebx xor edi, ecx xor edi, edx add eax, edi add eax, $289B7EC6 rol eax, 4 add eax, ebx //HH3_2 mov edi, eax xor edi, ebx xor edi, ecx add edx, edi add edx, $EAA127FA add edx, ebp //x0 rol edx, 11 add edx, eax //HH3_3 mov edi, edx xor edi, eax xor edi, ebx add ecx, edi add ecx, $D4EF3085 rol ecx, 16 add ecx, edx //HH3_4 mov edi, ecx xor edi, edx xor edi, eax add ebx, edi add ebx, $04881D05 rol ebx, 23 add ebx, ecx //HH4_1 mov edi, ebx xor edi, ecx xor edi, edx add eax, edi add eax, $D9D4D039 rol eax, 4 add eax, ebx //HH4_2 mov edi, eax xor edi, ebx xor edi, ecx add edx, edi add edx, $E6DB99E5 rol edx, 11 add edx, eax //HH4_3 mov edi, edx xor edi, eax xor edi, ebx add ecx, edi add ecx, $1FA27CF8 rol ecx, 16 add ecx, edx //HH4_4 mov edi, ecx xor edi, edx xor edi, eax add ebx, edi add ebx, $C4AC56E5 rol ebx, 23 add ebx, ecx //II1_1 mov edi, edx not edi or edi, ebx xor edi, ecx add eax, edi add eax, $F4292244 add eax, ebp //x0 rol eax, 6 add eax, ebx //II1_2 mov edi, ecx not edi or edi, eax xor edi, ebx add edx, edi add edx, $432AFF97 rol edx, 10 add edx, eax //II1_3 mov edi, ebx not edi or edi, edx xor edi, eax add ecx, edi add ecx, $AB9423E7 rol ecx, 15 add ecx, edx //II1_4 mov edi, eax not edi or edi, ecx xor edi, edx add ebx, edi add ebx, $FC93A039 rol ebx, 21 add ebx, ecx //II2_1 mov edi, edx not edi or edi, ebx xor edi, ecx add eax, edi add eax, $655B59C3 rol eax, 6 add eax, ebx //II2_2 mov edi, ecx not edi or edi, eax xor edi, ebx add edx, edi add edx, $8F0CCC92 rol edx, 10 add edx, eax //II2_3 mov edi, ebx not edi or edi, edx xor edi, eax add ecx, edi add ecx, $FFEFF47D rol ecx, 15 add ecx, edx //II2_4 mov edi, eax not edi or edi, ecx xor edi, edx add ebx, edi add ebx, $85845DD1 add ebx, [esp] //x1 rol ebx, 21 add ebx, ecx //II3_1 mov edi, edx not edi or edi, ebx xor edi, ecx add eax, edi add eax, $6FA87E4F rol eax, 6 add eax, ebx //II3_2 mov edi, ecx not edi or edi, eax xor edi, ebx add edx, edi add edx, $FE2CE6E0 rol edx, 10 add edx, eax //II3_3 mov edi, ebx not edi or edi, edx xor edi, eax add ecx, edi add ecx, $A3014314 rol ecx, 15 add ecx, edx //II3_4 mov edi, eax not edi or edi, ecx xor edi, edx add ebx, edi add ebx, $4E0811A1 rol ebx, 21 add ebx, ecx //II4_1 mov edi, edx not edi or edi, ebx xor edi, ecx add eax, edi add eax, $F7537E82 rol eax, 6 add eax, ebx //II4_2 mov edi, ecx not edi or edi, eax xor edi, ebx add edx, edi add edx, $BD3AF235 rol edx, 10 add edx, eax //II4_3 mov edi, ebx not edi or edi, edx xor edi, eax add ecx, edi add ecx, $2AD7D33B rol ecx, 15 add ecx, edx //II4_4 mov edi, eax not edi or edi, ecx xor edi, edx add ebx, edi add ebx, $EB86D391 rol ebx, 21 add ebx, ecx add eax, $67452301 add ebx, $EFCDAB89 add ecx, $98BADCFE add edx, $10325476 add esp, 4 pop edi mov [edi], eax mov [edi + 4], ebx mov [edi + 8], ecx mov [edi + 12], edx popad end; Реально ли здесь ещё чего оптимизировать или это предел?
пароли перебирать насчет оптимизации - выравнивание кода и данных, перестановка инструкций. читай маны по оптимизации от интела