Скачать Аллокация локальных переменных в стеке

15.09.1995
Скачать файл (902,00 Б)





Эти процедуры позволяют аллоцировать и освобождать память для локальных переменных в стеке. Преимущества перед 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).