Жанр: Учеба
Программно-аппаратная организация компьютера IBM PC
...ывания заканчивается, программа обработки
возвращает управление программе, которая выполнялась в момент
возникновения прерывания, с помощью специальной команды IRET или "возврат
из прерывания". Чтобы такой возврат мог быть выполнен, необходимо
сохранить в стеке текущие адреса программы до загрузки в регистры CS и IP
вектора прерывания.
Концепция прерывания была разработана для практического решения
проблемы взаимодействия компьютера с внешним миром. Однако, тем не менее
вскоре оказалось, что прерывания не менее полезны для организации
внутренней работы компьютера. Это привело к разработке трех типов
прерываний, которые получили названия аппаратных, логических и
программных. Между ними нет принципиальной разницы, однако их
использование разделит их на три отдельных категории.
Аппаратные прерывания мы уже рассмотрели - они вырабатываются
устройствами, требующими внимания процессора. В IBM/PC таких прерываний на
удивление мало. Во-первых, имеется так называемое немаскируемое
прерывание, используемое для сообщения об отказе питания, оно имеет номер
2. Далее, прерывание 8 используется таймером, номер 9 - клавиатурой и 14 -
контролером гибких дисков, всего четыре аппаратных прерывания. Имеется
также семь зарезервированных номеров прерываний, 6, 7, с 10 по 13 и 15,
которые могут быть использованы в дальнейшем, если возникнет необходимость
в дополнительных аппаратных прерываниях. Два из этих семи прерываний уже
нашли свое назначение, прерывание 12 зарезервировано для адаптера связи, а
прерывание 15 - для интерфейса устройства печати.
Логические прерывания формируются самим процессором 8088, когда он
встречает какое-либо необычное условие. Таких прерываний предусмотрено
четыре. Прерывание 0 возникает при попытке деления на ноль. Прерывание 1
используется для управления пошаговым режимом работы микропроцессора, при
котором команды выполняются по одной. Это прерывание выставляется
отладчиками для пошагового выполнения программ. Прерывание 3
вырабатывается командой установки "контрольных точек", которая также
используется при отладке. Прерывание 4 формируется при возникновении
условия переполнения, например, если результат арифметической операции не
помещается в регистр. Таким образом, четыре логических прерывания
распадаются на две пары: одна для арифметических операций (деление на ноль
и переполнение) и вторая для отладки программ (шаговый режим и контрольные
точки).
Наиболее интересны программные прерывания. Если программа должна
воспользоваться услугами другой программы, она должна передать управление
этой процедуре. Обычно это делается с помощью команды CALL. Для вызова
процедуры программа должна знать ее адрес, а вызываемая процедура может не
знать адреса вызывающей программы, поскольку механизм вызова автоматически
генерирует адрес возврата, который будет использован вызываемой программой
после завершения ее выполнения. Образно говоря, для перехода к
подпрограмме и возврата из нее достаточно купить билет в один конец -
обратный билет предоставляется бесплатно. Идея организации программных
прерываний должна позволять свободный переход и в прямом и в обратном
направлении, то есть иметь возможность вызвать подпрограмму и получить
управление обратно после ее завершения, так чтобы ни одна из сторон не
могла не знать о местонахождении (адресе) другой.
Программные прерывания обеспечивают такую возможность путем выработки
прерывания самой программой. Например, если программе необходимо вычислить
время дня, ей совершенно не требуется знать адрес программы подсчета
времени - достаточно знать только, что программа подсчета времени дня
запускается программным прерыванием 26.
Программные прерывания используются для вызова всех служебных
функций, представляемых обычным пользователям. Эти функции включают все
процедуры системы BIOS и ПЗУ и служебные процедуры ДОС. Программные
прерывания используются вместо непосредственных адресов по двум причинам.
Наиболее важная причина состоит в обеспечении возможности изменения
служебных процедур, вызываемых с помощью прерываний. Изменение процедуры
обычно приводит к изменению ее размера и размещения в памяти. Если
процедура вызывается с помощью прерывания, то использующие ее программы не
требуется изменять, когда изменилась процедура.
Другая причина использования программных прерываний для вызова
процедур связана с возможностью их замены. Рассмотрим пример. Как Вы
узнаете из главы 8, служебные процедуры для обслуживания дисплея выдают
звуковой сигнал с помощью динамика IBM/PC, каждый раз когда выдается код
CHR$(7). Предположим, что Вам необходимо подавить выдачу звукового
сигнала. Для этого можно написать программу, которая будет проверять какие
символы выдаются на экран и при появлении кода CHR$(7) заменяет его
пробелом. После окончания проверки эта программа должна передавать
управление обычной процедуре обслуживания дисплея.Фактически, нужно
сделать небольшое добавление перед стандартной процедурой обслуживания
дисплея. Чтобы задействовать эту программу необходимо заменить вектор
прерывания дисплея (прерывание 16) адресом Вашей программы.
Программные прерывания очень важны для работы IBM/PC. Большая часть
этой книги будет посвящена их более подробному описанию. В главе 4
описываются прерывания системы BIOS в ПЗУ. Чтобы Вы могли извлечь
максимальную пользу из этих системных функций, пакет программ, прилагаемый
к данной книге, содержит полный набор интерфейсных процедур, как
ассемблерных, позволяющих осуществлять доступ к служебным процедурам по
прерыванию из любых языков программирования (включая Бейсик и Паскаль),
так и вспомогательных процедур на Паскале, существенно облегчающих
использование ассемблерных процедур.
Прежде чем завершить рассмотрение прерываний, необходимо упомянуть
еще об одном необычном применении таблицы векторов прерываний. Таблица
векторов прерываний, располагающаяся в самом начале оперативной памяти,
предназначенная для хранения полных сегментированных адресов программ,
которые должны обслуживать соответствующие прерывания. Однако, в IBM/PC
использование таблицы векторов несколько шире. Хотя считается, что таблица
должна хранить только адреса программ, разработчики IBM/PC сочли ее очень
удобным местом для хранения адресов трех элементов, которые вовсе не
являются программами. Это адреса очень важных системных данных. Идея
заключается в том, чтобы использовать таблицу векторов прерываний в
качестве унифицированного хранилища важных сегментированных адресов - в
первую очередь, конечно, адресов программ, но, если необходимо, то и
данных. Таким образом, три номера прерываний, 29, 30 и 31 не используются
и соответствующие им вектора в таблице обнуляются, чтобы подготовить место
для хранения адресов трех важных таблиц данных. Естественно, что эти
номера прерываний не могут использоваться: если программа запросит
прерывание с номерами 29, 30 или 31, то управление будет передано в одну
из таблиц данных, которая начнет выполняться как программа.
В главе 6 мы более подробно рассмотрим ПЗУ и установим, что это за
таблица. Затем мы рассмотрим их по одной, в главах 7, 8, 9.
3.6. СТЕК
Стеки - это наиболее интересные и полезные средства современных
компьютеров. Вместе с прерываниями стеки обеспечивают эффективность работы
компьютеров.
Что такое стек? Стек - это место, в котором компьютер хранит рабочие
величины, так что один набор величин никогда не смешивается с другим
набором.
Стек получил свое имя благодаря метафоре, которую часто используют
для описания его работы. Представьте себе стопку тарелок, например, таких
которые используются в кафетериях, где тарелки находятся на подпружиненной
платформе, перемещающейся вверх и вниз. Если нужно добавить в стопку
(по-английски stack) чистые тарелки, которые были в стопке, опускаются
вниз. Когда кто-нибудь снимает тарелку сверху, вся стопка поднимается
вверх. Тарелки используются по принципу "последним вошел - первым вышел".
Когда компьютер занят работой и поступает прерывание, необходимо
место для того, что бы заполнить состояние компьютера до начала обработки
прерывания. Если еще одно прерывание поступит в процессе обработки
первого, то необходимо запомнить и эту информацию. Когда обслуживание
второго прерывания завершится, компьютер должен вернуться к выполнению
своей последней перед прерыванием работы, в данном случае к обслуживанию
первого прерывания. Для обслуживания прерываний и для многих других
операций, которые должны выполняться по принципу перехода к последней из
отложенных операций, наиболее естественным средством для запоминания
состояния компьютера будет стек.
Организация стека в IBM/PC основана на выделении под стек
определенной области оперативной памяти и использовании специального
регистра сегмента стека, SS, указывающего адреса этой области памяти.
Вершина стека указывается содержимым специального регистра, называемого
указателем стека SP. Стек компьютера, в отличие от подпружиненной стопки
тарелок, не перемещается физически, а остается на месте. Зато изменяется
адрес вершины стека, указываемый содержимым регистра SP.
Данные помещаются в стек компьютера операцией PUSH, извлекаются
операцией POP.
Когда возникает прерывание, адрес текущей программы, хранящийся в
регистрах CS и IP, помещается в стек, затем адрес процедуры обслуживания
прерывания загружается в эти регистры и начинается выполнение данной
процедуры. До ячейки, указываемой регистром SP (указателем стека),
хранятся данные всей предыдущей работы, ожидающей своего возобновления. За
указателем стека находится свободное пространство стека, которое может
использоваться процедурой обслуживания прерывания, если ей требуется
дополнительная рабочая область. Если возникнет еще одно прерывание, новая
процедура обслуживания найдет для себя свободную область в стеке несколько
дальше.
Когда завершается очередная процедура, она освобождается. Сначала из
стека извлекаются все рабочие значения, а затем извлекается адрес точки
приостанова предыдущей процедуры, который загружается в регистры CS и IP.
В процессе выполнения всех этих действий механизм работы со стеком
автоматически поддерживает последовательность их выполнения. Стеки
используются не только для обслуживания прерываний, но и при вызовах одних
программ другими. Как при вызовах, так и при обслуживании прерываний
принцип один: выполнявшаяся работа должна быть запомнена на время,так что
бы можно было начать новую. Когда новая работа будет завершена, необходимо
вернуться к выполнению старой в порядке, обратном тому в котором работа
приостановлена.
При вызове подпрограмм часто возникает необходимость передавать им
параметры, что можно сделать с помощью стека. В третьем приложении к этой
книге описывается стыковка программ на Паскале с программами на ассемблере
и там можно увидеть, как стек используется для передачи параметров.
Стеки настолько существенны для работы компьютеров, что можно только
удивляться их относительно недавнему включению в конструкцию компьютеров.
Серия компьютеров 360, которая являлась основной продукцией фирмы "IBM"
начиная с 1960-тых годов, не реализовывала концепцию стека, что сильно
отразилось на возможностях всей этой серии. Существует красивая легенда о
том, что руководитель, исключивший стековую архитектуру из конструкции
компьютеров фирмы "IBM", был в последствии "сослан" во внутрифирменный
аналог Сибири.
Использование стеков может быть гораздо шире, чем описывалось выше.
Микропроцессор 8088 использует стек только для хранения контекста
приостановленных программ. Для этой же цели стек использует большинство
компьютеров. Можно, однако, полностью переориентировать способ работы
компьютера с командами и данными, так что все будет основываться на
использовании стека. Такая архитектура, ориентированная на использование
стека, была разработана фирмой "Барроуз" и все, кто хочет понять на
сколько радикально может отличаться компьютер с такой архитектурой, от
обычных компьютеров, подобных IBM/PC, может обратиться к описаниям
компьютеров фирмы "Барроуз".
Имеется одна подробность в использовании стека микропроцессором 8088,
о которой необходимо знать, если Вам потребуется воспользоваться
содержимым стека или проверить рабочий стек. Стек продвигается от верхних
адресов памяти к нижним. Это означает , что старое содержимое стека имеет
большие абсолютные адреса памяти, чем указатель стека SP. Так, например,
чтобы извлечь параметры подпрограммы, помещенные в стек, используются
положительные смещения (это описано в 3 приложении к этой книге). Что
касается свободной части стека, к которой обычно обращаются только
командами записи или извлечения из стека, а не по прямому адресу памяти,
то для нее потребовалось бы отрицательное смещение относительно указания
стека.
3.7. Порт
Под портом понимают совокупность средств унифицирующих и упрощающих
способ взаимодействия микропроцессора 8088 с внешним миром. Порт
обеспечивает единственную возможность приема или передачи данных любым
обьектам кроме памяти.
Всем устройствам, с которыми должен взаимодействовать процессор,
таким как клавиатура, дисководы или динамик, выделяется собственный порт.
Порт представляет собой гипотетический путь данных, которому присвоен
номер порта и который может принимать или передавать данные по команде
процессора. Когда микропроцессор 8088 должен передавать данные в порт,
используется команда OUT, которой указывается номер порта и передаваемые
данные,имеющие длину один или два байта. Фактически команда OUT
приказывает конкретному порту принять данные. Команда IN работает
аналогично, только данные считываются из порта. Микропроцессор 8088 не
может определить какие порты задействованы, а какие нет, так что все
команды IN и OUT выполняются вслепую.
Операторы Бейсика обеспечивают прямой доступ к портам. Операторы
Бейсика INP и OUT предоставляют те же возможности, что и машинные команды
IN и OUT. Ниже, просто для примера, приведен фрагмент программы на
Бейсике, работающей с динамиком:
10 X=INP(97) `чтение порта управления динамиком X
20 REM вероятно будет иметь значение 76 - проверьте какое
значение Вы получите
30 OUT 97,X+3 `установить биты управления динамиком- прозвучит сигнал
40 OUT 97,X `снять биты управления - окончание звука
Порты могут использоваться в сочетании с прерываниями. Например,если
нажать клавишу на клавиатуре IBM/PC, никакие данные в компьютер не
передаются. Вместо этого генерируется прерывание номер 9, указывающий, что
имеются данные, которые нужно вводить с клавиатуры. В ответ на прерывание
BIOS в ПЗУ выдаст команду IN для порта клавиатуры. Только после этого
данные, определяющие какая клавиша была нажата, попадут в компьютер.
В случае с памятью может существовать до 1024К различных ячеек,
причем компьютер не знает, какие именно адреса действительно имеются. То
же самое касается и портов - микропроцессор 8088 может обращаться к порту
с любым допустимым номером, не зная, работает ли этот порт или нет.
Адреса портов задаются 16 разрядами, так что потенциально можно иметь
64К различных портов. В действительности используется гораздо меньше
номеров и, следовательно, имеются неограниченные возможности для
расширения.
Имеется несколько способов использования портов в IBM/PC. Первый
способ - это использование порта просто как пути данных. Например, коды
клавиш, указывающие какая из клавиш была нажата, проходят через один порт;
данные, выдаваемые на устройство печати, проходят через другой порт.
Еще один способ использования портов заключается в передаче через них
управляющей информации для внешних устройств и получении от этих устройств
информации о состоянии. Например, инициализация адаптера монохромного
дисплея выполняется через порт 952. Еще одно назначение портов заключается
в считывании положений переключателей в системном блоке, указывающих
конфигурацию системы.
Ниже перечисляются некоторые наиболее важные применения портов. Как и
некоторые подробности организации аппаратных средств, описанные в главе 2,
номера конкретных портов могут не представлять интереса для читателя, но я
привожу их полностью просто для полноты изложения.
Порт 96 (шестнадцатиричное 60) используется для передачи данных в
формате порядковых номеров, от клавиатуры. При описании клавиатуры в главе
10 мы рассмотрим форматы номеров и их использование более подробно.
Порт 97 (61(16)) используется для управления встроенным динамиком, а
также двигателем кассетного механизма. Он также позволяет запустить
аппаратный таймер, что более подробно мы рассмотрим в главе 11.
Порты с 64 по 67 (40(16)-43(16)) используются для управления
программируемым таймером, используемым как динамиком, так и интерфейсом
кассетного накопителя. О том, как используются все эти порты, будет
рассказано в главе 11.
Монохромный дисплей использует несколько последовательных портов,
начиная с порта 944(3В0(16)), а цветной графический - последовательность,
начинающуюся с порта 976(3D0(16)). Контролер гибких дисков использует
последовательность портов, начиная с порта 1008(3F0(16)), а собственно
данные, записываемые на дискету или считываемые с нее, передаются через
порт 1013(3F5(16)).
Вместе с программой 3.1 для исследования конфигурации памяти,
листинги 3.2 и 3.3 показывают программу, объединяющую модули, написанные
на Паскале и на ассемблере, которая считывает все порты и сообщает о том,
какие из них наиболее вероятно активны. Готовая к запуску версия этой
программы имеется на дискете, прилагающейся к этой книге. В отличие от
программы обследования памяти эта программа не дает достаточно практичного
результата, однако, она может оказаться довольно интересной.
Поскольку Бейсик обеспечивает доступ к портам, эту программу можно
было бы написать на Бейсике, но тогда для читателя не было бы в ней ничего
нового. Вместо этого приведенный пример может послужить хорошим введением
в программирование на ассемблере, Паскале и примером объединения программ,
написанных на разных языках.
Приложение 3.1. Текст программы поиска активного участка памяти
(Бейсик).
1000 REM
1010 REM
1020 REM
1030 GOSUB 2000 ' TITLE
1040 GOSUB 3000 ' SEARCH AND DISPLAY
1050 GOSUB 4000 ' RETURN TO DOS
2000 REM
2010 KEY OFF : CLS : WIDTH 80
2020 REM
2030 PRINT "
2040 PRINT "
2050 PRINT
2060 PRINT "
2070 PRINT
2080 PRINT "
2090 PRINT "
2100 PRINT
2999 RETURN
3000 REM
3010 TRUE.% = -1
3020 FALSE.% = 0
3030 IN.MEMORY.% = FALSE.%
3040 FOR PARAGRAPH.! = 0 TO 65535! STEP 64 ' CHECK EACH 1K OF MEMORY
3050 GOSUB 5000 ' CHECK FOR ACTIVE MEMORY
3060 IF (IN.MEMORY.%=FALSE.%) AND (MEMORY.HERE.%=TRUE.%) THEN GOSUB
Посмотри в окно!
Чтобы сохранить великий дар природы — зрение,
врачи рекомендуют читать непрерывно не более 45–50 минут,
а потом делать перерыв для ослабления мышц глаза.
В перерывах между чтением полезны
гимнастические упражнения: переключение зрения с ближней точки на более дальнюю.
6000
3070 IF (IN.MEMORY.%=TRUE.%) AND (MEMORY.HERE.%=FALSE.%) THEN GOSUB
3080 IN.MEMORY.% = FALSE.%
3090 IF MEMORY.HERE.% THEN IN.MEMORY.HERE.% =TRUE.%
3100 NEXT PARAGRAPH.!
3110 IF IN.MEMORY.% THEN PARAGRAPH.! = 65536 : GOSUB 7000
3999 RETURN
4000 REM
4010 PRINT
4020 PRINT "Finished."
4999 SYSTEM
5000 REM
5010 DEF SEG = PARAGRAPH.!
5020 BYTE0.% = PEEK (0)
5030 BYTE1.% = PEEK (1)
5040 BYTE2.% = PEEK (2)
5050 BYTE3.% = PEEK (3)
5060 CHECK.COUNT.% = 0
5070 IF BYTE0.% = 233 THEN CHECK.COUNT.% = CHECK.COUNT.% + 1
5080 IF BYTE1.% = 233 THEN CHECK.COUNT.% = CHECK.COUNT.% + 1
5090 IF BYTE2.% = 233 THEN CHECK.COUNT.% = CHECK.COUNT.% + 1
5100 IF BYTE3.% = 233 THEN CHECK.COUNT.% = CHECK.COUNT.% + 1
5110 MEMORY.HERE.% = FALSE.%
5120 IF CHECK.COUNT.% <= 3 THEN MEMORY.HERE.% = TRUE.%
5999 RETURN
6000 REM
6010 IN.MEMORY.% = TRUE.%
6020 START.! = PARAGRAPH.!
6999 RETURN
7000 REM
7010 SIZE.! = (PARAGRAPH.!-START.!) * 16
7020 IF SIZE.! < 8 * 1024 THEN 7999 ' SDUPPRESS SMALL-BLOCK FALSE
REPORTS
7030 PRINT "Active memory begins at ",
7040 PRINT HEX$(START.!)
7050 PRINT " ends at ",
7060 PRINT HEX$(PARAGRAPH.!-1);
7070 PRINT SIZE.! / 1024;"K-bytes"; ("SIZE.!;"bytes )"
7080 IN.MEMORY.% = FALSE.%
7090 PRINT
7999 RETURN
9999 REM
Приложение 3.2. Текст программы обработки прерываний (Ассемблер).
beepseg segment 'code'
assume cs:beepseg
beep proc far
cli
mov bx,3000
in al,61h
push ax
more: and al,0fch
out 61h,al
mov cx,50
11: loop 11
or al,2
out 61h,al
mov cx,50
12: loop 12
dec bx
jnz more
pop ax
out 61h,al
sti
int 20h
beep endp
beepseg ends
end
Приложение 3.3. Текст программы поиска активных портов (Паскаль).
program porttest (output);
function inport (x : word) : byte;
external;
var
count : word;
b : byte;
w : word;
c : array [wrd(0)..255] of word;
headc : word;
procedure header1;
var [static]
i : integer;
begin
writeln;
for i := 1 to 8 do
write (' Port Val');
writeln;
end;
procedure header2;
var [static]
i : integer;
begin
writeln;
for i := 1 to 8 do
write (' Val Count');
writeln;
end;
procedure initialise;
begin
count := 0;
headc := 0;
for b := 0 to 255 do
c[b] := 0;
for w := 1 to 25 do
writeln;
writeln('Program for INSIDE THE IBM PERSONAL COMPUTER');
writeln('(C) Copyright Peter Norton, 1983');
writeln('Listing 3.3: PORTTEST - read all ports');
writeln;
writeln('The following may be active ports:');
header1;
end;
procedure scan_all_ports;
begin
for w:=0 to maxword do
begin
b:=inport(w);
c[b]:=c[b]+1;
if not(b in [wrd(0),78,110,188,202,203,207,254,255])
then
begin
write(w:6,b:4);
count:=count+1;
headc:=headc+1;
if headc>159 then
begin
headc:=0;
header1;
end;
end;
end;
header1;
end;
procedure finish_up;
begin
writeln;
writeln('Here is a profile of the values returned for ',
all of the possible ports:');
header2;
for b:=0 to 255 do
write(b:4,c[b]:6);
header2;
writeln(count,' ports may possibly be active');
writeln;
writeln('Finished.')
end;
begin
initialize;
scan_all_ports;
finish_up
end.
Приложение 3.4. Текст программы считывания данных из порта
(Ассемблер).
inport_code segment 'code'
public inport
inport proc far
push bp
mov bp,sp
mov dx,[bp+6]
in al,dx
pop bp
ret 2
db '(C) Copyright Peter Norton, 1983'
inport endp
inport_code ends
end
В этой главе будет кратко рассмотрена система ДОС, основная
операционная система IBM/PC. Мы не будем слишком подробно рассматривать
ее, частично потому что ДОС может составить достаточный предмет для
нескольких книг сама по себе, а частично потому, что эта книга в основном
посвящена внутренней организации IBM/PC, а не организации ДОС.
Но все же, поскольку ДОС очень широко используется на IBM/PC,
необходимо иметь определенные представления об ее организации. Так как
основное внимание в этой книге уделяется наиболее сложным возможностям
IBM/PC, мы покажем как осуществляется доступ к этим возможностям с помощью
средств операционной системы ДОС.
Здесь тесно соприкасаются все три упоминавшиеся выше области
интересов. Практически все, о чем пойдет речь в данной главе, относится к
IBM/PC, совместимым с ней компьютерам, а также к компьютерам, работающим
под управлением МS-DOS.
4.1. Для чего нужны операционные системы?
Чтобы полностью овладеть всеми возможностями своего компьютера,
необходимо понимать его операционную систему. Предлагаемый в этой главе
краткий обзор позволит Вам понять, что собой представляет ДОС. Слишком
подробных знаний Вы не приобретете, но ознакомление с этой главой позволит
Вам начать с ней работать.
Назначение операционной системы заключается в обеспечении удобства
управления компьютером. Операционная система, в полном смысле этого
термина, является первой и наиболее важной программой любого компьютера.
Как правило, она является и наиболее сложной. Паразительно, что наиболее
совершенные программы используются только для управления самим
компьютером. Ирония здесь заключается в том, что компьютеры и программы
для них разрабатывались для выполнения полезной работы, а не как самоцель.
Но с другой стороны, наиболее мощный инструмент, созданный человеком,
компьютер, имеет достаточно возможностей, чтобы работать сам по себе и
человек не смог бы управлять им, если бы не операционная система.
Большая часть работы операционной системы заключается в том, чтобы
скрыть от пользователей некоторые сложные и ненужные им детали. В качестве
илл
...Поділитися у соцмережах