1
Лабораторная работа по курсу "Организация ЭВМ и систем"
Использование прерываний DOS и BIOS
Цель работы: познакомиться с прерываниями DOS для ввода/вывода и прерываниями BIOS для работы с видеосистемой.
Вызовы DOS. В состав DOS входит большое количество программ, осуществляющих вывод на экран и ввод с клавиатуры, запись/чтение файла, чтение/установку текущего времени и многое другое. Вызов большинства перечисленных функций осуществляется командой
int 21h
Здесь 21h - номер прерывания, по которому вызывается программа-диспетчер MS DOS, вызывающая ту или иную функцию DOS. Перед вызовом этого прерывания необходимо занести в регистр AH номер требуемой функции, их краткий список приведен в Приложении 2. Если DOS не смогла выполнить требуемую функцию, флаг CF устанавливается в 1 и в регистр AX заносится код ошибки.
Пример 1. Программа dos.asm. Считать с клавиатуры строку символов и вывести ее на экран, после чего занести в регистр CL ее длину. Первую букву в строке преобразовать в большую, если она маленькая, и наоборот. Вывести преобразованную строку на экран.
sseg |
segment stack 'stack' |
|
sseg |
db 64 dup (?) |
|
ends |
|
|
data |
segment |
|
buffer |
db |
80, 0 |
string |
db |
80 dup (0),'$' |
message db |
13, 10, '>$' |
|
prompt |
db 'Задание - ввести строку, преобразовать', 13, 10 |
|
|
db 'первую букву и вывести строку и ее длину',13,10, |
|
data |
db 'Введите строку: $' |
|
ends |
|
|
main |
segment |
|
|
assume |
cs: main, ds: data, ss: sseg |
start:
mov bx, |
data |
;Загрузка DS значением, |
mov ds, |
bx |
;соответствующим сегменту данных |
mov dx, offset prompt |
;Печать приглашения |
||
mov ah, 9h |
|
|
|
int 21h |
|
;Чтение строки |
|
mov dx, offset buffer |
|||
mov ah, 0Ah |
|
|
|
int 21h |
|
;DI - адрес буфера |
|
mov di, offset string |
|||
cmp byte ptr [di], 'A' |
;Буква? |
||
jl |
nosym |
|
;Нет (первый операнд меньше 'A') |
xor byte ptr [di], 20h |
;Преобр. первой буквы |
||
nosym: |
mov ax, 0 |
;AX - длина строки |
|
mov al, buffer+1 |
|||
add di, ax |
|
;DI - адрес конца строки |
|
mov byte ptr [di], '$' |
;Добавить метку конца строки для вывода строки |
||
mov dx, offset message |
;Печать сообщения |
||
mov ah, 9h |
|
|
|
int 21h |
|
;Печать строки |
|
mov dx, offset string |
|||
int 21h |
|
;В cl - длину строки |
|
mov cl, buffer+1 |
|
||
movAH,4Ch |
|
;Завершение программы |
2
movAL,0 int 21h
main ends
end start
Прерывания BIOS. Базовая система ввода-вывода BIOS обеспечивает управление периферийным оборудованием ПК. BIOS размещается в ПЗУ BIOS (основная часть BIOS - это 64 Кбайт ОП, начиная с адреса F0000h), включает набор управляющих программ для основных периферийных устройств ПК. Программы BIOS обеспечивают управление аппаратурой на самом низком уровне и являются аппаратно-зависимыми. Они обращаются к портам (управляющим регистрам и аппаратным буферам) устройств ввода-вывода. Программы DOS образуют более высокий уровень управления компьютером. Например, для записи данных на диск с помощью BIOS требуется задать номер головки, цилиндра и сектора на конкретном дисководе; при обращении к DOS достаточно указать спецификацию файла. Программы обслуживания файловой системы, входящие в состав DOS, проанализируют содержимое диска, определят местонахождение требуемого файла и поставят ряд запросов к BIOS на выполнение операции записи.
Использовать функции DOS проще, однако BIOS обладает большими возможностями. Например, вывод текстовых строк на экран с помощью функций DOS 09h и 40h выполнить просто, но они не могут вывести графику, изменить цвет фона или символов, позиционировать курсор, очистить экран, переключить видеостраницу, изменить видеорежим. BIOS обеспечивает все эти возможности (прерывание 10h). В Приложении 3 приведены функции прерывания BIOS 10h для работы с видеосистемой, использованные в Примере 2. В файле BIOS 10h.doc
приведен краткий список функций прерывания BIOS 10h.
Пример 2. Программа bios.asm. Вывод на экран графического изображения с помощью прерывания BIOS 10h.
; Установить графический видеорежим
|
mov |
AH,0h |
|
|
mov |
AL,10h |
|
|
int |
10h |
|
; Вывести |
на экран желтый прямоугольник |
||
|
mov |
AH,0Ch |
; Функция вывода пиксела |
|
mov |
AL,0Eh |
; Желтый цвет |
|
mov |
BH,0 |
; Номер видеостраницы |
c2: |
mov |
CX,50 |
; Начальная x-координата |
mov |
DX,10 |
; Начальная y-координата |
|
c1: |
int |
10h |
; Инкремент по y |
|
inc |
DX |
|
|
cmp |
DX,330 |
; Дошли до границы по y? |
|
jne |
c1 |
; Нет, повторяем вывод точек |
|
inc |
CX |
; Дошли до границы по y, инкремент x |
|
cmp |
CX,610 |
; Дошли до границы по x? |
|
jne |
c2 |
; Нет, повторяем вывод вертикальных линий |
; Остановить программу для наблюдения результата |
|||
|
mov |
AH,01h |
|
|
int |
21h |
|
; Восстановить текстовый видеорежим |
|||
|
mov |
AX,3 |
|
|
int |
10h |
|
Порядок выполнения работы
1.Напишите и выполните программу dos.asm, осуществляющую ввод-вывод при помощи вызовов DOS в соответствии с заданием своего варианта (см. Приложение 1).
2.Выполните программу bios.asm, используя упрощенные директивы сегментации
3.Найдите в обеих программах и выпишите с пояснениями 16-ричный код команд перехода
3
Jcc <метка вперед> и Jcc <метка назад>. Воспользуйтесь листингом ассемблера или информацией отладчика.
4.Покажите результаты выполнения обеих программ преподавателю.
5.*Модифицируйте Пример 2: выведите цветной параллелограмм.
Требования к отчету
1.При подготовке к лабораторной работе (дома) запишите в конспект: а) текст программы dos.asm для своего варианта;
б) полный текст программы bios.asm (с упрощенными директивами сегментации); в) все использованные функции DOS и BIOS с пояснениями;
г) все команды сравнения и условных переходов с пояснениями.
2.При выполнении работы занесите в отчет всю информацию, указанную в "Порядке выполнения".
3.Студент должен знать ответы на следующие вопросы:
Вопросы
1.Каково назначение вызовов (прерываний) DOS?
2.Каково назначение вызовов (прерываний) BIOS?
3.Знать команды сравнения и условных переходов.
ПРИЛОЖЕНИЕ 1. Варианты заданий к Примеру 1. Номер варианта равен номеру ПК.
1, 11, 21. Ввести с клавиатуры строку из двадцати символов. Поменять местами первые и последние 10 символов. Результат вывести на экран.
2, 12, 22. Ввести с клавиатуры один символ. Напечатать символ, код которого на 1 больше введенного. Непрерывно выводить этот символ до тех пор, пока пользователь не введет какой-либо символ.
3, 13, 23. Ввести с клавиатуры строку символов, вывести символы на экран в обратном порядке.
4, 14, 24. Ввести с клавиатуры строку, все буквы 'A' из исходной строки заменить на 'a'. Подсчитать и вывести на экран количество таких замен (от 0 до 9). Вывести результирующую строку на экран.
5, 15, 25. Ввести с клавиатуры строку английских букв, после чего вывести ее на экран в обратном порядке, преобразуя большие буквы в маленькие.
6, 16, 26. Ввести с клавиатуры две строки и, в соответствии с их длинами, напечатать: "Первая строка короче", "Вторая строка короче" или "Строки равной длины".
7, 17. Считать с клавиатуры строку символов, затем запросить еще один символ, подсчитать количество его появлений в строке (от 0 до 9) и вывести на экран.
8, 18. Считать с клавиатуры строку символов. В случае появления среди первых 9 символов символа * вывести на экран его порядковый номер.
9, 19. Считать с клавиатуры строку символов. Вывести на экран ее длину в виде шестнадцатеричного числа (от 0h до FFh).
10, 20. Моделирование ввода пароля: ввести строку символов, заменяя при вводе каждый символ на экране символом '*'. После окончания ввода пароля (при вводе символа возврата каретки 0Dh) напечатать пароль на экране.
* Необязательное задание. Оценивается дополнительными пунктами при условии, что студент полностью выполнил остальные задания.
4
ПРИЛОЖЕНИЕ 2. Некоторые функции прерывания MS-DOS INT 21h
Функция 01h: Ввод символа с клавиатуры с эхо-печатью. Функция ожидает ввода символа со стандартного устройства ввода (по умолчанию - клавиатура) и по получении символа помещает его в регистр AL. Одновременно с этим символ выводится на экран.
Функция 02h: Вывод символа на экран дисплея. Функция берет символ из регистра DL и выводит его на стандартное устройство вывода (по умолчанию - дисплей).
Функция 06h: Прямой ввод-вывод. Вводит с клавиатуры или выводит символ на экран. При отсутствии символа не ждет его ввода, а возвращает управление в программу. При вызове DL содержит код выводимого символа (00h…FEh) для вывода; или DL=FFh для ввода. Код введенного символа помещается в AL. Если символа нет, то ZF=1 (установлен флаг нуля).
Функция 08h: Ввод символа с клавиатуры без эха. Функция ожидает ввода символа со стандартного устройства ввода (по умолчанию - клавиатура) и по получении символа помещает его в регистр AL. Введенный символ на экране не отображается.
Функция 09h: Вывод строки на экран дисплея. Функция выводит строку на стандартное устройство вывода. Полный адрес строки задается регистрами DS:DX. В конце строки должен быть символ '$'.
Функция 0Ah: Буферизованный ввод с клавиатуры. Функция вводит со стандартного устройства ввода строку символов до тех пор, пока не встретится символ возврата каретки 0Dh. Адрес области ввода задается парой DS:DX. В первом байте области ввода должно быть указано максимально допустимое число вводимых байтов, во втором байте после выполнения функции будет содержаться число фактически введенных символов. Введенная строка будет помещена в буфер, начиная с третьего байта. Символ возврата каретки помещается в конец строки.
ПРИЛОЖЕНИЕ 3. Некоторые функции прерывания BIOS 10h (видеосистема)
Функция 00h: Установка видеорежима. Устанавливает текущий видеорежим.
При вызове: |
|
|
|
AH=00h |
|
|
|
АL=видеорежим: |
|
|
|
03h |
текстовый, 80x25, |
16 |
цветов |
10h |
графический, 640x350, |
16 |
цветов (EGA) |
12h |
графический, 640x480, |
16 |
цветов (VGA) |
1Dh |
графический, 800x600, |
256 цветов (VGA) |
|
38h |
графический, 1024x768, |
256 цветов (VGA) |
Функция 0Ch: Запись пиксела. Записывает в видеобуфер точку заданного цвета в заданной графической позиции.
При вызове:
AH=0Ch
АL=цвет (номер цветового регистра) ВН=страница СХ=графический столбец ВХ=графическая строка
Источники информации
1.Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. - М.: ДИАЛОГ-
МИФИ, 2001. (Статьи 7, 9, 24)
---------------------------------------------------------------------------------------------------
© Лабораторная работа подготовлена Л.В. Илюшечкиной.