Некоторые примеры положений курсора на экране.
Положение |
Десятичный формат |
Шестнадцатеричный формат |
||
|
Строка |
Столбец |
Строка |
Столбец |
Верхний левый угол |
00 |
00 |
00 |
00 |
Верхний правый угол |
00 |
79 |
00 |
4F |
Центр экрана |
12 |
39/40 |
00 |
27/28 |
Нижний левый угол |
24 |
00 |
18 |
00 |
Нижний правый угол |
24 |
79 |
18 |
4F |
Команда int 10h включает в себя установку курсора в любую позицию и очистку экрана. Ниже приведен пример установки курсора на 5-ю строку и
12-й столбец: |
|
mov ah,02 |
; запрос на установку курсора |
mov bh,00 |
; экран 0 |
mov dh,05 |
; строка 5 |
mov dl,12 |
; столбец 12 |
int 10h |
; передача управления в BIOS |
Значение 02 в регистре ah указывает команде int 10h на выполнение операции установки курсора. Значения строки и столбца должны быть в регистре dx, а номер экрана (или страницы) в регистре bh (обычно 0). Содержимое других регистров несущественно. Для установки строки и столбца можно также использовать одну команду mov c непосредственным шестнадцатеричным значением:
mov dx,050Ch ; строка 5, столбец 12
4.13. Очистка экрана
Запросы и команды остаются на экране, пока не будут смещены в результате прокручивания ("скроллинга") или переписаны на этом же месте другими запросами или командами. Когда программа начинает cвое выполнение, экран может быть очищен. Очищаемая область экрана может начинаться в любой позиции и заканчиваться в любой другой позиции с большим номером. Начальное значение строки и столбца заносится в регистр dx, значение 07 – в регистр bh и 0600H в ax. В следующем примере выполняется очистка всего экрана:
mov ax,0600h ; ah 06 (прокрутка), al 00 (весь экран) mov bh,07 ; нормальный атрибут (черно-белый) mov cx,0000 ; верхняя левая позиция
mov dx,184Fh ; нижняя правая позиция
int 10h ; передача управления в BIOS
Значение 06 в регистре ah указывает команде int 10h на выполнение операции очистки экрана. Эта операция очищает экран пробелами. Если установить нижнюю правую позицию больше, чем шестнадцатеричное
31
184F, то очистка перейдет вновь к началу экрана и вторично заполнит некоторые позиции пробелами. Для монохромных экранов это не вызывает каких-либо неприятностей, но для некоторых цветных мониторов могут возникнуть серьезные ошибки.
4.14. Экранные и клавиатурные операции: базовая версия DOS
Обычно программы должны выдать на экран сообщение о завершении или об обнаружении ошибки, отобразить запрос для ввода данных или для получения указания пользователя. Рассмотрим методы, применяемые в базовой версии DOS. Расширенные методы, введенные в последующих версиях DOS, изучить при необходимости по учебникам [3, 6, 1] и др. Операции из базовой DOS работают во всех версиях DOS и в операционных системах, эмулирующих ее (т.е в Windows всех версий и др.), и поэтому студентам специальности 075500 их следует знать. Студентам, обучающимся другим специальностям, рекомендуется применять расширенные возможности для новых разработок. В базовой версии DOS команды вывода на экран более сложны, но команды ввода с клавиатуры проще в использовании, благодаря встроенным проверкам.
4.15. Вывод на экран: базовая версия DOS
Вывод на экран в базовой версии DOS описан в уч. пос., ч. 1. В процессе выполнения операции конец сообщения определяется по oграничителю ($).
mov ah,09 |
; запрос вывода на экран |
lea dx,nameprmp |
; загрузка адреса сообщения |
int 21h |
; вызов DOS |
Адрес поля nameprmp, загружаемый в dx по команде lea, является oтносительным, поэтому для вычисления абсолютного адреса данных DOS складывает значения регистров ds и dx (ds:dx).
32
4.16. Ввод данных с клавиатуры: базовая версия DOS
Процедура ввода данных с клавиатуры также описан в уч. пос., ч. 1. Для ввода, использующего базовую DOS, область ввода требует наличия cписка параметров, содержащего поля, которые необходимы при
выполнении команды int. |
|
; сегмент данных |
|
namepar label byte |
; список параметров |
maxlen db 20 |
; максимальная длина |
factlen db ? |
; реальная длина |
namefld db 20 dup (' ') |
; введенные символы |
Запрос на ввод (номер функции – 10 (шестнадцатеричное – 0ah)):
; сегмент кода |
|
mov ah,0ah |
; запрос функции ввода |
lea dx,namepar |
; загрузить адреса списка параметров |
int 21h |
; вызвать DOS |
4.17. Ввод единственного символа Enter
При вводе данных, превышающего по длине максимальное количество, указанное в списке параметров, возникает звуковой сигнал и система oжидает ввода только символа Enter. Если вообще не вводить данные, а только нажать клавишу Enter, то система примет ее и yстановит в списке параметров нулевую длину следующим образом (шестнадцатеричные значения): |14|00|0d|...
4.18. Замена символа Enter
Вводимые значения можно использовать для самых разных целей, например для печати сообщений, сохранения в таблице, записи на диск.
При этом, возможно, |
появится необходимость замены символа Enter |
||||
(шестнадцатеричное |
0d) |
в области |
namefld |
на символ |
пробела |
(шестнадцатеричное |
20). |
Поле |
factlen |
NAMELEN |
содержит |
действительную длину или отноcительный адрес кода 0d. Если, например, factlen содержит длину 5, то адрес кода 0d равен namefld+5. Можно занести эту длину в регистр bx для индексной адресации в поле namefld:
mov bh,00 |
; установить в регистре bx |
|
mov |
bl,factlen |
; значение 5 |
mov |
namefld[bx],20h |
; заменить 0d на пробел |
Третья команда mov заносит символ пробела (шестнадцатеричное 20) по адресу, oпределенному первым операндом: адрес поля namefld плюс содержимое регистра bx, т.е. namefld+5.
33
4.19. Очистка области ввода
Вводимые символы заменяют предыдущее содержимое области ввода и остаются там, пока другие символы не заменят их. Рассмотрим следующие три успешных ввода [6]:
|
|
|
|
|
Ввод |
|
|
|
Содержимое namepar (шестнадцатеричное) |
|
|
||||||||||||
1 |
|
B |
R |
O |
W |
N |
|
14 |
05 |
|
42 |
52 |
4f |
57 |
4e |
0d |
20 |
20 |
. |
. |
. |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
2 |
|
H |
A |
M |
I |
L |
T O N |
14 |
08 |
|
48 |
41 |
4d |
49 |
4c |
54 |
4f |
4e |
0d |
. |
. |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
3 |
|
A |
D |
A |
M |
S |
|
14 |
05 |
|
41 |
44 |
41 |
4d |
53 |
0d |
4f |
4e |
0d |
. |
. |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
Имя HAMILTON заменяет более короткое имя BROWN. Но так как имя |
||||||||||||||||||||||
ADAMS короче имени HAMILTON, то оно заменяет только HAMIL. Код |
|||||||||||||||||||||||
Enter заменяет символ T. Остальные буквы – ON oстаются после имени ADAMS. Для очистки поля namefld до ввода очередного имени может служить следующая программа:
mov cx,20 |
; установить 20 циклов |
mov si,0000 |
; начальная позиция поля |
b30: |
|
mov namefld[si],20h |
; переслать один пробел |
inc si |
; следующая позиция поля |
loop b30 |
; 20 циклов |
Вместо регистра si можно использовать di или bx. Более эффективный способ очистки поля, предполагающий пересылку слова из двух пробелов, требует только десять циклов. Однако ввиду того, что поле namefld определено как db (байтовое), необходимо изменить длину в команде пересылки посредством операнда word, a также воспользоваться операндом ptr (указатель), как показано ниже:
mov cx,10 |
; установить 10 циклов |
|
lea |
si, namefld |
; начальный адрес |
b30: |
|
|
mov word ptr [si],2020h |
; переслать два пробела |
|
inc |
si |
; получить адрес |
inc |
si |
; следующего слова |
loop b30 |
; 10 циклов |
|
Команда mov по метке b30 обозначает пересылку слова из двух пробелов по адресу, находящемуся в регистре si. В последнем примеpе используется команда lea для инициализации регистра si и несколько иной способ в команде mov по метке b30, так как нельзя закодировать, например, следующую команду:
34
mov word ptr[namefld],2020h ; неправильно
Очистка входной области решает проблему ввода коротких имен, за которыми следуют предыдущие данные. Еще более эффективный cпособ предполагает очистку только тех байтов, которые расположены после введенного имени.
4.20. Экранные и клавиатурные операции: расширенная версия DOS
Рассмотрим теперь расширенные возможности, введенные в DOS 2.0 (реализованные в стиле операционной системы UNIX). Если вы используете более младшую версию DOS, то не сможете выполнить примеры из данного подраздела. Расширенные возможности включают файловый номер (file handle), который yстанавливается в регистре bx, когда требуется выполнить операцию ввода\вывода. Существуют следующие стандартные файловые номера:
0Ввод (обычно с клавиатуры) CON
1Вывод (обычно на экран) CON
2Вывод по ошибке (на экран) CON
3Ввод/вывод на внешнее устройство AUX
4Вывод на печать LPT1 или PRN
Прерывание DOS для ввода/вывода – int 21h, необходимая функция запрашивается через регистр ah: шестнадцатеричное 3f – для ввода, шестнадцатеричное 40 – для вывода. В регистр cx заносится число байтов для ввода/вывода, а в регистр dx – адрес области ввода/вывода.
В результате успешного выполнения операции ввода/вывода очищается флаг переноса (cf) и в регистр ax устанавливается действительное число байтов, участвующих в операции. Иначе устанавливается флаг cf, а код ошибки (в данном случае 6) заносится в ax. Поскольку регистр ax может содержать как длину данных, так и код ошибки, то единственный способ определить наличие ошибки – проверить флаг cf, хотя ошибки чтения с клавиатуры и вывода на экран – явления крайне редкие. Аналогичным oбразом используются файловые номера для дисковых файлов.
4.21. Вывод на экран: расширенная версия DOS
Следующие команды иллюстрируют операцию вывода на экран в расширенной версии DOS:
DISAREA db 20 DUP(' ') ; область данных
... |
|
mov ah,40h |
; запрос на вывод |
mov bx,01 |
; устройство вывода |
mov cx,20 |
; максимальное число байтов |
lea dx,disarea |
; адрес области данных |
|
35 |