我一直在尝试用汇编(16 位)为 MS-DOS 编写 TSR(终止驻留)程序(通常)。我已经阅读了有关 TSR 的 Wikipedia 页面以及专门在 DOS 中使用它的页面(但它似乎是用 C 语言而不是直接用汇编语言教授它)。我查看了一个包含大量 DOS 中断文档的站点,发现这个、这个和另一个与 TSR 程序最相关的一个。我不能发布所有链接,因为作为一个新用户,我可以在一个帖子上拥有多达 2 个超链接。
因此,我尝试在 NASM 中以实模式平面模型(.COM 文件格式)编写一个(看似)非常简单的 TSR 程序。这是代码:
[BITS 16]
[ORG 0x0100]
[SECTION .text]
Start:
; Get current interrupt handler for INT 21h
mov AX,3521h ; DOS function 35h GET INTERRUPT VECTOR for interrupt 21h
int 21h ; Call DOS (Current interrupt handler returned in ES:BX)
mov WORD [v21HandlerSegment],ES ; Store the current INT 21h handler segment
mov WORD [v21HandlerOffset],BX ; Store the current INT 21h handler offset
; Write new interrupt handler for INT 21h
mov AX,2521h ; DOS function 25h SET INTERRUPT VECTOR for interrupt 21h
mov DX,TSRStart ; Load DX with the offset address of the start of this TSR program
; DS already contains the segment address, it is the same as CS in this .COM file
int 21h ; Override the INT 21h handler with this TSR program
; The TSR program will be called even when this portion uses INT 21h to terminate and stay resident
mov AX,3100h ; DOS function TSR, return code 00h
mov DX,00FFh ; I don't know how many paragraphs to keep resident, so keep a bunch
int 21h ; Call our own TSR program first, then call DOS
TSRStart:
push WORD [v21HandlerSegment] ; Push the far address of the original
push WORD [v21HandlerOffset] ; INT 21h handler onto the stack
retf ; Jump to it!
[SECTION .data]
v21HandlerSegment dw 0000h
v21HandlerOffset dw 0000h
当我组装它并在 DOS 中执行它时,它不会返回到 DOS 提示符,而是挂起系统(除了硬件光标仅在最后一个提示符下方闪烁之外,没有任何活动发生)。我猜内存垃圾可能正在执行,但你明白了。
任何人都可以帮助找出这段代码的问题和/或提供在 DOS 中编码 TSR 的一般建议吗?在此先感谢,非常感谢任何帮助!