
- •1.2. Понятие алгоритма. Словесное задание алгоритмов
- •III. Тело алгоритма.
- •1.3. Типы алгоритмов. Операция присваивания
- •1.4. Графическое задание алгоритмов. Блок-схемы. Исполнение алгоритмов
- •2. Структурное программирование. Общие сведения по алгоритмическому языку паскаль и его среде разработки
- •2.1. Предпосылки появления и основные принципы структурного программирования
- •2.2. Язык программирования Турбо Паскаль. Единая интегрированная среда разработчика Turbo Pascal 7.0 (tp 7.0), структура ее диалогового окна и основные команды
- •2.3. Компилятор языка Паскаль Free Pascal ( fpc). Среда разработки Free Pascal ide
- •3. Основные элементы языка Паскаль. Алфавит. Идентификаторы. Типы данных. Выражения. Операции. Отношения. Математические функции в языке Паскаль
- •3.1. Синтаксис и семантика в описании алгоритмического языка. Алфавит языка Турбо-Паскаль
- •3.2. Элементарные конструкции языка Паскаль
- •3.3. Общая структура типов данных. Простые типы в языке Паскаль
- •3.4. Выражения, математические, логические операции, отношения, математические функции в языке Паскаль
- •3.5. Память пк, сегментная адресация, динамическая память
- •3.6. Указатели и динамические переменные
- •3.6.1. Виды указателей и их описание
- •3.6.2. Действия с указателями
- •3.6.3. Выделение и освобождение динамической памяти
3.5. Память пк, сегментная адресация, динамическая память
В современных языках программирования, а также вычислительных системах в качестве минимальной адресуемой единицы памяти (ячейки) принят 1 байт (8 бит). Каждая ячейка памяти должна иметь свой уникальный адрес, который используется для работы с ней. Адреса - это целые числа, представленные в компьютере в двоичной системе. Они начинаются с нуля для первой ячейки и возрастают для каждой последующей ячейки на 1. Максимально возможный адрес зависит от того, сколько бит (двоичных разрядов) отведено в компьютере под его запись. В случае, если двоичная длина адресов в компьютере составляет N бит, на них можно записать 2N различных адресов (от 0 до 2N-1). Поскольку адреса являются целыми числами, компьютер может использовать для работы с ними обычные арифметические операции.
Очевидно, для расширения возможностей работы ПК желательно иметь потенциальную возможность работы с большими объемами памяти. Из-за того, что двоичная длина адреса N в компьютере фиксирована, а для работы с адресами используются процессоры другой разрядности, то для задания адресов используют специальные приемы.
IBM/PC использует для адресации памяти возможности микропроцессора 8086, в котором адреса имеют длину N=20 бит, следовательно, процессор позволяет адресовать участок памяти размером 220 байт = 1024 К = 1 Мбайт. Его называют стандартной памятью ПК (у компьютеров с процессорами 80386 и выше адресное пространство составляет 4 Гбайт, однако в Паскале нет средств для поддержания работы с такой расширенной памятью). Поскольку основная часть арифметических операций микропроцессора 8086 рассчитана на действия с 16-разрядными числами, то для работы с 20-разрядными адресами использован принцип сегментированной адресации. В соответствии с этим принципом память для программы делится на непрерывные области памяти, называемые сегментами. Это участки памяти объемом 216 байт = 64 К, в котором байтовые ячейки имеют адреса от 0 до 216-1=65.535. Их называют относительной частью адреса или смещением (offset).
МП 8086 позволяет программе одновременно работать с четырьмя различными сегментами:
1) кодовым (содержит машинные команды программы),
2) данных (хранится информация),
3) стека,
4) вспомогательный, используемый для хранения вспомогательных данных, который также называют динамической памятью.
Для работы с данными 4 сегментами МП 8086 имеет четыре 16-битовых сегментных регистра (один на каждый сегмент) с именами CS, DS, SS и ES.
Полный адрес в МП 8086 состоит из двух 16-битовых значений: адреса сегмента и смещения. Допустим, адрес сегмента данных (содержимое регистра DS) равен 2F84 (в шестнадцатеричной системе счисления), а смещение равно 0532. Необходимо найти фактический адрес. Вычисление его выполняется следующим образом: значение сегментного регистра сдвигается влево на 4 бита (что эквивалентно умножению числа на 10002 или 1016), а затем оно складывается с величиной смещения. Полученное 20-битовое значение и есть фактический адрес данных:
регистр DS (после сдвига): 0010 1111 1000 0100 0000 = 2F840
смещение: 0000 0101 0011 0010 = 00532
-------------------------- --------------------------------
Адрес: 0010 1111 1101 0111 0010 = 2FD72
Участок памяти величиной 16 байт называется параграфом, поэтому говорят, что сегмент всегда начинается на границе параграфа, поэтому можно сказать, что сегмент адресует память с точностью до параграфа, а смещение -- с точностью до байта. Каждому сегменту соответствует непрерывная и отдельно адресуемая область памяти. Стандартная запись адреса имеет форму сегмент:смещение; например, в рассмотренном примере адрес можно записать как 2F84:0532. Сегментную разбивку адресного пространства задачи может производить как программист, так и среда программирования. Размещением сегментов в оперативной памяти управляет операционная система.
Динамическая память в Паскале рассматривается как сплошной массив байтов, который называется кучей (англ. - хип). Физически хип располагается в старших адресах памяти сразу за областью памяти, которую занимает тело программы. Динамические переменные создаются в хипе во время выполнения программы. С помощью этих переменных можно обрабатывать данные, объем которых до начала выполнения программы заранее не известен. Память под них выделяется блоками, которые связываются друг с другом. Такой способ хранения данных называется динамическими структурами.
Обращение к динамическим данным осуществляется через указатели. Это переменные специального вида, предназначенные для хранения адресов областей памяти. В указателе можно хранить адрес данных или программного кода. Указатель, как любой адрес байта памяти, по своей внутренней структуре представляет собой совокупность двух слов (данных типа word), трактуемых как сегмент и смещение.
Вопросы для проверки знаний.
1. Какова минимальной адресуемой единицы памяти в современных языках программирования, а также вычислительных системах ?
2. Сколько ячеек памяти можно адресовать при помощи 8-битных адресов ?
3. Что называют стандартной памятью ПК ?
4. В чем заключается принцип сегментированной адресации ?
5. Что называют сегментами и смещением адреса ?
6. С какими сегментами одновременно может работать программа в МП 8086 и какие сегментных регистра используются для адресации в них ?
7. Какие исходные данные задают полный адрес в МП 8086 и как он вычисляется ?
8. Что такое динамическая память ?
9. Каким образом происходит обращение к динамическим данным ?