2014-11-06 3 views
-1

나는 nasm에 tsr 프로그램을 만들었습니다. 그것은 잘 작동하지만 나는 또한 그것을 memmory에서 제거하고 복원 내가 'ESC'버튼을 누르면 모든 구부러진 interupts 원래로해야합니다. 이것은 'ESC'버튼을 누를 때 실행되는 코드의 일부입니다. TSR (Terminate-Stay-Resident) 프로그램을 제거하는 방법

uninst: 
cli 
xor ax, ax 
mov es, ax 
mov ax, [stari_int09_seg] 
mov [es:09h*4+2], ax 
mov dx, [stari_int09_off] 
mov [es:09h*4], dx 
sti 
mov ah,49h 
int 21h 
iret 

그래서 나는 원래 값으로 변경하고 mov ah,49h
내 memmory을 지워 내 INT의 09H를 복원,하지만 난 'ESC'를 누르면 내 도스 콘솔은 응답 불가가됩니다. 즉, TSR을 올바르게 제거하지 못했음을 의미합니다. 내 첫번째 질문은 내가 뭔가를 놓친거야? 실제로 적절한 답을 줄 수있는 TSR 프로그램에 대한 경험이있는 사람들이 있습니까?

+1

아, 49h, int 21h 시퀀스의 경우 ES를 릴리즈 할 블록의 시작 세그먼트로 설정해야합니다.이 세그먼트는 아마도 CS 레지스터 (PSP = 프로그램 세그먼트 접두어) 일 것입니다. 시도하십시오 : | 푸시 CS | 팝스 | mov 아, 49h | int 21h | . 나는이 .COM 형식 TSR (대 .EXE) 가정합니다. 또한 sti를 iret 직전으로 이동해야 할 수도 있습니다. 또 다른 문제는 일부 DOS 인터럽트를 중첩 할 수 없다는 것입니다. – rcgldr

+0

@rcgldr 내가 쓴 것은 시도했지만 성공하지 못했다. 당신이 그것을 볼 시간이 있다면 어딘가에 전체 코드를 업로드 할 수 있습니다 – Bozic

+0

이 링크가 도움이되는지보십시오. 지침은 약간 엉망이되어 쉼표가 아닌 별도의 줄에 피연산자를 표시합니다. [tsrs] (http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_18/CH18-4.html) – rcgldr

답변

0

블록 세그먼트를 ES 세그먼트 레지스터에 자유롭게 놓아야합니다.

RBIL->inter61b.zip->INTERRUP.G 
--------D-2149------------------------------- 
INT 21 - DOS 2+ - FREE MEMORY 
AH = 49h 
ES = segment of block to free 
Return: CF clear if successful 
CF set on error 
    AX = error code (07h,09h) (see #01680 at AH=59h/BX=0000h) 
Notes: apparently never returns an error 07h, despite official docs; DOS 2.1+ 
    code contains only an error 09h exit 
DOS 2.1-6.0 does not coalesce adjacent free blocks when a block is 
    freed, only when a block is allocated or resized 
the code for this function is identical in DOS 2.1-6.0 except for 
    calls to start/end a critical section in DOS 3.0+ 
SeeAlso: AH=48h,AH=4Ah 
0

DS가 벡터 9의 원래 값을 저장 한 세그먼트를 가리키고 있습니까?
다른 사람들은 DOS 기능 49h를 호출하기 전에 ES를 설정해야한다고 지적했습니다.
메모리를 비운 후에 즉시 IRET을 수행합니다. 나는이 코드가 인터럽트 루틴의 일부이고 therfore가 어떤 레지스터도 바꿀 수 없기 때문에 많은 POP 명령어를 기대했을 것입니다!