Поиск первого вхождения одной строки в другую - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Необходимо написать программу которая производит поиск первого вхождения строки-отправителя в строку-получатель и возвращает соответствующую позицию. Входные параметры: DS:SI указывают на строку-отправитель, а ESI указывают на строку-получатель. вот собственно сам код ВЕСЬ
Листинг программы
  1. data segment
  2. otvet db 2 dup (0),'$'
  3. mes1 db 13,10,'net sootvetstvii$'
  4. mes2 db 13,10,'sovpadenie s elentom $'
  5. bufIshodnii db 'afadfafaafafs54'
  6. lenIshodnii db ($ - bufIshodnii)-1
  7. req db 10,13,'Enter string:$'
  8. inpbuf db 30
  9. lenVvoda db ?
  10. bufVvoda db 30 dup (?)
  11. ends
  12. stek segment stack 'stack'
  13. dw 128 dup(0)
  14. ends
  15. code segment
  16. assume cs:code
  17. start:
  18. ; set segment registers:
  19. mov ax, data
  20. mov ds, ax
  21. mov es, ax
  22. mov ah, 09h
  23. lea dx, req
  24. int 21h
  25. mov ah, 0Ah
  26. lea dx, inpbuf
  27. int 21h
  28. XOR DX,DX
  29. xor ch,ch
  30. lea si,bufVvoda
  31. lea di,bufIshodnii
  32. mov cl,lenIshodnii
  33. PUSH CX
  34. ;poisk
  35. cycle1:
  36. XOR BX,BX
  37. MOV cl,lenVvoda
  38. rep cmpsb
  39. JZ sovpadenie ;esle ravnie to =>
  40. CMP CX,0
  41. JZ odin
  42. MOV Bl,lenVvoda
  43. SUB BX,CX
  44. JMP boleeOdnogo
  45. odin:
  46. POP CX
  47. CMP lenVvoda,1
  48. JZ dallee
  49. SUB DI,1
  50. dallee:
  51. SUB cl,1
  52. JC EndStroki ;CF=1
  53. add dx,1
  54. JMP konec
  55. boleeOdnogo:
  56. POP CX
  57. SUB CX,BX
  58. JC EndStroki ;CF=1
  59. konec:
  60. PUSH CX
  61. lea si,bufVvoda
  62. JMP cycle1
  63. EndStroki:
  64. mov ah,09h
  65. LEA dx,mes1
  66. INT 21h
  67. JMP ProgramEnd
  68. sovpadenie:
  69. POP CX
  70. MOV BH,lenVvoda
  71. SUB cl,bh
  72. MOV Bl,lenIshodnii
  73. SUB Bl,cl
  74. CMP DX,0
  75. JNZ nedellit
  76. SUB Bl,lenVvoda
  77. nedellit:
  78. ADD BL,48
  79. MOV otvet,Bl
  80. MOV ah,09h
  81. lea dx,mes2
  82. int 21h
  83. MOV ah,09h
  84. lea dx,otvet
  85. int 21h
  86. ProgramEnd:
  87. mov ax, 4c00h ; exit to operating system.
  88. int 21h
  89. ends
  90. end start
а вот здесь оснавная часть программы (без ввода и вывода)
Листинг программы
  1. cycle1:
  2. XOR BX,BX
  3. MOV cl,lenVvoda
  4. rep cmpsb
  5. JZ sovpadenie ;esle ravnie to =>
  6. CMP CX,0
  7. JZ odin
  8. MOV Bl,lenVvoda
  9. SUB BX,CX
  10. JMP boleeOdnogo
  11. odin:
  12. POP CX
  13. CMP lenVvoda,1
  14. JZ dallee
  15. SUB DI,1
  16. dallee:
  17. SUB cl,1
  18. JC EndStroki ;CF=1
  19. add dx,1
  20. JMP konec
  21. boleeOdnogo:
  22. POP CX
  23. SUB CX,BX
  24. JC EndStroki ;CF=1
  25. konec:
  26. PUSH CX
  27. lea si,bufVvoda
  28. JMP cycle1
Программа работает но не знаю как сделать что бы определяло позицию (постоянно недочёты) МБ кто-нибудь знает как написать, мб хотя бы алгоритм программы Как определить номер элемента с которого начинаются повторения МБ есть похожие программы буду рад любому содействию! ПРИМЕР РАБОТЫ ПРОГРАММЫ

есть уже строка например 123qwe123 ввожу например qwe а оно мне выдаёт 3 позиция

Решение задачи: «Поиск первого вхождения одной строки в другую»

textual
Листинг программы
  1. ORG  100h
  2. JMP  start
  3.  
  4. mess0  DB  13,10,'    STRING: $'
  5. mess1  DB  13,10,'SUB/STRING: $'
  6. mess2  DB  13,10,' START POS: $'
  7. mess3  DB  13,10,10,7,'NO RESULT! Press any key...$'
  8.  
  9. buf_1  DB  80,0,80 DUP(0)   ; буфер для строки
  10. buf_2  DB  10 DUP(0)        ; буфер для под/строки
  11. len_2  DW  0
  12.  
  13. start:
  14. ; сохраняем введённую строку: (fn) 0Ah ==============================//
  15.    MOV   AH,9            ;
  16.    MOV   DX,mess0        ;
  17.    INT   21h             ;
  18.    MOV   AH,0Ah          ;
  19.    MOV   DX,buf_1        ;
  20.    INT   21h             ;
  21.  
  22. ; сохраняем под/строку =====: STOSB =================================//
  23.    MOV   AH,9            ;
  24.    MOV   DX,mess1        ;
  25.    INT   21h             ;
  26.    MOV   DI,buf_2        ;
  27. @@:                      ;
  28.    MOV   AH,1            ;
  29.    INT   21h             ;
  30.    CMP   AL,13           ; заканчиваем ввод по-ENTER
  31.    JE    next            ;
  32.    STOSB                 ;
  33.    JMP   @b              ;
  34.  
  35. ; вычисляем длину под/строки: SCASB =================================//
  36. next:
  37.    XOR   AX,AX           ; искать будем нуль в конце строки
  38.    MOV   CX,0FFFFh       ; ставим счётчик на максимум
  39.    MOV   DI,buf_2        ; где искать
  40.    REPNE SCASB           ; поиск пошёл!
  41.    NOT   CX              ; инверсия счётчика
  42.    DEC   CX              ; CX = длина под/строки
  43.    MOV   [len_2],CX      ; сохраняем её в переменной
  44.  
  45. ; начинаем поиск под/строки в строке: CMPSB =========================//
  46.    XOR   AX,AX            ; это будет "плавающая позиция" в строке
  47.    XOR   BX,BX            ; это будет "финишная черта" для плавца
  48.    MOV   BL,BYTE[buf_1+1] ; BX = длина строки
  49.    SUB   BX,CX            ; оттяпаем лишний хвост
  50.    XOR   DX,DX            ; это будет найденая позиция в строке
  51. @@:                       ;
  52.    MOV   SI,buf_1+2       ; SI указывает на строку
  53.    MOV   DI,buf_2         ; DI - на под/строку
  54.    MOV   CX,[len_2]       ; СХ = длина под/строки
  55.    ADD   SI,AX            ; "плавающая позиция" в строке
  56.    MOV   DX,SI            ; запоминаем эту позицию..
  57.    REPE  CMPSB            ; сравниваем байт(DI) с байтом(SI)
  58.    JZ    @10              ; переход, если есть вхождение под/строки
  59.    INC   AX               ; иначе: позиция "поплыла" вперёд
  60.    DEC   BX               ; ..а счётчик назад
  61.    JNZ   @b               ; повторяем поиск с новой позиции..
  62. ; ошибка поиска! ====================================================//
  63.    MOV   AH,9             ;
  64.    MOV   DX,mess3         ; мессага!
  65.    INT   21h              ;
  66.    JMP   exit             ; ..и на выход!
  67.  
  68. ; нашли под/строку в строке! ========================================//
  69. ; выводим позицию на экран: AAM, INT-29H ============================//
  70. @10:                     ;
  71.    DEC   DX              ; декремент позиции
  72.    PUSH  DX              ; запомним её..
  73.    MOV   AH,9            ; мессагу на экран
  74.    MOV   DX,mess2        ;
  75.    INT   21h             ;
  76.    POP   AX              ; снимаем позицию в АХ
  77.    MOV   BX,buf_1        ; ВХ = адрес начала строки
  78.    SUB   AX,BX           ; вычисляем разницу
  79.    AAM                   ; распаковываем АL в АХ
  80.    ADD   AX,3030h        ; переводим число в символы
  81.    XCHG  AH,AL           ; сперва выводим на экран старшую часть
  82.    INT   29h             ;
  83.    SHR   AX,8            ; теперь младшую часть
  84.    INT   29h             ;
  85.  
  86. exit:                    ;
  87.    XOR   AX,AX           ; выход!
  88.    INT   16h             ;
  89.    INT   20h             ;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы