Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 168

Unknown Author

Другой случай, где полезно использование прерываний, особенно интересен для нас сейчас. Давно уже замечено, что в различных программах приходится выполнять одни и те же действия, например, выводить символы на экран или вводить их с клавиатуры, причем реализация этих действий требует детального знания тех или иных устройств ЭВМ. Так вот, чтобы избавить авторов программ от знания этих деталей, избавить их от необходимости выписывать эти действия в каждой программе заново, такие часто повторяющиеся действия описывают один раз в виде соответствующих процедур и включают их в состав ОС, и теперь все программы могут пользоваться ими.

Но как обращаться к этим процедурам? Конечно, можно использовать обычную команду вызова процедур (CALL), но для этого надо знать начальные адреса этих процедур. А эти адреса, к сожалению, меняются от одной версии ОС к другой, причем версии ОС меняются достаточно часто, поэтому сегодня эти адреса одни, а завтра - другие. Учитывая это, процедуры ОС принято вызывать несколько иначе - с помощью прерываний, исходя из следующего соображения: раз

ОС "вступает в игру" при любом прерывании, то почему бы не воспользоваться прерываниями и для вызова ее процедур.

Конкретно эта идея реализуется так. Определенные номера прерываний оставляют незанятыми для прерываний от устройств ЭВМ и предназначают для вызова процедур ОС, для чего в соответствующие элементы вектора прерываний записываются начальные адреса этих процедур. Поэтому, если выработать прерывание с одним из этих номеров, то будет вызвана соответствующая процедура. При этом не надо знать точный адрес этой процедуры, а достаточно знать только номер прерывания, по которой она вызывается. Номера же эти остаются одними и теми же во всех версиях ОС.

Но для вызова таким образом процедур ОС надо уметь генерировать прерывания из обычных программ. Для этого в систему команд ПК включена специальная команда - команда прерывания (interrupt):

INT ±8

Эта команда вызывает искусственное, насильственное прерывание с номером i8 (0<=i8<=255), а это значит, что начнет работать та процедура ОС, начальный адрес которой записан в элементе вектора прерываний с номером i8. Закончив свою работу, эта процедура вернет управление на команду программы, следующую за командой INT. Таким образом, эта команда очень похожа на команду CALL, но только вызывает процедуры более "хитрым" способом.

Отметим, что по команде INT можно сгенерировать прерывание с любым номером, например, прерывание, соответствующее делению на 0 или нажатию клавиши на клавиатуре. Однако делать этого не следует, а надо использовать эту команду только для вызова процедур ОС.