Команды обращения в стэк
Как уже упоминалось, во время исполнения процедуры стек содержит адрес возврата. Команда вызова процедуры CALL (call - вызвать) помещает адрес в стек, а команда возврата RET (return - возвратить) извлекает его по окончании исполнения процедуры. Это один из случаев, когда микропроцессор 8088 использует стек автоматически, без Вашего на то указания.
Таким образом, стек удобен для временного сохранения данных (содержимого регистров и ячеек памяти) при работе Вашей программы. Например, Вам может понадобиться сохранить содержимое регистра АХ на то время, пока он требуется для выполнения каких-либо действий. Для этого имеются две команды для работы со стеком – PUSH (поместить слово в стек) и POP (извлечь слово из стека). Команда PUSH помещает содержимое регистра или ячейки памяти размером в 16-битовое слово на вершину стека. А команда POP, наоборот, снимает слово с вершины стека и помещает его в ячейку памяти или регистр.
Команды PUSH и POP имеют следующие форматы:
PUSH источник
POP приемник
Приведем несколько примеров:
PUSH SI ;Можно сохранить регистр общего назначения
PUSH DS ;или регистр сегмента,
PUSH CS ;включая регистр CS
PUSH COUNTER ;Можно также сохранить содержимое
PUSH TABLE [BX][DI] ; ячейки памяти
Будучи взаимно обратными командами, PUSH и POP обычно используются парами, т.е. каждой команде PUSH в программе должна соответствовать своя команда POP. Например, при сохранении содержимого регистра АХ в стеке и последующем его восстановлении программа будет иметь вид:
PUSH AX ;Сохранить АХ на вершине стека
. . . . . . . ;Другие команды программы,
. . . . . . . изменяющие содержимое АХ
. . . . . . .
POP AX ;Восстановить значение АХ сняв его с вершины стека
Под вершиной стека понимается ячейка в сегменте стека, адрес которой содержится в указателе стека SP. Так как стек "растет" по направлению к младшим адресам памяти (к ячейке 0), то первое помещаемое в стек слово запоминается в ячейке стека с наибольшим адресом, следующее - на два байта ниже и т.д. Регистр SP всегда указывает на слово, помещенное в стек последним. Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник (слово) в стек. Действуя обратным образом, команда POP пересылает в операнд-приемник слово, адрес которого содержится в регистре SP, a затем добавляет 2 к содержимому этого регистра. На рисунке 3.1 показаны состояния стека и его указателя до и после использования команд PUSH и POP.
В результате исполнения команды PUSH указатель стека передвинется на два байта памяти ниже, и в этих байтах (ранее не используемых) будет содержаться значение регистра АХ, В результате исполнения команды POP содержимое регистра SP вернется в исходное состояние. С помощью серии команд PUSH в стеке можно сохранить 32768 слов, причем каждая команда PUSH помещает свой операнд на вершину стека, и поэтому с помощью команды POP слова извлекаются из стека в порядке, обратном их записи. Следующая последовательность команд помещает значения четырех регистров в стек, а затем восстанавливает их:
PUSH AX ;Сохранить АХ,
PUSH ES ;ES,
PUSH DI ;DI и
PUSH SI ;SI
POP SI ;Восстановить SI,
POP DI ;DI,
POP ES ;ES и
POP AX ;AX
Команды PUSH и POP удобны также для копирования содержимого одного регистра сегмента в другой. Например, с помощью команд
PUSH ES
POP DS
можно скопировать значение регистра ES в регистр DS.
Дата добавления: 2016-01-26; просмотров: 1327;