Почему некорректно завершается программа? Код |
CSEG segment assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG org 100h
Begin: jmp Init ;На метку инициализации
; === Процедура обработки 10h прерывания === Int_10h_proc proc pushf ;Сохраним флаги в стеке, т.к. они поменяются...
cmp ax,8899h ;Проверим на повторную загрузку в память (см. ниже) ;jne Next_test ;Если не проверка, то смотрим дальше...
xchg ah,al ;Меняем местами AH и AL (признак того, что мы в памяти ;что-то вроде ответного сигнала) popf ;Выровним стек iret ;Выйдем из прерывания (вернемся в нашу программу) ;AX теперь равен 9988h !!!
Int_10h_vect dd ? ;Здесь хранится адрес оргинального обработчика Int_10h_proc endp
; =============================================================== ; Инициализация (подготовка и настройка резидента) Init: mov ax,8899h ;Проверим, в памяти ли мы уже или еще нет int 10h ;8899h - наш позывной cmp ax,9988h ;Отозвался обработчик (AH/AL должены поменяться местами)? jne Set_resident
mov ah,9 ;Если в памяти, то выведем соответствующее сообщение mov dx,offset In_memory ;Зачем нас двое в памяти? int 21h
ret ;...И вернемся в DOS
Set_resident: ;Если нас в памяти нет, то установим резидент mov ax,3510h int 21h ;Получим и сохраним адрес (вектор) 10h прерывания mov word ptr Int_10h_vect,bx ;Вначале младшее слово (смещение) mov word ptr Int_10h_vect+2,es ;Затем старшее (сегмент)
mov ax,2510h mov dx,offset Int_10h_proc int 21h ;"Повесим" нашу процедуру на 10h прерывание
mov dx,offset Init int 27h ;Оставим программу резидентной в памяти.
In_memory db 'Мы уже в памяти!!!!$'
CSEG ends end Begin
|
|