Задать вопрос
@InfoLabs

Как определить расстояние между словами?

Доброго вечера!
Делаю задачку, определение расстояния между символами. Я ее реализовал, но вот задаюсь вопросом, неужто что-бы определить расстояние между словами, понадобится перебирать посимвольно на совпадение?

Подскажите как можно это реализовать?

Код для расчета расстояния между двумя символами:
spoiler
data segment
    msgStart     db "The distance determined between the symbols: $"
    msgDistance  db "The distance between A and B: $"
    msgInputA    db 10, 13, "Insert to value A: $"
    msgInputB    db "Insert to value B: $"
    msgNotfound  db "Symbol not found$"
    buffer       db 255 dup ('$')

    varA         db 255 dup ('$')
    varB         db 255 dup ('$')

    SerialStr    db "1234567890$"
    strlen      equ $-SerialStr
data ends

stk segment stack
    db 256 dup (?) 
stk ends

code segment
assume ds:data, cs:code, ss:stk

Search proc
    push bx
    push cx
    push dx 
    cld
    mov cx, strlen           ; загрузим в регистр кол-во символов в строке SerialStr
    mov di, offset SerialStr ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov bx, di               ; сохраним начальный адрес строки

    repnz scasb              ; повторяем, пока ZF != , !=0, как только ZF будет указывать на ==, == 0
    jcxz nofound             ; если CX = 0, прыгнем на nofound

    sub di, bx               ; узнаем разницу от начала строки, до найденного символа
    dec di                   ; да - уменьшить.
    mov ax, di               ; загрузим в регистр ax значение
    jmp sEnd
    
    nofound:
        mov dx, offset msgNotfound ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
        mov ah, 9h ; вывод строки
        int 21h    ; прерывание DOS, получает управление, для обработки информации
        jmp exit
    sEnd:
        pop dx
        pop cx
        pop bx
        ret
Search endp

hex2asc proc             ; Функция переводит числа в символы
    push ax
    push bx
    push cx
    push dx               ; Вход:  АХ = число, BX = система счисления
    mov   bx,10           ;
    xor   cx,cx           ; Выход: на экране
    isDiv:                  
        xor   dx,dx          
        div   bx             
        push  dx             
        inc   cx             
        or    ax,ax          
        jnz   isDiv           
    isOut:                  
        pop   ax              
        cmp   al,9           
        jle   noHex          
        add   al,7           
    noHex:                  
        add   al,30h          
        int   29h            
        loop  isOut
    pop dx
    pop cx
    pop bx
    pop ax   
    ret                     
hex2asc endp


; BX - count A; CX - count B
Calc proc
    cmp bx, cx ; Если A > B
    ja st1     ; Перепрыгнем на A - B
    ; Если B > A, то B - A

    sub cx, bx ; отнимем B - A
    mov ax, cx ; загрузим результат в другой регистр

    jmp cend   ; прыгнем на выход из процедуры
    st1: 
        sub bx, cx ; отнимем A - B
        mov ax, bx ; загрузим результат в другой регистр
    cend:
        ret
Calc endp

main:    
    mov ax, data ; загрузим датасегмент в ax
    mov ds, ax   ; загрузим датасегмент из ax в ds
    mov es, ax   ; загрузим датасегмент из ax в ds

    ; Начало - Стартовое сообщение
    mov dx, offset msgStart ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации

    mov dx, offset SerialStr ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации
    ; Конец - Стартовое сообщение

    ; Начало - ввод А
    mov dx, offset msgInputA ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации

    mov ah, 3fh         ;команда на ввод
    mov dx, offset varA ; загрузим адрес буффера
    int 21h             ;выполнить команду
    ; Конец - ввод А

    ; Начало - ввод B
    mov dx, offset msgInputB ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации

    mov ah, 3fh         ;команда на ввод
    mov dx, offset varB ; загрузим адрес буффера
    int 21h             ;выполнить команду
    ; Конец - ввод B

    mov al, varA ; загрузим в регистр искомый символ
    call Search  ; найдем его в строке    
    mov bx, ax   ; загрузим результат в другой регистр
    xor ax, ax   ; обнулим 16-битовый регистр
    
    mov al, varB ; загрузим в регистр искомый символ
    call Search  ; найдем его в строке    
    mov cx, ax   ; загрузим результат в другой регистр
    xor ax, ax   ; обнулим 16-битовый регистр

    ; BX - count A; CX - count B
    call Calc ; посчитаем расстояние

    push ax ; результат подсчета в ax, сохраним в стеке
    mov dx, offset msgDistance ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации
    pop ax  ; вернем результат подсчета обратно

    call hex2asc ; выведем в консоль содержимое регистра ax
exit:
    mov ax, 4c00h
    int 21h
code ends

end main
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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