Использование стека

Отметим основные виды операции, когда использование стека практически неизбежно:

· для временного сохранения значений регистров

например, 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.

Замечание. Имя процедуры по сути является меткой, т.е. с помощью простых команд перехода можно осуществить переход на первую команду процедуры.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: