From : Oleg Kharin <ok@ulk.udm.ru>
Date: 15 Sep 1994 08:02:26 +0500
Organization: JSV Uvinsky lesokombinat
Эти процедуры позволяют аллоцировать и освобождать память для локальных
переменных в стеке. Преимущества перед GetMem:
1. Работает быстрее.
2. Позволяет не дробить память, если далее вызывается GetMem, а аллоцированная
в стеке память освобождается.
function GetStackMem(Size:word):pointer;
inline($58/ { pop ax}
$40/ { inc ax } { Для выравнивания на слово }
$25/$FE/$FF/ { and ax,$FFFE}
$2B/$E0/ { sub sp,ax}
$8B/$C4/ { mov ax,sp}
$8C/$D2 { mov dx,ss});
procedure FreeStackMem(Size:word);
inline($58/ { pop ax}
$40/ { inc ax } { Для выравнивания на слово }
$25/$FE/$FF/ { and ax,$FFFE}
$03/$E0 { add sp,ax }
);
Пример:
procedure Test(Size:word);
var
p : pointer;
begin
p := GetStackMem(Size);
{Здесь можно использовать p^}
FreeStackMem(Size);
end;
Если в программе есть локальные переменные, то в ее конце можно
FreeStackMem не вызывать (т.к. SP получает в первоначальное значение из BP).
Олег.
|