памяти. Выполнение той же самой программы в системе с цветным графическим
монитором также обнаруживают 32К памяти, хотя реально используется всего
16К.
После памяти адаптера дисплея программа обнаруживает ПЗУ, занимающее
верхние адреса памяти. В этом последнем блоке программа обнаруживает ровно
столько байт, сколько в нем действительно имеется.
Программа 3-1: Найти и отобразить активную память Потерпите -
выполнение этой программы занимает 65 сек (Адреса начала сегментов
приведены в шестнадцатиричном виде)
Активная память начинается с 0
заканчивается 8FFF 576К байт
(589824 байта)
Активная память начинается с B000
заканчивается B7FF 32К байт
(32768 байта)
Активная память начинается с F000
заканчивается FFFF 64К байт
(65536 байт)
Конец работы
Рис 3.4. Результат работы программы 3.1
Хотя программа 3.1 интересна и сама по себе, для исследования памяти
Вашей систем, но она также может послужить хорошим примером тех
возможностей, которые откроются перед Вами, когда Вы досконально изучите
компьютер. Фирма "IBM" не сообщает, что Бейсик считывает из отсутствующей
памяти именно значение 233, и никто не объяснял мне, как проверять память.
Однако, имея интерес и некоторую настойчивость в исследованиях, я написал
программу, приведенную в конце главы, листинг 3.1. Именно к такой работе я
Вас и призываю. Изучайте Вашу систему, исследуйте все детали - и тогда Вы
приобретете глубокие познания о принципах работы IBM/PC.
Кстати, следует заметить, что эта программа может дать странные
результаты, если используются платы памяти, изготовленные не фирмой "IBM".
Это еще один признак, позволяющий больше узнать о Вашей системе.
3.4. Сверхоперативная память - регистры
Помимо памяти, для временного хранения данных микропроцессор 8088
использует еще и регистры, что существенно ускоряет работу. Сейчас мы
кратко рассмотрим использование регистров.
Наиболее полное писание регистров можно найти в руководствах по
системе команд и языку ассемблера микропроцессора 8076. В данном разделе
содержится достаточно сведений для того, чтобы Вы не терялись, встретив
упоминание названий регистров в любом контексте.
Микропроцессор имеет четыре шестнадцатиразрядных регистра общего
назначения, называемых AX, BX, CX и DX. Каждый из них может быть разделен
на два восьмиразрядных регистра, указанием старшей (H-high) или младшей
(L-low) части полного (X) регистра. Таким образом, восьмиразрядные
регистры называются AH, AL, BH, BL, CH, CL, DH и DL. Поскольку
восьмиразрядные регистры непосредственно связаны с 16-разрядными, операция
записи шестнадцатиричной величины ABCD в регистр AX эквивалентна записи
величины AB в регистр AH и величины CD регистр AL.
Хотя все эти регистры имеют общее назначение, каждый из них имеет
определенную специализацию. Например, если некоторая операция должна
повторяться несколько раз, то регистр содержит счетчик повторений.
Мы уже упоминали четыре регистра для сегментированной адресации:CD
для кодового сегмента, DS для сегмента данных, SS для сегмента стека и ES
для дополнительного сегмента. Относительная часть сегментированного адреса
может храниться в любом регистре и использоваться вместе с сегментной
частью, которая должна находиться в одном из регистров сегментов. Текущий
адрес в выполняемой программе образуется содержимым регистров IP (счетчик
команд) и CS. Текущий адрес в стеке образуется содержимым регистра
указателя стека (SP) и регистра сегмента SS.
Для адресации данных вместе с регистром сегмента DS могут
использоваться разные регистры. Часто для этой цели служит регистр DX. Два
специальных регистра, DI и SI также используются совместно с регистром DS.
При работе со строками байт, регистры SI и DI используются для хранения
индексов исходной и приемной строк относительно регистра DS. Регистр
указателя базы (BP) может использоваться в качестве адреса относительно
регистра SS.
3.5. На что необходимо обратить внимание - прерывания
Компьютер должен обладать способностью реагировать на события,
происходящие вне его микропроцессора, например, чтобы воспринимать
информацию, вводимую с клавиатуры. Существует два способа организации
такой реакции.Один способ состоит в постоянном ожидании события. Такой
способ называется "сканированием" или "опросом" и такой опрос может
занимать большую часть времени компьютера. Другой способ позволяет
компьютеру спокойно выполнять свою работу, пока не произойдет событие,
требующее его внимания. Такой подход называется использованием
"прерываний". использование прерываний позволяет наиболее эффективно
организовать работу компьютера, поскольку время центрального процессора не
расходится вхолостую на ожидание.
Какие примеры прерываний можно было бы привести? Например, прерывание
возникает, когда Вы нажимаете клавишу на клавиатуре. Другое прерывание
вырабатывает таймер, встроенный в IBM/PC. Таймер прерывает работу
микропроцессора 8088 восемнадцать раз в секунду. Операционная система
ведет отсчет времени дня просто подсчитывая эти прерывания таймера; время
дня можно вычислить по количеству прерываний таймера после последней
полуночи. Еще один вид прерываний формирует контроллер гибких дисков,
сообщая процессору, что очередная дисковая операция наконец завершилась.
Поскольку эти операции значительно медленнее чем работа самого
микропроцессора, выгода состоит в том, что процессор может не ждать
завершения дисковой операции и продолжать вычисления до тех пор, пока
контроллер выработает прерывание, указывающее что операция завершена.
Основная идея прерываний заключается в том, что все требующее
внимания процессора, должно сообщать ему о себе в форме прерывания.
Использование прерываний дает огромные преимущества. Если ничто не требует
внимания процессора, - а так обстоит дело большую часть времени, - то
процессор не тратит времени на проверку наступления событий, требующих его
вмешательства. С другой стороны, если возникает событие, требующее
внимания немедленно, оно немедленно и будет обслужено, поскольку
прерывания обычно обслуживаются сразу же после их возникновения.
Иногда бывает необходимо, чтобы работа процессора не прерывалась,
например, при выполнении какой-либо критичной операции. Для этого у
микропроцессора 8088 имеется специальная команда, которая позволяет
отложить обслуживание прерываний, запоминая их, и парная ей команда,
восстанавливающая нормальный режим обслуживания прерываний. Когда
прерывания запрещаются запрос прерываний не теряется - он запоминается и
будет обслуживаться, как только будут разрешены прерывания.
Обычно прерывания не запрещаются на сколько-нибуть продолжительное
время. Прерывания допустимо запрещать лишь на очень короткие промежутки
времени, необходимые для выполнения некоторых внутренних операций
процессора, состоящих из небольшого числа команд. Типичным примером таких
операций, которые не могут быть прерваны на полпути, может служить
загрузка нового набора значений в регистры сегментов. Поскольку эти
регистры необходимы для правильной работы любой программы, нарушение
согласованности загрузки в них значений может привести к полной
неразберихе, поэтому необходимо запретить прерывания на время загрузки в
них новых адресов.
Чтобы привести небольшой пример того, к чему может привести запрет
прерываний, рассмотрим две программы, названные BEEP и WARBLE. Если у Вас
есть пакет программ, прилагающийся к этой книге, Вы найдете в нем обе эти
программы, готовые к использованию. С помощью макроассемблера можно
получить эти программы из ассемблерного листинга 3.2, приведенного в конце
главы. Обе программы: BEEP и WARSLE, генерируют звуки с помощью динамика
IBM/PC. (О том как генерируются звуки будет рассказано в главе 11.) Каждая
из программ генерирует чистый непрерывный звук в одной тональности, но
программа WARBLE не запрещает прерывания. Поэтому она прерывается таймером
восемнадцать раз в секунду и хотя прерывания обслуживаются очень быстро,
звук получается вибрирующим. Программа BEEP запрещает прерывания и дает
непрерывный звук. Запустите обе программы и Вы почувствуете результат
запрета прерываний.
Механизм прерывания работает следующим образом: каждому из основных
типов прерываний присвоен свой номер. Например, прерывание таймера имеет
номер 8, гибкие диски, используют номер 14. В самом начале оперативной
памяти IBM/PC хранится таблица с адресами программ, которые должны
вызываться при возникновении различных прерываний. Эти адреса должны быть
полными сегментированными адресами, так что они занимают по два слова или
по четыре байта каждый. Эти адреса иногда называются векторами прерываний.
Прерывание с номером 0 имеет вектор, хранящийся в ячейке с нулевым
адресом, прерывание ! имеет свой вектор в ячейке 4 и так далее. Когда
происходит прерывание номер "X", вектор, хранящийся по адресу 4X,
загружается в регистры адреса программы, т.е., регистры CS и IP,и
компьютер начинает выполнять программу обслуживания прерывания, которая
размещается по этому адресу.
Когда обработка прерывания заканчивается, программа обработки
возвращает управление программе, которая выполнялась в момент
возникновения прерывания, с помощью специальной команды IRET или "возврат
из прерывания". Чтобы такой возврат мог быть выполнен, необходимо
сохранить в стеке текущие адреса программы до загрузки в регистры CS и IP
вектора прерывания.
Концепция прерывания была разработана для практического решения
проблемы взаимодействия компьютера с внешним миром. Однако, тем не менее
вскоре оказалось, что прерывания не менее полезны для организации
внутренней работы компьютера. Это привело к разработке трех типов
прерываний, которые получили названия аппаратных, логических и
программных. Между ними нет принципиальной разницы, однако их
использование разделит их на три отдельных категории.
Аппаратные прерывания мы уже рассмотрели - они вырабатываются
устройствами, требующими внимания процессора. В IBM/PC таких прерываний на
удивление мало. Во-первых, имеется так называемое немаскируемое
прерывание, используемое для сообщения об отказе питания, оно имеет номер
2. Далее, прерывание 8 используется таймером, номер 9 - клавиатурой и 14 -
контролером гибких дисков, всего четыре аппаратных прерывания. Имеется
также семь зарезервированных номеров прерываний, 6, 7, с 10 по 13 и 15,
которые могут быть использованы в дальнейшем, если возникнет необходимость
в дополнительных аппаратных прерываниях. Два из этих семи прерываний уже
нашли свое назначение, прерывание 12 зарезервировано для адаптера связи, а
прерывание 15 - для интерфейса устройства печати.
Логические прерывания формируются самим процессором 8088, когда он
встречает какое-либо необычное условие. Таких прерываний предусмотрено
четыре. Прерывание 0 возникает при попытке деления на ноль. Прерывание 1
используется для управления пошаговым режимом работы микропроцессора, при
котором команды выполняются по одной. Это прерывание выставляется
отладчиками для пошагового выполнения программ. Прерывание 3