Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Карта памяти. Куча

Возьмем пример: Uses M1,M2

Чем меньше памяти займут модули тем больше её остаётся для размешения данных.

Статические данные – это та часть памяти которая распределяется транслятором. И в основной программе, и в блоках можно запросить Динамически распределенную память (8 pn) под те или иные структуры, глобального ли локального характера.

ДРП – это вся свободная память, не занятая системными программами и сегментами называются также КУЧА.

По умолчанию минимальный размер кучи – 0, max – 655 360. Директиву $M<Размер стека>,<Минимум кучи>,<Максимум кучи> можно запретить уменьшение ДРП до 0 и задать другой максимум.

Сам TP занимает в памяти свыше 300К. Если нужно увеличить кучу выходных из TP перед запуском EXE – файла (перед этим надо получить EXE- файл при значении Disk опция Destination в подменю Compile)

 

Указателем называют переменную значением которой является Адрес.

На карте памяти обозначены указатели

Начала Кучи Heap Org

оверлейного буфера OvrHeapOrg,

края занятой части кучи HeapPtr,

конца кучи HeapEnd,

составляющие адреса Sseg и Sptr границы свободной части сегмента стека.

Функция Cseg(функцияDseg) возвращает значение из регистра CS(регистраDS) микропроцессора

В начале работы программы это Сегмент кода программы (Сегмент данных) в смысле состоящей адреса.

Указатели не могут быть не введены, ни выведены.

Функция Seg(P^), Ofs(P^) возвращает составляющие Адреса, состоящие указателю P.

Знак ^ надо читать как «указывает». Получается смысл “Адрес того места памяти, куда указывает P”.

Составляющие адреса можно вводить и выводить.

На рисунке 21 показана карта памяти

 

Старшие адреса     До 64 К   До 64 К     До 64 К До 64 К До 64 К   256 байт Системные программы Указатели HeapEnd = 40955   HeapPtr = 5195   HeapOrg = 6263 OvrHeapEnd     OvrHeapOrg   Sseg:Sptr= 5239 Sseg:0000   Младшие адреса памяти.
Ещё не распределенная память. Динамически распределяемая область памяти; расширяется в сторону увеличения адресов
Оверлейный буфер (создаётся только в оверлейных программах)
Сегмент стека; стек прирастает в сторону уменьшения адресов. Свободная память стека.  
Сегмент данных основной программы; глобальные переменные и типизированные константы.
Сегмент кода модуля System.
Сегмент кода модуля М1
Сегмент кода модуля М2
Сегмент кода основной программы.
Префикс основной программы.
Турбо Паскаль Системные программы

 

Рисунок 21- Карта памяти

 

Тема 4.2 Работа с динамическими структурами данных, распределение памяти.

 

Особенности объявления данных динамической структуры.

Динамическая переменная не указывается явно в описаниях переменных и у нее нет имени. Для доступа к динамическим переменным предназначены переменные специального типа данных, Называемого ссылочным типом.

Указатели – разновидности данных, ссылочного типа.

В результате указатель будет обычной переменной, в переменная на которую он будет указывать динамической.

 

Var

P: ^Char P:*^Char P^:Char

‘*’
адрес
Begin

P^: ‘*’;

…..

end;

 

Использование идентификатора указателя означает обращение к адресу ячейки памяти, на которую он указывает.

Чтобы обратиться к содержимому ячейки на которую указывает указатель требуется поставить символ ^. Это операция называется – разыменованием.

Указательная переменная P может быть:

1) Содержать адрес какой – либо переменной 2n память под которую уже выделена

Адрес
P P^

 

2) Содержать специальный пустой адрес nil

Nil
P

 

3) Находится в неопределенном состоянии

?
P

 

?

 

Различие между состоянием nil и неопределенным состоянием

P1 P2

Nil
Nil

 

P1=P2

 

На рисунке 23 представлены простейшие действия с указателями

 

Рисунок 23 простейшие действия с указателями

 

 

Тема 4.3 Решение задач по теме простейшие действия с указателями

 

Задача 1. Задание 6.3 Зубов стр.118

Запишите программу которая выводит Сегмент (часть адреса) – начало её кода, начало данных и кучи0 конца кучи, Сегмент границы свободной части кучи и стека.

Запустить программу из TP и выйдя из него

 

Program KU;

Uses crt;

BEGIN

clrscr;

writeln('Функция CSeg и DSeg возвращает значение из регистра CS и DS...',CSeg,' ',DSeg);

writeln('Начало кучи ',Seg(HeapOrg^),' Конец кучи ',Seg(HeapEnd^));

writeln(Seg(HeapPtr),' Края занятые частью кучи');

writeln('Адрес границы свободной части сегмента стека ',SSeg);

readln;

END.

 

Тема 4.4.Использование абсолютных адресов.

Функция Seg (<Имя>) (Сегмент)

Ofs(<Имя>) (Сегмент)

 

Речь идёт о первом байте значения или коде.

Можно узнать где транслятор разместил блоки и переменные программы. Можно разместить переменную <Имя > по выбранному <Адресу> указав константные выражения путём обьявления

Var <Имя>:<Тип>Absolute<адрес>

Var Z:Byte Absolute $F0000:$FFFF;

В место адреса после Absolute можно записать имя другой переменой и произойдет совмешение.

Var A,B,C:Real;

D:Array[1..5] jf Real Absolute A; D[1]- A, D[2] – B, D[3] – C; тронслятор выделяет для А,В,С, соединение 4- байтные участки памяти.

 

Имеются три глобальных перекрывающих массива Mem,MemW,MemL.

Элементы массива покрывают всю память имея тип Byte (массив MemL),

Для Mem и для элементов массивов MemW MemL в качестве индексов используются адреса (неномера).

Состовляющие Адреса – это выражения типа Word.

Запишите программу с определением константы: ConstX:Longint=2147483000;

и выводом соответствующих ей элементов массивов MemL запишите константы и MemW:

 

 

Program Ku2;

Uses crt;

Const X: Longint=2147483000;

Bedin clrscr;

Writeln(MemL[seg(x):ofs(x)],’ ’,MemW[seg(x):ofs(x)]);

End.

 

Тема 4.5 Описание не типизированных указателей.

1) Var <Список имен указателей>:Pointer

В первом случае не важен характер объекта ссылки указатель обозначает ____? пункт памяти.

 

2) типизированные –

Var <Список имен указателей >: ^ <имя базового типа>

 

Во втором случае

2.1) Type Vec=Array [1..5] of Real; Pnt=^Word;

Var S:^Byte; SS:^Vec; SSS:Pnt (3 переменных ссылочного типа)

В описании SS используется ранее описанный ссылочный тип Pnt.

2.2) Var T:^Array[1..5] of Real; TT:^Array[1..5] of Real тождественность типов T и TT транслятор не установит и Т:TT или TT:T невозможна Ситуация изменяется если определить для T и TT единый ссылочный тип

Type Pt=^Array[1..5] of Real

Var T,TT:Pt.

 

1. Указатели можно сравнивать на равенство (неравенство).

2. Указатели занимают 4 байта памяти (сегмент + смещение).

3. Имя сегмент Sg и Смещение Sm, значение указателя получают с помощью функции Ptr(Sg,Sm)

4. Операция @<Имя блока или переменная> возвращает указатель начала блока или поля переменной тот же результат функции Addr.

 

Для порождения динамических обьектов предназначена стандартная процедура NEW (A) где A – параметр ссылочного типа.

После работы процедуры NEW (A) переменная A получает значение ссылки на порожденный обьект.

Чтобы получить доступ к динамически выделенной памяти, необходимо написать “A^,

что означает “ идти по адресу хранящемуся в A^

Например

Progaram E2;

VAr x,y:^Integer;

…..

NEW(x); x^:=13; y:=x;

Writeln(y^); Writeln(x^+20);

 

Сначала динамически порождается объект целого типа. Это означает, что выделяется место в памяти, но ничего туда не заносится.

Х - переменная ссылочного типа, ей присваивается адрес динамического объекта

X^:=13 заносит число 13 в динамическую переменную

Y- cссылочная переменная может содержать адрес с любого объекта целого типа поэтому Y:=X

Он заносится в переменную Y значение того же адреса, что храниться в переменных, первый оператор выводит 13, второй 33

 

 

 
Адрес
Адрес
1

 

 

2

 

Но при этом целочисленное значение хранящиеся в динамической переменой не изменяются.

Для уничтожения динамических обьектов служит стандартная процедура DISPOSE(x)

где – x переменная ссылочного типа.

После окончания работы процедуры ссылочной переменной X присваивается значение Nil, а память занимаемая динамической переменной освобождается.

 

<== предыдущая лекция | следующая лекция ==>
Занятие | Тема 4.6 Списки
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 465; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.056 сек.