Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_СП_2004_1_00.doc
Скачиваний:
69
Добавлен:
04.11.2018
Размер:
882.69 Кб
Скачать

5. Модели памяти, поддерживаемые компилятором ibm c/2

Сегментная организация доступа к оперативной памяти ЭВМ, характерная для микропроцессоров Intel 8086/80286 и тесно связанная с особенностями их внутренней архитектуры, требует специального рассмотрения вопроса о размещении программного кода и данных в процессе работы программы. Этот вопрос имеет важное значение с точки зрения формирования исполнительных адресов при обращении к памяти и его изучение необходимо для полного понимания аппарата работы с указателями и механизма передачи параметров между отдельными функциями. Всякая программа на языке Си после ее подготовки к выполнению (т. е. компиляции и редактирования связей) и последующей загрузки в память персонального компьютера IBM PC представляется тремя основными типами независимых сегментов: кода, данных и стека. Размер одного сегмента каждого из этих типов не может превышать 64K байт памяти (1K = 1024 байт). Принципиально для нормальной работы любой программы необходимо иметь по крайней мере два таких сегмента, один из которых хранит инструкции выполняемой программы (сегмент кода), а второй содержит данные (сегмент данных), обрабатываемые этой программой. Однако если программа достаточно велика или большим является набор обрабатываемых ею данных, то может потребоваться более одного сегмента того или иного типа. Кроме этого, в большинстве случаев оказывается необходимым иметь специальным образом организованный сегмент стека для хранения автоматических переменных и передачи параметров функциям при их вызове. По существу обсуждаемые ниже модели организации памяти имеют самое прямое отношение к количеству сегментов различного типа и определяют тем самым максимально допустимый объм программы и ее данных. Компилятор IBM C/2 поддерживает пять основных моделей сегментации памяти: small, medium, compact, large и huge. Каждая из них может быть выбрана при помощи соответствующей опции при вызове компилятора и обеспечивается своими собственными библиотеками стандартных функций. Модель small обычно используется для небольших по объему программ, машинный код которых и данные могут разместиться в одном сегменте каждый. Общий размер программы в этом случае не должен превышать 128K байт памяти. Такая модель является наиболее экономичной в смысле использования оперативной памяти и скорости работы программы. Для нее компилятор производит короткие 16-разрядные указатели (тип near) при обращении к данным и инструкциям программы. Модель medium позволяет иметь большой объем программного кода, но допускает работу лишь с относительно небольшим количеством данных. В этом случае код программы может занимать произвольное количество сегментов по 64K каждый, однако сегмент данных должен быть всего один. Отдельные сегменты кода создаются компилятором из независимых программных модулей, каковыми являются файлы, содержащие исходный текст программы. Для такой модели инструкции программы адресуются с помощью 32-разрядных указателей (тип far), а данные выбираются в пределах единственного сегмента при помощи указателей типа near. Модель compact в определенном смысле противоположна предыдущей модели, ибо для нее характерен большой объем данных, занимающих произвольное количество стандартных сегментов, и малый объем программного кода, помещаемого компилятором в один сегмент. В рассматриваемом случае доступ к данным осуществляется посредством указателей типа far, а для выбора из памяти инструкций программы достаточно 16-разрядного адреса. Модель large допускает создание больших программ, состоящих из произвольного количества сегментов кода и данных, общий объем которых ограничен лишь адресным пространством используемой ЭВМ (1M для микропроцессора Intel 8086 и 16M для микропроцессора Intel 80286) и реальным об'емом оперативной памяти. Однако несмотря на это, создание массивов переменных, превышающих 64K байт, не является допустимым для рассматриваемой модели. В данном случае все указатели имеют тип far. Модель huge полностью идентична модели large с той лишь разницей, что она позволяет готовить массивы переменных, требующие для своего хранения более 64K байт памяти, размещая каждый из них в нескольких сегментах. Рациональное использование пяти рассмотренных моделей памяти дает возможность создавать гибкие, эффективные и большие по объему программные системы. Более того, допустимо произвольное смешение этих моделей путем игнорирования стандартных соглашений о длине адресов и явного назначения типа указателей с помощью ключевых слов near, far и huge при их определении в программе. Так, например, декларация

int (far *vector)[30];

определяет указатель типа far на массив vector тридцати элементов типа int независимо от того, какая модель памяти будет выбрана при компиляции программы.