|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 3, 2003 22:41:17 · Поправил: Asterix Нет, volodya, просто такой код более наглядный, меньше риска что-нибудь зрительно пропустить, возьмём хотя бы Four-F, мало того что он использует такой синтаксис, но и этого ему показалось мало и поэтому были дополнительно им написаны собственные макросы. |
|
|
Дата: Дек 3, 2003 22:50:25 Три хи-хи четыре раза. Я тебе на С такое напишу, что и не снилось твоему HLL. А на С++ еще круче забабахать можно. Переопределить все операторы, вообще хохма, так все и делают. И все КУДА более наглядно, чем асм может показать. С асмом связываются на для наглядности. |
|
|
Дата: Дек 3, 2003 23:19:11 · Поправил: Asterix Кажется нужно всё-таки так, сразу говорю никакой оптимизации не будет пока код не будет правильно работать: mov edi, OFFSET ScanString
mov esi, OFFSET Buffer
mov ecx, ScanStringLength
@loop:
test ecx, ecx
jz @find
mov al, BYTE PTR [edi]
test al, al
jz @00h_find
cmp BYTE PTR [esi], al
je @parse
sub edi, ScanStringLength
add edi, ecx
sub esi, ScanStringLength
add esi, ecx
inc esi
mov ecx, ScanStringLength
jmp @loop
@parse:
inc edi
inc esi
dec ecx
jmp @loop
@00h_find:
inc edi
inc esi
dec ecx
jmp @loop
@find: |
|
|
Дата: Дек 3, 2003 23:20:01 Asterix, лучше тогда уж оформляй нормально, чтобы всё понятно было, а всякие там .IF лучше не использовать, ведб так скрывается часть кода. |
|
|
Дата: Дек 4, 2003 00:10:17 Вот теперь, кажется, код правильно работает :-) И он должен быть достаточно быстр. |
|
|
Дата: Дек 4, 2003 15:58:41 · Поправил: Asterix Ну вот вся процедура будет выглядеть так, но файл блоками по 1000h читать и парсить каждый блок по отдельности нельзя, иначе скан-строка может спрятаться на стыке блоков, поэтому нужно читать весь файл сразу: ParseBuffer proc uses ebx edx ecx edi esi lpScanString:DWORD, ScanStringLength:DWORD,\
lpBuffer:DWORD, BufferLength:DWORD
mov edi, lpScanString
mov esi, lpBuffer
mov ecx, ScanStringLength
mov ebx, ecx
mov edx, esi
add edx, BufferLength
sub edx, ScanStringLength
inc edx
@loop:
cmp esi, edx
je @not_found
test ecx, ecx
jz @found
mov al, BYTE PTR [edi]
test al, al
jz @00h_found
cmp BYTE PTR [esi], al
je @parse
sub edi, ebx
add edi, ecx
sub esi, ebx
add esi, ecx
inc esi
mov ecx, ebx
jmp @loop
@parse:
inc edi
inc esi
dec ecx
jmp @loop
@00h_found:
inc edi
inc esi
dec ecx
jmp @loop
@found:
mov eax, esi
sub eax, ebx
ret
@not_found:
xor eax, eax
ret
ParseBuffer endp |
|
|
Дата: Дек 4, 2003 21:03:49 Блин, а ведь работает, и замечательно так быстренько, уже применил к своему файлу :-) Вобщем кто хочет ещё оптимизировать то пожалуйста :-) |
|
|
Дата: Дек 6, 2003 18:08:44 · Поправил: bsl_zcs Asterix читать и парсить каждый блок по отдельности нельзя, иначе скан-строка может спрятаться на стыке блоков, поэтому нужно читать весь файл сразу Или блоками, перекрывающимися на длину подстроки минус один. ;) |
|
|
Дата: Дек 6, 2003 19:01:09 bsl_zcs Это понятно :-) Но сложнее реализовать, как минимум нужно немного подумать. В моём случае файл находится под отладчиком, я просто через GlobalAlloc выделяю буфер в памяти == ImageSize, потом ReadProcessMemory в этот буфер и затем уже спокойно сканирую :-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045 |