Мне надо написать резидента,но чтоб повторно его не загружать в ОП при новом вызове проги,я все сделал в стиле AMIS.Но при проверке появился косячок,резидент все равно загружаеться заново.
После поиска свободного идентификатора(наименьшего),в первый раз он выдает,что свободен идентификатор 01H и загружает резидента в ОП. После второго вызова он опять говорит,что свободны все идентификаторы,берет идентификатор 01h,и опять загружаеться в память. При повторном запуске проги ставил проверялку:
ah=01h - идентификатор
al=00 - проверка занятости идентификатора
int 2dh - мультиплексорное прерывание AMSI
результат был ,что идентификатор 01 не занят...(((
ТАК КОГДА ОН ЕГО ЗАНИМАЕТ ТО?
[/b]
Проблемы с AMIS.Повторная загрузка резидента в ОП.
Модератор: Andy
пользуясь случаем,передаю привет маме...
;для тех,кто решиться подойти скурпулезно) ВОТ МОЙ ПРОГ....буду ПРЕБЛАГОДАРЕН...
.model tiny
.code
.186
org 2ch
envseg dw ?
org 80h
cmd_len db ?
cmd_line db ?
org 100h
;----------------------------------Resident---------------------
Start:
jmp initialize
reset_prog:
retf
;-----------------------------------MY_HANDLER_INT09h-------------
int09h_handler proc far
jmp short actual_int09h ;ISP
old_Int09h dd ?
dw 424bh
db 80h
jmp short reset_prog
db 7 dup (?)
;----------------Actual_handler---------------------
actual_int09h: ;actual int09h
db 80h,0fch
mux_id db ?
pushf
call dword ptr cs
ld_int09h
;mov al,07h
;int 29h
iret
int09h_handler endp
;--------------------------------INITIALIZE------------------------------
initialize proc near
jmp short init_entry
init_entry:
mov ah,9
mov dx,offset proga_inf
int 21h
mov ah,0ffh ;scan free_mux from ff to 00h
find_mux:
xor al,al ;func - check mux
int 2dh
cmp al,00h ;if mux not_free
jnz not_free
mov byte ptr mux_id,ah ;else save this id to mux_id
jmp short next_mux
not_free:
mov es,dx ;check the signature ES
I - finded
mov si,offset amis_sign ; and DS:SI - our
mov cx,6 ; if signature the same
repe cmpsb
jcxz already_loaded
next_mux:
dec ah
jnz find_mux ;if ah not null
free_mux_found:
cmp byte ptr mux_id,0
je no_free_mux
mov ax,3509h ;get adress of int09h offset{2b}:segm{2b} ,int9h=9*4
int 21h
mov word ptr old_int09h,bx ;offset
mov word ptr old_int09h+2,es ;seg
mov ax,2509h ;Set our handler
mov dx,offset int09h_handler
int 21h
mov ah,09h
mov dx,offset init_msg
int 21h
mov dx,offset initialize
int 27h
initialize endp
amis_sign db 'Artstd$'
db 'Textgrab$'
db 'Text grabber ,Sannikov(c)$'
;---------------------------------------EXIT----------------------------------------------------
exit_msg:
mov ah,09h
int 21h
ret
already_loaded:
mov dx,offset mux_alr_loaded
jmp exit_msg
no_free_mux:
mov dx,offset no_free_msg
jmp exit_msg
;------------------------------------Help_func----------------------------------------------
prntmx proc uses ax dx
ret
prntmx endp
init_msg db 'Succesfull Initialization',0dh,0ah,'$'
proga_inf db 'Information about programm',0dh,0ah,'$'
mux_alr_loaded db 'This resident already loaded',0dh,0ah,'$'
no_free_msg db 'No place for this resident',0dh,0ah,'$'
end start
.model tiny
.code
.186
org 2ch
envseg dw ?
org 80h
cmd_len db ?
cmd_line db ?
org 100h
;----------------------------------Resident---------------------
Start:
jmp initialize
reset_prog:
retf
;-----------------------------------MY_HANDLER_INT09h-------------
int09h_handler proc far
jmp short actual_int09h ;ISP
old_Int09h dd ?
dw 424bh
db 80h
jmp short reset_prog
db 7 dup (?)
;----------------Actual_handler---------------------
actual_int09h: ;actual int09h
db 80h,0fch
mux_id db ?
pushf
call dword ptr cs

;mov al,07h
;int 29h
iret
int09h_handler endp
;--------------------------------INITIALIZE------------------------------
initialize proc near
jmp short init_entry
init_entry:
mov ah,9
mov dx,offset proga_inf
int 21h
mov ah,0ffh ;scan free_mux from ff to 00h
find_mux:
xor al,al ;func - check mux
int 2dh
cmp al,00h ;if mux not_free
jnz not_free
mov byte ptr mux_id,ah ;else save this id to mux_id
jmp short next_mux
not_free:
mov es,dx ;check the signature ES

mov si,offset amis_sign ; and DS:SI - our
mov cx,6 ; if signature the same
repe cmpsb
jcxz already_loaded
next_mux:
dec ah
jnz find_mux ;if ah not null
free_mux_found:
cmp byte ptr mux_id,0
je no_free_mux
mov ax,3509h ;get adress of int09h offset{2b}:segm{2b} ,int9h=9*4
int 21h
mov word ptr old_int09h,bx ;offset
mov word ptr old_int09h+2,es ;seg
mov ax,2509h ;Set our handler
mov dx,offset int09h_handler
int 21h
mov ah,09h
mov dx,offset init_msg
int 21h
mov dx,offset initialize
int 27h
initialize endp
amis_sign db 'Artstd$'
db 'Textgrab$'
db 'Text grabber ,Sannikov(c)$'
;---------------------------------------EXIT----------------------------------------------------
exit_msg:
mov ah,09h
int 21h
ret
already_loaded:
mov dx,offset mux_alr_loaded
jmp exit_msg
no_free_mux:
mov dx,offset no_free_msg
jmp exit_msg
;------------------------------------Help_func----------------------------------------------
prntmx proc uses ax dx
ret
prntmx endp
init_msg db 'Succesfull Initialization',0dh,0ah,'$'
proga_inf db 'Information about programm',0dh,0ah,'$'
mux_alr_loaded db 'This resident already loaded',0dh,0ah,'$'
no_free_msg db 'No place for this resident',0dh,0ah,'$'
end start
пользуясь случаем,передаю привет маме...
Когда я писал резиденты, то через Int 2Fh проверял наличие себя в памяти.
Если через Int 2Dh, то суть другая. Нужно подменять вектор 2D и твой код должен проверять, его зовут или нет. Если не его идет по прошлому Int 2D адресу, а если его и функция AL = 00h, то должен ответить FFh - т.е. он занят. Таким образом помня прошлый вектор 2D "обегая" все другие резиденты выполняется поиск свободного ID. Почитай :
http://mjping.narod.ru/exempl/DOS/ascii.asm
http://www.soft32.ru/literature.shtml?t ... h05_06.htm
http://mjping.narod.ru/exempl/DOS/ascii.asm
http://www.soft32.ru/literature.shtml?t ... h05_06.htm
It's a long way to the top if you wanna rock'n'roll
А вообще искать себя гораздо проще через Int 2Fh BBB, или например, если прога садится на 09H, то сделать ответ, например:
mov ax, 1234h
int 09h, или Call [int09_vec]
cmp ax, 4321h
jz thats_it
jmp gone_away
mov ax, 1234h
int 09h, или Call [int09_vec]
cmp ax, 4321h
jz thats_it
jmp gone_away
It's a long way to the top if you wanna rock'n'roll
Всем спасибо,разорался.Моя ошибка состояла в том,что я полагал,что обработчик прерывания int 2dh уже существует и сам магическими путями заполяет идентификаторы резидентов....теперь понял,что все это ложиться на мои пока хрупкие плечи(как асм-кодера)...ЕЩЕ раз спасибо.
Асм жил,Асм жив,Асм будет жить...и мучать нас...
Асм жил,Асм жив,Асм будет жить...и мучать нас...
пользуясь случаем,передаю привет маме...