
- •В.А. Афанасьев
- •Часть 1 Лабораторный практикум
- •Предисловие
- •1. Краткая характеристика операционной среды ms-dos в компьютерах с операционной системой Windows
- •2. Составные части ms-dos и её инициализация
- •3. Взаимодействие Ассемблерной программы с ms-dos и аппаратными средствами Компьютера
- •4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде ms-dos
- •Распределение первого мегабайта памяти компьютера
- •Содержание некоторых полей области данных bios
- •5. Программная модель 32-разрядных процессоров i80x86
- •Назначения сегментных регистров
- •6.2.2. Путь выполнения команды
- •6.2.3. Трансляция программы. Опции командной строки
- •6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •Сегменты упрощенной модели памяти Small
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •6.2.5. Работа с отладчиком Turbo Debugger (td)
- •6.2.6. Форматы машинных команд и их кодирование
- •Определение эффективного адреса
- •Косвенные виды адресации
- •6.2.6.2. Использование 32-битных регистров
- •6.2.7. Работа над синтаксическими ошибками при ассемблировании программы
- •6.3. Задание к работе. Порядок выполнения
- •6.4. Контрольные вопросы
- •Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
- •Машинные коды команд базового процессора i8086
- •П.1.2. Демонстрационные файлы
- •П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
- •А) Листинг prog_com. Lst
- •Содержимое префикса программы psp
- •А) Листинг prog_exe.Lst
- •Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
- •Формат заголовка исполняемого .Exe – файла на диске
- •7.2.2. Ввод с клавиатуры символьной информации
- •7.2.2.1. Буфер ввода данных с клавиатуры
- •7.2.2.2. Системные функции dos ввода данных с клавиатуры
- •Сравнительная характеристика функций dos ввода с клавиатуры
- •7.2.3. Функции dos вывода данных на экран
- •7.2.4. Расширенные коды ascii и управление программой с клавиатуры
- •Расширенные коды для функциональных клавиш
- •7.2.5. Строковые команды. Общая характеристика
- •Команды обработки строк
- •7.3. Задания к работе. Подготовка и выполнение
- •7.4. Контрольные вопросы
- •Приложения к лабораторной работе № 2 Приложение п.2.1. Примеры реализаций типового задания
- •Приложение п.2.2. Esc-последовательности
- •Параметры Esc-последовательности
- •Приложение п.2.3. Таблица символов в кодировке ascii
- •8.2.2. Прямое программирование видеобуфера в текстовом режиме
- •8.2.3. Справочные данные по функциям bios
- •8.2.3.1. Прерывание int 10h. Видеофункции bios
- •Текстовые видеорежимы и страницы в стандарте vga, поддерживаемые современными видеоконтроллерами
- •8.2.3.2. Рекомендации по использованию видеосервиса bios
- •8.2.3.3. Прерывание int 16h
- •8.2.3.4. Задержка программных операций
- •Int 15h, функция 86h
- •8.3. Варианты индивидуального задания
- •8.4. Контрольные вопросы
- •Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры
- •П.3.2. Листинг 3.5. Демонстрационная программа использования функций bios для работы с экраном и клавиатурой
- •9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •Представление чисел в 16- разрядном компьютере
- •9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •9.2.4. Задание к работе. Порядок выполнения
- •Варианты заданий 1-7
- •Варианты заданий 8-14
- •9.2.5. Вопросы построения многомодульных программ
- •9.2.6. Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •9.3. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
8.2.3.4. Задержка программных операций
Программные задержки используются в тех случаях, когда в какой-либо точке программы надо приостановить её выполнение на некоторое время. По виду исполнения программные задержки делятся на два типа: задержки, реализуемые на основе выполнения программой "пустых" вложенных циклов, и задержки, реализуемые на основе системного таймера компьютера. В листинге 3.2 приведён пример реализации задержки первого типа.
Листинг 3.2. Программная задержка на основе выполнения вложенных циклов с командой Loop.
Proc delay ;Подпрограмма задержки
Mov cx, N ;N – счётчик внешнего цикла
Outer: push cx ;Сохраним содержание счётчик внешнего цикла
Mov cx,0 ;Обеспечим максимальное число повторений (64К раз)
;внутреннего цикла
Inner: loop Inner ;Внутренний цикл
Pop cx ;Восстановим содержание счётчик внешнего цикла
Loop Outer ;Повторим вешний цикл N раз
Endp delay
В листинге 3.2 параметр N выполняет роль масштабного множителя времени задержки
tзад = N*t исполнения внутреннего цикла.
При этом наименьшей единицей времени (т.е. "тиком") является время выполнения внутреннего цикла, состоящего, в свою очередь, из времени исполнения 65535 раз команды Loop. Параметр N подбирается экспериментально для получения tзад (в мсек или сек) с учётом быстродействия конкретного компьютера.
Из рассмотрения данного примера очевидны недостатки данного подхода, когда требуется обеспечить выполнение временной задержки в программе, независимо от типа используемого компьютера. Поэтому разумно определять время программной задержки непосредственно по таймеру. Выходные сигналы таймера с частотой 18,2 раза в секунду не зависят от производительности компьютера и играют роль счетчика суточного времени. Реализация данного способа использует функцию 00h прерывания BIOS Int 1Ah.
Int 1Аh, функция 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
Листинг 3.3. B данном примере установлена задержка на 5 секунд, что соответствует 91 отсчету таймера
..........
mov ah,0 ;Функция "чтения" циклов таймера
int 1Ah ;Получаем значение счетчика циклов в cx:dx
add dx,91 ;Добавляем 5 сек. к младшему слову в dx
mov bx,dx ;Запоминаем требуемое значение в bx и выполняем
;постоянную проверку значений счетчика времени суток
repeat: int 1Ah ;Вновь получаем значение счетчика
cmp dx,bx ;Сравниваем с искомым
jne repeat ;Если не равно, то повторяем снова,
;иначе задержка окончена
Если требуется введение задержки с высокой точностью, то необходимо использовать функцию 86h прерывания BIOS Int 15h. Она позволяет определить время задержки в микросекундах. Во время выполнения задержки разрешены прерывания. Управление программе возвращается после истечения заданного времени.