Поиск первого вхождения одной строки в другую - 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 startcycle1:
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 ;