Предыдущий раздел | ВВОД С КЛАВИАТУРЫ ШЕСТНАДЦАТЕРИЧНЫХ ЧИСЕЛ | Следующий раздел |
Записанные ранее программы ввода одно- и двухзначного шестнадцатеричных чисел реагировали на нажатие “нецифровых” клавиш точно так же, как и “цифровых”. Теперь мы получим программу, которая не будет реагировать на нажатие “нецифровых” клавиш.
Для этого в состав программы введем процедуру ввода шестнадцатеричной цифры. Эта процедура возвратит управление в главную программу только тогда, когда она получит с клавиатуры правильную шестнадцатеричную цифру. При нажатии "нецифровой" клавиши ее код на экран не выводится, и управление в программу не возвращается.
Ранее для ввода символа с клавиатуры использовалась функция 1 программного прерывания 21h. Эта функция не только вводит символ с клавиатуры, но и выводит его на экран. Подобный вывод символа во время его ввода называется "эхом" символа. Теперь мы будем использовать функцию 8 21-го прерывания, которая не выводит "эхо" символа.
На рис.32 приведена блок-схема процедуры ввода шестнадцатеричной цифры.Текст этой процедуры (она возвращает цифру в регистре BL.):
200 push ax
201 push dx
202 mov ah,8
204 int 21
206 mov dl,al
208 cmp al,30
20A jb 222
20C cmp al,39
20E ja 215
210 sub al,30
212 clc
213 jmp 223
215 cmp al,41
217 jb 222
219 cmp al,46
21B ja 222
21D sub al,37
21F clc
220 jmp 223
222 stc
223 jc 204
225 mov bl,al
227 mov ah,2
229 int 21
22B pop dx
22C pop ax
22D ret
И з у ч и т е внимательно алгоритм и найдите реализацию его этапов в тексте процедуры. Во-первых, обратите внимание, что управляющей структурой верхнего уровня является цепочка из цикла ПОКА и этапа "Вывод цифры на экран". В качестве условия повторения цикла выступает равенство единице флага ошибки CF.
Рис. 32. Алгоритм ввода одной шестнадцатеричной цифры
Имя CF флага ошибки обусловлено тем, что он реализуется в программе с помощью одноименного флага переноса. При этом флаг переноса используется совсем не для того, для чего он был создан. Данный прием широко распространен, и мы также будем его использовать.
Существуют специальные команды для работы с флагом CF. Команда stc устанавливает флаг (CF=1), а clc сбрасывает его (CF=0). Команда условного перехода jc выполняет переход при CF=1, а команда jnc – при CF=0.
В в е д и т е данную процедуру в память. Кроме того, запишите в память следующую программу для проверки процедуры:
100 call 200
103 int 20
П р о т р а с с и р у й т е программу, используя команду Р Debug для перехода через команды int. Курсор появится в левой части экрана и будет ждать ввода символа. Напечатайте символ "К", который не является правильным символом. Ничего не произойдет. Теперь напечатайте один из заглавных шестнадцатеричных символов. Вы должны увидеть шестнадцатеричную цифру в регистре BL, а также на экране. Испытайте эту процедуру на граничных условиях: "\" (символ, стоящий перед нулем), "0", "9", ":" (символ, стоящий после 9) и так далее.
Теперь, когда у нас есть процедура ввода одной шестнадцатеричной цифры, программа, считывающая двузначное шестнадцатеричное число в регистр DL и обрабатывающая ошибки, стала достаточно простой. Ее алгоритм приведен на рис.33.
Рис. 33. Алгоритм ввода двузначного шестнадцатеричного числа
Предыдущий раздел | В начало | Следующий раздел |