
- •1.1.1. Кодирование символов
- •2. Системный отладчик Debug
- •2.1. Адресация памяти
- •2.2. Работа в отладчике
- •Лабораторная работа № 1
- •3. Основы программирования
- •3.1. Процесс программирования
- •3.1.1. Этапы создания программы
- •3.1.2. Компиляция программы. Опции командной строки
- •3.2. Cинтаксис ассемблерной программы
- •3.3. Простейшая программа
- •3.4. Скелет (каркас) программы
- •3.4.1. Модуль EXE
- •3.4.2. Модуль COM
- •3.5. Образ программы в памяти
- •3.5.1. Модуль EXE
- •3.5.2. Модуль COM
- •3.6. Работа с отладчиком Turbo Debugger (TD)
- •Лабораторная работа №1
- •4. Операторы и директивы
- •4.1. "Препроцессорные" директивы INCLUDE и EQU
- •4.2. Директивы описания и инициализации переменных DB, DW и DD
- •4.2.1. Директива DB (Define Byte - определить байт)
- •4.2.2. Директивы DW и DD (Define Word и Define Double Word)
- •4.3. Операторы Assembler
- •4.3.1. Операторы обработки данных
- •4.3.2. Операторы передачи управления
- •4.4. Вспомогательные псевдооператоры
- •4.5. Работа с макрооператорами
- •Лабораторная работа № 2
- •4.6. Приложение к лабораторной работе № 2. Адресация
- •4.6.1. Форматы машинных команд и их кодирование
- •4.6.2. 16-битный режим адресации операндов в памяти
- •5. Сервисные функции DOS
- •5.1.1. Ввод с клавиатуры символьной информации
- •5.1.2. Системные функции DOS ввода данных с клавиатуры
- •5.1.3. Команды работы со строками
- •5.1.4. Системные функции DOS вывода данных
- •Лабораторная работа №3
- •Лабораторная работа №4
- •6. Функции BIOS для работы с экраном и клавиатурой
- •6.1. Прямое программирование видеобуфера в текстовом режиме
- •6.2. Прерывание 10h. Видеофункции BIOS
- •6.3. Прерывания 16h, 1Ah, 15h
- •6.3.1. Прерывание 16h
- •6.3.2. Прерывание 1Ah
- •6.3.3. Прерывание 15h
- •Лабораторная работа №5
- •Заключение
- •Рекомендуемая литература
- •Использованная литература
0000h:0417h, и, дополнительно, второй байт статуса клавиатуры (адрес 0000h:0418h) со следующими значениями:
0:1 – левая Ctrl нажата
1:1 – левая Alt нажата
2:1 – правая Ctrl нажата
3:1 – правая Alt нажата
4:1 – нажата Scroll Lock
5:1 – нажата Num Lock
6:1 – нажата Caps Lock
7:1 – нажата SysReg
6.3.2.Прерывание 1Ah
Функция 00h. Чтение счетчика циклов таймера.
Обработчик прерывания BIOS от системного таймера (Int 8) подсчитывает количество прерываний (каждые 55 мсек или 18,2 раза в секунду) в двойном слове памяти с адресом 0040h:006Сh. Данная функция возвращает накопленное значение (двоичный код) и сбрасывает его в 0. В регистре AL возвращается 0, если содержимое счетчика не превысило значения, соответствующего 24 часам (при достижении этого значения счетчик сбрасывается), иначе возвращается AL= 1.
Вызов: АН = 00h.
Возврат: СХ:DX – число тактов системного времени от полуночи, AL – флаг перехода через сутки.
Примеры возвращаемых значений в СХ:DX: 1 сек 12h или 18,
1 минута 04 44h или 1092,
1 час 1 00 07h или 65543,
24 часа 18 00 B0h или 1 573 040.
Для задержек меньших 14 секунд можно пользоваться только младшим байтом регистра DX
6.3.3. Прерывание 15h
Функция 86h. Задержка
Вызов: AH = 86h, СX:DX = время задержки в мксек.
Возврат: CF = 0 – нормальное исполнение, CF = 1 – функция не поддерживается.
Лабораторная работа №5
Тема работы. Использование сервисных функций BIOS. Прямое программирование страниц буфера видеоадаптера.
Цель работы. Научится работать с прерыванием 10h.
Содержание работы.
В данной работе предложена программа, демонстрирующая процесс программирования нулевой страницы памяти видеобуфера с последующим выводом текста в графическом режиме.
93

1IDEAL
2MODEL small
3STACK256
4DATASEG
5 |
string |
DB '*',0B0h,'H',0E4h,'E',0E4h,'L',0E4h,'L',0E4h,'O',0E4h,'*',0B0h |
6 |
lngth = |
$-string |
7CODESEG
8 |
Start: |
mov ax,@data |
9 |
|
mov ds,ax |
10 |
|
mov ah,00h |
11 |
|
mov al,3 |
12 |
|
int 10h |
13 |
|
mov ax,0B800h |
14 |
|
mov es,ax |
15 |
|
mov si,offset string |
16 |
|
mov di,160*12+36*2 |
17 |
|
mov cx,lngth |
18 |
|
cld |
19 |
|
rep movsb |
20 |
|
mov ah,05h |
21 |
|
mov al,0 |
22 |
|
int 10h |
23 |
|
mov ah,01h |
24 |
Exit: |
int 21h |
25 |
mov ax,4C00h |
|
26 |
END |
int 21h |
27 |
Start |
В данной программе в самом начале устанавливается третий видеорежим (см. табл. 4.2.), совместно с установкой видеорежима происходит очистка экрана.
Затем, уже известным способом, происходит загрузка байтов строки string в память по адресу 0B800h (строки 10-16), которая хранит данные 0-й страницы видеобуфера. После того, как символы загружены в нужные ячейки памяти, происходит подготовка и вызов 5й функции 10-го прерывания (строки 20-22), при этом указывается 0-я страница (строка 21).
В завершении, во избежании нежелательного затирания выведенной программой информации сервисными сообщениями DOS, вызываем функцию считывания символа, организуя тем самым задержку перед завершением программы.
Примечание. Тект, выводимый на экран данной программой, будет мигать только в полноэкранном режиме. Для перехода в полноэкранный режим используйте сочетание клавиш Alt+Enter.
Задания к работе.
1.Измените данную программу так, чтобы сообщение *HELLO* выводилось бы два раза - в нижнем левом и верхнем правом углах экрана.
2.Выведите в любое место на экране следующий набор символов, учитывая расположение:
1
2 3
4 5 6
7 8 9 0
3.Напишите программу, которая считывает строку символов с клавиатуры и выводит ее черными буквами на белом фоне в центр экрана.
94