- •Ижевский государственный технический университет
- •6. Оверлей 32
- •8.10. Стандартные библиотеки 52
- •Экзаменационные вопросы 52
- •1. Назначение системного программного обеспечения (спо)
- •Ос и языки программирования
- •2. Обслуживание ввода-вывода
- •2.1. Организация ввода-вывода
- •2.2 Способы управления пу Понятие драйвера пу
- •2.2.1. Синхронный ввод-вывод
- •2.2.2. Асинхронный ввод-вывод
- •2.2.3. Буферный ввод-вывод
- •3. Буферный обмен информацией в языках программирования.
- •4. Управление и доступ к оперативной памяти.
- •4.3. Управление реальной памятью
- •Разделы фиксированной длины
- •Использование разделов переменного размера
- •Использование перемещаемых разделов
- •Защита памяти
- •5. Библиотека dos
- •12. Прерывание 17h – работа с принтером
- •Функция 00h – прочитать время
- •6. Оверлей
- •6.1 Структура программного комплекса
- •6.2. Распределение памяти в оверлейной структуре
- •7. Встроенный в turbo pascal assembler
- •7.2. Режимы адресации в Ассемблере
- •7.4. Выражения для управления памятью
- •7.5.Выражения в Ассемблере
- •7.6. Команды Ассемблера
- •7.6.3. Команды ввода вывода
- •7.6.4. Адресные команды
- •7.6.7. Строковые команды
- •Test Аналогична команде and, но результат операции не записывается в 1 операнд.
- •Установить операнд:
- •8. Язык программирования с.
- •8.10. Стандартные библиотеки
- •Литература
- •Экзаменационные вопросы
- •На тему: название темы
- •Примечание: если курсовая работа выполняется двумя и более студентами, обязательно разбивка задач для каждого студента конкретно.
- •Состав пояснительной записки:
4. Управление и доступ к оперативной памяти.
4.1. Распределение ОП на платформе IBM PC
Вся память на IBM PC характеризуется двумя параметрами: сегмент адреса и смещение адреса. В ОС MS DOS, а также внутри программы смещение адреса имеет длины 2 байта и сегмент адреса – 2 байта. Как правило, в Pascal смещение и сегмент образуют специальный тип, который носит атрибут – pointer. Сегмент и смещение разделяются двоеточием.
На платформеIBM PC ОП делится на страницы длиной 64 Кб. При этом нулевая страница всегда является страницей ПЗУ. В этой странице записывается информация о конфигурации компьютера, а также могут быть ссылки на ПЗУ видеопроцессора, ПЗУ других периферийных устройств с постоянной памятью. В первой странице, как правило, располагаются резидентные программы (программа, выполняющаяся в процессе функционирования компьютера в течение сеанса).
К наиболее важным программам относятся планировщик задач, служит для загрузки и выгрузки всех исполняемых модулей; супервизор ввода - вывода (для управления вводом-выводом периферийных устройств); драйверы ввода – вывода и управления процессами. В зависимости от ОС резидентные программы могут занимать 1, 2 страницы и более. В ОС MS DOS, начиная с третьей или четвертой страницы, находится память доступная для пользовательской программы. Эта память заканчивается адресом А000:0. На картинке: ВП – видеопамять; РП – расширенная память. В ОС Windows, как правило, основная память полностью используется под ОС, а все пользовательские программы выполняются в расширенной памяти.
4.2. Методы обращения к памяти
4.2.1.Определение адреса с помощью указателя.
Определяем тип переменной, тип указателя.
var
p:pointer;
….
….
begin
p:=addr(…); { То же самое можно сделать через коммерческое а - @.}
....
end.
Необходимо помнить, что с помощью такого метода мы можем получить не только адреса переменных, но и адрес процедуры и функции. Таким образом, транслятору Турбо Паскаля безразлично с чем вы работаете с сегментом кода или сегментом данных.
Впроцессе выполнения загрузочного модуля программный код делится на 4 группы:
Сегмент команд – это выполняемые команды в машинном коде, может занимать более 1 страницы.
Сегмент данных – может занимать больше 1 страницы, но одно данное не может превышать 62 Кбайт.
Программный стек – часть оперативной памяти, служащая для заполнения значения регистров центрального процесса после вызова подпрограммы, адресов возврата и промежуточного хранения данных.. Принцип работы стека – первый вошел, последний вышел. Как правило величина стека различна для различных типов языков, в функциональных языках стек больше, чем в процедурных, поэтому в функциях и логических языках часто используется метод рекурсия (т.е. вызов процедурой или функцией самой себя ).
Куча – специальная область памяти, предназначенная для определенных динамических действий. В Турбо Паскале куча строится по следующим параметрам:
Собираются все свободные места между концом сегмента данных или команд и концом страницы.
Выделяется одна специальная страница (или меньше) под кучу и стек. Величину кучи или стека можно изменить задав {$M n1, n2, n3} n1- задает количество байт в стеке; n2 - память, отведенная для подпрограммы; n3- длина кучи.
Необходимо помнить (особенно при проектировании программ оболочек с вызовом других выполняемых программ), что величина стека должна превышать 4 тысячи байт.
В зависимости от типа транслятора куча может быть автоматически очищена или нет. В языке Паскаль не происходит запоминание и восстановление текущего адреса кучи и ее размера, поэтому с одной стороны не возможно автоматическое освобождение кучи. С другой стороны пользователь может передавать любые данные из подпрограммы через кучу.
В языке СИ происходит автоматическое запоминание адреса и величины кучи, которая приводит к автоматическому очищению кучи после выхода из подпрограммы.
4.2.2. Использование атрибута absolute
Атрибут absolute употребляется для полного выделения типа переменной и накладывается на уже выделенную переменную или агрегат.
Var R: real;
i3:array [0..2] of word absolute R;
c6:array [1..6] of char absolute i3;
videoarray[1..max] of byte absolute $A000:0;
i3-накладывает массив из трех беззнаковых целых на переменную R;
с6- накладывает массив из шести символов на массив i3;
video-массив 1..max из байт по абсолютному шестнадцатеричному адресу А000:0;
Распределение абсолютное к ячейкам памяти, допуск в TURBO PASCAL и если программа не работает в защищенном режиме (без расширенной оперативной памяти).
Данная проблема решается с использованием специально определенных констант: например, $A000:0 рекомендуется записывать константой segA000:0. Кроме того, существуют еще несколько констант, определяющих сегменты адреса оперативной памяти.
4.2.3. Предопределенные массивы в TURBO PASCAL и DELPHI.
Существуют два предопределенных массива для обращения к конкретным адресам оперативной памяти (все эти массивы имеют строгие имена и в программе не должно быть объявлений с данными именами): Mem и MemW.
1) Mem [Seg:Ofs]-осуществляет обращение к ячейке памяти длиной 1 байт по адресу, сегмент адреса и смещение адреса. Seg и Ofs адреса обязательно должны быть по типу word. Не рекомендуется внутри сегмента или смещения адреса употреблять арифметические операции div и *. При использовании беззнаковых данных во избежание ошибок в процессе вычислений рекомендуется предварительно явно преобразовать результат операции к типу longint :
Var
a,b:word;
l:longint;
begin
...
l:=longint(a) div longint(b)
a:=l;{a:=word(l);}
l:=Mem[a:b];
b:=Mem[$A000:b];
При употреблении шестнадцатеричных констант в массиве Mem так же рекомендуется использовать предопределенные константы.
2) MemW[Seg:Ofs]-2 байта, обращается к целому беззнаковому.
Функции по работе с адресами: Seg(var p):word; Ofs(var p):word. Seg-возвращение сегмента адреса от указателя; Ofs- возвращает смещение адреса.
Не рекомендуется обращаться к первой и второй странице ОП.