C клавиатуры вводится какой то символ, на экран выводится его интерпритация в таблице Морзе.Все элементы таблицы Морзе можно заменить на свои,произвольной длины,что поможет выполнять интерпритацию ввода в любой отображаемый символ или строку.
Исходный код:
data segment
;таблица символов Морзе
Morz_tbl db '.- $','-... $','-.-. $','-.. $','. $','..-. $','--. $','.... $','.. $','.--- $','-.- $','.-.. $','-- $','-. $','--- $','.--. $','--.- $','.-. $','... $','- $','..- $','...- $','.-- $','-..- $','-.-- $','--.. $'
Offs_tbl dw 26 dup (0) ;таблица адресов символов Морзе
data ends
code segment
assume cs:code,ds:data
begin:
mov ax,data
mov ds,ax
mov es,ax
mov [offs_tbl],offset morz_tbl ;адрес первого символа можно занести в таблицу сразу,его высчитывать не надо
CLD
xor ax,ax
mov al,'$' ;в al символ который будем искать,т.е $,признак конца строки для функций вывода
lea di,Morz_tbl ;в di адрес начала строки в которой будем искать,т.е. в таблице Морзе
add di,4h ;перемещаемся на 4 байта,т.к. первый символ мы уже занесли в таблицу адресов
mov bx,2 ;bx будет увеличиваться по мере нахождения новых адресов
mov cx,81h ;81h - длина строки символов Морзе,нужно изменить,если будут использоваться другие символы в так называемой "таблице Морзе"
offs_insert: ;далее будет создаваться таблица смещений на все символы из таблице Морзе,что бы их проще потом было выводить на экран
repne scasb ;повторять пока не равно,поиск символа из al в строке символов Морзе
mov [Offs_tbl+bx],di ;как только позиция найдена,она заносится в таблицу адресов
add bx,2 ;перемещение по таблице адресов осуществляется переходами по 2 байта
jcxz next ;переход если cx=0,т.е мы прошли по всей длине строки символов Морзе
jmp offs_insert ;cx не равен 0,строка не кончилась,продолжать поиск дальше,при этом и длина до конца строки(cx) и текущая позиция начала поиска (di) сохраняются
next:;все адреса символов Морзе найдены,теперь можно анализировать ввод с клавиотуры
mov ax, 40h ;40[0]h - адрес буффера клавиатуры
mov es, ax ;иначе как через ах,адрес в es никак не передать,хотя,может и передать,но извращаться не захотелось
main_cycle:
mov ax, es:[1ch] ;в ax хвост буфера [1ch]
mov bx, es:[1ah] ;в bx голова буфера [1ah]
cmp bx , ax ;если и хвост и голова указывают на один и тот же элемент,значит ввода с клавиотуры небыло
jnz do ;иначе,если они не равны,нужно обработать ввод и получить адрес выводимого символа Морзе
jmp wt ;если ввода небыло,то продолжаем цикл до бесконечности
do: ;если что то было введено с клавиотуры
mov al, es:[bx] ;в al введенный символ
mov es:[1ch], bx
cmp al,30h ;сравниваем введенный символ с 0
jz ext ;если равно,то выходим
sub al,97 ;вычитаем из аски кода символа 97(а)
mov dx,2
mul dx ;умножаем то что получилось на 2,т.к. перемещение по таблице адресов символов Морзе происходит по 2х байтовым прыжкам,ах здесь играет роль индекса,если бы Offs_tbl была массивом
lea bx,Offs_tbl ;в bx смещение таблици адресов
add bx,ax ;получаем в конечном счете адрес того символа,который нам надо вывести,но этот адрес хранится в таблице,здесь же bx представляет не саму таблицу,а только ее смещение в памяти,т.е мы получаем смещение на смещение
mov dx,[bx] ;копируем в dx адрес символа из таблици Морзе,который будем выводить
mov ax,0900h
int 21h ;выводим его
wt:jmp main_cycle ;переходим к началу сего колдовства и проверяем все заново
ext:mov ax,4c00h
int 21h ;выход
code ends
end begin |