Меню сайта

Урок 50. Операции со стеком

Микропроцессор 8088 адресует стек спомощью регистровой пары SS:SP.
— — — Помещение объектов в стек приводит к тому,что он растет в сторону
— — — меньших адресов памяти. — Стек, кроме всего прочего, служит и для
— — — запоминания адресов возврата изподпрограмм. — В этом разделе
— — — рассматриваются некоторые команды, которыенепосредственно работают
— — — со стеком.

— — — — — Фиг.4.7 иллюстрирует ассемблированныестековые команды.
— — — Мнемоника команд очевидна- за кодамиопераций PUSH и POP следует
— — — имя регистра для указания операнда.Единственным исключением
— — — является помещение и извлечение из стекарегистра флагов, которые
— — — используют мнемонику PUSHF и POPFсоответственно. Содержимое любой
— — — ячейки памяти, которую программа можетадресовать, используя
— — — возможные способы адресации, также можетбыть помещено или
— — — извлечено из стека.

— — — — — При любых действиях со стеком вмикропроцессоре 8088 базовой
— — — единицей информации является 16=битовоеслово. Длина любого
— — — объекта, помещаемого в стек либоизвлекаемого из стека, составляет
— — — одно или несколько слов. Байтовых команд,связанных с засылкой
— — — данных или извлечением их из стека, несуществует. Если, например,
— — — программе необходимо сохранить содержимоерегистра AL а стеке, она
— — — должна поместить содержимое регистра AX,так как не существует
— — — способа сохранения только содержимогорегистра AL.

— — — — — Основное назначение стека — временноехранение информации. Как
— — — мы уже видели, стек используется длясохранения адреса возврата-
— — — программа также может сохранять данные.Если программа хочет
— — — использовать регистр, пусть даже сохранитьтекущие данные, она
— — — может послать значение этого регистра встек. Эти данные
— — — сохраняются в стеке и позже могут бытьвосстановлены. Например,
— — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:00:43
— — — — — — — — -Фиг. 4.7 Операции со стеком — — — — — — — — — — — — — — — — — — — — — Page -1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 4.7 Операции со стеком
— — — — — — — — — -0000 — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE,DS:CODE
— — — — — — — — — -0000 — — — — — — — — — — — — — — — — — EXWORD -LABEL — — WORD

— — — — — — — — — -0000 — 50 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — AX — — — — — —Поместить регистр в стек
— — — — — — — — — -0001 — 56 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — SI
— — — — — — — — — -0002 — 0E — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — CS — — — — — —Можно поместить в стек сегментный регистр
— — — — — — — — — -0003 — FF 36 0000 R — — — — — — — — — — — — — — -PUSH — — — EXWORD — — — — — — — — Можно также поместить в стек ячейку памяти

— — — — — — — — — -0007 — 8F 06 0000 R — — — — — — — — — — — — — — -POP — — — — EXWORD — — — — — — — — Можно извлечь то, что в помещено в стек
— — — — — — — — — -000B — 07 — — — — — — — — — — — — — — — — — — — — — — — — -POP — — — — ES — — — — — —Можно извлечь в другое место
— — — — — — — — — -000C — 5F — — — — — — — — — — — — — — — — — — — — — — — — -POP — — — — DI
— — — — — — — — — -000D — 5B — — — — — — — — — — — — — — — — — — — — — — — — -POP — — — — BX

— — — — — — — — — -000E — 9C — — — — — — — — — — — — — — — — — — — — — — — -&n
bsp-PUSHF — — — — — — — — — — — — Другая мнемоника для флагов
— — — — — — — — — -000F — 9D — — — — — — — — — — — — — — — — — — — — — — — — -POPF

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Пример, демонстрирующий передачу параметров

— — — — — — — — — -0010 — 50 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — AX
— — — — — — — — — -0011 — 53 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — BX
— — — — — — — — — -0012 — 51 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — CX
— — — — — — — — — -0013 — 52 — — — — — — — — — — — — — — — — — — — — — — — — -PUSH — — — DX
— — — — — — — — — -0014 — E8 0017 R — — — — — — — — — — — — — — — — — — CALL — — — SUBROUTINE — — — — — — Передача управления
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — … — — — — — — — — — — — — — — Продолжение программы

— — — — — — — — — -0017 — — — — — — — — — — — — — — — — — SUBROUTINE — — — — — PROC — — — NEAR

— — — — — — — — — -0017 — 8B EC — — — — — — — — — — — — — — — — MOV — — — — BP, SP — — — — — — — — Занесение в BP адреса стека
— — — — — — — — — -0019 — 8B 46 02 — — — — — — — — — — — — — — — — — — — MOV — — — — AX, [BP+2] — — — — — — Выборка последнего параметра (DX)
— — — — — — — — — -001C — 8B 5E 04 — — — — — — — — — — — — — — — — — — — MOV — — — — BX, [BP+4] — — — — — — Выборка третьего параметра (CX)
— — — — — — — — — -001F — 8B 4E 06 — — — — — — — — — — — — — — — — — — — MOV — — — — CX, [BP+6] — — — — — — Выборка второго параметра (BX)
— — — — — — — — — -0022 — 8B 56 08 — — — — — — — — — — — — — — — — — — — MOV — — — — DX, [BP+8] — — — — — — Выборка первого параметра (AX)
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — …
— — — — — — — — — -0025 — C2 0008 — — — — — — — — — — — — — — — — — — — — RET — — — — 8 — — — — — — — — — — — — — Возврат с уничтожением поля параметров
— — — — — — — — — -0028 — — — — — — — — — — — — — — — — — SUBROUTINE — — — — — ENDP
— — — — — — — — — -0028 — — — — — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END

— — — — — — — — — — — — — — -Фиг. 4.7 Операции со стеком

— — — программе нужно ввести код из портаввода=вывода 3DAH, а в регистре
— — — DX находятся важные данные. Следующаяпоследовательность команд

— — — — — PUSH — DX
— — — — — MOV DX, — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 3DAH
— — — — — IN -AL, — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — DX
— — — — — POP DX

— — — — — сохраняет регистр DX в стеке на то время,пока он нужен в
— — — программе для выполнения команды IN.

— — — — — Операции сохранения регистров в стекеобычно используется в
— — — начале программы. В большинстве случаевподпрограмма старается
— — — избегать изменения содержимого любогорегистра. Поэтому
— — — подпрограмма, которой нужны регистры длявычислений и для хранения
— — — адресов, помещает все необходимые ейрегистры в стек до выполнения
— — — команд обработки. Затем, после выполнения,подпрограмма
— — — восстанавливает регистры из стека спомощью команд POP.

— — — — — Помните о том, что стек — это структуратипа LIFO. Если в вашей
— — — программе выполняется последовательностькоманд

— — — — — PUSH — BX
— — — — — PUSH CX
— — — — — POP BX
— — — — — POP CX

— — — — — то результирующим эффектом будет обмензначений в регистрах BX
— — — и CX. Только тот факт, что в команде PUSHбыл указан регистр BX, не
— — — означает, что команда POP, указывающая натот же регистр,
— — — восстанавливает первоначальное содержимоерегистра BX. Еще одним
— — — важным моментом является то, что командыPUSH и POP должны быть
— — — сбалансированы, т.е. каждой команде PUSHдолжна соответствовать
— — — команда POP. Точно так же, как и в случаескобок в арифметическом
— — — выражении, если посылки и извлечения изстека не сбалансированы,
— — — результаты будут неверны. Более того,несбалансированные команды
— — — PUSH/POP обычно приводят к возврату изподпрограмм по адресу
— — — значения данных, а не значения указателякоманд из=за того, что
— — — микропроцессор 8088 записывает в стекадрес возврата. Обычно это
— — — вынуждает микропроцессор выполнятьпрограмму, которую программист
— — — никогда не писал. Поэтому баланс стековыхкоманд обязателен. Будьте
— — — особенно внимательны в тех случаях, когдав программе есть условный
— — — переход вокруг стековых операций- можнолегко выпустить из виду
— — — один из вариантов выполнения, что оставитстек несбалансированным.

— — — — — Наряду с сохранением данных, программаможет использовать стек
— — — в качестве буфера при некоторыхпересылках- в частности, не
— — — существует команды пересылки, которая быпереносила данные из
— — — одного сегментного регистра в другой. Вобычном случае загрузка
— — — одного сегментного регистра из другоготребует сначала загрузки его
— — — значения а промежуточный регистр. Этодостигается следующей
— — — последовательностью из двух команд:

— — — — — MOV — — AX,CS —переслать значение регистра
— — — — — — — — — — — — — — — — — — -CS в регистр AX
— — — — — MOV — — DS,AX —загрузить это значение в
— — — — — — — — — — — — — — — — — — — регистр DS

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

— — — — — PUSH — CS — — — — -регистр CS поместить в стек
— — — — — POP — — DS — — — — -поместить это значение в регистр DS

— — — — — Результирующий эффект этойпоследовательности команд тот же,
— — — регистр DS загружается из регистра CS.Здесь длина программы —
— — — всего два байта, и к тому же не требуетсяпромежуточный регистр.
— — — Однако эти две команды занимают большевремени, так как нужны
— — — дополнительные циклы чтения и записи встек. Это — метод потери в
— — — скорости выполнения ради уменьшенияразмера объектного кода.

Категория: Программирование на Ассемблере | Дата: 10.02.13

Меню раздела
Блок