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

Unknown Author

Уточним некоторые детали этой схемы на примере, ПК.

Как запоминается то место текущей программы, в котором было прервано ее выполнение? Напомним, что в ЛК адрес команды, которая должна быть выполнена следующей, находится в регистрах CS и IP. В момент прерывания эти регистры и показывают на ту команду, которая была бы выполнена, если бы не было прерывания, и с которой, следовательно, надо будет возобновить работу программы. (Отметим, что ЦП воспринимает сигнал прерывания только между командами, но не во время выполнения команды.) Поэтому, когда приходит сигнал прерывания, ЦП запоминает значения этих двух регистров, причем запоминает в стеке текущей Программы: сначала в стек записывается содержимое CS, а затем - IP. (Замечание: ранее уже отмечалось, что если машинная программа сама не использует стек, то все равно под него надо отводить место в памяти; причина этого, как видно, в том, что стек программы используется при прерываниях, которые происходят во время ее счета, например, из-за случайного нажатия клавиш на клавиатуре.)

Помимо адреса следующей команды программы процессор также запоминает в стеке и текущее значение флага регистров Flags, т. е. значения всех флагов. Зачем? Дело в том, что программа может быть прервана между командой сравнения и следующей за ней командой условного перехода, и позже придется возобновлять работу программы с этой команды условного перехода. Ясно, что в этот момент все флаги должны быть такими же, какими они были после команды сравнения, т. е. в момент прерывания. Учитывая это, ЦП и спасает регистр флагов, чтобы затем можно было его восстановить. При этом регистр Flags записывается в стек до адреса прерывания.

Итак, когда в ЦП приходит сигнал прерывания, то он приостанавливает выполнение текущей программы и спасает в стеке этой программы текущее значение флага регистров и адрес следующей команды, а затем уже передает управление на ОС. (Отметим, что ЦП также обнуляет флаги прерывания IF и трассировки TF.)

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

Все возможные прерывания нумеруются числами от 0 до 255. Для каждого прерывания составляется своя процедура обработки прерывания (ПОП), и все эти процедуры включаются в состав ОС. Начальные адреса этих процедур записываются в самые первые ячейки памяти; эти адреса попадают сюда при загрузке ОС в оперативную память. При этом каждый такой адрес записывается в виде пары segiofs, где seg - номер сегмента памяти, в котором находится соответствующая ПОП, a ofs - ее смещение внутри этого сегмента. В связи с этим каждый адрес занимает 4 байта, двойное слово, и потому начальный адрес i-й ПОП располагается в двойном слове с адресом 4*i. Всего эти начальные адреса занимают 4*256=1024=1 Кб. Это место памяти принято называть вектором прерываний. Таким образом, вектор прерываний - это массив из 256 элементов, i-й элемент которого - начальный адрес процедуры обработки прерывания с номером i.