如何删除TSR(Terminate-stay-resident)程序

时间:2014-11-06 18:42:32

标签: assembly dos nasm tsr

我在nasm中创建了一个tsr程序。它工作正常但我还必须删除它从memmory和恢复所有连接的中断到原来当我按下ESC'按钮。当我按下ESC'这是我运行的代码的一部分。按钮。

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

所以我恢复了我的int 09h,我改变了它的原始值并用mov ah,49h清除了我的记忆,但是当我按下ESC'我的dos控制台变得反应迟钝。这意味着我没有以正确的方式移除我的TSR。我的第一个问题是我错过了什么?是否有任何有TSR程序经验的人才能真正给出适当的答案。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您确定DS指向存储了向量9的原始值的段吗?
正如其他人指出你需要在调用DOS函数49h之前设置ES 在释放内存后立即执行IRET。我本来期望一堆POP指令,因为这段代码是中断程序的一部分,因此无法更改任何寄存器!