Массив со словами (словарь паролей короче), каждое заканчиваются возвратом каретки (0x0D0A), вот пример: Код (Text): 31 32 33 34 35 36 37 38 0D 0A 61 62 63 64 65 66 12345678..abcdef 0D 0A 41 42 43 44 45 46 0D 0A 31 32 24 33 34 35 ..ABCDEF..12$345 36 37 38 61 20 62 63 64 65 66 41 42 43 2A 44 45 678a bcdefABC*DE 46 7E 0D 0A F~.. Найти длину самого длинного слова, вот "исходник": Код (Text): ;======================================== stdcall longword,buffer,size ;======================================== longword: push ebx mov ebx,[esp+8] add [esp+12],ebx mov ecx,ebx or eax,-1 @@: cmp byte[ebx],0x0f lea ebx,[ebx+1] jnc @b sub ecx,ebx sub ecx,eax sbb edx,edx and edx,ecx inc ebx add eax,edx cmp ebx,[esp+12] mov ecx,ebx jc @b not eax pop ebx retn 8 ;========================================
Очень интересно. А в чем суть вопроса? ;======================================== stdcall longword,buffer,size ;======================================== longword: mov edx,[esp+4] dec edx add [esp+8],edx mov ecx,edx or eax,-1 @@: inc edx cmp word[edx],0A0Dh jne @b sub ecx,edx cmp ecx,eax jae @1 mov eax,ecx @1: inc edx mov ecx,edx cmp edx,[esp+8] jc @b not eax retn 8 Так доходчивей, короче, правильней, и регистров меньше используется.
dr_dred Ни в чем, я сделал для себя решение, а потом ним поделился, потому что не понравилось cresta Да там можно любое, что больше 0x0D, просто с jnz у меня почему-то чуть дольше получалось
dr_dred Разве это плюс? Если задействовать один дополнительный регист (esi сам просится , можно выйграть ещё минимум 3 байта в размере и немного в скорости.
bogrus Мне Ваше решение понравилось Доходил в отладчике. Так можно еще: ;======================================== Код (Text): longword: mov edx,[esp+4] add [esp+8],edx xor eax,eax or ecx,-1 .repeat .repeat inc ecx .until word [edx+ecx]=0A0Dh .if ecx>eax mov eax,ecx .endif lea edx,[edx+ecx+2] or ecx,-1 .until edx>=[esp+8] retn 8 ;======================================== то же что и ;======================================== Код (Text): longword: mov edx,[esp+4] add [esp+8],edx xor eax,eax or ecx,-1 @@: inc ecx cmp word[edx+ecx],0A0Dh jne @b cmp ecx,eax jna @1 mov eax,ecx @1: lea edx,[edx+ecx+2] or ecx,-1 cmp edx,[esp+8] jb @b retn 8
Пользуясь случаем. Когда-то в HEAP была тема "Самозарождение вирусов", и кто-то написал там код, размножающий себя в памяти. Иногда, отлаживая программу в OllyDbg, отладка начинается не с первой команды программы, а раньше, и тогда видно, что вызов процедуры start идет так: call dword ptr [ebp+8] Пользуяь этим: Код (Text): format PE GUI 4.0 include 'win32axp.inc' section '.code' code readable writeable executable start: mov esi,[ebp+8] mov ecx,10h lea edi,[esi+ecx] add dword [ebp+8],ecx rep movsb .end start ?
Код (Text): pas_len: push ebp xor ebp,ebp mov esi,[esp+12] mov edi,-235802126 add esi,[esp+8] _s: mov eax,[esp+8] lea edx,[eax+3] _l: cmp eax,esi jge _r mov ecx,edi mov ebx,[eax] add ecx,ebx not ebx and ecx,2155905152 and ecx,ebx jnz _4 mov ecx,edi mov ebx,[eax+4] add ecx,ebx not ebx and ecx,2155905152 and ecx,ebx jnz _8 mov ecx,edi mov ebx,[eax+8] add ecx,ebx not ebx and ecx,2155905152 and ecx,ebx jnz _12 mov ecx,edi mov ebx,[eax+12] add ecx,ebx add eax,16 not ebx and ecx,2155905152 and ecx,ebx jz _l jmp _z _12:add eax,4 _8: add eax,4 _4: add eax,4 _z: test ecx,32896 jnz @F shr ecx,16 add eax,2 @@: shl cl,1 sbb eax,edx add [esp+8],eax add dword ptr[esp+8],2 cmp eax,ebp jle _s mov ebp,eax jmp _s _r: mov eax,ebp pop ebp retn 8