Assembler - язык неограниченных возможностей


Обработчики прерываний - часть 2


Хотя прямое изменение таблицы векторов прерываний и кажется достаточно удобным, все-таки это не лучший подход к установке обработчика прерывания, и пользоваться им следует только в случаях крайней необходимости, например внутри обработчиков прерываний. Для обычных программ DOS предоставляет две системные функции: 25h и 35h — установить и считать адрес обработчика прерывания, которые и рекомендуются к использованию в обычных условиях:

; скопировать адрес предыдущего обработчика в переменную old_handler mov ax,3587h ; АН = 35h, AL = номер прерывания int 21h ; функция DOS: считать ; адрес обработчика прерывания mov word ptr old_handler,bx ; возвратить ; смещение в ВХ mov word ptr old_handler+2,es ; и сегментный ; адрес в ES, ; установить наш обработчик mov ax,2587h ; АН = 25h, AL = номер прерывания mov dx,seg int_handler ; сегментный адрес mov ds,dx ; в DS mov dx,offset int_handler ; смещение в DX int 21h ; функция DOS: установить ; обработчик ; (не забывайте, что ES изменился после вызова функции 35h!) [...] ; восстановить предыдущий обработчик lds dx,old_handler ; сегментный адрес в DS и смещение в DX mov ax,2587h ; АН = 25h, AL = номер прерывания int 21h ; установить обработчик

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

; Процедура minmax ; находит минимальное и максимальное значения в массиве слов ; Ввод: DS:BX = адрес начала массива ; СХ = число элементов в массиве ; Вывод: ; АХ = максимальный элемент ВХ = минимальный элемент minmax proc near ; установить наш обработчик прерывания 5 push 0 pop es mov еах,dword ptr es:[5*4] mov dword ptr old_int5,eax mov word ptr es:[5*4],offset int5_handler mov word ptr es:[5*4]+2,cs ; инициализировать минимум и максимум первым элементом массива mov ax,word ptr [bx] mov word ptr lower_bound,ax mov word ptr upper_bound,ax ; обработать массив mov di,2 ; начать со второго элемента bcheck: mov ax,word ptr [bx][di] ; считать элемент в АХ bound ax,bounds ; команда BOUND вызывает ; исключение - ошибку 5, ; если АХ не находится в пределах lower_bound/upper_bound add di,2 ; следующий элемент loop bcheck ; цикл на все элементы ; восстановить предыдущий обработчик mov eax,dword ptr old_int5 mov dword ptr es:[5*4],eax ; вернуть результаты mov ax,word ptr upper_bound mov bx,word ptr lower_bound ret




Начало  Назад  Вперед