В то время как регистры сегментов используются для получения доступа к большим разделам (по 64 К) памяти, последняя группа регистров используется для оказания помощи в отыскании пути к определенным байтам в памяти. Они применяются совместно с регистром сегмента для указания на точное место в памяти. Имеется пять таких регистров, каждый из которых используется для конкретной цели. Указатель команды (инструкции) IP, который называют также программным счетчиком, РС, сообщает микропроцессору только о месте, где выполняется программа. Указатель стека, SР, и указатель базы, BP, используются для оказания помощи в отслеживании выполняющейся работы. Индекс источника, SI, и индекс местоназначения (выхода) DI, используются для оказания помощи программам в перемещении больших объемов данных из одного места в другое.

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

Микропроцессоры РС в основном управляются посредством последовательности 1-битовых флагов, каждый из которых отмечает или устанавливает определенное состояние в компьютере. Флаги действуют независимо друг от друга, однако, для удобства, они собраны вместе в регистр флагов.

Отдельные флаги могут проверяться и устанавливаться посредством специальных команд, а вся группа флагов может считываться или устанавливаться посредством пары команд, которые считывают или устанавливают весь регистр флагов. Всего имеется девять стандартных флагов. Шесть из них используются для индикации результатов арифметических и подобных им операций: флаг нуля – ZF – указывает на нулевой результат (или равенство при сравнении), флаг знака – SF – указывает на отрицательный результат, флаг переноса – CF – означает перенос в следующую позицию, флаг дополнительного переноса – AF – указывает  на перенос из первых четырех битов (что требуется для моделирования десятичных операций), флаг переполнения – OF – отмечает получение слишком большого результата и, наконец, флаг четности – PF – отмечает четность или нечетность результата.

НЕ нашли? Не то? Что вы ищете?

Три оставшихся флага используются для управления. Флаг направления, DF, управляет направлением повторения операций (например, при побайтовом перемещении данных): справа налево или наоборот. Флаг прерываний, IF, контролирует возможность прерываний: разрешены они или временно запрещены. Флаг захвата, TF, вызывает генерацию компьютером специального прерывания "захвата" после выполнения одной команды. Это делает возможным пошаговое выполнение программы с трассировкой результатов каждой отдельной команды.

Задание на выполнение:

Рассмотреть на примере любой программы работу турбо-отладчика.

Вопросы к отчету по лабораторной работе 1:

Особенности турбо-отладчика. Команда CPU и ее подокна. С помощью какой клавиши выполняется трассировка программы. Какая команда позволяет вернуться назад по коду отлаживаемой программы и в каких случаях возврат невозможен. Для чего используется команда Unit return Регистры и флаги.

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

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

(2 часа)

Язык С поддерживает доступ к внутренним регистрам микропроцессора (МП) через псевдопеременные, ссылка на которые в С-программе компилируется в ссылку на внутренний регистр МП. Перечислим имена псевдопеременных:

_AX; _AL; _AH;

_BX; _BL; _BH;

_CX; _CL; _CH;

_DX; _DL; _DH;

_SI; _DI; _BP; _SP;

_CS; _ES; _DS; _SS.

Пример: Чтобы узнать текущее значение сегментных регистров, в программу помещается следующий код:

...

unsigned cur_code_seg, cur_data_seg, cur_stack_seg, cur_es_seg;

cur_code_seg = _CS;

cur_data_seg = _DS;

cur_stack_seg = _SS;

cur_es_seg = _ES;

...

Псевдопеременная может также использоваться в левой части оператора присваивания. Но необходимо помнить, что:

Невозможно непосредственно присвоить значение регистрам CS, IP; Изменение значений сегментных регистров DS, SS, ES приводит к непредсказуемым последствиям для программы и требует особой осторожности; Установленные в регистры значения могут быть неявно переопределены последующими операторами программы и к моменту использования в других выражениях будут содержать не ранее присвоенное, а случайное значение; При использовании псевдопеременных следует отключить использование регистровых переменных и регистровой оптимизации в опциях компилятора.

Пример:

Вывод символа на экран с помощью псевдопеременных:

#include<dos. h>

void main(){

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

_AH=0x0e;

_AL='N';

/*вызывает 10-е прерывание*/

geninterrupt(0x10);

}

Функция void geninterrupt(int intr_num) выполняет обращение к обработчику прерывания с номером intr_num. Для задания необходимых значений регистрам и получения значений из обработчика следует использовать псевдопеременные. Достоинством функции является минимальный размер и максимально возможная производительность кода при выполнении прерывания.

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

Задание:

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

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

Тема: «Работа с функциями 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

тип

Формат

Цвета

Адаптер

Адрес

0

Текст

40х25

16/8 полутона

CGA, EGA

B800

1

Текст

40х25

16/8

CGA, EGA

B800

2

Текст

80х25

16/8 полутона

CGA, EGA

B800

3

Текст

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);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5