【问题标题】:How to remove TSR (Terminate-stay-resident) program如何删除 TSR(终止驻留)计划
【发布时间】: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

标签: assembly dos nasm tsr


【解决方案1】:

我们必须将要释放的块段放入 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多