Отметим основные виды операции, когда использование стека практически неизбежно:
· для временного сохранения значений регистров
например, push cx
...; например во вложенных циклах
pop cx
· для сохранения текущих состояний флагов и последующего их восстановления
pushf
popf
· для определения или изменения состояния любого флага
Пример. Записать в регистр AX значение флага трассировки TF (это 8-й бит), не изменяя при этом никакие флаги (!)
pushf; запомним для последующего восстановления
pushf; запомним для пересылки в ax
pop ax
mov cl,8; счетчик сдвигов
shr,cl; сдвиг бита TF к правому краю AX
and ax,1b; теперь AX:=TF
popf; восстановить исходный Flags
· для пересылки данных
например, X:=Y
push Y
pop X
Задача. Пусть в регистрах ax, bx,cx, dx находятся 4 числа, о которых известно, что
(dx) < (ax) < (bx) < (cx)
Необходимо перезаписать значения регистров так, чтобы выполнялось условие
(ax) < (bx) < (cx) < (dx)
Решение. Поместим в стек содержимое регистров так, чтобы вначале находилось самое маленькое число, затем большее и т.д. При извлечении из стека остается только помещать значения в соответствующие регистры.
|
|
Push dx... pop dx
Push ax pop cx
Push bx pop bx
Push cx pop ax
· при работе с процедурами;
· при определении локальных переменных.
Процедуры
Понятие
Процедура, часто называемая также подпрограммой, — это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи.
Процедура представляет собой группу команд для решения конкретной подзадачи.
Процедура - именованная, правильным образом оформленная группа команд, которая, будучи однократно описана, при необходимости может быть вызвана по имени любое количество раз из различных мест программы.
Описание процедуры
Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.
Синтаксис описания процедуры таков
< имя > proc [ тип ]
< тело процедуры >
< имя > endp
< Тип > может принимать значения near или far и характеризует возможность обращения к процедуре из другого сегмента кода. Тип near позволяет обращаться к процедуре только из того сегмента кода, в котором она описана. К процедуре типа FAR можно обращаться и из других сегментов тоже. По умолчанию тип принимает значение near.
Замечание. Имя процедуры по сути является меткой, т.е. с помощью простых команд перехода можно осуществить переход на первую команду процедуры.