Как написать на masm под х86 функцию поиска кол-ва вхождений последовательности байт в большом массиве байт? - Assembler
Формулировка задачи:
char* haystack; //массив байтов заранее не известного содержимого char* hsSize; //размер haystack char* needle; // последовательность байт, которую нужно искать в haystack char* nSize; //размер needle
unsigned int FileScanner::smartBruteForce(QByteArray &data, QByteArray &needle) { unsigned int count = 0; unsigned int dataSize = data.size(); unsigned int needleSize = needle.size(); unsigned int needleSizeCut = needleSize - 1; char* dp = data.data(); char* np = needle.data(); char lastNeedle = *(np + needleSize - 1); for(unsigned int i = 0; i < dataSize - needleSize + 1; i++) { if(*(dp + (i + needleSizeCut)) != lastNeedle) //This is smart technology )))) continue; unsigned int j; for(j = 0; j < needleSize; j++) { if(*(dp + (i + j)) != *(np + j)) break; } if(j == needleSize) count++; } return count; }
Решение задачи: «Как написать на masm под х86 функцию поиска кол-ва вхождений последовательности байт в большом массиве байт?»
org 100h jmp start mess0 db 13,10,'<==== TRUE $' ; мессага если есть вхождение, mess1 db 13,10,'<=== FALSE $' ; .. и если нет вхождения под/строки haystack db '45210fffdknvbcdhgff751fghdj001234' ; строка (данные твоего файла) hsSize = $ - haystack ; длина строки needle db '0knvbcdhg' ; под/строка nSize = $ - needle ; длина под/строки start: ;================================================================================ mov di,haystack ; место для поиска SCASB'ом mov cx,hsSize ; кол-во повторов mov al,byte [needle] ; искать будем первый символ под/строки find: ; repne scasb ; прекратить при совпадении! jz ok ; переход, если есть совпадение jmp errorFind ; иначе: ошибка! ok: ; push cx di ; сохраняем счётчик и позицию в строке mov cx,nSize ; меняем счётчик на длину под/строки dec di ; SCASB проскочил позицию. вернём её.. mov si,needle ; SI указывает на адрес под/строки repe cmpsb ; сравниваем строки до не совпадения jz stopFind ; переход, если строки совпали pop di cx ; иначе: восстанавливаем счётчик и позицию в строке jmp find ; и продолжаем поиск в строке со-старой позиции ;================================================================================ stopFind: ; поиск дал результат! mov ah,9 ; mov dx,mess0 ; int 21h ; jmp exit ; errorFind: ; прокол! mov ah,9 ; mov dx,mess1 ; int 21h ; exit: ; xor ax,ax ; int 16h ; int 20h ; выход!
Объяснение кода листинга программы
Ниже представлен код на языке Assembler со следующей постановкой задачи — «Как написать на masm под х86 функцию поиска кол-ва вхождений последовательности байт в большом массиве байт?» org 100h jmp start mess0 db 13,10,'<==== TRUE $' mess1 db 13,10,'<=== FALSE $' haystack db '45210fffdknvbcdhgff751fghdj001234' hsSize = $ - haystack needle db '0knvbcdhg' nSize = $ - needle start: ;================================================================================ mov di,haystack mov cx,hsSize mov al,byte [needle] find: repne scasb jz ok jmp errorFind ok: push cx di mov cx,nSize dec di mov si,needle repe cmpsb jz stopFind pop di cx jmp find stopFind: mov ah,9 mov dx,mess0 int 21h jmp exit errorFind: mov ah,9 mov dx,mess1 int 21h exit: xor ax,ax int 16h int 20h Вывод: Кол-во вхождений последовательности '0knvbcdhg' в строке '45210fffdknvbcdhgff751fghdj001234' равно 2.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д