gpt4 book ai didi

assembly - 帮助在DOS的NASM汇编中编写TSR程序

转载 作者:行者123 更新时间:2023-12-04 04:13:19 34 4
gpt4 key购买 nike

我一直在尝试在MS-DOS的汇编语言(16位)中编写TSR(终止驻留)程序(通常)。我已经阅读了维基百科页面
在TSR上以及在DOS中专门使用它的页面(但它似乎是在用C而不是直接在Assembly中进行讲授)。我查看了一个包含大量DOS中断文档的站点,并找到了this onethis one以及与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进行编码的一般建议吗?在此先感谢您的帮助!

最佳答案

我想到了。在查看了更多其他资源之后,我发现了以下代码:

push WORD [v21HandlerSegment]       ; Push the far address of the original 
push WORD [v21HandlerOffset] ; INT 21h handler onto the stack

需要是这样的:
push WORD [CS:v21HandlerSegment]       ; Push the far address of the original 
push WORD [CS:v21HandlerOffset] ; INT 21h handler onto the stack

因为这些内存引用是从数据段引用的,而该数据段不是从TSR的调用者设置的。所以基本上我是从其他数据块中引用数据的...

也可以通过将CS放入DS中(然后再放回DS的原始值)来实现,如下所示:
push DS
push CS
pop DS
; Memory references....
pop DS

关于assembly - 帮助在DOS的NASM汇编中编写TSR程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6854117/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com