Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать
      1. Прямая работа с видеопамятью

Для того чтобы текстовое или графическое изображение появилось на экране монитора, оно должно быть записано в память видеоадаптера. Функции BIOS вывода на экран также, в конечном счете, осуществляют запись указанных данных в видеопамять.

В адресном пространстве центрального процессора отведены определенные области адресов для обращения к видеопамяти. Область памяти, начинающаяся с абсолютного адреса B800h:0000h и заканчивающаяся адресом B800h:FFFFh соответствует видеопамяти для текстовых режимов. Все, что программы пишут по этим адресам, немедленно пересылается в память видеоадаптера.

В текстовых режимах для хранения каждого отображаемого символа используется словная ячейка, первый байт которой содержит ASCII-код символа, а второй — его атрибут. Так, например, по адресу B800h:0000h находится байт с кодом символа, находящимся в верхнем левом углу экрана; по адресу B800h:0001h находится атрибут этого символа; по адресу B800h:0002h находится код второго символа в верхней строке экрана и т. д.

Таким образом, любая программа может вывести текст на экран простой командой пересылки данных, не прибегая ни к каким специальным функциям DOS или BIOS.

; Вывод символа на экран с помощью записи его кода в видеопамять

mov ax, 0B800h ; сегментный адрес текстового видеобуфера

mov es, ax ; занесем в ES

mov al, '$' ; код символа

mov ah, 1110000b ; атрибут ­– черным цветом на сером фоне

mov es:[(12*80+40)*2], ax ; запишем в середину видеобуфера

Часто при прямом выводе данных необходимое изображение подготавливают в виде массива данных в памяти, который затем копируется в видеопамять с помощью строковой команды пересылки MOVS.

1.4.Ввод с клавиатуры

      1. Средства dos

Как и в случае вывода на экран, DOS предоставляет набор функций для чтения данных со стандартного устройства ввода STDIN, в качестве которого может использоваться клавиатура, файл или стандартный вывод другой программы.

Функция DOS 0AhСчитать строку символов из STDIN в буфер

Ввод: АН = 0Ah

DS:DX = адрес подготовленного буфера

Вывод: Буфер содержит введенную строку

Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1 - 254), а содержимое, если оно задано, может использоваться как подсказка для ввода (предопределенная строка).

Функция 0Ah используется командным процессором для ввода команд пользователя, поэтому правила ввода строки здесь те же, что и при вводе команд в командной строке DOS. При наборе строки обрабатываются клавиши Esc, F3, F5, BS (Backspace), Ctrl-C/Ctrl-Break. После нажатия клавиши Enter строка (включая последний символ CR (0Dh), вызванный нажатием Enter) записывается в подготовленный буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.

Функция 0Ah предоставляет удобный, но ограниченный способ ввода данных. Если требуется контролировать отображение символов на экране, реакцию программы на функциональные и управляющие клавиши и т. д., используют функции посимвольного ввода.

Функция DOS 01h Считать символ из STDIN с эхом, ожиданием и про­веркой на Ctrl-Break.

Ввод: АН = 01h

Вывод: AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа.

При чтении с помощью этой функции введенный символ автоматичес­ки немедленно отображается на экране (STDOUT). При нажатии Ctrl-C или Ctrl-Break работа функции прерывается (выполняется команда INT 23h). Если нажата клавиша, не со­ответствующая какому-нибудь символу (клавиши управления курсором и редактирования, функциональные клави­ши), или же некоторая комбинация клавиш, то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код. В табл. 2 приведены наиболее распространенные клавиши и комбинации, генерирующие расширенные ASCII-коды.

В трех следующих вариантах функции 1 код символа возвращает­ся в AL по такому же принципу.

Функция DOS 08hСчитать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break

Ввод: АН = 08h

Вывод: AL = код символа

Функция DOS 07hСчитать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break

Ввод: АН = 07h

Вывод: AL = код символа

Функция DOS 06hСчитать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break

Ввод: АН = 06h

DL = 0FFh

Вывод: ZF = 1, если не была нажата клавиша, и AL = 0

ZF = 0, если клавиша была нажата; в этом случае AL = код символа

Кроме перечисленных функций могут потребоваться и некоторые служебные функции DOS для работы с клавиатурой.

Функция DOS 0BhПроверить состояние клавиатуры

Ввод: АН = 0Bh

Вывод: AL = 0, если не была нажата клавиша

AL = 0FFh, если была нажата клавиша

Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши.

Функция DOS 0Сh — Очистить буфер и считать символ

Ввод: АН = 0Сh

AL = Номер функции DOS (01, 06, 07, 08, 0Ah)

Вывод: Зависит от вызванной функции

На уровне BIOS ввод с клавиатуры буферируется, то есть коды нажимаемых клавиш сохраняются в специальном буфере клавиатуры в памяти. Это дает пользователю возможность начать вводить команду еще до того, как система освободилась и управление получил командный процессор. Функции ввода с ожиданием, рассмотренные выше, вначале проверяют состояние буфера клавиатуры, и только если он пуст, ожидают ввод.

Функция 0Ch используется как менеджер вызова одной из описанных функций ввода с предварительной очисткой буфера клавиатуры. В результате указанная подфунк­ция чтения символа обязательно будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос о форматировании диска.

Функции посимвольного ввода без эха можно использовать для ин­терактивного управления программой.

Таблица 2. Некоторые расширенные коды ASCII

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

F1

3Bh

Alt-A

1eh

Alt-M

32h

Alt-Y

15h

Alt--

82h

F2

3Ch

Alt-B

30h

Alt-N

31h

Alt-Z

2ch

Alt-=

83h

F3

3Dh

Alt-C

2eh

Alt-O

18h

Alt-0

81h

Ins

52h

F4

3Eh

Alt-D

20h

Alt-P

19h

Alt-1

78h

Del

53h

F5

3Fh

Alt-E

12h

Alt-Q

10h

Alt-2

79h

left

4Bh

F6

40h

Alt-F

21h

Alt-R

13h

Alt-3

7ah

right

4Dh

F7

41h

Alt-G

22h

Alt-S

1fh

Alt-4

7bh

up

48h

F8

42h

Alt-H

23h

Alt-T

14h

Alt-5

7ch

down

50h

F9

43h

Alt-I

17h

Alt-U

16h

Alt-6

7dh

Home

47h

F10

44h

Alt-J

24h

Alt-V

2fh

Alt-7

7eh

End

4fh

F11

85h

Alt-K

25h

Alt-W

11h

Alt-8

7fh

PgUp

49h

F12

86h

Alt-L

26h

Alt-X

2dh

Alt-9

80h

PgDn

51h

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]