
Быстрый поиск
Введите фрагмент названия статьи для поиска

Поиск строки в памяти с использованием маски
29.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для поиска произвольной строки в блоке памяти с использованием бинарной маски я написал следующую процедуру:Code (Assembler) : Убрать нумерацию
- ; ---------------------------------------------
- ; Процедура поиска строки в блоке памяти
- ; (C) ManHunter / PCL
- ; ---------------------------------------------
- ; SRCdata - блок памяти в котором выполняется поиск
- ; SRCsize - размер блока в котором выполняется поиск
- ; PTRdata - строка для поиска
- ; PTRsize - длина строки для поиска
- ; MSKdata - бинарная маска для поиска или 0 если не используется
- ;
- ; Возврат: EAX = offset найденной строки
- ; EAX = -1 если ничего не найдено
- ; ---------------------------------------------
- proc scanmem SRCdata:dword, SRCsize:dword, PTRdata:dword,\
- PTRsize:dword, MSKdata:dword
- push esi edi ebx ecx edx
- ; Длина паттерна больше длины данных?
- mov eax,[PTRsize]
- cmp eax,[SRCsize]
- ; Да, возврат -1
- ja .scanmem_not_found
- mov esi,[SRCdata]
- mov edi,[PTRdata]
- mov edx,[MSKdata]
- mov ebx,esi
- add ebx,[SRCsize]
- sub ebx,[PTRsize]
- .scanmem_loop:
- xor ecx,ecx
- .scanmem_test_char:
- or edx,edx
- jz .scanmem_no_mask
- cmp byte [edx+ecx],0
- jz .scanmem_char_equal
- .scanmem_no_mask:
- mov al,[esi+ecx]
- cmp al,[edi+ecx]
- jne .scanmem_next_pattern
- .scanmem_char_equal:
- inc ecx
- cmp ecx,[PTRsize]
- jb .scanmem_test_char
- jmp .scanmem_found
- .scanmem_next_pattern:
- inc esi
- cmp esi,ebx
- jbe .scanmem_loop
- .scanmem_not_found:
- ; Строка не найдена
- mov eax,-1
- jmp .scanmem_ret
- .scanmem_found:
- ; Строка найдена
- mov eax,esi
- .scanmem_ret:
- pop edx ecx ebx edi esi
- ret
- endp
Читать статью целиком »
Просмотров: 7265 | Комментариев: 5

Вывод лога на Ассемблере
19.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Если при работе вашей программы требуется вывод лога неопределенной длины, то это удобно делать в многострочном поле Edit. Преимущества такого способа налицо: можно мышкой выделить и скопировать любой кусок текста, средствами API получить весь текст целиком и сохранить в файл, быстро очистить окно лога и многое другое. Удобно делать все, кроме главного: добавление новых строчек в лог. Конечно, можно получать текст, в памяти добавлять к нему новые строчки и вставлять обратно. Но это долго, неудобно и требует дополнительных ресурсов, а для очень больших логов и вовсе неприемлемо. Поэтому воспользуемся следующей функцией:Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; procedure AddLog
- ; void AddLog(hWnd:dword,CtrlID:dword,pStr:&string)
- ;---------------------------------------------
- proc AddLog hWnd:dword,CtrlID:dword,pStr:dword
- push eax
- invoke GetDlgItem,[hWnd],[CtrlID]
- or eax,eax
- jz .AddLog_1
- mov [CtrlID],eax
- invoke SendMessage,[CtrlID],EM_GETLINECOUNT,0,0
- dec eax
- invoke SendMessage,[CtrlID],EM_LINEINDEX,eax,0
- invoke SendMessage,[CtrlID],EM_SETSEL,eax,eax
- invoke SendMessage,[CtrlID],EM_REPLACESEL,FALSE,[pStr]
- .AddLog_1:
- pop eax
- ret
- endp
Читать статью целиком »
Просмотров: 6037 | Комментариев: 5
