[asm]program rezydentny COM

0

witam, mam problem z programem typu TSR, jest to program COM, problem polega na tym ze kiedy uruchomie program raz to zgrywa on nowa procedure przerwania 9. KIedy uruchomie go ponowanie psrawdza on czy juz jest w pamieci czy nie i i jesli jest to sie usuwa. PRoblem w tym ze kiedy uruchmonie go tak kolo 6 - 10 razy to w pamieci zostaja jakies jego smieci i nie wiem dlaczego prosze o pomoc oto kod:

.model tiny

prog	segment

assume cs:prog, ds:prog, es:prog

org	100h

start:
jmp	startuj

;-------------CZESC TSR PROGRAMU------------------

ety	db	'jest_ok'
nowa08	proc	far
pushf

push	ax


in	al,60h ;pobranie klawisza 
cmp	al,30 ;porownanie czy to nasz klawisz
jne	koncz_juz


mov	ah,02h
int	16h ; pobieramy do al bajt ze stanem klawisz (SHIFT,ALT,CTRL)
and	al,04h ;nakldamy maske na CTRL
cmp	al,04h
jne	koncz_juz

push	dx
push	bx
push	ds
push	es
push	bp

mov	ah,03h 
mov	bh,0 ; storna video w techu pisze ze pzrewaznie 0
int	10h ; pobieramy pozycje kursora kolumne i wiesz do dl i dh

mov	row,dh
mov	col,dl

;----------------13h INT10h wypisuje ciag znakow
mov	ax,1301h ;wyswietl kursor i aktualizuj kursor
push	cs
pop	es
lea	bp,zmienna ;napis do wypisania
mov	cx,59 ;ile znakow wypisac
mov	dl,col-2 ;kolumna gdzie zaczac pisac
mov	dh,row ; rzad j/w
mov	bl,74h ;kolor napisu i tla
int	10h
;jmp	$+2 ; opoznienie sekunda

pop	bp
pop	es
pop	ds
pop	bx
pop	dx

koncz_juz:

pop	ax

call	dword ptr cs:[temp08]

iret
endp

zmienna	db	'Program rezydentny jest zaladowany Mozna pracowac dalej: '
row		db	0
col		db	0

stara08	dd	0
temp08	dd	0
;--------------WLASCIWY START PROGRAMU-------------
startuj:

mov	ax,3509h
int	21h
mov	word	ptr	cs:[stara08],bx
mov	word	ptr	cs:[stara08+2],es

lea	si,ety
mov	di,si
mov	cx,7
repe	cmpsb ; powrownuje ds:si z es:di, repe powtarza tyle razey ile w cx
je	usun_sie

mov	ax,3509h
int	21h
mov	word	ptr	cs:[temp08],bx
mov	word	ptr	cs:[temp08+2],es

mov	ax,2509h
lea	dx,nowa08
cli
int	21h
sti

push	cs
pop	ds

lea	dx,startuj
int	27h

;---------------PRZERWANIE 09h ROWNA SIE STARA09-------
;---------------USUWAMY PROGRAM Z PAMIECI-------------
usun_sie:

mov	ds,word	ptr	es:[temp08+2]
mov	dx,word	ptr	es:[temp08]
mov	ax,2509h
cli
int	21h
sti


mov	ah,49h
int	21h

mov	ax,4c00h
int	21h

prog ends
end start

z gory dziek iza pomoc!

nikt nie potrafi mi pomoc ???

0

mam Bardzo podobny problem w programie TSR z przerwaniem zegara. Po wyjsciu zostaja w pamieci smieci a struktura jest niemal identyczna do tej od mojego przedmowcy...

0

Ten problem jest spowodowany specyfiką pamięci przy programach rezydentnych, która po prostu nie kasuje niektórch części, co pozwala na "rezydowanie", lecz usunięcie tego to skomplikowany problem logiczny. Oferują to specjalne biblioteki, niestety płatne. Najlepszy sposób to znalezienie tej części, w której są "śmieci", i ręczne usunięcie jej (za pomocą permanętnych komend)

0

U mnie powyższy program działa dobrze tz. nie zostawia dodatkowych smieci w pamięci po kilkukrotnym uruchomieniu.

Po uruchomieniu programu zajmuje on w pamięci dokładnie 5968b i całą tą pamięć po ponownym uruchomieniu zwalnia.

Uruchamiałem na Windowsie 98 Wersja 4.10.2222

1 użytkowników online, w tym zalogowanych: 0, gości: 1