строке S1.
lea di, s1 ;Строка
lea si, s2 Подстрока
again:
mov al, [si]
mov ah, 02
mov dl, [si]
int 21h
mov cx, count_s1
repne scasb
mov ax, count_s1
mov pos, ax
sub pos, cx ;Разность между длиной строки и остатком в cx
mov s1_of, offset s1
mov ax, pos
add s1_of, ax
mov di, s1_of ;Переходим к совпавшей букве
mov cx, count_s2 ;в cx длина подстроки
repe cmpsb
cmp cx, 0
je position
inc s2_of
lea di, s1 ;Строка
jmp again
Что я сделал не так? Подскажите, пожалуйста
Если ты новичок, то лучше: 1. Не используй инструкции rep 2. Не используй макросы
а что ты не так сделал?
Не знаю, но если не работает, то где-то явно косяк
А как со строками работать без rep?
откуда ты знаешь, что не работает?
на какой инструкции код не правильно работает в сравнении с алгоритмом в твоей голове?
то есть, он тебе выводит ерунду. Ищи, что у тебя выводится. Явно нет закрывающего нуля или $.
А какая вообще логика? Если ты идёшь по s1, ищешь первый байт s2, сравниваешь, а если не совпало, перезагружаешь s1, но не перезагружаешь s2? Т.е., для строк abceabcd и abcd после перехода на again оно будет искать непонятно что?
Я тебе рекомендую эту задачу разбить на несколько этапов: 1) вывести любую строку; 2) вывести число; 3) получить из консоли число и вывести его; 4) найти начало подстроки и вывести позицию. Каждый из этих этапов сделай в своей подпрограмме и отдельно протестируй.
Маленько переписал код: 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): $' mes3 db 'Result: $' 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 ;счетчик для подстроки a db 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, позиция совпавшей буквы mov ax, pos add s1_of, ax lea di, s1_of ;Переходим к совпавшей букве mov cx, count_s2 ;в cx длина подстроки repe cmpsb cmp cx, 0 je position 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
Обсуждают сегодня