код, номер элемента, с которого начинается подстрока в строке, выводит, но неправильно. Подскажите, пожалуйста, что не так:
model small
.stack 256
.data
mes1 db 10, 13, 'Enter the string (Enter 0 to exit from input): $'
mes2 db 10, 13, 'Enter the substring (Enter 0 to exit from input): $'
mes4 db 10, 13, 'Not found$'
ent db 10, 13, '$'
endstr db '$'
s1 db 256 dup(?) ;string
s2 db 256 dup(?) ;substring
pos dw 0
count_s1 dw 0 ;счетчик для основной строки
count_s2 dw 0 ;счетчик для подстроки
back dw 0
s1_of dw 0
s2_of dw 0
.code
main:
mov ax, @data
mov ds, ax
mov es, ax
lea di, s1
mov ah, 09
lea dx, mes1
int 21h
input1:
mov ah, 01
int 21h
cmp al, 30h
je next
stosb
inc count_s1
jmp input1
next:
mov al, endstr
stosb
lea di, s2
mov ah, 09
lea dx, mes2
int 21h
input2:
mov ah, 01
int 21h
cmp al, 30h
je exit
stosb
inc count_s2
jmp input2
exit:
mov al, endstr
stosb
mov ah, 09
lea dx, ent
int 21h
mov ah, 09
lea dx, mes3
int 21h
find:
lea di, s1 ;Строка
lea si, s2 ;Подстрока
again:
mov s1_of, offset s1 ;записываем смещение строки
mov al, [si]
mov cx, count_s1
repne scasb
mov ax, count_s1
mov pos, ax
sub pos, cx ;Разность между длиной строки и остатком в cx, позиция совпавшей буквы
sub di, pos ;возвращаем di к начальному состоянию
mov ax, pos
add s1_of, ax
lea di, s1_of ;Переходим к совпавшей букве
mov cx, count_s2 ;в cx длина подстроки
repe cmpsb
cmp cx, 0
je position
mov ax, count_s2
mov back, ax
sub back, cx
sub si, back ;возвращаем si к начальному состоянию
inc si
lea di, s1 ;Строка
jmp again
position:
mov ax, pos
aam
add ax, 3030h
mov bx, ax
mov ah, 02
mov dl, bh
int 21h
mov dl, bl
int 21h
jmp over
over:
mov ax, 4c00h
int 21h
end main
> lea di, s1_of ;Переходим к совпавшей букве Не переходим. mov. Плюс ты не учитываешь, что после scasb у тебя di смотрит на следующую букву, а не на совпавшую.
Я вроде это учел, sub di, pos ;возвращаем di к начальному состоянию.
Обсуждают сегодня