2

在学习 tsr 编程时,我看到了某些我无法理解的代码的使用。

示例 cede 部分是(在 c 中):(请解释粗体部分)

#include "dos.h"
#include"stdio.h"
void interrupt our();
void interrupt (*prev)();
char far *scr=(char far*)0xB8000000L;
int ticks;
unsigned char color;
main()
{   
    prev=getvect(8);   // <<<<<
    setvect(8,our);    // <<<<<
    keep(0,10000);     // <<<<<
}
4

2 回答 2

2

该程序安装一个中断处理程序。它使用中断号 8,系统定时器中断。这是使用此中断在运行 DOS 的机器上“连续”执行操作的常见做法。

prev=getvect(8);

此行获取中断向量,即系统每秒调用 18 次的函数的指针。

setvect(8,our);

这一行设置了中断向量,也就是告诉系统调用这个函数,而不是旧函数,每秒18次。请注意,为了避免崩溃,新函数必须调用旧函数,除了它的主要目的(这似乎是改变 characters 的大小写)。

keep(0,10000);

这一行使程序带有退出代码( success0的常规值)并告诉 DOS 将字节(或者可能是 16 字节单位?不太可能;我不记得)留在 RAM 中。这与程序 ( ) 的正常完成不同,其中 DOS 将程序先前占用的所有 RAM 标记为空闲。10000exit(0)

TSR 程序崩溃的一个常见原因是keep结尾的缺失。DOS释放函数代码占用的内存our,在接下来的1/18秒内,随机执行一段代码。

有关详细信息,请参阅Int 21/AH=31h

另请注意,参数 tokeep应该通过操作一些地址来计算,这样你就不会占用太多内存,另一方面,要占用足够的内存来包含函数的代码our,它执行你需要的东西。该值10000只是一个示例。

于 2012-10-10T19:29:45.717 回答
2

如果您阅读我在 TSR 上发布的类似问题的答案,您将部分理解此代码

如何编写更改字符大小写的 TSR

这里最重要的是

远指针:由于 16 位 DOS 使用段偏移寻址方案,您的正常近指针无法访问超出其分配段的 64K 的内存。您必须阅读详细信息才能理解它。

显存地址:这个 B8000000 是你需要远指针的地址。这个地址的特殊之处在于,从这个位置开始的字节(等于屏幕分辨率*2)被直接复制到显存中。

因此,如果您在间接后将字符分配给指针地址,它将打印在屏幕上

就像是

char * far p = 0xB8000000;

*p = 'a'; // this would actually print a on screen at left top

向前循环以到达屏幕的其余部分。

yashwant kanetkar 的 ac 书对此有很多参考。我记得很多年前我在本科时使用过它。

其余的只是在 dos.h 中索引 api。如果您不了解任何内容,为什么不仔细阅读他们的描述并回到这里?

于 2012-10-10T18:59:03.083 回答