Предыдущий раздел ВВОД С КЛАВИАТУРЫ ШЕСТНАДЦАТЕРИЧНЫХ ЧИСЕЛ Следующий раздел

8.3. Более совершенный ввод шестнадцатеричных цифр

Записанные ранее программы ввода одно- и двухзначного шестнадцатеричных чисел реагировали на нажатие “нецифровых” клавиш точно так же, как и “цифровых”.  Теперь мы получим программу, которая не будет реагировать на нажатие “нецифровых” клавиш.

Для этого в состав программы введем процедуру ввода шестнадцатеричной цифры. Эта процедура возвратит управление в главную программу только тогда, когда она получит с клавиатуры правильную шестнадцатеричную цифру. При нажатии "нецифровой" клавиши ее код на экран не выводится, и управление в программу не возвращается.

Ранее для ввода символа с клавиатуры использовалась функция 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. Алгоритм ввода двузначного шестнадцатеричного числа

 


Предыдущий раздел В начало Следующий раздел