Проблемы с AMIS.Повторная загрузка резидента в ОП.

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

Модератор: Andy

Ответить
Mosk
Сообщения: 9
Зарегистрирован: 14 окт 2006, 13:54

Мне надо написать резидента,но чтоб повторно его не загружать в ОП при новом вызове проги,я все сделал в стиле AMIS.Но при проверке появился косячок,резидент все равно загружаеться заново.

После поиска свободного идентификатора(наименьшего),в первый раз он выдает,что свободен идентификатор 01H и загружает резидента в ОП. После второго вызова он опять говорит,что свободны все идентификаторы,берет идентификатор 01h,и опять загружаеться в память. При повторном запуске проги ставил проверялку:
ah=01h - идентификатор
al=00 - проверка занятости идентификатора
int 2dh - мультиплексорное прерывание AMSI
результат был ,что идентификатор 01 не занят...(((
ТАК КОГДА ОН ЕГО ЗАНИМАЕТ ТО?

[/b]
пользуясь случаем,передаю привет маме...
Mosk
Сообщения: 9
Зарегистрирован: 14 окт 2006, 13:54

;для тех,кто решиться подойти скурпулезно) ВОТ МОЙ ПРОГ....буду ПРЕБЛАГОДАРЕН...
.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 :o 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 :D 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
пользуясь случаем,передаю привет маме...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Когда я писал резиденты, то через Int 2Fh проверял наличие себя в памяти.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Если через 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
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

А вообще искать себя гораздо проще через Int 2Fh BBB, или например, если прога садится на 09H, то сделать ответ, например:

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
Mosk
Сообщения: 9
Зарегистрирован: 14 окт 2006, 13:54

Всем спасибо,разорался.Моя ошибка состояла в том,что я полагал,что обработчик прерывания int 2dh уже существует и сам магическими путями заполяет идентификаторы резидентов....теперь понял,что все это ложиться на мои пока хрупкие плечи(как асм-кодера)...ЕЩЕ раз спасибо.
Асм жил,Асм жив,Асм будет жить...и мучать нас...
пользуясь случаем,передаю привет маме...
Ответить