Команды работы со стеком

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

push источник — запись значения источник в вершину стека.

Операнд м. находиться в регистре общего назначения, в сегментном регистре, в памяти

Нельзя непосредственный операнд!!!

Пример1 PUSH AX

PUSH MAS; 16-бит адрес

Пример2 MOV AX, 3

PUSH AX

Пример3 PUSH CS

Пример4 Запись одного байта

MOV AL, ‘A

PUSH AX

Теряем 1 байт.

Чтобы потом прочитать его, следует прочитать все слово, затем выделить из него байт.

(Замечание. В i80186 появился вариант команды, в котором допускается непосредственный операнд, т.е. м. исп-ть директиву.186)

При реализации этой команды выполняются следующие действия (рис. 3):

· (sp) = (sp) – 2; значение sp уменьшается на 2;

· значение из источника записывается по адресу, указываемому парой ss:sp.

pop назначение — запись значения из вершины стека по месту, указанному операндом назначение. Значение при этом “снимается” с вершины стека. Алгоритм работы команды pop обратен алгоритму команды push (рис. 4):

· запись содержимого вершины стека по месту, указанному операндом назначение;

· (sp) = (sp) + 2; увеличение значения sp.

!!! Операндом не может быть регистр CS

!!! Команды push и pop не осуществляют проверку на выход за пределы стека.

Например, если стек пуст, а мы считываем слово из стека, будет считано слово за сегментом стека.

Проверку обязан выполнять программист. Как?

§ если стек полон, то смещение вершины стека =0, т.е. проверить SP=0?

§ если стек пуст, то смещение вершины стека = размеру стека в байтах.

!!! Чтобы очистить стек можно выполнить определенное число раз команду pop, но это неэффективно. Лучше

1) запомнить вначале то значение SP, до которого затем нужно будет очищать стек, а затем его восстановить

mov ax,sp

...

mov sp,ax

2) еще лучше add sp,2*n

Для этого надо заметить, что после удаления из стека n слов значение SP должно увеличиться на 2*n. А регистр SP является регистром общего назначения и его можно использовать в любых командах

pusha — команда групповой записи в стек. По этой команде в стек последовательно записываются регистры ax, cx, dx, bx, sp, bp, si, di. Заметим, что записывается оригинальное содержимое sp, то есть то, которое было до выдачи команды pusha (рис. 5). На вершине стека DI

!!! Команда pusha чувствительна к установленной разрядности сегмента (атрибут разрядности. Он может принимать значение use16 или use32) и при указании 32-разрядного сегмента работает с соответствующими 32-разрядными регистрами, то есть eax, ecx, edx, ebx, esp, ebp, esi, edi.

pushaw — почти синоним команды pusha. Но она нечувствительна к разрядности сегмента и всегда работает с регистрами размером в слово — ax, cx, dx, bx, sp, bp, si, di).

pushad — выполняется аналогично команде pusha, но размещает в стеке регистры общего назначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi, edi.

Следующие три команды выполняют действия, обратные вышеописанным командам:
popa;
popaw;
popad
.

Группа команд, описанная ниже, позволяет сохранить в стеке регистр флагов и записать слово или двойное слово в стеке. Отметим, что перечисленные ниже команды — единственные в системе команд микропроцессора, которые позволяют получить доступ (и которые нуждаются в этом доступе) ко всему содержимому регистра флагов.

pushf — сохраняет регистр флагов в стеке. Работа этой команды зависит от атрибута размера сегмента:

· use16 — в стек записывается регистр flags размером 2 байта;

· use32 — в стек записывается регистр eflags размером 4 байта.

pushfw — сохранение в стеке регистра флагов размером в слово. Всегда работает как pushf с атрибутом use16.

pushfd — сохранение в стеке регистра флагов flags или eflags в зависимости от атрибута разрядности сегмента (то есть то же, что и pushf).

Аналогично, следующие три команды выполняют действия, обратные рассмотренным выше операциям: popf popfw popfd.


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



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