169 похожих чатов

Снова я с выводом номера вхождения подстроки в строку. Исправил

код, номер элемента, с которого начинается подстрока в строке, выводит, но неправильно. Подскажите, пожалуйста, что не так:

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

2 ответов

73 просмотра

> lea di, s1_of ;Переходим к совпавшей букве Не переходим. mov. Плюс ты не учитываешь, что после scasb у тебя di смотрит на следующую букву, а не на совпавшую.

Ыиу- Автор вопроса
s54820
> lea di, s1_of ;Переходим к совпавшей букве Не пе...

Я вроде это учел, sub di, pos ;возвращаем di к начальному состоянию.

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
18
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
или вы считаете муит дает знание?
супер_лох_3000 альфа версия
12
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
А кто такой мужчина в твоем понимании Азиз?
who?です 🐈
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Ну значит тебе повезло, мы же про транк говорим оба?
Александр (Rouse_) Багель
11
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
Карта сайта