команда POP. Точно так же,
команда POP. Точно так же, как и в случае скобок в арифметическом
выражении, если посылки и извлечения из стека не сбалансированы,
результаты будут неверны. Более того, несбалансированные команды
PUSH/POP обычно приводят к возврату из подпрограмм по адресу
значения данных, а не значения указателя команд из=за того, что
микропроцессор 8088 записывает в стек адрес возврата. Обычно это
вынуждает микропроцессор выполнять программу, которую программист
никогда не писал. Поэтому баланс стековых команд обязателен. Будьте
особенно внимательны в тех случаях, когда в программе есть условный
переход вокруг стековых операций; можно легко выпустить из виду
один из вариантов выполнения, что оставит стек несбалансированным.
Наряду с сохранением данных, программа может использовать стек
в качестве буфера при некоторых пересылках; в частности, не
существует команды пересылки, которая бы переносила данные из
одного сегментного регистра в другой. В обычном случае загрузка
одного сегментного регистра из другого требует сначала загрузки его
значения а промежуточный регистр. Это достигается следующей
последовательностью из двух команд:
MOV AX,CS ;переслать значение регистра
;CS в регистр AX
MOV DS,AX ;загрузить это значение в
; регистр DS
Каждая из этих команд имеет длину несколько байт, и эта
последовательность разрушает содержимое регистра AX. Альтернативным
подходом может быть
PUSH CS ; регистр CS поместить в стек
POP DS ; поместить это значение в регистр DS
Результирующий эффект этой последовательности команд тот же,
регистр DS загружается из регистра CS. Здесь длина программы -
всего два байта, и к тому же не требуется промежуточный регистр.
Однако эти две команды занимают больше времени, так как нужны
дополнительные циклы чтения и записи в стек. Это - метод потери в
скорости выполнения ради уменьшения размера объектного кода.
Содержание Назад Вперед