Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_лаб1_2_Полн.doc
Скачиваний:
9
Добавлен:
06.05.2019
Размер:
262.66 Кб
Скачать

1. Лабораторная работа № 1

БИТОВЫЕ КАРТЫ ПАМЯТИ

    1. 1.1. Общие методические указания по выполнению лабораторной работы

Структура работы. Работа состоит из 2-х частей: подготовительной (4 часа) и основной (4 часа).

Цели работы.

Подготовительная часть:

– изучить принципы работы с логическими операциями над целыми числами (работа с данными на битовом уровне) в языке C и разработать программные функции и процедуры, реализующие различные битовые операции;

– получить навыки работы с упакованными данными.

Основная часть:

– изучить принципы работы с битовыми картами памяти;

– разработать приложение, моделирующее работу менеджера памяти на основе битовой карты;

– разработать интерфейс для данного приложения.

Среда выполнения:

Подготовительная часть Borland С++ или и в MS Visual Studio (консольное приложение).

Основная часть: MS Visual Studio.

Перед выполнением работы необходимо повторить:

– двоичную и шестнадцатеричную системы счисления;

– представление целых чисел без знака в памяти компьютера (8-битовых, 16-битовых, 32-битовых) и соответствующие типы языка С++ (short, int, unsigned short и т.д.);

– синтаксис задания шестнадцатеричных констант в языке С++;

– операции сдвигов (<<, >>);

– логические операции (~, &, |) над целыми;

– написание процедур и функций;

– правила оформления модулей.

    1. 1.2. Теоретические сведения

    2. 1.2.1. Работа с данными на битовом уровне

Обычно при программировании на языке высокого уровня минимальным размером данных является байт. Однако операционной системе часто приходится работать «на битовом уровне». Так, например, в регистре устройства каждый бит может иметь самостоятельное значение (чтение - запись, готов - не готов и т.д.).

Чтобы работать на битовом уровне, надо уметь устанавливать (в 1), сбрасывать (в 0) и определять значение отдельного бита целочисленной переменной, не меняя при этом остальных битов.

Биты в числе принято номеровать справа налево, начиная с 0.

Для установки в 1 отдельного бита целочисленной переменной необходимо выполнить операцию ИЛИ (OR, на языке C - |) со специально подобранным целым, которое принято называть маской. Для установки бита номер n в маске в соответствующей позиции должна стоять 1, а все остальные биты должны быть 0.

Пусть, например, необходимо установить в 1 5-ый бит целочисленной байтовой переменной x. В качестве маски нам потребуется комбинация битов 00100000, что на языке C можно записать с помощью шестнадцатеричной константы 0х20. Имеем:

x |= 0x20;

Сброс бита выполняется операцией И (AND, на языке C - &) с маской, в которой все 1, кроме одного 0, находящегося в соответствующей позиции (11011111):

x &= 0xDF;

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

y = x;

y & = 0x20;

if (y > 0) cout << 1 else cout << 0;

Для определения значения бита можно также использовать операции сдвига:

i << j – сдвиг содержимого i на j разрядов влево; освободившиеся младшие разряды заполняются нулями;

i >> j – сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями.

y = x;

y <<=2 >>=7; // уничтожение всех битов, кроме

нужного

if (y > 0) cout << 1 else cout << 0;

Здесь важно, чтобы переменная y была объявлена как беззнаковая. Иначе при сдвиге вправо освобождающиеся биты будут заполняться не нулями, а единицами.