Поиск первого вхождения одной строки в другую - 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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д