【发布时间】:2014-11-06 18:42:31
【问题描述】:
我在 nasm 中创建了一个 tsr 程序。它工作正常,但当我按下“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 计划经验的人可以真正给出适当的答案。
【问题讨论】:
-
对于 ah,49h, int 21h, 序列,你应该设置 ES 为要释放的块的起始段,这可能是 CS 寄存器(PSP = 程序段前缀)。尝试:|推cs |流行音乐 | mov ah,49h |诠释 21 小时 | .我假设这是一个 .COM 类型的 TSR(相对于 .EXE)。此外,您可能需要将 sti 移到 iret 之前。另一个问题是某些 DOS 中断不能嵌套。
-
@rcgldr 我试过你写的但没有成功。如果您有时间查看,我可以将整个代码上传到某个地方
-
看看这个链接是否有帮助。指令有点混乱,在单独的行而不是逗号上显示操作数。 tsrs