Резидентная программа не создает файл

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

Модератор: Andy

Ответить
Prostomc
Сообщения: 1
Зарегистрирован: 11 июн 2013, 18:52

Резидентная программа не создает файл

Сообщение Prostomc » 11 июн 2013, 18:58

Резидентная программа по нажатию ctrl+S создает файл, ctrl+X - выгружается из памяти.
Перехватываю нажатие, ставлю флаг "fileflag", потом по таймеру создаю файл.
Файл не создается. В обработчик таймера входит.
Не могу понять в чем дело. Подскажите, пожалуйста

Код: Выделить всё

  .model tiny
    CSEG segment para
    assume cs:CSEG
    .386
    org 100h
    .startup
    jmp setup
 
 
int09old dd ?
int28old dd ?
fileflag db 0h
addr db 'c:\file.dat' , 0
MES db 2000 dup(?)
 
            ;TIMER!
int28new proc
push ds ax dx bx
 
cmp fileflag, 0h
jz int28ret
 
mov fileflag, 0h
 
mov dx, offset addr ;Create file
mov cx, 0
mov ah, 3dh
mov al, 2h
int 21h
mov bx, ax
 
mov ah, 3eh ;Close file
int 21h
 
int28ret:
 
pushf
call cs:[int28old]
pop bx dx ax ds
iret
 
int28new endp
 
            ;INT09H
int09new proc
 
push ds ax dx bx
mov ax, 0040h
mov ds, ax
test byte ptr ds:[0017h], 00000100b
jz no_ctrl
 
in al, 60h
cmp al, 1fh
je ctrl_s
cmp al, 2dh
je ctrl_x
 
 
        ;NO ctrl
no_ctrl:
pop bx dx ax ds
jmp cs:[int09old]
 
    
ctrl_s:
 
mov fileflag, 01h
 
int09ret:
mov ah, 2
mov dl, fileflag
add dl, 30h
int 21h
 
 
pushf
call cs:[int09old]
mov ah, 0
int 16h
pop bx dx ax ds
iret
            ;EXIT
ctrl_x:
 
mov ax, 2509h
mov dx, word ptr int09old
mov ds, word ptr int09old+2
int 21h
 
mov ax, 2528h
mov dx, word ptr int28old
mov ds, word ptr int28old+2
int 21h
 
mov ah, 2
mov dl, 34h
int 21h
 
mov es, cs:[2Ch]
mov ah, 49h
int 21h
push cs 
pop es
mov ah, 49h
int 21h
 
jmp int09ret
 
int09new endp
end_resident label BYTE
 
 
        ;SETUP
 
setup:
 
mov ax, 3563h
int 21h
cmp bx, 0AEh
jne gosetup
 
mov ah, 2
mov dl, 39h
int 21h
 
mov ax, 4c00h
int 21h
 
gosetup:
mov ah, 2
mov dl, 30h
int 21h
 
 
mov ax, 2563h
mov dx, 0aeh
int 21h
 
mov ah, 2
mov dl, 31h
int 21h
 
 
mov ax, 3509h
int 21h
 
                ;SAVE OLD 09H
mov word ptr int09old, bx
mov word ptr int09old+2, es
 
mov ah, 2
mov dl, 32h
int 21h
 
mov ax, 2509h           ;NEW 09H
lea dx, int09new
int 21h
                ;SAVE OLD 28H
mov ax, 3528h
mov word ptr int28old, bx
mov word ptr int28old+2, es
 
                ;NEW 28H
mov ax, 2528h
lea dx, int28new
int 21h
 
 
mov ah, 2
mov dl, 33h
int 21h
 
 
mov ax, 3100h
lea dx, end_resident + 15
mov cx, 4
shr dx, cl
int 21h
 
 
CSEG ends
end


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

Re: Резидентная программа не создает файл

Сообщение somewhere » 13 июн 2013, 07:23

А потому что нельзя вызывать INT внутри обработчика прерывания - используйте CALL
Разве это сейчас не объясняют?

Косяк номер 2: нет сохранения/восстановления CX - рекомендую использовать PUSHA/POPA во избежание геморроя
Косяк номер 3: на входе в обработчик прерывания таймера DS - неопределен, соответственно все переменные доступны по неверным адресам. Установите хотя бы DS=CS
It's a long way to the top if you wanna rock'n'roll

Ответить