Показаны сообщения с ярлыком Прерывания. Показать все сообщения
Показаны сообщения с ярлыком Прерывания. Показать все сообщения

Прерывание 10h: службы ROM BIOS для видеодисплея

воскресенье, 25 апреля 2010 г. Автор: Vadim 0 коммент.

 

Все видеослужбы ROM BIOS запрашиваются с помощью прерывания 10h (в десятичной нотации 16). Имеется 25 основных служб, предоставляемых данным прерыванием. Подобно всем другим службам ROM BIOS видеослужбы нумеруются, начиная с 00h, и выбираются с помощью занесения номера службы в регистр AH. Обычно при работе с этими службами требуется задавать дополнительные параметры в регистрах AL, BX, CX или DX.

Служба 0: установить режим выдачи изображения

Служба 0 используется для выбора одного из четырнадцати режимов выдачи, показанных в таблице. Режимы с 0h по 6h применимы для стандартного цветного графического адаптера (CGA); режим 7h применяется для монохромного режима (MDA); режимы с 0Dh по 10h были добавлены для улучшенного графического адаптера (EGA); наконец, режимы 11h - 13h были внедрены на многоцветном графическом массиве (MCGA) (PS/2 моделей 25 и 30) и видеографическом массиве (VGA) (PS/2 моделей 50, 60 и 80).

Обычно при установке режима ROM BIOS чистит буфер памяти экрана, даже если снова и снова устанавливается один и тот же режим. Такая повторная установка того же самого режима может быть использована как простой и эффективный способ очистки экрана. В некоторых версиях DOS команда CLS фактически чистит экран с помощью данного способа. Установка видеорежима приводит также к установке принятых по умолчанию значений цветов цветовой палитры, поэтому при очистке экрана не используйте службу 0, если вы работаете с цветами, вместо этого применяйте видеослужбу 6.

При наличии адаптеров EGA,MCGA и VGA вы можете также дать указание ROM BIOS не очищать экран при установке видеорежима. Для этого к номеру режима, задаваемому вами в регистре AL, прибавьте число 80h (в десятичной нотации 128), что соответствует добавлению 1 в бит 7.

Значения регистров для службы установки видеорежима 0h

Номер службы Параметр

AH = 0 AL = номер режима

Таблица. Видеорежимы, устанавливаемые с помощью

видеослужбы ROM BIOS

--------------------------------------------------------------

Режим Тип Разрешающая Число Видеопод-

способность цветов системы

--------------------------------------------------------------

00h,01h Текстовый 40*25 16 CGA,EGA,

MCGA,VGA

02h,03h Текстовый 80*25 16 CGA,EGA,

MCGA,VGA

04h,05h Графический 320*200 4 CGA,EGA,

MCGA,VGA

06h Графический 640*200 2 CGA,EGA,

MCGA,VGA

07h Текстовый 80*25 Монохромный MDA,

EGA,VGA

08h,09h,0Ah Только для PCjr

0Bh,0Ch Внутренние режимы BIOS

0Dh Графический 320*200 16 EGA,VGA

0Eh Графический 640*200 16 EGA,VGA

0Fh Графический 640*350 Монохромный EGA,VGA

10h Графический 640*350 16 EGA,VGA

11h Графический 640*480 2 MCGA,VGA

12h Графический 640*480 16 VGA

13h Графический 320*200 256 MCGA,VGA

Например, следующий фрагмент очистит экран и установит видеорежим 3:

MOV AX, 0003h

INT 10h

Служба 6: прокрутить окно вверх

Служба 06h (в десятичной нотации 6) и ее напарник служба 07h (в десятичной нотации 7) используются для задания на экране прямоугольной области текстового окна и прокручивания его содержимого вверх или вниз на одну или более строк. Для достижения эффекта прокрутки в нижнюю часть окна службой 06h вставляются пустые строки (служба 07h вставляет пустые строки в верхнюю часть окна); при этом верхние строки окна (нижние - в случае службы 07h) смещаются и исчезают с экрана.

Число строк, подлежащих прокрутке, задается в регистре AL. При AL = 00h окно очищается полностью (то же самое произойдет, если мы прокрутим больше строк, чем позволяет размер окна). Положение и размер окна задается в регистрах CX и DX: CH содержит верхнюю строку, а DH - нижнюю строку; CL - левую колонку, а DL - правую колонку. Атрибуты для новых пустых строк в обеих службах, задаются в регистр BH. Ниже суммируется порядок задания значений регистров для обеих служб (06h и 07h).

Значения регистров для служб прокрутки окон 06h и 07h

Номер службы Параметры

AH = 06h AL = число строк, подлежащих прокрутке

(прокрутка CH = номер строки для верхнего лев. угла

вверх)

AH = 07h CL = номер колонки для верх. левого угла

(прокрутка DH = номер строки для нижнего прав. угла

вниз)

DL = номер колонки для ниж. правого угла

BH = атрибут для выдачи пустых строк

Служба 7: прокрутить окно вниз

Служба 07h (в десятичной нотации 7), как мы уже упоминали, является зеркальным отображением службы 06h. Различие между этими двумя службами состоит в том, как происходит прокрутка. При выполнении службы 07h новые пустые строки появляются в верхней части окна, а старые строки исчезают со стороны его нижней части. (При выполнении службы 06h имеют место противоположные изменения.)

Служба 02h: установить положение курсора

Служба 02h (в десятичной нотации 2) устанавливает позицию курсора, используя координаты строки и колонки экрана. В текстовых режимах, где может быть несколько страниц изображения, каждая из них имеет независимо записываемую позицию курсора. Хотя в графических режимах и нет видимого курсора, в них логическое положение курсора поддерживается тем же способом, что и в текстовых режимах. Эта логическая позиция курсора используется для управления вводом/выводом символов по аналогии с текстовым режимом.

Для задания позиции курсора номер строки помещается в регистр DH, номер колонки в DL, а номер страницы в BH. Нумерация строк и колонок начинается с координат 0,0 в левом верхнем углу экрана. В графических режимах для идентификации положения курсора используются координаты строки и колонки пикселов вместо координат для знака. Номер страницы - это обычный номер страницы изображения, используемый в Бэйсике: страницы от 0 до 7 в 40-колонных режимах и от 0 до 3 в 80-колонных режимах. В графических режимах номер страницы должен быть установлен в 0.

Сведения о задании регистров даны ниже.

Значения регистров при установке положения курсора

с помощью службы 02h

Номер службы Параметры

AH = 02h DH = номер строки

DL = номер колонки

BH = номер страницы

Прерывание 21h: общие функции DOS

Автор: Vadim 1 коммент.
 

Все функции DOS вызываются с помощью прерывания 21h (в десятичной нотации 33). Первая версия DOS содержала 42 функции. Во второй к ним добавлено еще 33 функции, которые сохраняются во всех последующих версиях. Выбор конкретной функции осуществляется путем записи соответствующего номера в регистр AH.

Функция 02: вывод одного символа на экран

Для вывода одного символа на экран ПК используется

функция 02 прерывания 21h:

mov DL, <код выводимого символа>

mov AH, 2

int 21h

Выводимый символ высвечивается в позиции курсора (что бы там ни было записано), после чего курсор сдвигается на одну позицию вправо. Если курсор находился в конце строки экрана, то он перемещается на начало следующей строки, а если курсор был в конце последней строки экрана, то содержимое экрана сдвигается на одну строку вверх, а внизу появляется пустая строка, в начало которой и устанавливается курсор.

Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (0Ah) и 13 (0Dh). Символ с кодом 7 (bell, звонок) на экране не высвечивается (и курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (backspase, шаг назад) возвращает курсор на одну позицию влево, если только он не был в самой левой позиции строки. Символ с кодом 9 (tab, табуляция) смещает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (line feed, перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ с кодом 13 (carrige returne, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки.

Функция 9: вывести строку на экран дисплея

Для вывода на экран строки (последовательности символов) можно, конечно, использовать функцию 02, однако сделать это можно и за один прием с помощью функции 09 прерывания 21h:

DS:DX := начальный адрес строки

mov AH, 9

int 21h.

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX - смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.

Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.

Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.

Среди функций DOS нет такой, которая выводит числа. Такую операцию, если надо, приходится реализовывать на основе рассмотренных функций.

Функция 4Ch: завершение программы

Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:

mov AL, <код завершения>

mov AH, 4Ch

int 21h

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

МАНИПУЛЯТОР МЫШЬ

Автор: Vadim 0 коммент.

Манипулятор мышь (в дальнейшем, просто мышь) является средством, позволяющим пользователю достаточно удобно осуществлять управление прикладными программами. Как правило, мышь соединена с ПЭВМ через последовательный интерфейс. Прикладные программы, связывающиеся через интерфейс с мышью, делают это через обращение к драйверу Microsoft, например GMOUSE.COM. Все обращения к драйверу происходят через прерывание 33h.

Прерывание 33h имеет ряд функций, которые выбираются с помощью загрузки номера функции в регистр AX. Основные функции будут приведены ниже.

Функция 00h: инициализация мыши. Если мышь инициализирована, то в регистре AX возвращается значение FFFFh, а в регистре BX - число клавиш мыши. Если инициализации не происходит, то в регистре AX возвращается значение 0000h.

Функция 01h: показать указатель мыши.

Функция 02h: спрятать указатель мыши.

Функция 03h: получить текущие координаты указателя мыши и состояние кнопок. Координаты указателя соответствует виртуальному экрану. На практике, обычно, они содержат положение пикселя в графическом режиме или умноженные на 8 координаты в текстовом режиме. Отсчет графических координат начинается от 0. Текстовые координаты отсчитываются от 1. Эта функция возвращает в регистре CX координату x, а в регистре DX координату y, в регистре BX - состояние кнопки (бит 0 - левая кнопка нажата, если установлена; бит 1 - средняя кнопка нажата, если установлена; бит 2 - правая кнопка нажата, если установлена).

Функция 04h: установить позицию указателя. В регистр CX пересылается координата x, а в регистр DX координата y. Установленная позиция указателя будет игнорироваться, если она находится внутри области исключения (см. функцию 07h и 08h). Координаты задаются всегда в пикселях, где (0,0) - координата верхнего левого угла виртуального экрана.

Функция 05h: получить информацию о нажатии клавиши. В регистр BX пересылается номер кнопки (0 - левая кнопка, 1 - правая кнопка, 2 - средняя кнопка). В регистр AX возвращается состояние кнопки (бит 0 - левая кнопка нажата, если установлена; бит 1 - средняя кнопка нажата, если установлена; бит 2 - правая кнопка нажата, если установлена). В регистр BX возвращается счетчик нажатия клавиши, CX - координата x последнего нажатия, DX - координата y последнего нажатия. После обращения к этой функции счетчик нажатия клавиши сбрасывается.

Функция 06h: получить информацию об отжатии клавиши. В регистр BX пересылается номер кнопки (0 - левая кнопка, 1 - правая кнопка, 2 - средняя кнопка). В регистр AX возвращается состояние кнопки (бит 0 - левая кнопка отжата, если установлена; бит 1 - средняя кнопка отжата, если установлена; бит 2 - правая кнопка отжата, если установлена). В регистр BX возвращается счетчик отжатий клавиши, CX - координата x последнего отжатия клавиши мыши, а DX - координата y последнего отжатия клавиши мыши. После обращения к этой функции счетчик отжатия клавиши сбрасывается.

Функция 07h: установить горизонтальное ограничение для указателя мыши. В регистр CX пересылается минимальное значение координаты x, в регистр DX - максимальное значение координаты x.

Функция 08h: установить вертикальное ограничение для указателя мыши. В регистр CX пересылается минимальное значение координаты y, в регистр DX - максимальное значение координаты y.

Функция 09h: установить форму указателя мыши в графическом режиме. По умолчанию используется указатель типа стрелки. В ES:DX пересылают адрес буфера изображения. Длина буфера изображения 64 байта. Байты с 32 по 64 определяют вид курсора, а байты с 0 по 31 определяют прозрачность курсора. Они рассматриваются как битовая маска 16´16 каждый бит которой маскирует пиксели экрана. При создании изображения драйвер предварительно получает информацию о 16´16 пикселях соответствующего места экрана и к каждому пикселю применяется операция AND с маской экрана, а затем к полученному результату - операция XOR с маской изображения. Приведенный ниже пример показывает формирование курсора в графическом режиме в виде прямоугольника с тонкой прозрачной полоской в середине.

program testmouse;

uses dos,graph;

var

reg:registers;

res1,res2,i,res3,res4:byte;

buf : array [0..63] of byte;

gd,gm:integer;

begin

FOR i:=32 TO 64 DO

buf[i]:=255;

FOR i:=0 TO 31 DO

buf[i]:=1;

gd:=detect;

initgraph(gd,gm,'');

reg.AX:=1;

intr($33,reg);

reg.ax:=9;

reg.es:=seg(buf);

reg.dx:=ofs(buf);

intr($33,reg);

.

.

.

closegraph;

end.

В регистр BX заносится смещение вправо (в пикселях) из левого верхнего угла указателя, пикселя изображения рассматриваемого драйвером в качестве текущей позиции. В регистр CX заносится смещение вниз (в пикселях) из левого угла указателя, пикселя изображения рассматриваемого драйвером в качестве текущей позиции.

Функция 0Ah: установить вид указателя мыши в текстовом режиме. В регистр BX заносят 0, если выбирают курсор, используемый в программе, и 1, если выбирают стандартный курсор. Если указатель генерируется программой, то в регистр CX заносятся биты определяющие маску AND, а в регистр DX заносятся биты определяющие маску XOR по следующему принципу. Биты 0-7 - код символа; биты 8-10 цвет символа; бит 11 - бит интенсивности; биты 12-14 - цвет фона; бит 15 - бит мерцания.

Функция 10h: установить область исключения указателя. В регистр CX пересылают значение левой верхней координаты x, в DX - значение левой верхней координаты y, в SI - значение правой нижней координаты x, в DI - значение правой нижней координаты y. Эта функция определяет область исключения отображения указателя мыши. Область исключения отменяется обращением к функции 00h или 01h, или другим обращением к этой функции.

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

Функция 15h: получить размер сохраненного буфера состояния мыши. В регистр BX возвращается размер буфера в байтах.

Функция 16h: сохранить состояние драйвера мыши. В ES:DX заносится адрес буфера. Под буфер выделяется 64 байта.

Функция 17h: восстановить состояние драйвера мыши. В ES:DX заносится адрес буфера.

Функция 1Dh: установить текущую видеостраницу для указателя мыши. В регистр BX заносится номер видеостраницы. Допустимые номера страницы зависят от активного режима визуального отображения.

Функция 1Eh: получить текущую видеостраницу для указателя мыши. В регистр BX возвращается номер текущей видеостраницы для указателя мыши.

Функция 1Fh: отключить драйвер мыши. Если отключение драйвера прошло успешно, то в регистр AX заносится значение 001Fh, а в ES:BX - адрес драйвера. Если драйвер не отключен, то в регистр AX возвращается значение FFFFh.

Функция 20h: повторное включение драйвера мыши.

Функция 24h: получить информацию о мыши. Возвращаются следующие значения:

BH - старший номер версии драйвера; BL - младший номер версии драйвера; CH - тип мыши (1 - bus mouse, 2 - serial mouse, 3 - InPort mouse, 4 - PS/2 mouse, 5 - HP mouse); CL - номер аппаратного прерывания.

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

Procedure test;

{чтение мыши и клавиатуры}

type signal=record

case mouse:boolean of

true:(left,right:boolean;

{состояние клавиш мыши

dx,dy:word ;{ее перемещение });

false: (asc,ext:byte;

{ ASC- и расширенный коды }

status:word;

{флаги клавиатуры});

end;

{поле mouse показывает, сигнал от мыши или клавиатуры}

var ready:boolean;

begin

ready:=false; {ожидание команды}

with signal_t(signal) do

repeat

if mouse_sig then begin

mouse:=true;

r.ax:=11;intr($33,r);dx:=r.cx;dy:=r.dx;

r.ax:=3; intr($33,r);

left:=r.bx and 1 <>0;

right:=r.bx and 2 <>0;

mouse_sig:=false;

ready:=true; end

else {если мышь не трогали - опрос клавиатуры}

begin r.ah:=$11; intr($16,r);

{если не расширенная клавиатура, вызывайте функцию 1}

if r.flags and 64 = 0 then begin

{если буфер клавиатуры не пуст}

mouse:=false;

status:=memw[$40:$17]; {флаги клавиатуры}

repeat

r.ah:=$10;intr($16,r);

asc:=r.al; ext:=r.ah;

r.ah:=$11; intr($16,r);

ready:=r.flags and 64 <>0;

{очистка буфера и запоминание кода клавиши}

until ready; end;

end

until ready;

end;

ОБЩИЕ СВЕДЕНИЯ О МИКРОПРОЦЕССОРЕ 8088

воскресенье, 31 января 2010 г. Автор: Vadim 0 коммент.

Внутри микропроцессора 8088 информация содержится в группе 16-битовых элементов, называемых регистрами. Всего он имеет 14 регистров: 12 регистров данных и адресов и в дополнение к ним указатель команд (регистр адре­са команд) и регистр состояния (регистр флагов). Можно подразделить 12 регистров данных и адресов на три группы по четыре регистра, а именно на регистры данных, регистры указателей и индексов и регистры сегментов.

АДРЕСАЦИЯ

Так как у микропроцессора 8088 указатель команд и адресные ре­гистры имеют по 16 битов, то можно подумать, что он способен адресоваться к памяти объемом не более 64 байт (65 536 байт), т. е. имеет стандартный для 8-бито-' вых микропроцессоров диапазон адресов. Однако на самом деле микропроцессор 8088 всегда генерирует 20-битовые адреса. Он делает это за счет добавления 16-би­тового смещения к содержимому регистра сегмента, умноженному на 16. Таким образом,

физический адрес = смещение + 16 • (регистр сегмента).

В действительности микропроцессор 8088 вместо умножения на 16 использует содержимое регистра сегмента так, как если бы оно имело четыре дополнительных нулевых-бита (рис. 1. 1). Добавление нулей аналогично умножению, поскольку при каждом сдвиге на одну позицию влево двоичное число удваивается. Следователь­но, перемещение значения регистра сегмента на четыре позиции влево умножает его на 16:2 • 2 • 2 • 2 = 16.

Например, если смещение адреса имеет значение ЮН, где суффикс Н обозначает шестнадцатеричное число, а регистр сегмента содержит 2000Н, то микропроцессор 808С произведет вычисление физического адреса следующим образом (операнды показаны в двоичном виде):

0000 0000 0001 0000 (смещение) + 0010 0000 0000 0000 0000 (номер блока) 0010 0000 0000 0001 0000 (физический адрес).

Следовательно, мы получим 20-битовый адрес ячейки памяти 200ЮН.

Имея в своем распоряжении 20-битовый адрес, микропроцессор 8088 может получить доступ к любому из 1 048 576 байт. .(Данное значение называется "мега­байт" (Мбайт); 1 Мбайт = 1024 Кбайт.) Это в 16 раз превышает диапазон адресов микропроцессора 8088!

15 О

Смещение

clip_image002[4]

СЕГМЕНТЫ И СМЕЩЕНИЯ

У большинства микропроцессоров адрес ячейки памяти представляет собой одно число. А у микропроцессора 8088 адрес каждой ячейки памяти задается двумя числами: номером блока и смещением. Такой странный метод адресации обусловлен тем, что команды программы для микропроцессора 8088 и ее данные должны располагаться в разных частях памяти, другими словами, в разных сег­ментах. Если, например, Вам требуется адресоваться к ячейке с данными, то микропроцессору 8088 понадобится адрес блока памяти, с которого начинается сегмент данных (из регистра сегмента данных), и позиция желаемой ячейки в этом сегменте (ее смещение). Вспомните, как ищут в городе чей-нибудь дом: сначала находят улицу (считайте ее сегментом), а затем дом с нужным номером (смеще­нием) на этой улице.

К счастью, Вам достаточно задавать только смещение, а номер блока микропро­цессор 8088 выберет сам. Несколько позже мы обсудим это обстоятельство более детально.

ВОЗМОЖНОСТИ ПРОГРАММИРОВАНИЯ

Микропроцессор 8088 обладает впечатляющими возможностями прог­раммирования. Они пришлись особенно по душе тем программистам, которым ранее приходилось "бороться" с 8-битовыми микропроцессорами. Действительно, микропроцессор 8088 может выполнять арифметические операции над двоичными числами со знаком и без знака, длиной в 8 или 16 битов, а также над десятичными числами, хранящимися как в упакованном (по две цифры в байте), так и в неупа­кованном (по одной цифре в байте) виде. Он может также оперировать строками (например, сообщениями) длиной до 64 Кбайт.

Система команд микропроцессора 8088 содержит 92 основных типа команд и предусматривает семь различных способов адресации или режимов доступа к данным. Комбинации типов команд, режимов адресации (имеющие множество комбинаций операндов) и различных типов данных, которые мы только что упоми­нали, образуют тысячи команд, которые могут быть выполнены микропроцессором 8088. Действительно, сочетание всех этих свойств позволяет микропроцессору 8088 обеспечивать вдвое большую производительность по сравнению с 8085, если оба они работают с одинаковой скоростью.

МЕРА СКОРОСТИ

Как и электронные часы, микропроцессоры управляются кварцевым генератором. Кварцевый генератор испускает импульсы со стабильной фиксиро­ванной частотой, задающей скорость работы микропроцессора. В персональных ЭВМ PC и PC/XT кварцевый генератор испускает 4 770 000 импульсов в секунду.

Специалисты по вычислительной технике пользуются другой единицей измере­ния: числом колебаний в секунду, или герцами. Импульсы в секунду, колебания в секунду и герцы означают одно и то же, но в этой книге мы будем использовать термин "герц". Таким образом, персональная ЭВМ PC имеет тактовый генератор с частотой 4 770 000 Гц (4,77 МГц).

При частоте 4,77 МГц (4 770 000 колебаний в секунду) тактовый генератор персональной ЭВМ PC "тикает" каждые 210 не. Мы будем называть это значение циклом тактового генератора ЭВМ.

Самая быстрая команда (например, копирование содержимого одного регистра в другой регистр) выполняется за два цикла, или за 420 не. Самая медленная команда, деление двух 16-битовых чисел со знаком, выполняется за 206 циклов тактового генератора, или примерно за 43 мкс. Как видите, даже самая медленная команда выполняется всего за 0, 000043 с!

ОБЛАСТЬ ПОРТОВ ВВОДА-ВЫВОДА

В дополнение к области памяти объемом в 1 Мбайт микропроцессор 8088 может адресоваться к внешним устройствам через 65 536 (64 К) портов вво­да-вывода. Он имеет специальные команды ввода-вывода, которые позволяют Вам иметь непосредственный доступ к первым 256 портам (от 0 до 255). Другие команды позволяют Вам получить косвенный доступ к порту с помощью занесения идентифицирующего его номера (от 0 до 65 535) в регистр данных. Подобно ячей­кам памяти любой порт может быть 8- или 16-битовым.

РАСПРЕДЕЛЕНИЕ ПАМЯТИ

Большая часть адресного пространства в 1 Мбайт доступна для систем­ных и прикладных программ, но некоторые ячейки с самыми старшими и самыми младшими адресами используются микропроцессором 8088 для специальных целей. Шестнадцать старших байтов памяти отводятся под команды начальной загрузки системы, которые используются микропроцессором 8088 в момент вклю­чения питания. Первые 1024 ячейки отведены под адреса программ, которые исполняются микропроцессором 8088 при прерывании его работы внешним устрой­ством.

ПРЕРЫВАНИЯ

Время от времени всем нам приходится сталкиваться с прерываниями. Одни прерывания нам приятны, другие неприятны, третьи безразличны. При жела­нии Вы можете игнорировать некоторые прерывания, не обращая внимания, ска­жем, на телефонный или дверной звонок или на ребенка, дергающего Вас за рукав. (Да нет, игнорировать ребенка практически невозможно!) На прерывания других видов Вы просто обязаны реагировать; например, если Вы прокололи шину на железнодорожном переезде, то должны немедленно что-то предпринять.

Прерывания по сути являются требованиями к Вам обратить на них внимание. Аналогично периферийные устройства вычислительной системы могут потребо­вать, чтобы процессор "обратил на них внимание". Поэтому событие, которое заставляет процессор приостановить выполнение своей программы для выполне­ния некоторой затребованной деятельности, называется прерыванием.

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

ТИПЫ ПРЕРЫВАНИЙ

Микропроцессор 8088 может обрабатывать прерывания двух видов: одни он может игнорировать, а другие обязан обслужить как можно скорее. Преры­вания могут быть инициированы внешними устройствами, например дисководами и. другими высокоскоростными периферийными устройствами; они могут быть также инициированы специальными командами или, в определенных ситуациях, самим микропроцессором 8088.

Микропроцессор 8088 может распознать 256 различных прерываний. Каждому из них однозначно соответствует код типа, по которому микропроцессор иденти­фицирует прерывание. Он использует этот код (целое число от 0 до 255) в качестве указателя ячейки, находящейся в области памяти с младшими адресами. Эта ячейка содержит адрес программы обработки данного прерывания, называемый вектором прерывания.

Некоторые из этих 256 прерываний используются системным программным обеспечением, поставляемым фирмой IBM к своим персональным ЭВМ IBM PC, а именно резидентной частью операционной системы (называемой BIOS), дисковой операционной системой DOS и интерпретатором языка Бейсик. Остальные прерыва­ния можно использовать по своему усмотрению. Более детально прерывания обсуждаются в гл. 6.

АДРЕСНАЯ ШИНА И ШИНА ДАННЫХ

Микропроцессор 8088 выполнен в виде интегральной микросхемы с 40 выводами, 20 из которых служат для вывода адресов ячеек памяти и образуют так называемую адресную шину. Первые 8 проводников адресной шины используются также для ввода данных в микропроцессор и вывода данных из него; они образуют 8-битовую шину данных микропроцессора 8088. Такое совмещение называется мультиплексированием шины данных и адресной шины. (Старшие четыре проводника адресной шины также мультиплексированы: по ним в микропроцессор поступает информация о состоянии операций с памятью и устройствами ввода-вы­вода.)