- •1. Лабораторная работа № 1
- •1.1. Общие методические указания по выполнению лабораторной работы
- •1.2. Теоретические сведения
- •1.2.1. Работа с данными на битовом уровне
- •1.2.2. Упакованные данные
- •1.2.3.Разработка менеджера памяти на основе битовой карты
- •1.3.Задание на лабораторную работу
- •1.4. Отчет по лабораторной работе
- •2. Лабораторная работа №2
- •2.1. Общие методические указания по выполнению лабораторной работы
- •2.2. Теоретические сведения
- •2.2.1. Определение данных
- •2.2.2. Команды пересылки
- •2.2.3. Арифметические операции
- •2.3. Примеры программ на ассемблере
- •2.4. Порядок выполнения работы
- •2.5. Задание на лабораторную работу
- •2.6. Отчет по лабораторной работе
1. Лабораторная работа № 1
БИТОВЫЕ КАРТЫ ПАМЯТИ
1.1. Общие методические указания по выполнению лабораторной работы
Структура работы. Работа состоит из 2-х частей: подготовительной (4 часа) и основной (4 часа).
Цели работы.
Подготовительная часть:
– изучить принципы работы с логическими операциями над целыми числами (работа с данными на битовом уровне) в языке C и разработать программные функции и процедуры, реализующие различные битовые операции;
– получить навыки работы с упакованными данными.
Основная часть:
– изучить принципы работы с битовыми картами памяти;
– разработать приложение, моделирующее работу менеджера памяти на основе битовой карты;
– разработать интерфейс для данного приложения.
Среда выполнения:
Подготовительная часть Borland С++ или и в MS Visual Studio (консольное приложение).
Основная часть: MS Visual Studio.
Перед выполнением работы необходимо повторить:
– двоичную и шестнадцатеричную системы счисления;
– представление целых чисел без знака в памяти компьютера (8-битовых, 16-битовых, 32-битовых) и соответствующие типы языка С++ (short, int, unsigned short и т.д.);
– синтаксис задания шестнадцатеричных констант в языке С++;
– операции сдвигов (<<, >>);
– логические операции (~, &, |) над целыми;
– написание процедур и функций;
– правила оформления модулей.
1.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 была объявлена как беззнаковая. Иначе при сдвиге вправо освобождающиеся биты будут заполняться не нулями, а единицами.