Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать

3.2. Работа с клавиатурой и экраном.

Информация, которую компьютер выводит на экран, располагается в определенной области памяти. В стандартном текстовом режиме (а именно в этом режиме мы и предполагаем работать) эта область начинается с адреса b8000h. В этом режиме экранная область памяти разбита на несколько страниц. В любой момент времени на экран выводится содержимое одной из этих страниц, она называется активной. Таким образом, программист может заранее подготовить информацию в пассивной странице, а затем быстро сделать эту страницу активной. Но мы этим заниматься не будем, а будем всегда работать только с нулевой страницей. В рассматриваемом текстовом режиме экран имеет 25 строк (нумерация 0 – 24) и 80 столбцов (0 – 79). Таким образом, для описания текущего состояния экрана в памяти отводится 25*80 = 2000 слов. Каждое из этих слов описывает одно знакоместо. В младшем байте такого слова содержится ASCII – код выводимого символа, а в старшем байте – атрибуты, с которыми этот символ выводится на экран (цвет символа и цвет фона в знакоместе). Байт атрибутов имеет формат, представленный на рис 3.1 (подробней смотри Приложение).

D7

D6

D5

D4

D3

D2

D1

D0

рис. 3.1

Здесь разряды D2 – D0 определяют цвет символа (000 – черный, … 111 – белый). Разряд D3 задает яркость цвета символа. Разряды D6 – D4 задают цвет фона (000 – черный, … 111 – белый). Разряд D7 задает яркость фона или, значительно реже, мигание символа. Назначение разряда D7 (мигание/яркость) можно менять программным путем (смотри раздел 5.2 в Приложении).

Все клавиши на клавиатуре можно разделить на символьные и функциональные. Символьные клавиши (а, б, …1, 2,...) вводят в компьютер символы, которые впоследствии можно отображать на экране. То есть для символьных клавиш имеется их ASCII – код. Функциональные клавиши (F1,…DEL,…INS, …) ASCII – кода не имеют. Когда мы нажимаем любую клавишу на клавиатуре, происходит следующее. Контроллер клавиатуры выставляет СКЭН – код (номер) нажатой клавиши в порт с адресом 60h и, через контроллер прерываний, формирует на процессор запрос на прерывание. В IBM – подобных компьютерах этому запросу присвоен тип 9 («девятое прерывание»). Обработчик «девятого прерывания» читает СКЭН – код из порта 60h, переводит его в ASCII – код, если нажата символьная клавиша (для функциональных ASCII – код берется равным 0), и помещает и СКЭН и ASCII код в расположенный в памяти кольцевой буфер клавиатуры (подробно буфер клавиатуры описан в Приложении). Программы же считывают информацию уже из этого буфера.

Конечно, мы можем напрямую работать с видеопамятью и кольцевым буфером. Например, для того чтобы очистить экран, достаточно записать во все слова видеопамяти ASCII – код пробела с соответствующими атрибутами. Допустим, так:

mov cx, 2000 ; число повторений цикла

mov ax, 0b800h

mov es, ax ; настраиваем es на начало видеопамяти

mov si, 0 ; в si смещение в видеопамяти

cikle:

mov word ptr es:[si], 7020h ; записываем в текущее знакоместо код и атрибуты ; 20h – ASCII – код пробела, 70h – «черным по белому»

add si, 2 ; переходим к следующему знакоместу (слову)

loop cikle

Однако, работа с аппаратурой напрямую, хотя и обеспечивает наиболее высокое быстродействие, чревата ошибками. Поэтому мы рекомендуем новичкам пользоваться сервисными подпрограммами, которые DOS и BIOS предоставляют пользователю через программные прерывания int n. Далее приводится далеко не полный перечень прерываний, обеспечивающих сервис по работе с экраном и клавиатурой.