Поиск первого вхождения одной строки в другую - Assembler
Формулировка задачи:
Здравствуйте!
Необходимо написать программу которая производит поиск первого вхождения строки-отправителя в строку-получатель и возвращает соответствующую позицию. Входные параметры: DS:SI указывают на строку-отправитель, а ESI указывают на строку-получатель.
вот собственно сам код ВЕСЬ
а вот здесь оснавная часть программы (без ввода и вывода)
Программа работает но не знаю как сделать что бы определяло позицию (постоянно недочёты)
МБ кто-нибудь знает как написать, мб хотя бы алгоритм программы
Как определить номер элемента с которого начинаются повторения
МБ есть похожие программы буду рад любому содействию!
ПРИМЕР РАБОТЫ ПРОГРАММЫ
data segment otvet db 2 dup (0),'$' mes1 db 13,10,'net sootvetstvii$' mes2 db 13,10,'sovpadenie s elentom $' bufIshodnii db 'afadfafaafafs54' lenIshodnii db ($ - bufIshodnii)-1 req db 10,13,'Enter string:$' inpbuf db 30 lenVvoda db ? bufVvoda db 30 dup (?) ends stek segment stack 'stack' dw 128 dup(0) ends code segment assume cs:code start: ; set segment registers: mov ax, data mov ds, ax mov es, ax mov ah, 09h lea dx, req int 21h mov ah, 0Ah lea dx, inpbuf int 21h XOR DX,DX xor ch,ch lea si,bufVvoda lea di,bufIshodnii mov cl,lenIshodnii PUSH CX ;poisk cycle1: XOR BX,BX MOV cl,lenVvoda rep cmpsb JZ sovpadenie ;esle ravnie to => CMP CX,0 JZ odin MOV Bl,lenVvoda SUB BX,CX JMP boleeOdnogo odin: POP CX CMP lenVvoda,1 JZ dallee SUB DI,1 dallee: SUB cl,1 JC EndStroki ;CF=1 add dx,1 JMP konec boleeOdnogo: POP CX SUB CX,BX JC EndStroki ;CF=1 konec: PUSH CX lea si,bufVvoda JMP cycle1 EndStroki: mov ah,09h LEA dx,mes1 INT 21h JMP ProgramEnd sovpadenie: POP CX MOV BH,lenVvoda SUB cl,bh MOV Bl,lenIshodnii SUB Bl,cl CMP DX,0 JNZ nedellit SUB Bl,lenVvoda nedellit: ADD BL,48 MOV otvet,Bl MOV ah,09h lea dx,mes2 int 21h MOV ah,09h lea dx,otvet int 21h ProgramEnd: mov ax, 4c00h ; exit to operating system. int 21h ends end start
cycle1: XOR BX,BX MOV cl,lenVvoda rep cmpsb JZ sovpadenie ;esle ravnie to => CMP CX,0 JZ odin MOV Bl,lenVvoda SUB BX,CX JMP boleeOdnogo odin: POP CX CMP lenVvoda,1 JZ dallee SUB DI,1 dallee: SUB cl,1 JC EndStroki ;CF=1 add dx,1 JMP konec boleeOdnogo: POP CX SUB CX,BX JC EndStroki ;CF=1 konec: PUSH CX lea si,bufVvoda JMP cycle1
есть уже строка например 123qwe123 ввожу например qwe а оно мне выдаёт 3 позиция
Решение задачи: «Поиск первого вхождения одной строки в другую»
textual
Листинг программы
ORG 100h JMP start mess0 DB 13,10,' STRING: $' mess1 DB 13,10,'SUB/STRING: $' mess2 DB 13,10,' START POS: $' mess3 DB 13,10,10,7,'NO RESULT! Press any key...$' buf_1 DB 80,0,80 DUP(0) ; буфер для строки buf_2 DB 10 DUP(0) ; буфер для под/строки len_2 DW 0 start: ; сохраняем введённую строку: (fn) 0Ah ==============================// MOV AH,9 ; MOV DX,mess0 ; INT 21h ; MOV AH,0Ah ; MOV DX,buf_1 ; INT 21h ; ; сохраняем под/строку =====: STOSB =================================// MOV AH,9 ; MOV DX,mess1 ; INT 21h ; MOV DI,buf_2 ; @@: ; MOV AH,1 ; INT 21h ; CMP AL,13 ; заканчиваем ввод по-ENTER JE next ; STOSB ; JMP @b ; ; вычисляем длину под/строки: SCASB =================================// next: XOR AX,AX ; искать будем нуль в конце строки MOV CX,0FFFFh ; ставим счётчик на максимум MOV DI,buf_2 ; где искать REPNE SCASB ; поиск пошёл! NOT CX ; инверсия счётчика DEC CX ; CX = длина под/строки MOV [len_2],CX ; сохраняем её в переменной ; начинаем поиск под/строки в строке: CMPSB =========================// XOR AX,AX ; это будет "плавающая позиция" в строке XOR BX,BX ; это будет "финишная черта" для плавца MOV BL,BYTE[buf_1+1] ; BX = длина строки SUB BX,CX ; оттяпаем лишний хвост XOR DX,DX ; это будет найденая позиция в строке @@: ; MOV SI,buf_1+2 ; SI указывает на строку MOV DI,buf_2 ; DI - на под/строку MOV CX,[len_2] ; СХ = длина под/строки ADD SI,AX ; "плавающая позиция" в строке MOV DX,SI ; запоминаем эту позицию.. REPE CMPSB ; сравниваем байт(DI) с байтом(SI) JZ @10 ; переход, если есть вхождение под/строки INC AX ; иначе: позиция "поплыла" вперёд DEC BX ; ..а счётчик назад JNZ @b ; повторяем поиск с новой позиции.. ; ошибка поиска! ====================================================// MOV AH,9 ; MOV DX,mess3 ; мессага! INT 21h ; JMP exit ; ..и на выход! ; нашли под/строку в строке! ========================================// ; выводим позицию на экран: AAM, INT-29H ============================// @10: ; DEC DX ; декремент позиции PUSH DX ; запомним её.. MOV AH,9 ; мессагу на экран MOV DX,mess2 ; INT 21h ; POP AX ; снимаем позицию в АХ MOV BX,buf_1 ; ВХ = адрес начала строки SUB AX,BX ; вычисляем разницу AAM ; распаковываем АL в АХ ADD AX,3030h ; переводим число в символы XCHG AH,AL ; сперва выводим на экран старшую часть INT 29h ; SHR AX,8 ; теперь младшую часть INT 29h ; exit: ; XOR AX,AX ; выход! INT 16h ; INT 20h ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д