Реализовать функцию обработки ошибки динамически распределяемой области можно с помощью переменной HeapError. Эта функция вызывается каждый раз, когда программа динамического распределения памяти не может выполнить запрос на выделение памяти. HeapError является указателем, который ссылается на функцию со следующим заголовком:
{$F+} function HeapFunc(Size: word): integer; {$F-}
Функция обработки ошибки динамически распределяемой области реализуется путем присвоения ее адреса переменной HeapError:
HeapError := @HeapFunc;
Функция обработки ошибки динамически распределяемой области получает управление, когда при обращении к процедурам New и GetMem запрос не может быть выполнен. Параметр Size содержит размер блока, для которого не оказалось области памяти соответствующего размера, и функция обработки ошибки произведет попытку освобождения блока, размер которого не меньше данного размера.
В зависимости от успеха выполнения этой попытки функция обработки ошибки динамически распределяемой области возвращает значения 0, 1 или 2. Возвращаемое значение 0 свидетельствует о неудачной попытке, что немедленно приводит к возникновению ошибки во время выполнения программы. Возвращаемое значение 1 также свидетельствует о неудачной попытке, но вместо ошибки во время выполнения оно приводит к тому, что процедуры New и GetMem возвращают указатель nil. Возвращаемое значение 2 свидетельствует об удачной попытке и вызывает повторную попытку выделить память.
Стандартная функция обработки ошибки динамического распределения области всегда возвращает значение 0, приводя к ошибке всякий раз, когда не могут быть выполнены процедуры New или GetMem. Однако для многих прикладных задач более подходящей является простая функция обработки ошибки динамически распределяемой области:
{$F+} function HeapFunc(Size:word): integer; {$F-}
begin
HeapFunc := 1;
end;
Если такая функция реализована, то вместо принудительного завершения работы программы в ситуации, когда процедуры New GetMem не могут выполнить запрос, она будет возвращать пустой указатель (nil).
14. Использование языка ассемблера в программах на Turbo Pascal
Turbo Pascal позволяет писать отдельные части программы (подпрограммы или части подпрограмм) на языке ассемблера. Здесь возможны четыре варианта.
Во-первых, можно написать подпрограмму на языке ассемблера, скомпилировать ее отдельно компилятором TASM (Turbo Assembler) с получением объектного файла, а затем скомпоновать его с основной программой, написанной на Turbo Pascal, используя при этом директиву компилятора {$L <имя файла>}, где <имя файла> - имя файла с подпрограммой на ассемблере, и директиву external.
Во-вторых, используя встроенный ассемблер пакета Turbo Pascal, отдельные части текста программы можно написать непосредственно на языке ассемблера, заключив их в операторные скобки asm … end.
В-третьих, ту или иную подпрограмму (процедуру или функцию) можно полностью, за исключением заголовка, написать на языке ассемблера, используя при этом директиву assembler. В этом случае также используется встроенный ассемблер.
Наконец, в-четвертых, можно небольшую подпрограмму написать непосредственно в кодах процессора, используя оператор или директиву inline.
При написании отдельных частей программы на языке ассемблера следует иметь в виду, что необходимо сохранить содержимое регистров BP, SP, SS и DS. Еслиих необходимо изменить, то исходные значения следует запомнить, а затем восстановить. Остальные регистры можно безболезненно изменять.
Основным вопросом стыковки программы с подпрограммой, написанной на ассемблере, является передача параметров в подпрограмму и обратно.