Система программирования Турбо Паскаль Встроенный ассемблер графика в Турбо Паскале

Этот подход способствовал пониманию того, что нет абсолютной информации об объекте, определение информации зависит от составленной модели объекта. За единицу количества информации принимается такое количество информации, которое содержит сообщение, уменьшающее неопределенность знаний в два раза. Такая единица названа бит. Во многих случаях используют группы бит состоящие из 16 разрядов (слово), 32 разрядов (двойное слово), 48 – разрядов (учетверенное) слово.

Процедуры и функции для работы с динамической памятью

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

Функция ADDR.

Возвращает результат типа POINTER, в котором содержится адрес аргумента. Обращение:

ADDR ( X )

Здесь Х- любой объект программы (имя любой переменной, процедуры, функции). Возвращаемый адрес совместим с указателем любого типа. Отметим, что аналогичный результат возвращает операция @ .

Функция CSEG.

Возвращает значение, хранящееся в регистре CS микропроцессора в начале работы программы в регистре CS содержится сегмент начала кода программы). Обращение:

CSEG 

Результат возвращается в слове типа WORD.

Процедура DISPOSE.

Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем. Обращение:

DISPOSE(TP)

Здесь ТР - типизированный указатель. При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения. При освобождении динамических объектов можно указывать вторым параметром обращения к DISPOSE имя деструктора (подробнее см. гл.10).

Функция DSEG.

Возвращает значение, хранящееся в регистре DS микропроцессора (в начале работы программы в регистре DS содержится сегмент начала данных программы). Обращение:

DSEG 

Результат возвращается в слове типа WORD.

Процедура FREEMEM.

Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за нетипизированным указателем. Обращение:

FREEMEM ( Р, SIZE )

Здесь Р - нетипизированный указатель;

SIZE - длина в байтах освобождаемого фрагмента.

При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения.

Процедура GETMEM.

Резервирует за нетипизированным указателем фрагмент динамической памяти требуемого размера. Обращение:

GETMEM ( Р, SIZE )

За одно обращение к процедуре можно зарезервировать не более 65521 байтов динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.

Процедура MARK.

Запоминает текущее значение указателя кучи HEAPPTR. Обращение:

MARK ( PTR )

Здесь PTR - указатель любого типа, в котором будет возвращено текущее значение HEAPPTR. Используется совместно с процедурой RELEASE для освобождения части кучи.

Функция MAXAVAIL.

Возвращает размер в байтах наибольшего непрерывного участка кучи. Обращение:

MAXAVAIL

Результат имеет тип LONGINT. За один вызов процедуры NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.

Функция MEMAVAIL.

Возвращает размер в байтах общего свободного пространства кучи. Обращение:

MEMAVAIL 

Результат имеет тип LONGINT.

Процедура NEW.

Резервирует фрагмент кучи для размещения переменной. Обращение:

NEW ( ТР )

Здесь ТР - типизированный указатель.

За одно обращение к процедуре можно зарезервировать не более 65521 байта динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.

Процедура NEW может вызываться как функция. В этом случае параметром обращения к ней является тип переменной, размещаемой в куче, а функция NEW возвращает значение типа указатель. Например:

type

PInt =^Integer; 

var

p: Pint; 

begin

p := New(PInt);

......

end.

При размещении в динамической памяти объекта разрешается в качестве второго параметра обращения к NEW указывать имя конструктора (см. гл.10).

Функция OFS.

Возвращает значение типа WORD, содержащее смещение адреса указанного объекта. Вызов:

OFS ( X ) 

Здесь Х- выражение любого типа или имя процедуры.

Функция PTR.

Возвращает значение типа POINTER по заданному сегменту SEG и смещению OFS. Вызов:

PTR ( SEG, OFS )

Здесь SEG - выражение типа WORD, содержащее сегмент;

OFS - выражение типа WORD, содержащее смещение. 

Значение, возвращаемое функцией, совместимо с указателем любого типа.

Процедура RELEASE.

Освобождает участок кучи. Обращение:

RELEASE ( PTR ) 

Здесь PTR - указатель любого типа, в котором предварительно было сохранено процедурой MARK значение указателя кучи. Освобождается участок кучи от адреса, хранящегося в PTR, до конца кучи. Одновременно уничтожается список всех свободных фрагментов, которые, возможно, были созданы процедурами DISPOSE или FREEMEM.

Функция SEG.

Возвращает значение типа WORD, содержащее сегмент адреса указанного объекта. Вызов:

SEG ( X ) 

Здесь X - выражение любого типа или имя процедуры.

Функция SIZEOF.

Возвращает длину в байтах внутреннего представления указанного объекта. Вызов:

SIZEOF ( X ) 

Здесь X - имя переменной, функции или типа. Например, везде в программе из примера 6.1 вместо константы SIZEOFREAL можно было бы использовать обращение SIZEOF(REAL).

 

В 1833 - 1871 гг. английский ученый Чарлз Бэббидж разработал проект «аналитической машины», которая имела все основные узлы современной ЭВМ: «склад» (память), «мельницу» (арифметическое устройство) и «управление» (уст-ройство управления). Здесь впервые был реализован принцип разделения информации на команды и данные.
Способ хранения данных в Turbo Vision