Пример программы распределения памяти и получения доступа к полям PSP

{Программа, демонстрирующая распределение памяти}

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: