подскажите, можно ли данную функцию оптимизировать по скорости? реализую Blowfish алго, притормаживает это место? Код (Text): mov edi,[Input] mov esi,0xFF ; d = (Input AND $000000ff); Input:= Input SHR 8; mov edx,edi and edx,esi shr edi,8 ; c = (Input AND $000000ff) + 1; Input:= Input SHR 8; mov ecx,edi and ecx,esi shr edi,8 ; b = (Input AND $000000ff); Input:= Input SHR 8; mov ebx,edi and ebx,esi shr edi,8 ; a = (Input AND $000000ff); Input:= Input SHR 8; mov eax,edi and eax,esi ; F = ((sbox[1,a] + (sbox[2,b] AND $0000001f)) XOR sbox[3,c]) + (sbox[4,d] AND $0000001f); mov eax,dword [sbox0+eax*4] mov ebx,dword [sbox1+ebx*4] and ebx,0x1F add eax,ebx mov ecx,dword [sbox2+ecx*4] xor eax,ecx mov edx,dword [sbox3+edx*4] and edx,0x1F add eax,edx retn
Код (Text): mov edi,[Input] mov esi,0xFF mov edx,edi mov ecx,edi and edx,esi shr ecx,8 mov ebx,edi mov eax,edi shr ebx,16 and ecx,esi shr eax,24 and ebx,esi ; F = ((sbox[1,a] + (sbox[2,b] AND $0000001f)) XOR sbox[3,c]) + (sbox[4,d] AND $0000001f); mov ebx,dword [sbox1+ebx*4] and ebx,0x1F mov eax,dword [sbox0+eax*4] mov ecx,dword [sbox2+ecx*4] add eax,ebx mov edx,dword [sbox3+edx*4] xor eax,ecx and edx,0x1F add eax,edx retn где-то так P.S. поправил
KiNDeR Важный момент: как Вы осуществили переход от sbox[1,a], sbox[2,b], sbox[3,c], sbox[4,d] к sbox0, sbox1, sbox2, sbox3? Ну, или, короче, ширина таблицы фиксирована?
это опечатка, формула для паскаля была, а там счет с 1 а не с 0 фиксирована, каждый блок по 256 32-битных
Код (Text): mov edi, Input mov eax, 0x1F movzx ecx, byte [edi+1] mov edx, eax movzx ebx, byte [edi] and eax, [sbox1+ecx*4] ; b&0x1F movzx ecx, byte [edi+2] add eax, [sbox0+ebx*4] ; a+b&0x1F movzx ebx, byte [edi+3] xor eax, [sbox2+ecx*4] ; (a+b&0x1F)^c and edx, [sbox3+ebx*4] ; d&0x1F add eax, edx ; (a+b&0x1F)^c+d&0x1F У меня так нЕмного быстрее. Можно edi не использовать, если Input - стековая переменная.