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

 WASM Phorum —› WASM.WIN32 —› Сравнение строк

Посл.отвђт Сообщенiе


Дата: Авг 20, 2003 17:48:11

Доброе время суток!
Простите, снова возникла проблема и снова обращаюсь к Вам.
Нужно сравнить строки. Например, имеется строка от пользователя -
из формы и строка из реестра или из секции .data.
Как правильно сравнить строку любой длины. Я могу только сравнить
первую цифру\букву, но дальше ничего не получается (f как быть с регистром).
Один человек дал исходник:
;
Mov ESI, OFFSET buffer
Mov EDI, OFFSET original
@@comp: ;отсюда начинаем сравнение
Mov AL,[ESI]
Cmp AL,00h ;конец?
Jz @@ ; куда прыгать????
Cmp AL,[EDI] ;одинаково?
Jnz @@ ; куда прыгать????
Inc ESI
Inc EDI
Jmp @@comp
;
- комментарии мои. В чём грабли? Подскажите. Куда "прыгать"? А есть ли другие варианты?
Помогите с исходным кодом сравнения строк. Может быть Вы подскажите другие варианты для моего случая.
Я пишу программу, где пользователь вводит пароль, а как его обработать не знаю.

Заранее спасибо!
1990


Дата: Авг 20, 2003 17:53:21

Можно сделать проще и хранить не пароли, а их хеш. Пользователь вводит свой пароль, считаем хеш, сравниваем с имеющимся. Можно тот же CRC32 взять. В случае побуквенного сравнения подобрать такой пароль - дело 1 минуты.
А исходник явно с ошибками написан, особенно инструкции, вроде "jz @@", плюс сама имея не оптимальная.


Дата: Авг 20, 2003 18:02:00

Немного не точно указал - @@ - это начало, например @@error и т.д. Извините, за неточность!


Дата: Авг 20, 2003 18:09:39

Если строки имеют одинаковую длину то можно так:
Mov ESI, OFFSET buffer 
Mov EDI, OFFSET original 
@@comp: ;отсюда начинаем сравнение 
Mov AL,byte ptr [ESI] 
Cmp AL,byte ptr [EDI] ;одинаково? 
Jnz @@exit ; не равны. Выходим.
Cmp AL,00h ; коли достигли конца 
Jz @@exit  ; то выходим из цыкла   
Inc ESI 
Inc EDI 
Jmp @@comp
@@exit:


или так
Mov ESI, OFFSET buffer 
Mov EDI, OFFSET original
repe cmpsb


или посмотри описание функции lstrcmp


Дата: Авг 20, 2003 19:29:02

IMHO, the CompareString function compares two character strings, using the locale specified by the given identifier as the basis for the comparison.

int CompareString(
LCID Locale, // locale identifier
DWORD dwCmpFlags, // comparison-style options
LPCTSTR lpString1, // pointer to first string
int cchCount1, // size, in bytes or characters, of first string
LPCTSTR lpString2, // pointer to second string
int cchCount2 // size, in bytes or characters, of second string
);


Дата: Авг 21, 2003 11:16:34

Вы что, прикалываетесь? Есть такая комманда "cmps". Поэлементно сравнивает две строки.


Дата: Авг 22, 2003 10:29:03

А как использовать cmps?
Если я пытаюсь сравнить регистры, то ничего не выходит
cmps EDI,ESI
В чём грабли?


Дата: Авг 22, 2003 13:43:56

1990
cmps EDI,ESI

Приехали!!! А что написано в мануале???

Посмотрите пожалуста.

cmps сравнивает массив байт/слов/двойных слов источника [esi], с приёмником в [edi]

Длинна массива в ecx. Используется в связке с rept

Это команда без операндов.

ЧИТАЙТЕ МАНУАЛЫ


Дата: Авг 22, 2003 17:52:46

Спасибо! Понял наконец в чём фича. Всё исправил. А вот интересно, как это работать с паролями с помощью хэш и т.д. Посвятите по поводу нетрадиционных механизмов защиты "вводимого" пароля? Может быть, подкините исходник особо сложного механизма.
Заранее спасибо!


Дата: Авг 22, 2003 18:18:56

1990
Вот особо сложный -- криптование логина и пароля между собой.. А алгоритм можешь и сам придумать, на основе существующих :)


Дата: Авг 22, 2003 21:22:01

Подкиньте ресурсы или исходные коды с примерами шифрования. А алгоритм придумать смогу, если увижу работающую структуру.


Дата: Авг 24, 2003 13:44:44

Сравнение двух строк без учета регистра
CmpStrI proc
str1 equ dword ptr [ebp+08]
str2 equ dword ptr [ebp+12]

push ebp
mov ebp, esp
push esi
push edi
push ebx
xor eax, eax
xor edx, edx
xor ebx, ebx

mov esi, str1
mov edi, str2

new_loop:
mov al, [esi]
mov dl, [edi]
inc esi
inc edi

cmp al, dl
je b_equ

sub al, dl
@@: neg al
js @B
cmp al, 'a'-'A'
je new_loop

inc ebx
jmp CSI_end

b_equ:
test al, al
jnz new_loop

CSI_end:
mov eax, ebx
pop ebx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 8
CmpStrI endp

Если имеется длина какой-либо строки, то процедура сравнения двух строк без учета регистра выглядит так:
CmpStrI proc
str1 equ dword ptr [ebp+08]
len equ dword ptr [ebp+12]
str2 equ dword ptr [ebp+16]

push ebp
mov ebp, esp
push esi
push edi
push ebx
xor eax, eax
xor edx, edx
xor ebx, ebx

mov esi, str1
mov edi, str2
mov ecx, len
and ecx, 0FFh
inc ecx

new_loop:
dec ecx
jz CSI_end

mov al, [esi]
mov dl, [edi]
inc esi
inc edi

sub al, dl
jz new_loop
@@: neg al
js @B
cmp al, 'a'-'A'
je new_loop

inc ebx
jmp CSI_end

CSI_end:
mov eax, ebx
pop ebx
pop edi
pop esi
mov esp, ebp
pop ebp
ret 12
CmpStrI endp


Дата: Авг 24, 2003 18:10:55

Спасибо большое, Android! Я обязательно воспользуюсь Вашим примером! Большое спасибо!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067