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

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

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

Здравствуйте! Необходимо написать программу которая производит поиск первого вхождения строки-отправителя в строку-получатель и возвращает соответствующую позицию. Входные параметры: DS:SI указывают на строку-отправитель, а ESI указывают на строку-получатель. вот собственно сам код ВЕСЬ
data segment  
otvet        db  2 dup (0),'$'     
mes1         db  13,10,'net sootvetstvii$'
mes2         db  13,10,'sovpadenie s elentom $'
bufIshodnii  db  'afadfafaafafs54'
lenIshodnii  db  ($ - bufIshodnii)-1
req          db  10,13,'Enter string:$'
inpbuf       db  30      
lenVvoda     db  ?       
bufVvoda     db  30 dup (?)      
ends
 
stek segment stack 'stack'
    dw   128  dup(0)
ends
 
code segment
assume cs:code
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    mov  ah, 09h
    lea  dx, req
    int  21h
 
    mov ah, 0Ah
    lea dx, inpbuf      
    int 21h     
    
    XOR DX,DX
    xor ch,ch
    lea si,bufVvoda
    lea di,bufIshodnii
    mov cl,lenIshodnii
    PUSH CX
;poisk
cycle1:
    XOR BX,BX
    MOV cl,lenVvoda
    rep cmpsb
    JZ  sovpadenie ;esle ravnie to => 
    CMP CX,0
    JZ  odin
    MOV Bl,lenVvoda
    SUB BX,CX
    JMP boleeOdnogo
odin:     
    POP CX
    CMP lenVvoda,1
    JZ  dallee
    SUB DI,1
dallee:    
    SUB cl,1
    JC  EndStroki    ;CF=1
    add dx,1
    JMP konec
boleeOdnogo: 
    POP CX
    SUB CX,BX
    JC  EndStroki    ;CF=1    
konec:        
    PUSH CX
    lea si,bufVvoda
    JMP cycle1 
EndStroki:
    mov ah,09h
    LEA dx,mes1
    INT 21h
    JMP ProgramEnd
sovpadenie:
    POP CX 
    MOV BH,lenVvoda
    SUB cl,bh
    MOV Bl,lenIshodnii
    SUB Bl,cl
    CMP DX,0
    JNZ  nedellit 
   SUB Bl,lenVvoda
nedellit:   
    ADD BL,48
    MOV otvet,Bl
    MOV ah,09h
    lea dx,mes2
    int 21h
    MOV ah,09h
    lea dx,otvet
    int 21h    
ProgramEnd: 
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
 
end start
а вот здесь оснавная часть программы (без ввода и вывода)
cycle1:
    XOR BX,BX
    MOV cl,lenVvoda
    rep cmpsb
    JZ  sovpadenie ;esle ravnie to => 
    CMP CX,0
    JZ  odin
    MOV Bl,lenVvoda
    SUB BX,CX
    JMP boleeOdnogo
odin:     
    POP CX
    CMP lenVvoda,1
    JZ  dallee
    SUB DI,1
dallee:    
    SUB cl,1
    JC  EndStroki    ;CF=1
    add dx,1
    JMP konec
boleeOdnogo: 
    POP CX
    SUB CX,BX
    JC  EndStroki    ;CF=1    
konec:        
    PUSH CX
    lea si,bufVvoda
    JMP cycle1
Программа работает но не знаю как сделать что бы определяло позицию (постоянно недочёты) МБ кто-нибудь знает как написать, мб хотя бы алгоритм программы Как определить номер элемента с которого начинаются повторения МБ есть похожие программы буду рад любому содействию! ПРИМЕР РАБОТЫ ПРОГРАММЫ

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

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

textual
Листинг программы
ORG  100h
JMP  start
 
mess0  DB  13,10,'    STRING: $'
mess1  DB  13,10,'SUB/STRING: $'
mess2  DB  13,10,' START POS: $'
mess3  DB  13,10,10,7,'NO RESULT! Press any key...$'
 
buf_1  DB  80,0,80 DUP(0)   ; буфер для строки
buf_2  DB  10 DUP(0)        ; буфер для под/строки
len_2  DW  0
 
start:
; сохраняем введённую строку: (fn) 0Ah ==============================//
   MOV   AH,9            ;
   MOV   DX,mess0        ;
   INT   21h             ;
   MOV   AH,0Ah          ;
   MOV   DX,buf_1        ;
   INT   21h             ;
 
; сохраняем под/строку =====: STOSB =================================//
   MOV   AH,9            ;
   MOV   DX,mess1        ;
   INT   21h             ;
   MOV   DI,buf_2        ;
@@:                      ;
   MOV   AH,1            ;
   INT   21h             ;
   CMP   AL,13           ; заканчиваем ввод по-ENTER
   JE    next            ;
   STOSB                 ;
   JMP   @b              ;
 
; вычисляем длину под/строки: SCASB =================================//
next:
   XOR   AX,AX           ; искать будем нуль в конце строки
   MOV   CX,0FFFFh       ; ставим счётчик на максимум
   MOV   DI,buf_2        ; где искать
   REPNE SCASB           ; поиск пошёл!
   NOT   CX              ; инверсия счётчика
   DEC   CX              ; CX = длина под/строки
   MOV   [len_2],CX      ; сохраняем её в переменной
 
; начинаем поиск под/строки в строке: CMPSB =========================//
   XOR   AX,AX            ; это будет "плавающая позиция" в строке
   XOR   BX,BX            ; это будет "финишная черта" для плавца
   MOV   BL,BYTE[buf_1+1] ; BX = длина строки
   SUB   BX,CX            ; оттяпаем лишний хвост
   XOR   DX,DX            ; это будет найденая позиция в строке
@@:                       ;
   MOV   SI,buf_1+2       ; SI указывает на строку
   MOV   DI,buf_2         ; DI - на под/строку
   MOV   CX,[len_2]       ; СХ = длина под/строки
   ADD   SI,AX            ; "плавающая позиция" в строке
   MOV   DX,SI            ; запоминаем эту позицию..
   REPE  CMPSB            ; сравниваем байт(DI) с байтом(SI)
   JZ    @10              ; переход, если есть вхождение под/строки
   INC   AX               ; иначе: позиция "поплыла" вперёд
   DEC   BX               ; ..а счётчик назад
   JNZ   @b               ; повторяем поиск с новой позиции..
; ошибка поиска! ====================================================//
   MOV   AH,9             ;
   MOV   DX,mess3         ; мессага!
   INT   21h              ;
   JMP   exit             ; ..и на выход!
 
; нашли под/строку в строке! ========================================//
; выводим позицию на экран: AAM, INT-29H ============================//
@10:                     ;
   DEC   DX              ; декремент позиции
   PUSH  DX              ; запомним её..
   MOV   AH,9            ; мессагу на экран
   MOV   DX,mess2        ;
   INT   21h             ;
   POP   AX              ; снимаем позицию в АХ
   MOV   BX,buf_1        ; ВХ = адрес начала строки
   SUB   AX,BX           ; вычисляем разницу
   AAM                   ; распаковываем АL в АХ
   ADD   AX,3030h        ; переводим число в символы
   XCHG  AH,AL           ; сперва выводим на экран старшую часть
   INT   29h             ;
   SHR   AX,8            ; теперь младшую часть
   INT   29h             ;
 
exit:                    ;
   XOR   AX,AX           ; выход!
   INT   16h             ;
   INT   20h             ;

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


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

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

13   голосов , оценка 3.923 из 5
Похожие ответы