Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. A) дохода лица, работающего по найму и b) дохода самозанятого лица.
  2. III. Работа над темой
  3. Quot;Бедные и средний класс работают ради денег". "Богатые заставляют деньги работать на себя".
  4. Quot;РАБОТА" ЛЮБВИ
  5. V. Самостоятельная работа студентов.
  6. V.Игра «Мы работаем на фабрике».
  7. VIII. Самостоятельная работа студентов

Тема: «Работа с функциями BIOS.
Доступ к регистрам через функции и структуры»

(2 часа)

Доступ к регистрам может осуществляться не только через псевдопеременные, но и через функции и структуры. И одной из таких функций является int86(int intno, union REGS *inregs, union REGS *outregs). Данная функция загружает внутренние регистры МП значениями, записанными в объединении по шаблону union REGS, на начало которого указывает inregs (в примере первый &rr –является указателем состояния на входные регистры), и выполняет прерывание с номером intno. Значения внутренних регистров на выходе из прерывания записываются в объединении по шаблону union REGS, на начало которого указывает outregs (второй &rr – указатель состояния выходных регистров). Описание объединений выполняет точка вызова функции. Шаблон union REGS описан в заголовочном файле <dos.h> и представляет собой объединение двух структур:

struct WORDREGS{

unsigned int ax,bx, cx, dx, si, di, cflag,flags;

};

struct BYTEREGS{

unsigned char al,ah,bl,bh,cl,ch,dl,dh;

};

union REGS{

struct WORDREGS x;

struct BYTEREGS h;

};

Структура WORDREGS используется для доступа к регистрам как двух – байтовым единицам. Структура BYTEREGS позволяет осуществлять доступ к отдельным байтам регистров общего назначения (РОН). Поле структуры flags позволяет перед вызовом задать значение регистра флагов и после вызова прочесть его. Так как многие функции MS-DOS используют флаг переноса для сигнализации об ошибках в программе-обработчике прерывания, в структуре WORDREGS специально выделено поле cflag для значения флага переноса. Функция int86() возвращает значение регистра AX.

Недостатком функции является возможность доступа к ограниченному числу регистров (т.е. не использует сегментные регистры).

Для получения значения сегментного регистра используется библиотечная функция segread() файла <Dos.h>.

Пример: Вывод символа на экран с помощью функций и структур:

#include<dos.h>

void main(){

union REGS rr; /*структура описывает регистры общего назначения*/

/*используется 10-е прерывание и выводится символ на активную видео-страницу*/

rr.h.ah=0x0e;

rr.h.al='K';

int86(0x10,&rr,&rr);

}

BIOS имеет ряд средств для определения и настройки параметров видеосистемы. В основном эти услуги выполняют функции прерываний 10h и 15h, а также использование областей данных BIOS.

Использование областей данных BIOS – наиболее быстрый способ для определения текущего режима работы видеоадаптера, номера активной страницы, числа столбцов текста, текущей позиции курсора. Воздействие на область данных BIOS позволяет изменять позицию курсора на любой из страниц.

Для проверки наличия адаптера EGA или VGA запрашивается функция BIOS, поддерживаемая только конфигурациями компьютера с таким адаптером. Например, функция AH=0Fh прерывания 10h BIOS – позволяет читать текущий видеорежим. Тогда выходной информацией является:

AL = текущий режим;

AH = число текстовых колонок на экране;

BH = текущий номер активной страницы дисплея.

Установка видео режима осуществляется с помощью функции AH=00h прерывания 10h BIOS:

Вход: AL = режим

AL тип Формат Цвета Адаптер Адрес
  Текст 40х25 16/8 полутона CGA,EGA B800
  Текст 40х25 16/8 CGA,EGA B800
  Текст 80х25 16/8 полутона CGA,EGA B800
  Текст 80х25 16/8 CGA,EGA B800

Пример a) Считываем текущий видеорежим и выводим его значение на экран:

#include<stdio.h>

#include<dos.h>

void main(){

union REGS rr;/*структура описывает регистры общего назначения*/

/*используется 10-е прерывание и читаем текущий видео режим*/

rr.h.ah=0x0f;

int86(0x10,&rr,&rr);

printf("текущий режим=%d,число текстовых колонок=%d",

rr.h.al, rr.h.ah);

}

Пример b) Установим нулевой видеорежим, а затем вернем 3 видеорежим

#include<stdio.h>

#include<dos.h>

#include<conio.h>

void main(){

union REGS rr;/*структура описывает регистры общего назначения*/

/*используется 10-е прерывание и устанавливает нулевой видео режим 40х25*/

rr.h.ah=0x00;

rr.h.al=0x00;

int86(0x10,&rr,&rr);

/*используется 10-е прерывание и читаем текущий видео режим*/

rr.h.ah=0x0f;

int86(0x10,&rr,&rr);

printf("текущий режим=%d,число текстовых колонок %d",

rr.h.al, rr.h.ah);

getch();

/*используется 10-е прерывание и устанавливает нулевой видео режим 80х25*/

rr.h.ah=0x00;

rr.h.al=0x03;

int86(0x10,&rr,&rr);

/*используется 10-е прерывание и читаем текущий видео режим*/

rr.h.ah=0x0f;

int86(0x10,&rr,&rr);

printf("текущий режим=%d,число текстовых колонок %d",

rr.h.al, rr.h.ah);

getch();

}

Задание:

1. Написать программу, используя доступ через функции и структуры. В программе необходимо реализовать функцию AH=01h (0x01) прерывания 10h BIOS, чтобы установить размер/форму курсора (текст), причем если курсор виден, то он мерцает. Для этого в качестве входа используются регистры CH и CL, где

CH = начальная строка (значения от 0 до 1Fh; 20h=подавить курсор)

CL = конечная строка (0-1Fh)

2. Написать программу, использующую функцию AH=00h прерывания 10h BIOS, которая устанавливает 2 видео-режим (AL=2), показывает результат установки на экране монитора, затем переустанавливает в 1 видео-режим (AL=1) и выводит результат на экран и по окончанию программы возвращает 3 видео-режим (AL=3).


Дата добавления: 2015-07-11; просмотров: 104 | Нарушение авторских прав


Читайте в этой же книге: Лабораторная работа №1 | Лабораторная работа №7 | Задание на выполнение | Лабораторная работа №8 | Лабораторная работа №9 |
<== предыдущая страница | следующая страница ==>
Лабораторная работа №2| Лабораторная работа №6

mybiblioteka.su - 2015-2024 год. (0.009 сек.)