Системное программирование

Автор: Пользователь скрыл имя, 10 Марта 2013 в 15:44, курс лекций

Описание работы

Один из основных принципов машины фон Неймана — то, что и программы, и данные хранятся в одной и той же памяти. Сохраняемая в памяти программа представляет собой некоторые коды, которые могут рассматриваться как данные. Возможно, с точки зрения программиста программа — активный компонент, она выполняет некоторые действия. Но с точки зрения процессора команды программы — это данные, которые процессор читает и интерпретирует. С другой стороны программа — это данные с точки зрения обслуживающих программ, например, с точки зрения компилятора, который на входе получает одни данные — программу на языке высокого уровня (ЯВУ), а на выходе выдает другие данные — программу в машинных кодах.

Работа содержит 1 файл

Системное программирование 15 лекций.doc

— 946.00 Кб (Скачать)

AH=03

Чтение текущего положения курсора. Программа может  определить положение курсора на экране (строку и столбец), а также pазмер курсора, следующим образом:

AH=04

Чтение положения  светового пера. Данная функция используeтся  в графическом режиме для определения положения светового пеpа.

AH=05

Выбор активной страницы.

AH=06

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

Ранее код 06 использовался  для очистки экрана. В текстовом  режиме установка в регистре AL значения 00 приводит к полной прокрутке вверх всего экрана, очищая его пробелами. Установка ненулевого значения в регистре AL определяет количество строк прокрутки экрана вверх. Верхние строки уходят с экрана, а чистые строки вводятся снизу. Следующие команды выполняют прокрутку всего экрана на одну строку:

MOV AX,0601H ;Прокрутить на одну строку  вверх 

MOV BH,07 ;Атрибут: нормальный, черно-белый 

MOV CX,0000 ;Координаты от 00,00

MOV DX,184FH ; до 24,79 (полный экран) 

INT 10H ;Вызвать BIOS

Для прокрутки  любого количества строк необходимо установить соответствующее значение в регистре AL. Регистр BH содержит атрибут  для нормального или инвертированного отображения, мигания, установки цвета  и так далее. Значения в регистрах CX и DX позволяют прокручивать любую часть экрана. Ниже объясняется стандартный подход к прокрутке:

1. Определить  в элементе ROW (строка) значение 0 для  установки строки положения курсора.

2. Выдать текст  и продвинуть курсор на следующую  строку.

3. Проверить,  находится ли курсор на последней строке (CMP ROW,22).

4. В случае, если  да, то увеличить элемент ROW (INC ROW) и выйти.

5. В случае, если  нет, то прокрутить экран на  одну строку и, используя ROW переустановить курсор.

AH=07

Прокрутка экрана вниз. Для текстового режима прокрутка экрана вниз обозначает удаление нижних строк и вставка чистых строк сверху.

Регистр AH должен содержать 07, значения остальных регистpов аналогичны функции 06 для прокрутки  вверх.

AH=08

Чтение атрибута/символа  в текущей позиции курсора. Для чтения символа и байта атрибута из дисплейного буфера, как в текстовом, так и в графическом режиме используются следующие команды:

MOV AH,08 ;Запрос на чтение атр./симв.

MOV BH,00 ;Страница 0 (для текстового  реж.)

INT 10H ;Вызвать BIOS

Данная функция  возвращает в регистре AL значение символа, а в AH — его атрибут. В графическом режиме функция возвращает шест.00 для не ASCII-кодов. Так как эта функция читает только один cимвол, то для символьной строки необходима организация цикла.

AH=09

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

MOV AH,09 ;Функция вывода 

MOV AL,символ ;Выводимый символ 

MOV BH,страница ;Номер страницы (текст.реж.)

MOV BL,атрибут ;Атрибут или цвет 

MOV CX,повторение ;Число повторений  символа 

INT 10H ;Вызвать BIOS

В регистр AL должен быть помещен выводимый на экран  символ. Значение в регистре CX определяет число повторений символа на экране. Вывод на экран последовательности различных символов требует организации цикла. Данная функция не перемещает курсор. В следующем примере на экран выводится пять мигающих «сердечек» в инвертированном виде:

MOV AH,09 ;Функция вывода 

MOV AL,03H ;Черви (карточная масть)

MOV BH,00 ;Страница 0 (текст. режим) 

MOV BL,0F0H ;Мигание, инверсия 

MOV CX,05 ;Пять раз 

INT 10H ;Вызвать BIOS

В текстовом (но не в графическом) режиме символы  автоматически выводятся на экран  и переходят с одной строки на другую. Для вывода на экран текста запроса или сообщения необходимо составить программу, которая устанавливает в регистре CX значение 01 и в цикле загружает в регистр AL из памяти выводимые символы текста. Так как регистр CX в данном случае занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого символа необходимо дополнительно продвигать курсор в следующий столбец (функция 02).

В графическом  режиме регистр BL используется для  определения цвета графики. В  случае, если бит 7 равен 0, то заданный цвет заменяет текущий цвет точки, если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.

AH=0A

Вывод символа  в текущую позицию курсора. Единственная разница между функциями 0A и 09 состоит  в том, что функция 0A не устанавливает  атрибут:

MOV AH,0AH ;Функция вывода 

MOV AL,символ ;Выводимый символ 

MOV BH,страница ;Номер страницы (для  текста)

MOV CX,повторение ;Число повторений  символа 

INT 10H ;Вызвать BIOS

Для большинства  применений команда прерывания DOS INT 21H более удобна.

AH=0E

Вывод в режиме телетайпа. Данная функция позволяет использовать монитор, как простой терминал.

Для выполнения этой функции необходимо установить в регистре AH шест. значение 0E, в регистр AL поместить выводимый символ, цвет текста (в графическом режиме) занести в регистр BL и номер страницы для текстового режима — в регистр BH. Звуковой сигнал (код 07H), возврат на одну позицию (08H), конец строки (0AH) и возврат каретки (0DH) действуют, как команды для форматизации экрана.

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

AH=0F

Получение текущего видео режима. Данная функция возвращает в регистре AL текущий видео режим, в pегистре AH — число символов в  строке (20, 40 или 80), в регистре BH — номер страницы. 

 

 

 

AH=13

Вывод символьной строки (только для AT). Данная функция  позволяет на компьютерах типа AT выводить на экран символьные строки с установкой атрибутов и перемещением курсора:

MOV AH,13H ;Функция вывода на экран

MOV AL,сервис ;0, 1, 2 или 3

MOV BH,страница ;

LEA BP,адрес ;Адрес строки в  ES:BP

MOV CX,длина ;Длина строки 

MOV DX,экран ;Координаты на экране 

INT 10H ;Вызвать BIOS

Возможен следующий  дополнительный сервис:

u 0 — использовать атрибут и не перемещать курсор;

u 1 — использовать атрибут и переместить курсор;

u 2 — вывести символ, затем атрибут и не перемещать курсор;

u 3 — вывести символ, затем атрибут и переместить курсор.

4

Расширенный ASCII код

ASCII-коды от 128 до 255 (шест. 80-FF) представляют собой ряд специальных символов полезных при формировании запросов, меню, специальных значков с экранными атрибутами. Например, используя cледующие символы можно нарисовать прямоугольник:

DA

Верхний левый  угол

BF

Верхний правый угол

C0

Нижний левый угол

D9

Нижний правый угол

C4

Горизонтальная  линия

B3

Вертикальная  линия

Следующие команды  с помощью INT 10H выводят горизонтальную линию на 25 позиций в длину:

MOV AH,09 ;Функция вывода на экран 

MOV AL,0C4H ;Горизонтальная линия 

MOV BH,00 ;Страница 0

MOV BL,0FH ;Выделение яркостью

MOV CX,25 ;25 повторений 

MOV 10H ;Вызвать BIOS

Напомним, что  курсор не перемещается.

Вывод вертикальной линии включает цикл, в котором  курсор перемещается вниз на одну строку и выводится символ шест. B3. Для  штриховки может быть полезен символ с точками внутри:

B0

Одна четверть точек (светлая штриховка)

B1

Половина точек (средняя штриховка)

B2

Три четверти точек (темная штриховка)

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

4

Другие операции ввода/вывода

Ниже перечислены  другие функции DOS, которые могут  оказаться полезными в работе. Код функции устанавливается  в регистре AH и, затем, выдается команда INT 21H. 

 

AH=01

Ввод с клавиатуры с эхо отображением. Данная функция  возвращает значение в регистре AL. В  случае, если содержимое AL не равно  нулю, то оно представляет собой  стандартный ASCII-cимвол, например, букву  или цифру. Нулевое значение в  регистре AL свидетельствует о том, что на клавиатуре была нажата специальная функциональная клавиша, например, Номе, F1 или PgUp. Для определения скэн-кода клавиш, необходимо повторить вызов функции. Данная функция реагирует на запрос Ctrl/Break.

AH=02

Вывод символа. Для вывода символа на экран в текущую позицию курсора необходимо поместить код данного символа в pегистр DL. Коды табуляции, возврата каретки и конца строки действуют обычным образом.

AH=07

Прямой ввод с клавиатуры без эхо отображения. Данная функция работает аналогично функции 01 с двумя отличиями: введенный символ не отображается на экране, то есть, нет эхо, и oтсутствует реакция на запрос Ctrl/Break.

AH=08

Ввод с клавиатуры без эхо отображения. Данная функция  действует аналогично функции 01 с  одним отличием: введенный символ не отображается на экран, то есть, нет эхо.

AH=0B

Проверка состояния  клавиатуры. Данная функция возвращает шест. FF в регистре AL, если ввод с  клавиатуры возможен, в противном  случае — 00. Это средство связано  с функциями 01, 07 и 08, которые не ожидают ввода с клавиатуры.

4

Ввод с клавиатуры по команде BIOS INT 16H

Команда BIOS INT 16H выполняет специальную операцию, которая в соответствии с кодом  в регистре AH обеспечивает следующие  три функции ввода с клавиатуры.

AH=00

Чтение символа. Данная функция помещает в регистр AL oчередной ASCII символ, введенный с клавиатуры, и устанавливает скэн-код в регистре AH. В случае, если на клавиатуре нажата одна из специальных клавишей, например, Номе или F1, то в регистр AL заносится 00. Автоматическое эхо символа на экран по этой функции не происходит.

AH=01

Определение наличия  введенного символа. Данная функция  сбрасывает флаг нуля (ZF=0), если имеется  символ для чтения с клавиатуры; очередной символ и скэн-код будут  помещены в регистры AL и AH соответственно и данный элемент останется в буфере.

AH=02

Определение текущего состояния клавиатуры. Данная функция  возвращает в регистре AL состояние  клавиатуры из адреса памяти:

Бит

7

Состояние вставки  активно (Ins)

6

Состояние фиксации верхнего регистра (Caps Lock) переключено

5

Состояние фиксации цифровой клавиатуры (Num Lock) переключено

4

Состояние фиксации прокрутки (Scroll Lock) переключено

3

Нажата комбинация клавишей Alt/Shift

2

Нажата комбинация клавишей Ctrl/Shift

1

Нажата левая  клавиша Shift

0

Нажата правая клавиша Shift 

 

 

 

4

Функциональные клавиши

Клавиатура располагает  тремя основными типами клавишей:

1. Символьные (алфавитно-цифровые) клавиши: буквы от a до z, цифры  от 0 до 9, символы %, $, # и так далее.

2. Функциональные клавиши: Номе, End, Возврат на позицию, стрелки, Enter, Del, Ins, PgUp, PgDn и программно-функциональные клавиши.

3. Управляющие клавиши: Alt, Ctrl и Shift, которые работают совместно с другими клавишами.

Функциональная клавиша  не вырабатывает какой-либо символ, но чаще формирует запрос на некоторые действия. Аппаратная реализация не требует от функциональных клавишей выполнения каких-либо специфических действий.

Задачей программиста является определить, например, что нажатие  клавиши Номе должно привести к установке курсора в верхний левый угол экрана, или нажатие клавиши End должно установить курсор в конец текста на экране.

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

Каждая клавиша  имеет собственный скэн-код от 1 (Esc) до 83 (Del) или от шест.01 до шест.53. Посредством этих скэн-кодов программа может определить нажатие любой клавиши. Например, запрос на ввод одного символа с клавиатуры включает загрузку 00 в регистр AH и обращение к BIOS через INT 16H:

MOV AH,00 ;Функция ввода с клавиатуры

INT 16H ;Вызвать BIOS

Данная операция имеет два типа ответов в зависимости  от того, нажата символьная клавиша  или функциональная. Для символа (например, буква A) клавиатура посылает в компьютер два элемента информации:

1. ASCII-код символа A (шест.41) в регистре AL;

2. Скэн-код для  клавиши A (шест.1E) в регистре AH.

В случае, если нажата функциональная клавиша (например, Ins) клавиатура также передает два элемента:

1. Нуль в регистре AL;

2. Скэн-код для  клавиши Ins (шест.52) в регистре AH.

Таким образом, после выполнения команды INT 16H необходимо прежде проверить содержимое регистра AL. В случае, если AL содержит нуль, то была нажата функциональная клавиша, если не нуль, то получен код символьной клавиши.

Скэн-коды

Клавиатура имеет по две клавиши для таких символов как *, + и -. Нажатие «звездочки», например, устанавливает код символа шест.2A в регистре AL и один из двух скэн-кодов в регистре AH в зависимости от того, какая из клавишей была нажата: шест.09 для звездочки над цифрой 8 или шест.29 для звездочки на клавише PrtSc.

Информация о работе Системное программирование