Резидент запускается для DOS 6.22, но потом при запуске любой другой программы подвисает тачку наглухо.
Кратко суть программы. Для текущего каталога, по нажатию на клавишу проверяет наличие файла. Если файл есть, выводит в левом верхнем углу хендл, если нет, то выводит код ошибки.
Буду очень признателен.
;SKAN.ASM Пример резидентной программы. Программа не претендует на оптимальность.
; TASM scan
; tlink scan
; exe2bin scan.exe scan.com
; scan.com
code_seg_a segment
assume cs:code_seg_a, ds:code_seg_a
org 100h
scan proc far
Start: jmp Install
int9: push ax
push bx
push cx
push di
push dx
push es
push ds
push cs
pop ds
mov ah,3dh
mov al,2
lea dx,word ptr ds:file
int 21h
jc error
mov word ptr ds:handle1,ax
mov bx,word ptr ds:handle1
mov ah,3eh
int 21h
error:
;---------------------------------
push ax
mov cx,6
m: mov bx,16 ; база
xor dx,dx
div bx
mov di,dx
mov bl, byte ptr cs:table[di]
mov di,cx
mov byte ptr cs:buf[di],bl
cmp ax,0h
jle m1
loop m
m1:
MOV AX, 0B800H ; Адрес видеобуфера
MOV ES, AX
MOV bh, 7 ; Байт атрибутов БЕЛЫЙ
xor ax,ax
m2: mov di,cx
mov bl, byte ptr cs:buf[di]
mov di,ax
mov es:[di],bx
inc ax
inc ax
inc cx
cmp cx,7
jne m2
mov di,ax
mov es:[di],0720h ;черный пробел
;-----------------------------------
pop ax
pop ds
pop es
pop dx
pop di
pop cx
pop bx
end_int9:
pop ax
db 0EAh ; JMP FAR
int9_sav label dword
dw 0,0
table: db "0123456789ABCDEF"
file: db 'somefile.prn',0
handle1: dw 0
buf: db 6 dup (?)
pgm_len equ $-int9
install:
push cs
pop ds
mov ax,3509h ; дать адрес обработчика прерывания
int 21h
mov word ptr [int9_sav],bx
mov word ptr [int9_sav+2],es
lea dx,int9
mov ax,2509h ; установит обработчик прерывания
int 21h
lea dx,load
mov ax,0900h ; вывести сообщение
int 21h
Дык нельзя вот так просто вызывать функции ДОС из обработчиков аппаратных прерываний.
Чтобы это делать, есть несколько способов: проверка флага занятости ДОС, отложенная активизация по таймеру, своппинг SDA.
В сети должно быть много инфы и исходников на эту тему (искать в Яндексе что-то наподобие "нереентерабельность ДОС").
Еще была хорошая книга - К.Г.Финогенов "Самоучитель по системным функциям MS-DOS", 1995. Там все описано.
Совершенно верно.18.12.02 10:05 Автор: Chingachguk <Chingachguk> Статус: Member
1.5. Прерывание 21h. Его можно перехватить для более надежного определения занятости DOS'а, чем через флаг InDOS. Дело в том, что функции 21-го прерывания 00-0ch и 0eh-... независимы друг от друга, в связи с чем при работе одной группы функций можно безопасно вызывать функции из другой группы. Соответственно, если в обработчике 21-го прерывания проверить номер функции и записать номер группы в переменную, то можно будет "всплыть" и в случае работы DOS в первой группе.
Помог эксперт Ayl c RusFAQ.ru: программирование на языке Assembler
и Traish.
Про флаги тоже спасибо.