(Код, взят из начала программы, которая обрабатывает запросы услуг видеодисплея.)
список адресов | машинный шестнадцатеричный код | эквивалент программного кода на языке ассемблера | регистр |
фрагмент выделен из программы ПЗУ — базовой системы ввода-вывода | |||
F000: 3605 | FB | STI | |
F000: 3606 | FC | CLD | |
F000: 3607 | PUSH | ES | |
F000: 3608 | IE | PUSH | DS |
F000: 3609 | PUSH | DX | |
F000: 360А | PUSH | CX | |
F000: 360В | PUSH | BX | |
F000: 360С | PUSH | SI | |
F000: 360D | PUSH | DI | |
F000: 360E | PUSH | BP | |
F000: 360F | PUSH | AX | |
F000: 3610 | 8AC4 | MOV | AL,AH |
F000: 3612 | 32E4 | XOR | AH,AH |
F000: 3614 | D1E0 | SHL | AX,1 |
F000: 3616 | 8BF0 | MOV | SI,AX |
F000: 3616 | 3D2800 | CMP | AX,0028 |
1. Первая колонка (F000: 3605 и т.д.) — это список адресов, которым мы можем пренебречь.
2. Вторая колонка (FB, FC,06 и т.д.) — это действующий машинный шестнадцатеричный код.
3. Третья колонка - это эквивалент программного кода на языке ассемблера.
Код начинается с команды STI, которая приводит в действие прерывание. Когда происходит прерывание, дальнейшие прерывания приостанавливаются на тот случай, если программе обработки прерывания придется выполнять какую-либо очень важную операцию. В данном же случае ничего важного не происходит и поэтому включается механизм обработки других видов прерываний.
|
|
Следующая команда CLD устанавливает флаг направления в его нормальное положение "вперед". Это обеспечивает продвижение "вперед", а не "назад", данным программы. Для нас это не очень важно, но интересно отметить, что программист потратил время на то, чтобы специально удостовериться, что флаг установлен в направление "вперед" еще до начала работы.
За этим следует: серия из девяти команд PUSH. Эти команды записывают данные в стек компьютера. Вы видите, что каждая из команд PUSH указывает на регистр (ES, DS и т.д.), который сохраняется. Эти значения регистров заносятся в стек, так что программа обработки прерывания может убедиться, что они сохранены. По окончании действия программы обработки данных эти значения возвращаются из стека в регистры, таким образом, независимо от того, как в это время использовались регистры, они всегда возвращаются в свое первоначальное состояния.
За девятью операциями PUSH мы находим четыре команды обработки данных (MOV, XOR, SHL, MOV), которые делают одну простую вещь: они берут число и готовят его для сравнения. Хотя эти команды выглядят довольно сложными, все, что здесь происходит, на самом деле очень просто.
!!! Таким образом, при появлении запроса на прерывание
· система прерываний идентифицирует сигнал
· затем управление передается на соответствующую подпрограмму обработки.
Программы обработки прерывания могут быть расположены:
|
|
· во встроенном ПЗУ базовой системы ввода-вывода
· как часть операционной системы.
· прикладные программы обработки текстов, электронные таблицы и т.п. — могут также иметь свои подпрограммы обработки прерывания, если в этом есть необходимость.