I
I
InfoLabs2017-06-03 21:39:43
assembler
InfoLabs, 2017-06-03 21:39:43

How to determine the distance between words?

Good evening!
I'm doing a task, determining the distance between characters. I implemented it, but I'm wondering if it's really possible to determine the distance between words, you need to sort through character by character for a match?
Tell me how can I implement this?
Code to calculate distance between two characters:

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

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question