Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
Делись... А в чем ошибка ? 17.12.02 20:21 Число просмотров: 1846
Автор: SLaViR Статус: Незарегистрированный пользователь
|
Резидент запускается для 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
mov ax,cs:[2ch]
mov es,ax
mov ah,49h
int 21h ; Освобождаю среду
; mov dx,((offset pgm_len+15)/16)+010h ; размер резидентной части
mov dx,285
mov ax,3100h
int 21h ; завершить программу, оставив часть в памяти
load: db 0Ah, 0Dh, 'SCAN',0Ah, 0Dh
db 'On left top corner show status of somefile.prn', 0Ah, 0Dh
db '$'
scan endp
code_seg_a ends
end start
|
<programming>
|
[ASM] Резидент под DOS 6.22 (Поиск и печать файла, при его создании) 16.12.02 15:42
Автор: SLaViR Статус: Незарегистрированный пользователь
|
Никто не решал такую проблему?
Могу поделиться исходником на асме... но он кривой.... ошибку отловить не получается
|
|
Делись... А в чем ошибка ? 17.12.02 14:13
Автор: Chingachguk <Chingachguk> Статус: Member
|
> Никто не решал такую проблему?
Именно такую - нет>...
> Могу поделиться исходником на асме... но он кривой.... > ошибку отловить не получается
Давай, покажи. А то слишком абстрактно ...
|
| |
Делись... А в чем ошибка ? 17.12.02 20:21
Автор: SLaViR Статус: Незарегистрированный пользователь
|
Резидент запускается для 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
mov ax,cs:[2ch]
mov es,ax
mov ah,49h
int 21h ; Освобождаю среду
; mov dx,((offset pgm_len+15)/16)+010h ; размер резидентной части
mov dx,285
mov ax,3100h
int 21h ; завершить программу, оставив часть в памяти
load: db 0Ah, 0Dh, 'SCAN',0Ah, 0Dh
db 'On left top corner show status of somefile.prn', 0Ah, 0Dh
db '$'
scan endp
code_seg_a ends
end start
|
| | |
А флаги кто будет сохранять? 18.12.02 07:04
Автор: Killer{R} <Dmitry> Статус: Elderman
|
pushf при входе в обработчик и popf непосредственно перед выходом.
|
| | | |
Обработчик должен быть примерно таким 18.12.02 07:13
Автор: Killer{R} <Dmitry> Статус: Elderman
|
worker:
pushf
pusha
push ds
push es
cli
;тырыпыры
;тырыпыры
pop es
pop ds
popa
popf
old_farjmp db 0eah
old_ofs dw 0
old_seg dw 0
|
| | |
Нереентерабельность однако 17.12.02 23:04
Автор: :-) <:-)> Статус: Elderman
|
Дык нельзя вот так просто вызывать функции ДОС из обработчиков аппаратных прерываний.
Чтобы это делать, есть несколько способов: проверка флага занятости ДОС, отложенная активизация по таймеру, своппинг SDA.
В сети должно быть много инфы и исходников на эту тему (искать в Яндексе что-то наподобие "нереентерабельность ДОС").
Еще была хорошая книга - К.Г.Финогенов "Самоучитель по системным функциям MS-DOS", 1995. Там все описано.
|
| | | |
Совершенно верно. 18.12.02 10:05
Автор: Chingachguk <Chingachguk> Статус: Member
|
> Дык нельзя вот так просто вызывать функции ДОС из > обработчиков аппаратных прерываний.
Полностью согласен.
Необходимо, к примеру, писать обработчик int 28h - этот вектор дос вызывает всякий раз, когда дос не занят и можно звать его апи.
Хочу заметить, что эта же тема обсуждалась тут ~ полгода назад.
Также аналогичная тема сейчас проскочила на форуме wasm.ru - в теме "резидент".
|
| | | | |
Спасибо всем. Помощь была просто неоценима и вовремя... 18.12.02 13:10
Автор: SLaViR Статус: Незарегистрированный пользователь
|
1.5. Прерывание 21h. Его можно перехватить для более надежного определения занятости DOS'а, чем через флаг InDOS. Дело в том, что функции 21-го прерывания 00-0ch и 0eh-... независимы друг от друга, в связи с чем при работе одной группы функций можно безопасно вызывать функции из другой группы. Соответственно, если в обработчике 21-го прерывания проверить номер функции и записать номер группы в переменную, то можно будет "всплыть" и в случае работы DOS в первой группе.
Помог эксперт Ayl c RusFAQ.ru: программирование на языке Assembler
и Traish.
Про флаги тоже спасибо.
|
|
|