Обработка строк данных на языке Ассемблера (Лабораторная работа № 1), страница 2

repne         scas source                 ;ищем вхождение символа

      je found                      ;если нашли идём на метку found

nofound:                           ;если не нашли

      print nmes,0               ;выводим сообщение

      jmp exit                      ;идём на выход

found:

      push DI                                   ;запоминаем DI в стек

      lea SI,substring+2      ;кладём в SI адрес подстроки

      push CX                                 ;запоминаем СХ в стек

      xor CX,CX                 ;обнуляем СХ

      mov CL,[substring+1]            ;количество сравниваемых символов(длина подстроки)

      dec DI                         ;в строке переходим на 1 символ назад

repe           cmps source,substring            ;сравнение строк

      je match                      ;если всё совпало - на метку match          

mismatch:                        ;если не совпало

      dec DI                         ;переходим в строке на 1 символ назад

      pop CX                       ;восстанавливаем СХ из стека

      pop DI                        ;восстанавливаем DI в стек

      cmp CX,0                   ;если СХ=0 -> прошли всю строку и не нашли искомой подстроки

      jne cycl                       ;если оно не равно 0, то ищем заново(на метку cycl)

      print mesMisMatch,0 ;если строка закончилась, то выводим сообщение          

      jmp exit                      ;идём на выход        

match:                                          ;если нашли подстроку

      print mesMatch,0       ;выводим сообщение

      print mesSym,0                      ;выводим сообщение

      pop CX                                   ;восстанавливаем СХ из стека

      xor AX,AX                 ;обнуляем АХ

      mov AL,[source+1]    ;записываем в АХ количество символов в строке

      sub AX,CX                 ;из количества сиволов вычитаем количество непройденных символов(позиция начала вхождения подстроки)

;выводим число

;********************************************************

      mov BX,10                 ;записываем делитель

      xor CX,CX                 ;обнуляем число разрядов

      std                               ;обработка в обратном порядке

begin1:     

      div BL                        ;делим

      inc CX                        ;увеличиваем число разрядов

      mov DL,AL                ;запоминаем частное

      add AH,30h                ;преобразуем в символ остаток

      mov AL,AH                ;загружаем остаток в аккумулятор

      xor AH,AH                 ;обнуляем остаток

      stosb                           ;загружаем символ в строку

      mov AL,DL                ;восстанавливаем делимое

      cmp AL,0                   ;если=0,то обработка закончена

      jne begin1                  

      cld                               ;обработка в прямом порядке

      mov SI,DI                   ;смещение строки

      inc SI                          ;к последнему символу

      mov AH,02h               ;номер функции(вывод символа)

cycl1:

      lodsb                           ;загружаем символ в аккумулятор

      mov DL,AL   

      int 21h                        ;выводим его

      loop cycl1

;************************************************************

exit:

      mov AH,4Ch  ;стандартный выход

      int 21h

endp main

end main

        Тесты

Исходные данные

Результат

1

String: 12345

Substring: 123

Substring was found

Position:1

2

String: 232345456789

Substring: 45

Substring was found

Position:5

3

String: 11234

Substring:123

Substring was found

Position:2

4

String: 567345

Substring: 15

Substring not found

5

String: rtyunh

Substring: yun

Substring was found

Position:3

6

String:123tyu n56h

Substring:u n5

Substring was found

Position:6

7

String: rtwwerty

Substring: ik

Substring not found

8

String: 22233343533345

Substring: 3345

Substring was found

Position:11