- •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 часа).
Цели работы.
Подготовительная часть:
– изучить принципы работы с логическими операциями над целыми числами (работа с данными на битовом уровне) в языке Паскаль и разработать программные функции и процедуры, реализующие различные битовые операции;
– получить навыки работы с упакованными данными.
Основная часть:
– изучить принципы работы с битовыми картами памяти;
– разработать приложение, моделирующее работу менеджера памяти на основе битовой карты;
– разработать интерфейс для данного приложения.
Среда выполнения:
Подготовительная часть: Borland Pascal или Delphi (консольное приложение).
Основная часть: Delphi.
Перед выполнением работы необходимо повторить:
– двоичную и шестнадцатеричную системы счисления;
– представление целых чисел без знака в памяти компьютера (8-битовых, 16-битовых, 32-битовых) и соответствующие типы языка Паскаль (byte, word, longint);
– синтаксис задания шестнадцатеричных констант в языке Паскаль;
– операции сдвигов (shl, shr);
– логические операции (not, and, or, xor) над целыми данными;
– написание процедур и функций;
– правила оформления модулей.
1.2. Теоретические сведения
1.2.1. Работа с данными на битовом уровне
Обычно при программировании на языке высокого уровня минимальным размером данных является байт. Однако операционной системе часто приходится работать «на битовом уровне». Так, например, в регистре устройства каждый бит может иметь самостоятельное значение (чтение - запись, готов - не готов и т.д).
Чтобы работать на битовом уровне, надо уметь устанавливать (в 1), сбрасывать (в 0) и определять значение отдельного бита целочисленной переменной, не меняя при этом остальных битов.
Биты в числе принято номеровать справа налево, начиная с 0.
Для установки в 1 отдельного бита целочисленной переменной необходимо выполнить операцию ИЛИ (OR) со специально подобранным целым, которое принято называть маской. Для установки бита номер n в маске в соответствующей позиции должна стоять 1, а все остальные биты должны быть 0.
Пусть, например, необходимо установить в 1 5-ый бит целочисленной байтовой переменной x. В качестве маски нам потребуется комбинация битов 00100000, что на языке Паскаль можно записать с помощью шестнадцатеричной константы $20. Имеем:
X := X OR $20;
Сброс бита выполняется операцией И (AND) с маской, в которой все 1, кроме одного 0, находящегося в соответствующей позиции (11011111):
X := X AND $DF;
Для определения значения бита сначала следует скопировать число во временную переменную (чтобы не испортить основное значение), затем сбросить (обнулить) все биты, кроме нужного, т.е. выполнить И с маской, состоящей из нулей и единственной 1 в нужной позиции. Если в результате получится 0 – значит, в исходной переменной был 0. Иначе – 1.
y := x;
y := y AND $20;
if (y > 0) then writeln(1) else writeln( 0);
Для определения значения бита можно также использовать операции сдвига:
i shl j – сдвиг содержимого i на j разрядов влево; освободившиеся младшие разряды заполняются нулями;
i shr j – сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями.
y := x;
y shl 2 shr 7; {«уничтожили» все биты, кроме интересующего нас – в данном случае это 5-й бит}
if (y > 0) then writeln(1) else writeln( 0);