Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по архитектуре ЭВМ.doc
Скачиваний:
46
Добавлен:
02.05.2014
Размер:
238.59 Кб
Скачать

23.Команды ввода-вывода

Все устройства ЭВМ принято делить на внутренние и внешние. Внутренние устройства - это центральный процессор (ЦП) и оперативная память, а внешние -все остальные устройства (внешняя память, клавиатура, дисплей, принтер и т. д.). В широком смысле, под вводом-выводом понимается обмен информацией между ЦП и любым внешним устройством. При этом "отсчет" ведется от ЦП: ввод - это передача данных в ЦП из внешнего устройства, а вывод - передача данных из ЦП во внешнее устройство.

В ПК передача информации между ЦП и внешними устройствами, как правило, осуществляется через порты. Порт - это некоторый регистр размером в байт или слово, причем этот регистр находится вне ЦП и не имеет никакого отношения к обычным регистрам типа AX, SI и т. п. Вообще-то все порты являются байтовыми, но два соседних порта рассматриваются как порт размером в слово. Порты нумеруются, их номера - от 0 до 0FFFFh. Таким образом, потенциально может быть 65536 портов, однако реально их значительно меньше (несколько десятков). С каждым внешним устройством связан свой порт или несколько портов, их номера заранее известны.

Как ЦП, так и внешнее устройство может записывать информацию в порт и может считывать из него. Со стороны ЦП (а точнее, той программы, которую он выполняет) эти операции осуществляются с помощью следующих машинных команд:

Чтение из порта (ввод): IN AL,n или IN AX,n

Запись в порт (вывод): OUT n,AL или OUT n,AX

По команде IN в регистр AL(AX) переносится содержимое порта с номером n, а команда OUT реализует обратное действие: в порт с номером n записывается содержимое регистра AL(AX).

Номер порта (n) в этих командах может быть задан двояко - либо явным числом от 0 до 255, либо регистром DX, значение которого и трактуется как номер порта. Например:

IN AL,97h         ;AL:= порт 97h

MOV DX,836

OUT DX,AX     ;порт 836:=AX

Первый вариант операнда n используется, когда номер порта небольшой и известен заранее, а второй вариант - когда номер порта может быть любым или когда он становится известным только во время счета программы.

Сценарий ввода-вывода через порты существенно зависит от специфики того внешнего устройства, с которым ведется обмен, но достаточно типичным является следующий сценарий.

Часто ЦП связан с внешним устройством двумя портами: через один передаются данные - это порт данных, а через другой пересылается всякого рода управляющая информация - это порт управления. Когда ЦП (а точнее, программа, которую он выполняет) хочет начать обмен с каким-то внешним устройством, то он записывает в порт управления этого устройства определенную комбинацию битов, которая трактуется как призыв к установлению связи. Если устройство функционирует и не занято, то в ответ оно записывает в этот порт другую комбинацию битов, сигнализирующую о том, что оно готово к обмену. ЦП же, выждав определенное время, считывает информацию из порта и, если там оказался сигнал о том, связь установлена, начинает собственно обмен.

Пусть ЦП хочет что-то вывести. Тогда он записывает в порт управления комбинацию символов, трактуемую как команда "выводи", а в порт данных - выводимую величину (например, код символа). Внешнее же устройство, считав из портов эту информацию, записывает в порт управления сигнал "занято" и начинает собственно вывод (например, печатает символ на бумаге). В это время ЦП либо переходит в состояние ожидания, опрашивая (считывая) в цикле порт управления, либо занимается другой работой - до тех пор, пока в порте управления не сменится сигнал "занято". Когда внешнее устройство закончит вывод, то оно записывает в этот порт сигнал об успешном завершении своей работы или сигнал об ошибке (например, порвалась бумага в принтере). Далее ЦП продолжает свою работу (например, осуществляет следующую операцию обмена) или как-то реагирует на сбой в работе устройства.

Осуществлять подобным образом ввод-вывод в каждой программе - занятие трудоемкое. Оно требует знания многих технических деталей - номеров портов, управляющих сигналов и сигналов ответа, порядка опроса портов и т. п., причем эта информация различна для разных внешних устройств. А, кроме того, в каждой новой программе приходится заново описывать все действия, связанные с вводом-выводом, что, конечно, накладно. В то же время в большинстве программ используются, в общем-то, одни и те же операции ввода-вывода. Учитывая все это, поступают так: один раз описываются часто используемые операции ввода-вывода, которые скрывают всю "кухню" работы с портами, и эти операции включают в состав операционной системы (ОС), постоянно находящейся в ОП, чтобы ими могла пользоваться любая программа, выполняемая на ЭВМ. Такой способ существенно упрощает жизнь программистов, поэтому обычно используют только эти операции и не пользуются портами напрямик. С портами работают лишь тогда, когда надо реализовать какой-нибудь необычный, экзотический ввод-вывод.