{Программа, демонстрирующая распределение памяти}
program Demo_Size;
uses Crt;
var
P: pointer;
I: word; procedure ProgSize;
var
SysemTotalSize: word {Общий размер кучи}
PrefixSize: word {Размер PSP}
CodeSize: word {Размер сегмента кода}
DataSize: word {Размер сегмента данных}
HeapSIze: word {Размер динамической памяти}
AllocHeapSize: word {Размер занятой части динамической памяти}
Factor: real;
S: string[80];
LI: byte absolute S;
1,1: byte;
function Lin_Adr (P: pointer): longint; {Вычисление абсолютного (линейного) адреса объекта по обычному сегментному адресу}
begin
Lin_Adr:=longint(Seg(P^)*16+0fs(Р^);
end;
begin {Начало процедуры}
SystemTotalSize:= 640*1024 div 16;
PrefixSize:= 256 div 16;
CodeSize:= Dseg — PrefixSeg — PrefixSize;
DataSize:= SegtHeapOrg^ — SSeg;
HeapSize;= Mem[PrefixSeg:2] - Seg (HeapOrg^);
AllocHeapSize:= (Lin_Adr(HeapPtr)-Lin_Adr(HeapOrg)+1) div 16;
Writein (' Распределение памяти: ');
Factor:= 67 / SystemTotalSize;
L:= Round(Factor*PrefixSize);
FillChar(S[l],L,#176);
Writeln ('PSP ',PrefixSize:5,' ',S);
L:= Round(Factor*CodeSize);
FillChar(S[l],L,#176);
Writeln('Код ',CodeSize:5,' ',8);
L:= Round(Factor*DataSize);
FillChar(S[l],L,#176);
Writeln ('Данные ',DataSize:5,' ',S);
L:= Round(Factor*HeapSize);
LI:= Round(Factor*AllocHeapSize);
FillChar(S[l],LI,#176);
FillChar(S[LI+l],L-LI,#219);
Writein ('Куча:', HeapSize: 5,' ',S);
Writein end;
begin {Основная программа}
Randomize;
|
|
for I:=l to 100 do {Попробуйте поменять конечное значение параметра I (от 1 до 1000)}
GetMam(P,Random(1000)); {Занимаем часть динамической.памяти блоками случайных размеров}
ProgSize; {Выводим на экран карту памяти}
end.
Порядок выполнения работы
1. Изучить теоретические сведения по теме: “Изучение карты памяти. Разработка программы доступа к полям PSP”.
2. Изучить программу распределения памяти и доступа к полям PSP.
3. Показать работающую программу преподавателю.
4. Ответить на контрольные вопросы.
Контрольные вопросы
1. Адреса MS-DOS. Абсолютный адрес, сегмент, смещение.
2. Карта распределения памяти при выполнении программы.
3. Сегмент кода, сегмент данных, сегмент стека. Назначение каждого из сегментов.
Лабораторная работа № 32
Разработка программы использования динамической памяти
Цель работы: формирование знаний и умений по работе с динамической памятью. Приобретение навыков работы с динамическими переменными, указателями.