Выход из резидентной программы или выгрузка ее из памяти

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Рыжкин
Сообщения: 2
Зарегистрирован: 22 дек 2013, 19:14

22 дек 2013, 19:19

У меня есть программа, загружаемая резидентно в память ПК и осуществляющая перехват прерывания INT09h, анализирующая нажатие пользователем комбинации клавиш, в случае нажатия комбинации Alt-A выполнятся слияние двух файлов.

Помогите сделать выход из резидентной программы или сделать выгрузку ее из памяти.

.model tiny
.code
.286

org 1eh
org 1ch
envseg dw ?
org 100h

start:
jmp init

int09h_handler proc far
jmp short actual_int09h_handler
old_int09h dd ?
dw 424Bh
db 00h
actual_int09h_handler:
pushf
call dword ptr cs:old_int09h
disable_point label byte
pusha
push ds
push es
cld
push 0B800h
pop es
push 0040h
pop ds
mov di, word ptr ds:001Ch
jne l1
jmp exit
l1:
mov ax, word ptr [di]

No_ext:
mov ah,10h ;ожидание нажатия клавиши от пользователя
int 16h ;(в ah=0, если расширенный, в al=расширенный код)
cmp al,0 ;проверка на расширенный код
jnz No_ext ;если не расширенный код, то переход к No_ext
cmp ah,1eh ;расширенный код Alt+a(в ah );
push cs
pop ds
je Alt_a ;если да(Alt+a), то переход к Alt_a:
jne re
jmp exit
re: ;иначе на старый вектор

Alt_a proc near

;открываем первый файл
MOV AH,3DH
MOV AL,0
LEA DX,PATH1
INT 21H
JC CLOSE2
MOV HANDL1,AX
;открываем второй файл
MOV AH,3DH
MOV AL,1
LEA DX,PATH2
INT 21H
JC CLOSE1
MOV HANDL2,AX
;указатель второго файла на конец
MOV AH,42H
MOV BX,HANDL2
XOR CX,CX
XOR DX,DX
MOV AL,2
INT 21H
;готовим регистры
LEA DX,BUFER
MOV CX,1000
;блок копирования
LOO:
;читаем
MOV BX,HANDL1
MOV AH,3FH
INT 21H
CMP AX,CX
JZ NORM
MOV CX,AX ;<1000 байт
MOV EOF,1 ;достигнут конец файла
NORM:
;пишем
MOV BX,HANDL2
MOV AH,40H
INT 21H
CMP EOF,0 ; не достигнут ли конец
JZ LOO
; закрываем второй файл
CLOSE2:
MOV AH,3EH
MOV BX,HANDL2
INT 21H
;закрываем первый файл
CLOSE1:
MOV AH,3EH
MOV BX,HANDL1
INT 21H
;выход в ДОС

EXIT1:
MOV Ax,4C00H
INT 21H


Alt_a endp

int09h_handler endp

exit:
pop es
pop ds
popa
iret

init proc near

mov ax,3509h; получим адрес обработчика прерывания
int 21h
mov word ptr old_int09h,bx
mov word ptr old_int09h+2,es


mov ax,2509h; установим адрес нового обработчика
mov dx, offset int09h_handler
int 21h

mov ah,49h
mov es, word ptr envseg
int 21h

mov dx, offset init

mov ah,09h
mov dx,offset mes_l
int 21h

int 27h



ret


buf db 1 dup (?)
PATH1 DB 'PRIMER1.TXT',0;имя первого файла
PATH2 DB 'PRIMER2.TXT',0;имя второго файла(куда добавлять)
HANDL1 DW ? ;описатель первого файла
HANDL2 DW ? ;описатель второго файла
BUFER DB 1000 DUP(?) ;буфер
EOF DB 0 ;если 1,то в процессе чтения
;достигнут конец файла
mes_l db 'Rezident zagruzhen',0Dh,0Ah,'$'
mes db 'Rezident vygruzhen',0Dh,0Ah,'$'

init endp

end start
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

23 дек 2013, 14:18

Восстановить обработчики прерываний и освободить блоки памяти - вот и все
It's a long way to the top if you wanna rock'n'roll
Рыжкин
Сообщения: 2
Зарегистрирован: 22 дек 2013, 19:14

24 дек 2013, 16:44

somewhere писал(а):Восстановить обработчики прерываний и освободить блоки памяти - вот и все

А можно пример листинга?
Ответить