Listing (КП - вывод текста на экран), страница 2
Описание файла
Файл "Listing" внутри архива находится в следующих папках: КП - вывод текста на экран, STSR. Текстовый-файл из архива "КП - вывод текста на экран", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.
Просмотр 2 страницы текстового-файла онлайн
int09h_handler endp
; Конец обработчика прерывания клавиатуры
; переменные, использованные в обработчике
scr_buf db LINES_NUM*CHARS_NUM*2 dup(?)
header db 'Вывод строк', 0
help db 'Введите номер строки (1, 2, или 3)', 0
msg0 db 'Строка не выбрана', 0
msg1 db 'This is a line number one', 0
msg2 db 'This is a line number two', 0
msg3 db 'This is a line number three', 0
msg_xt db 'Чтобы продолжить, нажмите Escape', 0
; Обработчик мультиплексорного прерывания. Программа использует AMIS-сигнатуру
; для совместимости с другими программами
; поддерживает функции AMIS 3.6 00h, 02h, 03h, 04h и 05h
hw_reset2D: retf
int2Dh_handler proc far
jmp short act2Dh_handler ; пропустить ISP
old_int2Dh dd ?
dw 424Bh
db 00h
jmp short hw_reset2D
db 7 dup(0)
act2Dh_handler:
db 80h, 0FCh ; начало команды cmp ah, число
mux_id db ? ; идентификатор программы
je its_us ; если вызывают с чужим AH - это не н
с
jmp dword ptr cs:old_int2Dh ; вызов старого обработчика
its_us: ; вызвали все-таки нас
cmp al, 06h ; функции AMIS выше 06h не поддерживаются
jae int2D_no ;
cbw ; занести в AX номер функции AMIS
mov di, ax
shl di, 1 ; умножить его на 2, т. к. jumptable - т
блица слов
jmp word ptr cs:jumptable[di] ; вызов обработчика
функции
;jumptable : таблица адресов обрабатываемых функций AMIS
jumptable dw offset int2D_00, offset int2d_no
dw offset int2D_02, offset int2d_03
dw offset int2D_04, offset int2d_05
int2D_00: ; функция 00 - запрос сигнатуры AMIS
mov al, 0FFh
mov cx, 0100h
push cs
pop dx
mov di, offset amis_sign ; DX:DI - адрес AMIS сигнатуры
iret
int2D_no: ; функция не поддерживается
mov al, 00h
iret
unload_failed: ; сюда передается управление, если
; векторы прерываний были заняты после нашей прогр
ммы
mov al, 01h
iret
int2D_02: ; функция 02 - выгрузка резидента
push 0
pop ds ; сегментный арес таблицы векторов прерываний
ДОС
mov ax, cs ; наш сегмент кода
; проверим, все ли перехваченные прерывания по прежнему указывают на нас
cmp ax, word ptr ds:[09h*4+2] ; проверка для прерывания
клавиатуры
jne unload_failed
cmp ax, word ptr ds:[2Dh*4+2] ; проверка для
мультиплексорного прерывания
jne unload_failed
; восстановим старые обработчики прерываний
mov ax, 2509h
lds dx, dword ptr cs:old_int09h
int 21h
mov ax, 252Dh
lds dx, dword ptr cs:old_int2Dh
int 21h
push cs
pop ds
mov ah, 09h
mov dx, offset cs:unloaded_ok
int 21h
; выгрузка резидента
mov es,cs:[2Ch]
mov ah,49h
int 21h
push cs
pop es
mov ah,49h
int 21h
iret
unloaded_ok db 'Программа успешно выгружена из памяти', 13, 10, '$'
cant_unl db 'Ошибка: Другая программа перехватила прерывания', 13, 10,
'$'
int2D_03: ; функция AMIS 03 - запрос на активацию программы
cmp byte ptr we_are_active, 0 ; мы и так активны?
je already_popup
call save_scr
push cs
pop ds
call show_scr
mov byte ptr we_are_active, 1 ; активировать программу
already_popup: ; программа уже активна
mov al, 03h
iret
int2D_04:; функция AMIS 04 - получить список перехваченных прерываний
mov dx, cs
mov bx, offset amis_hooklist
iret
int2D_05: ; функция AMIS 05 - получить список "горячих" клавиш
mov al, 0FFh
mov dx, cs
mov bx, offset amis_hotkeys
iret
int2Dh_handler endp
; Конец обработчика мультиплексорного прерывания
; AMIS - сигнатура для резидентных программ
amis_sign db "LORD...." ; имя автора
db "STSR...." ; имя программы
db "Вывод строки по запросу пользователя", 0
; AMIS - список перехваченных прерываний
amis_hooklist db 09h
dw offset int09h_handler
db 2Dh
dw offset int2Dh_handler
; AMIS - список горячих клавиш
amis_hotkeys db 01h ; проверяются после вызова стандартного обработчика
db 1 ; используем одну клавишу
db 16h ; скэн-код клавиши [u]
dw 04h ; вызывается по Ctrl
dw 0 ; запрещенные флаги
db 1 ; клавиша не остается в буфере клави
туры
; резидентная часть завершена
; процедура инициализации резидента
init proc near
jmp short init_entry_pnt ; прыжок на точку входа
exit_with_msg: ; выйти, написав сообщение
call show_msg
ret
already_loaded: ; резидент уже загружен
cmp byte ptr unloading, 1 ; пользователь потребовал выгрузки?
je do_unload ; да, выгрузить
mov dx, offset already_msg ; вывод сообщения о том, что резидент в п
мяти
jmp short exit_with_msg
no_more_mux: ; если свободный идентификатор MUX не найден
mov dx, offset no_more_mux_msg
jmp short exit_with_msg
cant_unload1: ; если нельзя выгрузить программу
mov dx, offset cant_unload1_msg
jmp short exit_with_msg
do_unload: ; выгрузить резидент, в AH - идентификатор программы - 1
inc ah
mov al, 02h ; вызвать функцию AMIS 02 - выгрузка резидента
; mov dx, cs
; mov bx, offset exit_pnt
cli
int 2Dh
sti
mov ax, 4C00h
int 21h
; push cs
; pop ds
; mov dx, offset cant_unload2_msg ; вывести сообщение
; jmp short exit_with_msg
exit_pnt: ; точка выхода
push cs
pop ds
mov dx, offset unloaded_msg
push 0
jmp short exit_with_msg
init_entry_pnt: ; точка входа в програму
cld
; чтение параметров командной строки
call read_cmd
cmp byte ptr cs:[di], '/'
jne not_unload
inc di
cmp byte ptr cs:[di], 'u'
jne check_next
; если программа запущена с ключом "/u", выгрузить
mov byte ptr unloading, 1
jmp not_unload
check_next:
cmp byte ptr cs:[di], '?'
jne not_unload
; программа вызвана с ключом '/?'
mov dx, offset helpmsg
call show_msg
jmp start_scan
not_unload: ; вывести сообщение о правилах использования программы
mov dx, offset usage
call show_msg
start_scan:
mov ah, -1 ; сканируем свободные ID'ы от 0 до FFh
more_mux:
xor al, al ; обнуляем AL - функция AMIS проверки наличия резидента
; вызов функции AMIS 00 - проверка наличия резидента
int 2Dh
cmp al, 00h ; идентификатор свободен?
jne not_free ; нет - сделать прыжок
mov byte ptr mux_id, ah ; да - вписать его в код обработчика
jmp short next_mux
not_free: ; идентификатор занят
mov es, dx
mov si, offset amis_sign
mov cx, 16 ; сравнить первые 16 байт
repe cmpsb
jcxz already_loaded ; если не совпадают -
; перейти к следующему идентификатору
next_mux:
dec ah
jnz more_mux
free_mux_found:
cmp byte ptr unloading, 1 ; нас вызвали для выгрузки?
je cant_unload1 ; выгрузка невозможна
cmp byte ptr mux_id, 0
je jp_nomux ; идентификаторы кончились
jmp next_lab
jp_nomux:
jmp no_more_mux
;
next_lab:
mov ah, 34h
int 21h
dec bx
mov word ptr in_dos_addr, bx
mov word ptr in_dos_addr+2, es