4Текст (1071377), страница 2
Текст из файла (страница 2)
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
; перехват прерываний - сохранение старых обработчиков и вызов новых
mov ax, 352Dh
int 21h
mov word ptr old_int2Dh, bx
mov word ptr old_int2Dh+2, es
mov ax, 3509h
int 21h
mov word ptr old_int09h, bx
mov word ptr old_int09h+2, es
mov ax, 252Dh
mov dx, offset int2Dh_handler
int 21h
mov ax, 2509h
mov dx, offset int09h_handler
int 21h
mov ah, 49h
mov es, word ptr envseg
int 21h ; освободить память для переменных окружения
mov dx, offset init
int 27h ; terminate and stay resident
show_msg proc near
mov ah, 9
int 21h
ret
show_msg endp
read_cmd proc near
mov al, cmd_len
dec al
dec al
mov di, offset cmd_line
xor ah, ah
add di, ax
ret
read_cmd endp
init endp
usage db 'STSR release 1', 13, 10
db 'Copyright (C) 2001 by LORD', 13, 10, '$'
helpmsg db 'Программа предназначена вывода строк по запросу пользов
теля. ', 13, 10
db 'Вызвать резидент можно, нажав Ctrl+U', 13, 10, 13,
10
db 'USAGE:', 13, 10
db 'STSR - загрузить программу', 13, 10
db 'STSR /? - вызов справки', 13, 10, '$'
db 'STSR /u - выгрузить программу', 13, 10,
'$'
; символьные массивы для вывода
already_msg db 'Ошибка: Программа уже загружена в память', 13, 10, '$'
no_more_mux_msg db 'Ошибка: слишком много резидентов в памяти', 13, 10, '$'
cant_unload1_msg db 'Ошибка: программа не обнаружена в памяти', 13, 10, '$'
cant_unload2_msg db 'Ошибка: другая программа перехватила прерывания', 13, 10,
'$'
unloaded_msg db 'Программа успешно выгружена из памяти', 13, 10, '$'
pars db 'Params received', 13, 10, '$'
in_dos_addr dd ?
unloading db 0
end start
1Помощь 2>> 3 4Коды 5 6 7Поиск 8Фоpмат 9Печать 10Выход