Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000239.doc
Скачиваний:
22
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

6.2. Стековые команды

Для работы со стеком в ПК имеется несколько команд, которые принято называть стековыми. Сразу отметим, что все они будут работать правильно, только если регистр SS указывает на начало сегмента стека, а регистр SP – на вершину стека. Если в этих регистрах записано что-то иное, то действие стековых команд непредсказуемо.

Запись и чтение слов

Основными стековыми командами ПК являются команды записи слова в стек и считывания слова из стека.

Запись слова в стек: PUSH op

Допустимые типы операнда: rl6, sr, ml6.

Команда PUSH («вталкивать») записывает в стек свой операнд. Условно это можно изобразить так (рис. 33):

Рис. 33. Иллюстрация работы команд PUSH и POP

Более точно команда PUSH действует так: сначала значение регистра SP уменьшается на 2 (вычитание происходит по модулю 216), т. е. SP сдвигается вверх и теперь указывает на свободную ячейку области стека, а затем в нее записывается операнд:

SP:=(SP-2) mod 216,op-> [SS:SP]

Флаги команда не меняет.

В команде PUSH в качестве операнда можно указывать любой сегментный регистр (например, PUSH CS), но нельзя указывать непосредственный операнд (например, PUSH 5 - ошибка). Если мы хотим записать в стек явное число, то это надо делать через регистр, например:

MOV АХ, 5

PUSH AX ;5 -> стек

Отметим также, что по команде PUSH в стек можно записать только слово, но не байт или двойное слово. Двойное слово приходится записывать двумя командами, а для записи байта (скажем, символа '*') этот байт расширяют каким угодно способом до слова и в стек уже записывают слово:

MOV AL, '*' ;AL:='*' (AH:=?)

PUSH AX

При этом в силу «перевернутого» представления слов в памяти ПК код символа '*' займет в стеке байт, на который указывает регистр SP (рис. 34).

Рис. 34. Размещение символа в стеке

Конечно, при таком способе записи байта в стек, теряется байт, но обычно на это идут, если хотят воспользоваться командой PUSH. Для чтения же байта из стека надо считать все слово, а затем из него выделить нужный байт.

Чтение слова из стека: POP op

Допустимые типы операнда: r16, sr (кроме CS), ml6.

Команда POP («выталкивать») считывает слово из вершины стека и присваивает его указанному операнду (см. рис. 33). Более точно: слово из ячейки, на которую указывает пара SS:SP, пересылается в операнд, а затем SP увеличивается на 2 (сложение происходит по модулю 216), т. е. сдвигается вниз:

[SS:SP] -> op, SP:=(SP+2) mod 216.

Слово, считанное из стека по команде POP, может быть помещено в любой регистр, кроме сегментного регистра CS (изменение этого регистра означает переход). Кроме того, по этой команде можно считать только слово, но не байт или двойное слово.

Запись и чтение регистра флагов

Следующая пара стековых команд используется для записи в стек и чтения из стека регистра флагов.

Запись регистра флагов в стек: PUSHF

Чтение регистра флагов из стека: POPF

По команде PUSHF в стек записывается содержимое регистра флагов Flags, а по команде POPF из стека считывается слово и оно заносится в Flags. При этом команда PUSHF не меняет флаги, а команда POPF, естественно, меняет все флаги.

Эти команды обычно используются для сохранения текущих состояний флагов и последующего их восстановления. Эти команды можно также использовать для определения или изменения состояния любого флага – в том случае, если нет подходящих команд для реализации этих действий. Например, записать в регистр АХ значение флага трассировки TF (он занимает 8-й бит регистра Flags при нумерации битов справа налево от 0), не меняя при этом никакие флаги, можно так:

PUSHF ;запомнить Flags,чтобы

;затем восстановить ;его

PUSHF ;запомнить Flags для пересылки

;в АХ

POP AX ;AX:=Flags

MOV CL, 8

SHR AX, CL ;сдвиг бита с TF к правому краю АХ

AND AX, 1b ;AX:=TF

POPF ;восстановить исходное значение

;Flags