Команда NOP - еще одна удобная команда микропроцессора 8088. Она
не делает ничего - "нет операции". Тщательный анализ машинных
команд показывает, что это в действительности команда XCHG. А
именно, это
XCHG AX,AX
что эквивалентно "ничего не выполнять", и бывают ситуации,
когда такую команду желательно использовать, чтобы выждать
некоторое время. В небольшом цикле, предназначенном для
определенной временной задержки, можно использовать команды NOP для
заполнения тела цикла, достигая тем самым точной выдержки времени
выполнения цикла (хотя цикл - не лучший способ временной задержки,
если интервал не очень маленький). Разработчики IBM PC требуют
использовать NOP в некоторых местах, чтобы удовлетворять
определенным временным требованиям. Например, программа не может
иметь доступ в схему таймера чаще, чем раз в одну микросекунду. Две
последовательно идущие команды IN нарушают это требование, так что
между командами IN должно быть выполнено несколько команд NOP.
Команда HLP останавливает ЭВМ; после выполнеиня этой команды
микропроцессор останавливается. Если прерывания заблокированы во
время останова, ЭВМ полностью "замирает". В этой сиутации
единственная возможность запустить ЭВМ заново - выключить питание и
включить его снова. Однако, если прерывания были разрешены в момент
останова микропроцессора, они продолжают восприниматься и
управление будет передаваться обработчику прерываний. После
выполнеиня команды IRET в обработчике программа продолжает
выполнение с ячейки, следующей за командой HLT. Команду HLT можно
использовать в мультизадачных системах, чтобы завершить текущую
активную задачу, но это не всегда лучший способ такого завершения.
Разработчики персональной ЭВМ используют команду останова только
тогда, когда возникает катастрофическая ошибка оборудования и
дальнейшая работа бессмысленна.
Команда LOCK - это командный префикс, такой же, как подавление
сегментации или REP-префикс. Она предназначена для
мультипроцессорных систем, в которых несколько микропроцессоров
могут одновременно работать с одними и теми же ячейками памяти.
Префикс LOCK вынуждает микропроцессор 8088 захватить линии
управления, и тем самым получить исключительное право достура в
память на время обработки команды с префиксом. Лучший пример этого
- установка- проверка флага в общей памяти.
MOV AL,1
LOCK XCHG AL,FLAG_BYTE
CMP AL,1
В этом примере байт FLAG_BYTE содержит нулевой или единичный
индикатор. Микропроцессор устанавливает флаг равным единице, когда
входит в "критическую" область программы, где он выполняет
некоторые системные действия, которые может выполнять в данный
момент времени лишь один микропроцессор. Перед входом в
"охраняемую" область микропроцессор должен проверить, не работает
ли в ней другой микропроцессор. Если это так, он должен подождать
перед входом; иначе он может войти в область. В примере перед
командой XCHG используется префикс LOCK. Префикс LOCK дает
микропроцессору право исключительного доступа в течение выполнения
команды XCHG, которая читает содержимое ячейки памяти, а затем
записывает данные в эту же ячейку. Команда XCHG записывает 1 из
регистра AL в поле FLAG_BYTE, засылая его текущее значение в
регистр AL. Теперь, если регистр AL содержит 1, то в "охраняемой"
области находится другой микропроцессор, и проверяющий
микропроцессор обязан ждать. Если регистр AL нулевой,
микропроцессор может войти в "охраняемую" область, а команда XCHG
уже установила поле FLAG_BYTE равным 1, чтобы больше ни один
микропроцессор не смог войти туда. Префикс LOCK препятствует любому
другому микропроцессору проверять поле FLAG_BYTE в течение
короткого интервала времени между проверкой и установкой ячейки
флага.
К сожалению, описание работы префикса LOCK носит чисто
теоретический характер. IBM PC не реализует аппаратные средства,
необходимые для работы LOCK.
Команда WAIT останавливает выполнение программы
микропроцессором, аналогично команде HLT. Но в случае команды WAIT
выполнение программы возобновляется, когда один из внешних выводов
микропроцессора 8088, вывод TEST, становится активен. Если вывод
TEST активен во время выполнения команды WAIT, остановки не
возникает вообще. Если вывод TEST неактивен, микропроцессор ждет до
тех пор, пока он не станет активен. Микропроцессор 8088 использует
эту команду вместе с командой ESC, чтобы работать с арифметическим
сопроцессором 8087.
Команда ESC дает возможность расширить набор команд
микропроцессора 8088 без изменений самого микропроцессора. Команда
содержит поле режима адресации и может указать любую ячейку памяти
с помощью обычных способов адресации микропроцессора 8088. Однако
микропроцессор ничего не делает в случае этой команды, кроме того,
что читает данные из соответствующей ячейки и просто их
отбрасывает.
Команда ESC позволяет другому микропроцессору, или так
называемому сопроцессору, наблюдать за работой микропроцессора
8088. Команда ESC активизирует сопроцессор, и он выполняет ее, как
собственную. Если сопроцессору нужен адрес памяти, микропроцессор
8088 выдает этот адрес в цикле фиктивного чтения. Затем сопроцессор
может выполнять запись или чтение по этому адресу в зависимости от
того, что ему нужно. Эффективность команды ESC станет очевидна в
гл.7, где рассматривается арифметический сопроцессор 8087,
сопроцессор микропроцессора 8088.