
- •Введение в системное программирование Основные понятия и определения Программы и программное обеспечение
- •Системное программирование
- •Этапы подготовки программы
- •Системное программирование
- •Лекция 1
- •1. Язык Си: Общая характеристика, историческая справкаи основные достоинства
- •2. Подготовка к выполнению и выполнение программ
- •3. Элементы языка с
- •Лекция 2
- •1. Понятие типа данных. Переменные и константы. Операция присваивания
- •2.Типы данных в языке си. Описание данных в программе
- •3. Константы в языке Си
- •4. Арифметические операции и арифметические выражения
- •5. Операции отношения, логические операции и логические выражения
- •6. Автоматическое преобразрвание типов и операция приведения
- •7. Простейшие операторы языка си. Составной оператор
- •Лекция 3
- •3. Инициализация переменных и массивов
- •4. Управляющие конструкции языка си
- •Лекция 4
- •1. Адреса и указатели
- •2. Отождествление массивов и указателей.Адресная арифметика
- •3. Указатели на массивы. Массивы указателей и многомерные массивы
- •4. Динамическое выделение памяти под массивы
- •5. Инициализация указателей
- •Лекция 5
- •1. Функции в языке си. Формальные и фактические параметры. Механизм передачи параметров. Возвращаемые значения
- •2. Использование указателей в качестве аргументов функций
- •3. Предварительное описание функций
- •4. Аргументы командной строки
- •Лекция 6
- •1. Ввод и вывод в языке си: Общие концепции
- •2. Файлы данных и каталоги. Внутренняя организация и типы файлов
- •3. Стандартные функции для работы с файлами и каталогами
- •4. Внешние устройства как специальные файлы. Организация обмена со стандартными внешними устройствами
- •5. Операции ввода/вывода через порты микропроцессоров intel 8086/80286
- •Лекция 7
- •1. Общая структура программы на языке си. Время существования и видимость переменных. Блоки
- •2. Классы памяти
- •3. Рекурсивные вызовы функций. Реализация рекурсивных алгоритмов
- •4. Препроцессор языка Си
- •5. Модели памяти, поддерживаемые компилятором ibm c/2
- •Лекция 8
- •1. Структуры в языке си: основные понятия
- •2. Массивы структур
- •3. Указатели на структуры
- •4. Вложение структур
- •5. Структуры и функции
- •6. Объединения
- •7. Перечисления
- •8. Определение и использование новых типов данных
- •9. Классы имен
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 независимо от того, какая модель памяти будет выбрана при компиляции программы.