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