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


Мультиплексорное прерывание - часть 11


; AMIS: сигнатура для резидентных программ amis_sign db "Cubbi..." ; 8 байт - имя автора db "ASCII..." ; 8 байт - имя программы db "ASCII display and input utility",0 ; ASCIZ-комментарий ; не более 64 байт

; AMIS: список перехваченных прерываний amis_hooklist db 09h dw offset int09h_handler db 2Dh dw offset int2Dh_handler

; AMIS: список "горячих" клавиш amis_hotkeys db 01h ; клавиши проверяются после стандартного ; обработчика INT 09h db 1 ; число клавиш db 1Eh ; скан-код клавиши (А) dw 08h ; требуемые флаги (любая Alt) dw 0 ; запрещенные флаги db 1 ; клавиша глотается

; конец резидентной части ; начало процедуры инициализации

initialize proc near mov ah,9 mov dx,offset usage ; вывести информацию о программе int 21h

; проверить, не установлена ли уже наша программа mov ah,-1 ; сканирование номеров от FFh до 00h more_mux: mov al,00h ; Функция 00h - проверка наличия программы int 2Dh ; мультиплексорное прерывание AMIS, cmp al,00h ; если идентификатор свободен, jne not_free mov byte ptr mux_id,ah ; записать его номер прямо в код ; обработчика int 2Dh, jmp short next_mux not_free: mov es,dx ; иначе - ES:DI = адрес их сигнатуры mov si,offset amis_sign ; DS:SI = адрес нашей сигнатуры mov cx,16 ; сравнить первые 16 байт, repe cmpsb jcxz already_loaded ; если они не совпадают, next_mux: dec ah ; перейти к следующему идентификатору, jnz more_mux ; пока это не 0 ; (на самом деле в этом примере сканирование происходит от FFh до 01h, ; так как 0 мы используем в качестве признака отсутствия свободного ; номера в следующей строке) free_mux_found: cmp byte ptr mux_id,0 ; если мы ничего не записали, je no_more_mux ; идентификаторы кончились mov ax,352Dh ; АН = 35h, AL = номер прерывания int 21h ; получить адрес обработчика INT 2Dh mov word ptr old_int2Dh,bx ;и поместить его в old_int2Dh mov word ptr old_int2Dh+2,es mov ax,3509h ; AH = 35h, AL = номер прерывания int 21h ; получить адрес обработчика INT 09h mov word ptr old_int09h,bx ; и поместить его в old_int09h mov word ptr old_int09h+2,es mov ax,252Dh ; AH = 25h, AL = номер прерывания mov dx,offset int2Dh_handler ; DS:DX - адрес нашего int 21h ; обработчика mov ax,2509h ; AH = 25h, AL = номер прерывания mov dx,offset int09h_handler ; DS:DX - адрес нашего int 21h ; обработчика mov ah,49h ; AH = 49h mov es,word ptr envseg ; ES = сегментный адрес среды DOS int 21h ; освободить память mov ah,9 mov dx,offset installed_msg ; вывод строки об успешной int 21h ; инсталляции mov dx,offset initialize ; DX - адрес первого байта за ; концом резидентной части int 27h ; завершить выполнение, оставшись ; резидентом ; сюда передается управление, если наша программа обнаружена в памяти already_loaded: mov ah,9 ; АН = 09h mov dx,offset already_msg ; вывести сообщение об ошибке int 21h ret ; и завершиться нормально




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