Turbo Assembler 3.0. Руководство пользователя


Выделение временной памяти


В ваших программах на Турбо Паскале можно выделять также временную память (локальные переменные) в стеке на время выполне- ния каждого вызова. Перед возвратом управления эта память должна быть освобождена, а значение регистра BP восстановлено. В следую- щем примере процедура MyProc резервирует пространство для двух целых переменных a и b:

CODE SEGMENT ASSUME CS:CODE MyProc PROC FAR ; procedure MyProc(i : integer); PUBLIC MyProc LOCAL a : WORD, b : WORD = LocalSpace ; a в [bp-2] ; b - в [bp-4] i equ word ptr [bp+6] ; параметр i находится над ; сохраненным BP и адресом ; возврата push bp ; нужно сохранить BP вызывающей ; программы mov bp,sp ; теперь BP указывает на ; вершину стека sub sp,LocalSpace ; зарезервировать пространст- ; во для двух слов mov ax,42 ; загрузить в AX начальное ; значение A mov a,ax ; и в A xor ax,ax ; очистить регистр AX mov b,ax ; инициализировать B нулем mov b,ax ; выполнить нужные действия . . . mov sp,bp ; восстановить исходное ; значение SP mov bp ; восстановить исходное ; значение регистра BP ret 2 MyProc ENDP CODE ENDS END

Примечание: Директива Турбо Ассемблера LOCAL использу- ется для создания идентификаторов и выделения пространства для локальных переменных.

Оператор:

LOCAL a : WORD, b : WORD = LocalSpace

на время выполнения процедуры присваивает идентификатору a значе- ние [BP-2], идентификатору b - значение [BP-4], а идентификатору LocalSpace - число 4 (размер области локальных переменных). Пос- кольку нет соответствующего оператора для создания идентификато- ров, ссылающихся на параметры, вы должны использовать присваива- ние i значения [BP+6].

Более разумный способ инициализации локальных переменных заключается в том, чтобы вместо уменьшения SP занести в стек их значения. Таким образом, вы должны заменить SUB SP,LocalSpace инструкциями:

mov ax,42 ; получить начальное значение ; для a push ax ; занести его в a xor ax,ax ; обнулить AX push ax ; и занести 0 в b

Если вы используете этот способ, нужно внимательно отслежи- вать стек! Не следует ссылаться на идентификаторы a и b перед тем, как они занесены в стек.

Другой вид оптимизации предусматривает использование инст- рукции PUSH CONST для инициализации локальных переменных (ее мож- но использовать при наличии процессором 80186, 80286 и 80386), или сохранение BP в регистре вместо занесения его в стек (если есть неиспользованные регистры).



Содержание раздела