90917

Программные прерывания. Интерфейс с базовой системой ввода-вывода

Лабораторная работа

Информатика, кибернетика и программирование

Ознакомиться с технологией программирования на языке Ассемблера синхронных прерываний. Изучить функциональные возможности базовой системой ввода-вывода и принципы взаимодействия с ней на примере векторов прерываний 10h и 16h.

Русский

2015-07-10

124 KB

2 чел.

Лабораторная работа № 3

Программные прерывания. Интерфейс с базовой системой ввода-вывода

3.1. Цель работы

Ознакомиться с технологией программирования на языке Ассемблера синхронных прерываний. Изучить функциональные возможности базовой системой ввода-вывода и принципы взаимодействия с ней на примере векторов прерываний 10h и 16h.

3.2. Краткие теоретические сведения

Прерывание (англ. Interrupt) – это специальный сигнал центральному процессору о наступлении какого-либо события и о необходимости его обработать, прервав выполнение основной программы.

По отношению к источнику возникновения различают прерывания асинхронные (аппаратные) и синхронные (программные).

Асинхронное прерывание – это сигнал процессору от периферийного устройства компьютера, поступающий в произвольный момент времени. Обработчики аппаратных прерываний реализуются, как правило, в драйверах периферийных устройств;

Синхронное прерывание – это сигнал, возникающий непосредственно в самом процессоре при выполнении им какой-либо программы. Причем, этот сигнал может быть как реакцией самого процессора на исключительную ситуацию, возникшую при выполнении программы (например, деление на ноль, переполнение и т.п.), так и специально организованным в программе вызовом обработчика прерываний с помощью команды INT. Обработчики синхронных прерываний реализуются, как правило, в виде микропрограмм или отдельно загружаемых в оперативную память библиотек.

В компьютерах на базе процессорной архитектуры х86 адреса обработчиков должны быть указаны в таблице векторов прерываний (англ. Interrupt Descriptor Table, IDT). Вектор – это подпрограмма или набор подпрограмм, выполняющий определенные операции при обработке прерывания. В IDT прописаны адреса загруженных в память обработчиков программных и аппаратных прерываний. Базовая система ввода-вывода и операционная система имеют возможность использовать информацию из IDT для организации вызова необходимого обработчика при возникновении прерывания. Кроме этого, установленная на компьютере операционная система имеет возможность при необходимости менять в IDT адреса стандартных обработчиков на адреса нестандартных. В микропроцессоре Intel 8086 таблица векторов расположена в первом килобайте оперативной памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение.

Базовая система ввода-вывода (англ. Basic Input/Output System, BIOS) – это часть системного программного обеспечения компьютера, организующее интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования. Основное предназначение BIOS – корректно инициализировать оборудование при включении компьютера и передать управление загрузчику операционной системы. Помимо этого, BIOS позволяет пользователю изменить некоторые настройки периферийных устройств и компьютерной системы в целом.

В базовой системе ввода-вывода компьютеров на базе процессорной архитектуры х86 реализованы векторы прерываний 10h и 16h, организующие операции ввод-вывода с монитором и клавиатурой соответственно. Для инициализации вызова функций данных векторов в ассемблерной программе используется команда INT. При этом номер необходимой функции (номер подпрограммы) задается в регистре АН, а необходимые для функции входные параметры в регистрах ВХ, СХ, DX. Все функции сохраняют регистры, кроме SI,  DI и регистров, используемых для передачи параметров. Основные функции вектора 10h приведены в таблице 3.1, а функции вектора 16h в таблице 3.2.

Таблица 3.1. Основные функции вектора 10h для работы с дисплеем

Номер функции

Назначение функции

Параметры

2

Позиционирование курсора на экране в заданной позиции

Входные параметры:

АН = 2 (номер функции)

ВН = 0 (номер страницы)

DH = номер строки (0...24)

DL = номер столбца (0...79)

Выходные параметры: нет

3

Чтение текущей позиции курсора

Входные параметры:     

АН = 3

ВН = 0

Выходные параметры:    

DH = номер строки

DL = номер столбца

8

Чтение с экрана символа и его атрибутов из текущей позиции курсора

Входные параметры:  

АН = 8

ВН = 0

Выходные параметры:   

AL = код символа

АН = атрибут символа*

9

Вывод символа с заданными атрибутами в текущей позиции курсора

Входные параметры:   

АН = 9

ВН = 0

BL = атрибут символа*

AL = код символа

СХ = счетчик символов (количество)

Выходные параметры: нет

10

Вывод символа в текущей позиции курсора со старыми атрибутами

Входные параметры:   АН = 10

ВН = 0

AL = код символа

СХ = счетчик (количество символов)

Выходные параметры: нет

14

Вывод символа и перемещение курсора в следующую позицию («Телетайп»)

Входные параметры:   АН = 14

ВН =0

AL = код символа

BL = атрибут символа*

Выходные параметры: нет

*Байт атрибута символа имеет следующую структуру:

   биты 0-3 – цвет  символа (0-Fh),

   биты 4-6 – цвет  фона (0-7h),

   бит 7 – признак мигания (0/1)

Таблица 3.2. Основные функции вектора 16h для работы с клавиатурой

Номер функции

Назначение функции

Параметры

0

Чтение символа из буфера и ожидание следующей нажатой клавиши

Входные параметры:

АН = 0 (номер функции)

Выходные параметры:

AL = ASCII символ (если AL=0, AH содержит расширенный код ASCII)

AH = сканкод  или расширенный код ASCII

1

Проверка состояния буфера клавиатуры

Входные параметры:     

АН = 1

Выходные параметры:    

ZF = 1 – если буфер пуст.

ZF = 0 – если буфер не пуст.

AX = как для функции 0 (но символ здесь не

удаляется из очереди).

2

Определение состояния специальных клавиш (определяет какие shift-клавиши нажаты в данный момент, находится ли клавиатура в состоянии NumLock, и т.п.)

Входные параметры:  

АН = 2

Выходные параметры:   

AL = статус клавиатуры (необходимо смотреть флаги клавиатуры)

3.3. Методические указания

В лабораторной работе требуется написать ассемблерную процедуру, вызываемую  из СИ-программы и выполняющую взаимодействие с дисплеем с помощью функций вектора прерываний 10h или взаимодействие с клавиатурой с помощью функций вектора прерываний 16h. Ввод исходных данных и вывод результатов необходимо реализовать в СИ-программы.

Программные модули на Си и Ассемблере рекомендуется написать и отладить в компиляторе QC, т. к. в нем проверена корректная работа эмулятора векторов 10h и 16h. В заданиях подразумевается использование текстового режима работы монитора 25х80.

Обратите внимание, что при пошаговой отладке написанной программы возможно её некорректное поведение, поскольку содержимое экрана может изменяться после каждого шага.  В связи с этим, окончательную проверку работоспособности программы на тестовых примерах следует проводить в режиме её обычного запуска из компилятора QC командой меню «Run».

Если вариант вашего задания ориентирован на считывание символа или строки, необходимо до вызова ассемблерной процедуры предусмотреть в СИ-программе заполнение экрана произвольной информацией (например, вывод 25 раза строки текста длиной 80 символов).

Для возможности совместной работы программных модулей на Си и на Ассемблере они должны быть включены в файл совместного проекта (см. методические указания (п. 2.3) лабораторной работы № 2).

В некоторых вариантах требуется использование таблицы кодов ASCII. Внимательно смотрите на то, в какой системе счисления представлен код символа.

2.4. Порядок выполнения работы

1. Напишите программный модуль на языке Си, осуществляющий ввод исходных данных и вызов ассемблерной процедуры, выполняющий. Модуль на Си должен содержать:

  •  прототип ассемблерной процедуры;
  •  ввод исходных данных с подсказками;
  •  заполнение экрана символами (если требуется по заданию)
  •  вызов ассемблерной процедуры;
  •  вывод результатов работы ассемблерной процедуры.

2. В отдельном модуле напишите ассемблерную процедуру, использующую прерывания BIOS и выполняющую действия в соответствии с заданием варианта (таблица 3.3), выданным преподавателем.

3. Объедините модули с программами на Си и Ассемблере в один проект, выполните компиляцию и произведите отладку на не менее трёх тестовых примерах.

2.5. Задания к лабораторной работе, исходные данные

Таблица 3.3.

Вар. №

Задание

1

Написать процедуру для вывода строки текста с заданными атрибутами вертикально сверху  вниз с заданной позиции на экране.

Прототип функции: void var1(char *str, int row, int col, char *attr), где

  •  str – строка для вывода,
  •  row – номер строки,
  •  col – номер столбца,
  •  attr – массив атрибутов, размерность совпадает с str.

2

Написать процедуру для считывания с экрана строки текста, начиная с заданной позиции.

Прототип функции: void var2(char *str, int row, int col, int len), где

  •  str – строка, куда нужно поместить считанные данные,
  •  row – номер строки,
  •  col – номер столбца,
  •  len – количество считываемых символов.

3

Написать процедуру, меняющую на экране атрибуты строки символов с заданной позиции.

Прототип функции: void var3(int row, int col, int len, char *attr), где

  •  row - номер строки,
  •  col - номер столбца,
  •  len - длина строки,
  •  attr – массив атрибутов символов размерностью len.

4

Написать процедуру, которая выводит на экран с определенной позиции горизонтально слева направо строку символов с заданными атрибутами.

Прототип функции: void var4(char *str, char *attr, int row, int col), где

  •  str – строка символов для вывода,
  •  attr – массив атрибутов символов,
  •  row – номер строки,
  •  col – номер столбца.

5

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

Прототип функции: void var5(char *str, int n), где

  •  str – строка, куда нужно поместить считанные данные,
  •  n – количество символов в итоговой строке.

6

Написать процедуру, которая выводит с определенной позиции экрана горизонтально справа налево строку символов с единым для всех атрибутом.

Прототип функции: void yar6(char *str, int row, int col, char attr), где

  •  str – строка для вывода,
  •  row – номер строки,
  •  col – номер столбца,
  •  attr – атрибут символов.

7

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

Прототип функции: void var7(char *str, int row int col, int len), где

  •  str – строка, куда нужно поместить считанные данные,
  •  row – номер ряда,
  •  col – номер колонки,
  •  len – количество считываемых символов.

8

Написать процедуру для вывода на экран заданного символа с разными атрибутами сверху вниз с определенной позиции n раз.

Прототип функции: void var8(char sym, int row, int col, char *attr, int n), где

  •  sym – задаваемый символ,
  •  row – номер строки,
  •  col – номер столбца,
  •  attr – массив атрибутов символа размерностью n,
  •  n – количество повторений символа.

9

Написать процедуру для вывода цифровых символов от 1 до n с заданным атрибутом с определенной позиции экрана слева направо. Между всеми символами при выводе на экран добавлять символ пробела.

Прототип функции: void var9(int row, int col, char attr, int n), где

  •  row – номер строки,
  •  col – номер столбца,
  •  attr – атрибут символов,
  •  n – количество символов.

10

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

Прототип функции: void var10(char *str, char key), где

  •  str – строка, куда нужно поместить считанные данные,
  •  keyASCII-код клавиши, сигнализирующий о выходе из подпрограммы.

11

Написать процедуру для изменения на экране атрибутов столбца символов снизу вверх с заданной позиции.

Прототип функции: void var11(char *attr, int row, int col, int n), где

  •  attr – массив атрибутов символов,
  •  row – номер строки,
  •  col – номер столбца,
  •  n – количество символов.

12

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

Прототип функции: void var12(char attr, int col), где

  •  attr – атрибут символов,
  •  col – номер столбца.

13

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

Прототип функции: void var13(char sym, int row, int n), где

  •  sym заданный символ,
  •  row – номер строки,
  •  n – количество замен.

14

Написать процедуру, переписывающую на экране строку из n символов с одной заданной позиции на другую. Прежнее месторасположение строки заполнить символами «*».

Прототип функции: void var14(int row1, int col1, int row2, int col2, int n), где

  •  row1, col1 – исходная позиция строки (номер строки и столбца),
  •  row2, col2 – конечная позиция строки (номер строки и столбца).
  •  n – длина строки.

15

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

Прототип функции: void var15(int row, int col, char key), где

  •  row – номер строки,
  •  col – номер столбца,
  •  keyASCII-код клавиши, сигнализирующий о выходе из подпрограммы.

16

Написать процедуру, копирующую на экране заданный столбец на указанное место. При копировании изменить атрибут всех символов столбца на заданный.

Прототип функции: void var16(char attr, int col1, int col2), где

  •  attr – атрибут символа,
  •  col1 – номер столбца-источника,
  •  col2 – номер столбца-приемника.

17

Написать процедуру, заменяющую на экране каждый четный элемент заданного столбца на символ с координатами (0, 0). Количество замен определяется в исходных данных.

Прототип функции: void var17(int col, int n), где

  •  col – номер столбца,
  •  n – количество замен.

18

Написать процедуру, выводящую на экран заданную строку символов с определенной позиции по диагонали слева направо вниз. Атрибут задается один для всех элементов строки.

Прототип функции: void var18(char *str, int row, int col, char attr), где

  •  str – строка для вывода,
  •  row – номер строки,
  •  col – номер столбца,
  •  attr – атрибут символов.

19

Написать процедуру, выводящую на экран заданную строку символов с разными атрибутами по диагонали справа налево вверх.

Прототип функции: void var19(char *str, char *attr, int row, int col), где

  •  str – строка символов,
  •  attr – массив атрибутов символов,
  •  row – номер строки,
  •  col – номер столбца.

20

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

Прототип функции: void var20(char *str, int n), где

  •  str – строка, куда нужно поместить считанные данные,
  •  n – количество считываний символов из буфера клавиатуры.

21

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

Прототип функции: void var21(int row, int n), где

  •  row – номер строки,
  •  n – количество замен.

22

Написать процедуру, заменяющую в заданном столбце экрана все символы-цифры на заданный символ с заданным атрибутом.

Прототип функции: void var22(char sym, char attr, int col), где

  •  sym – задаваемый символ,
  •  attr атрибут символов,
  •  col – номер столбца.

23

Написать процедуру, заменяющую символы в заданной прямоугольной области экрана на заданный символ с заданным атрибутом.

Прототип функции: void var23(int row1, int col1, int row2, int col2, char sym, char attr), где

  •  row1, col1 – координаты верхнего левого угла прямоугольника,
  •  row2, col2 – координаты нижнего правого угла прямоугольника,
  •  sym – заданный символ,
  •  attr – атрибут символа.

24

Написать процедуру, считывающую с экрана строку символом через один с заданной позиции вертикально снизу вверх.

Прототип функции: void var24(char *str, int row int col, int len), где

  •  str – строка, куда нужно поместить считанные данные,
  •  row – номер строки,
  •  col – номер столбца,
  •  len – количество считываемых символов.

25

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

Прототип функции: void var25(char *str, char key), где

  •  str – строка, куда нужно поместить считанные данные,
  •  keyASCII-код клавиши, сигнализирующий о выходе из подпрограммы.

26

Написать процедуру, производящую печать на экране строки символов с заданной позиции одновременно слева направо и сверху вниз.

Прототип функции: void var26(char *str, int row, int col), где

  •  str – заданная строка символов,
  •  row – номер строки,
  •  col – номер столбца.

27

Написать процедуру, считывающую с экрана символы с начала заданной строки. В результирующую строку необходимо записать только цифровые символы.

Прототип функции: void var27(char *str, int row), где

  •  str – строка, куда нужно поместить считанные данные,
  •  row – номер строки.

28

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

Прототип функции: void var28(char *str, int col), где

  •  str – строка, куда нужно поместить считанные данные,
  •  col – номер столбца.

29

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

Прототип функции: void var29(char *str, int row1, int row2, int n), где

  •  str – строка, куда нужно поместить считанные данные,
  •  row1 – номер первой строки,
  •  row2 – номер второй строки,
  •  n – количество символов в итоговой строке.

30

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

Прототип функции: void var30(char *str, int n), где

  •  str – строка, куда нужно поместить считанные данные,
  •  n – количество считываний символов из буфера клавиатуры.

  1.  Содержание отчёта

  1.  Титульный лист;
  2.  Цель работы;
  3.  Задание в соответствии с вариантом;
  4.  Исходные данные и полученные результаты в виде скриншотов экрана;
  5.  Листинг конечного варианта программы с необходимыми пояснениями и комментариями;
  6.  Содержательный вывод.

  1.  Примеры контрольных вопросов

  1.  Дайте определение прерываниям и приведите классификацию;
  2.  Расскажите про последовательность действий при организации в программе синхронного прерывания по команде int;
  3.  Что собой представляет BIOS и для чего она необходима в компьютере?
  4.  Назовите 3 любых функции вектора 10h и поясните принцип их работы;
  5.  Назовите 3 любых функции вектора 16h и поясните принцип их работы;
  6.  Как в процессоре I8086 запретить обработку аппаратных прерываний? Что такое маскируемое и немаскируемое прерывание?
  7.  С помощью каких команд при прерываниях происходит сохранение и восстановление данных в стек? Для чего выполняются эти процедуры?
  8.  Какие векторы прерываний BIOS существуют помимо 10h и 16h? Назовите 3 и поясните их назначение;
  9.  Расскажите о назначении и принципах работы контроллера прерываний.
  10.  Что такое таблица векторов прерываний? Где она располагается у процессора I8086?


 

А также другие работы, которые могут Вас заинтересовать

15348. Анализ и оценка эффективности системы управления персоналом. Магазин Очень нужные товары 469 KB
  Главной целью курсовой работы является исследование системы управления персоналом, анализ и оценка ее эффективности. Ставятся следующие задачи: рассмотреть систему управления персоналом, изучить внешнюю и внутреннюю среду предприятия, проанализировать существующую систему управления персоналом...
15349. Анализ налогообложения предприятия МУЗ Городская больница 150.5 KB
  ВВЕДЕНИЕ Среди экономических рычагов при помощи которых государство воздействует на рыночную экономику важное место отводится налогам. В условиях рыночной экономики любое государство широко использует налоговую политику в качестве определенного регулятора возде...
15350. Муниципальная слуба 192 KB
  Изучить положения действующего законодательства о муниципальной службе в России. Ознакомиться с научными трудами, посвящёнными муниципальной службе. Проследить основные тенденции в развитии данного института в России. Дать оценку всей проанализированной в работе информации, сделать на её основе адекватные выводы.
15351. Анализ системы управления на предприятии ООО Конкорд 252 KB
  В этой работе представлены материалы, дающие представление и возможность для анализа системы управления организации «Конкорд». Цель работы - провести анализ существующей на предприятии системы управления, оценить её сильные и слабые стороны
15352. АНАЛИЗ ФИНАНСОВОГО СОСТОЯНИЯ ООО XYZ 1.13 MB
  Основой для проведения финансового анализа ООО XYZ стала следующая информация финансовой (бухгалтерской) отчетности...
15353. Аудит финансовых вложений 235 KB
  Содержание Введение 1. Цели и задачи аудита финансовых вложений 2. Основные законодательные и нормативные документы регулирующие объект проверки и источники информации для проверки финансовых вложений 4. План и программа аудиторской проверки учета финансовых вл...
15354. Аудиторские риски 123.5 KB
  Цель, задачи и предмет курсовой работы это - аудиторская деятельность – особая, самостоятельная форма контроля и представляет собой независимую экспертизу и анализ финансовой отчетности...
15355. Валютный контроль и нормы валютного законодательства 192 KB
  Валютный контроль: понятие цели нормативное закрепление. Проблемы валютного регулирования Виды валютного контроля Система органов валютного контроля Глава 2. Основные нормы валютного законодательс
15356. Влияние современной игрушки на развитие личности ребенка 224 KB
  Влияние современной игрушки на развитие личности ребёнка Содержание Введение 1. Возникновение и историческое развитие игрушки Игрушка элемент культуры Народная игрушка Современ...