- •Введение
- •1. Особенности персонального компьютера
- •1.1. Оперативная память
- •1.2. Регистры
- •1.3. Представление данных
- •1.4. Представление команд
- •2. Язык ассемблера. Начальные сведения
- •2.1. Лексемы
- •2.2. Предложения
- •2.3. Директивы определения данных
- •2.4. Директивы эквивалентности и присваивания
- •2.5. Выражения
- •3. Пересылки. Арифметические команды
- •3.1. Обозначения операторов команд
- •3.2. Команды пересылки
- •3.3. Команды сложения и вычитания
- •3.4. Команды умножения и деления
- •3.5. Изменение размера числа
- •3.6. Примеры
- •3.7. Лабораторная работа № 1
- •4. Переходы. Циклы
- •4.1. Безусловный переход
- •4.2. Команды сравнения и условного перехода
- •4.3. Команды управления циклом
- •4.4. Вспомогательные операции ввода-вывода
- •4.5. Массивы
- •4.6. Лабораторная работа № 2
- •5. Программные сегменты
- •5.1. Сегментирование адресов в пк
- •5.2. Программные сегменты
- •5.3. Начальная загрузка сегментных регистров
- •5.4. Структура программы
- •6. Стек
- •6.1. Стек и сегмент стека
- •6.2. Стековые команды
- •6.3. Приемы работы со стеком
- •7. Процедуры
- •7.1. Дальние переходы
- •7.2. Подпрограммы-процедуры
- •7.3. Передача параметров через регистры
- •7.4. Передача параметров через стек
- •7.5. Локальные данные процедур
- •7.6. Лабораторная работа № 3
- •8. Ввод и вывод данных
- •8.1. Реализация основных операций ввода-вывода
- •8.2. Операции ввода-вывода
- •8.3. Пример структуры программы
- •Заключение
- •Библиографический список
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
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