- •Введение
- •1.1. Основные направления эволюции микрокомпьютеров
- •1.2. Основные сведения о компьютерах
- •1.3. Представление чисел
- •Заключение
- •Лекция 2 машинная организация процессора 80286
- •2.1. Введение
- •2.2. Структура памяти
- •2.3. Сегментация памяти
- •2.4. Структура ввода-вывода
- •2.5. Регистры
- •2.6. Операнды и режимы адресации операндов
- •2.7. Замечания о режимах адресации
- •Глава 3 базовая система команд процессора 80286
- •3.1. Нотация языка ассемблера
- •3.2. Команды передач данных
- •3.3. Арифметические команды
- •Лекция 6. Цепочечные команды
- •Лекция 7. Команды безусловной передачи управления
- •Лекция 8. Команды условной передачи управления
- •Лекция 9. Прерывания
- •Int n
- •Лекция 10. Флажковые команды
- •3.10. Команды синхронизации
- •3.11. Поддержка языков высокого уровня
- •3.12. Замечания о префиксах
- •3.13. Воздействие на флажки
- •Заключение
Лекция 10. Флажковые команды
Процессор 80286 имеет команды для установки и сброса флажка переноса (STC, CLC), флажка направления (STD, CLD) и флажка прерывания (STI, CLI). Имеется также команда инвертирования флажка переноса (CMC). Эти команды приведены в табл. 3.21. Мы уже рассматривали использование флажков процессора: флажок переноса предназначен для арифметики многократной точности, флажок направления - для обработки цепочек и флажок прерывания - для разрешения и запрещения прерываний.
|
Таблица 3.21 Операции над флажками |
| |
|
Мнемоника команды |
Описание команды | |
|
|
0 CF | |
|
|
1 – CF CF | |
|
|
1 CF | |
|
|
0 DF | |
|
|
1 DF | |
|
|
0 IF | |
|
|
1 IF | |
3.10. Команды синхронизации
Одним из средств синхронизации процессора с внешними устройствами являются прерывания, но в его архитектуре реализованы еще две формы синхронизации. Первая относится к использованию подчиненного процессора, выполняющего то, что не может делать процессор 80286, а вторая - к разделению ресурсов, например памяти, с другими процессорами в мультипроцессорной системе. Остановимся на этих формах подробнее.
Подчиненные процессоры. Хотя система команд процессора 80286 довольно мощная, в ней, конечно, нет множества команд, оперирующих, например, числами с плавающей точкой. Разумеется, можно написать
процедуру для сложения двух чисел с плавающей точкой, но намного эффективнее иметь команду сложения чисел с плавающей точкой. Еще лучше иметь отдельный процессор, способный выполнять операции над числами с плавающей точкой, и подчинить его процессору 80286. Имея такой процессор, можно включать в программу команды операций над числами с плавающей точкой; встретив такую команду, процессор 80286 будет вызывать для ее выполнения процессор с плавающей точкой. Такой процессор 80287 рассматривается в следующей главе.
Подчиненный процессор работает только во взаимодействии с процессором 80286. В частности, когда процессор 80286 встречает специальную команду ESC (эта мнемоника обозначает все команды, в которых процессору 80286 требуется помощь), он извещает подчиненный процессор. Команда ESC показывает, какую операцию должен выполнить подчиненный процессор (эту информацию процессор 80286 игнорирует). Но команда ESC задает для подчиненного процессора операнд в памяти. Эту информацию процессор 80286 использует: он вычисляет адрес памяти операнда, а затем считывает или записывает в память по запросу подчиненного процессора. (На самом деле взаимодействие между процессорами осуществляется несколько сложнее.)
Команда ESC применяется совместно с командой ожидания WAIT, обеспечивающей синхронизацию процессоров; с ее помощью процессор 80286 проверяет, когда подчиненный процессор заканчивает свою операцию. Когда подчиненный процессор работает, он выдает сигнал высокого уровня на своем выходе BUSY (занят), а команда WAIT приостанавливает процессор 80286, если он обнаруживает такой сигнал на выходе BUSY. Как и в цепочечных командах, команду WAIT разрешается прерывать до ее завершения. Подробнее о командах ESC и WAIT мы поговорим в гл. 4.
Разделение ресурсов. Еще одна форма синхронизации двух процессоров связана с разделением общего ресурса. Рассмотрим, например, систему резервирования авиабилетов, в которой несколько процессоров обращаются к общей базе данных, находящейся в разделенной памяти. Как мы покажем, база данных может быть испорчена, если двум процессорам разрешить модифицировать ее одновременно.
Предположим, что один из процессоров хочет изменить платеж Гарри Джонса за рейс 351 с кредитной карточки компании VISA на кредитную карточку компании American Express. Прежде всего процессор будет просматривать список пассажиров рейса 351 до тех пор, пока не обнаружит данные Гарри Джонса. После этого он запишет новую информацию в поле кредитной карточки этой записи. Предположим, что когда производится эта модификация, второй процессор занят проверкой кредитных карточек всех пассажиров. Когда этот процессор начинает заниматься Гарри Джонсом, он
может обнаружить часть старого номера и часть нового, потому что первый процессор еще не закончил корректировку. В результате компания, обслуживающая по кредитным карточкам, отвергнет такой неправильный номер.
Наверное, можно было бы решить проблему, если бы первый процессор изменял весь номер одной командой. Для этого лучше всего воспользоваться командой повторяющейся пересылки цепочки REP MOVS. Теперь вроде бы второй процессор не сможет считать неправильный номер, но только если он не попытается сделать это в середине команды REP MOVS первого процессора. Будьте уверены, что однажды это произойдет!
Т
аким
образом, изменение номера карточки в
одной команде решает проблему не
полностью, а просто уменьшает вероятность
ее возникновения. Что действительно
нужно сделать, чтобы процессор "Гарри"
запретил всем остальным процессорам
обращаться к разделенной памяти на
время выполнения им командыREP
MOVS?
В процессоре 80286 это обеспечивается
предшествующим команде префиксом
блокировки LOCK:
Такая команда заставит процессор выдать сигнал LOCK на все время выполнения команды. Теперь систему резервирования авиабилетов можно спроектировать так, чтобы дать исключительное право на доступ к памяти , любому процессору, выдавшему сигнал блокировки. Если никакой другой процессор не может обратиться к разделенной памяти, то он не сможет считать запись во время ее корректировки.
Рассмотрим еще один пример, в котором требуется выдавать сигнал блокировки. Пусть некоторый процессор хочет зарезервировать билет Уильяму Смиту на рейс 351. Она находит первую незанятую запись в списке пассажиров и с помощью команды пересылки цепочки помещает в нее информацию об Уильяме Смите. Предположим, что другой процессор хочет зарезервировать билет Роберту Грину. Он может найти ту же свободную запись (перед тем, как процессор "Смита" что-то туда запишет) и попытается поместить туда информацию о Роберте Грине. Неважно, какой процессор первым будет выполнять команду пересылки цепочки; главное заключается в том, что один из них "перезапишет" информацию другого. Здесь префикс LOCK перед командой пересылки цепочки не помогает.
К счастью, и такую ситуацию можно предотвратить, если воспользоваться семафором. Семафор - это просто ячейка памяти, которая сообщает процессору о том, что другой процессор работает с разделенной памятью, и заставляет первый процессор ожидать освобождения памяти. Рассмотрим, как работает
семафор. Любой процессор, желающий обратиться к разделенной памяти, вначале должен проверить семафор. Если семафор имеет значение 1, процессор вынужден ожидать освобождения памяти. Если же семафор имеет значение 0, процессор должен установить его значение в 1 (запрещая другим процессорам обращаться к памяти), модифицировать содержимое памяти нужным образом, а затем сделать значением семафора 0.
К
онечно,
теперь возникает проблема в том, что
оба процессора одновременно проверяют
семафор и обнаруживают его нулевое
значение. Оба процессора установят его
значение в 1 и оба попытаются одновременно
работать с разделенной памятью. Такую
ситуацию можно предотвратить, если
считывать значение семафора и устанавливать
его в 1 одной командой и выдавать на
время ее выполнения сигнал блокировки.
Такой командой оказывается команда
обменаXCHG,
используемая следующим образом:
С командой XCHG надо было бы указать префикс LOCK, чтобы на время ее выполнения действовал сигнал блокировки. Однако применение команды XCHG для установки и проверки семафоров настолько важно, что процессор 80286 автоматически выдает сигнал блокировки независимо от наличия или отсутствия префикса LOCK.

CLC
сбросить флажок переноса
CMC
инвертировать флажок переноса
STC
установить
флажок переноса
CLD
сбросит
флажок направления
STD
установить
флажок направления
CLI
сбросить флажок разрешения прерываний
STI
установить флажок разрешения прерываний