使用dos.h在TSR编程中使用keep(int,int)函数

时间:2012-10-10 18:33:03

标签: c tsr

在研究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);     // <<<<<
}

2 个答案:

答案 0 :(得分:2)

该程序安装中断处理程序。它使用中断号8 system timer interrupt。这是一种常见的做法,可以使用此中断在运行DOS的计算机上“持续”执行操作。

prev=getvect(8);

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

setvect(8,our);

此行设置中断向量,即告诉系统调用此函数而不是旧函数,每秒18次。请注意,为了避免崩溃,除了主要目的(似乎更改字符大小写)之外,新函数必须调用旧函数。

keep(0,10000);

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

TSR计划崩溃的常见原因是最后缺少keep。 DOS释放由函数our的代码占用的内存,并在接下来的1/18秒内执行随机代码。

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

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

答案 1 :(得分:1)

如果您阅读我在TSR上发布的相似问题的答案

,您将部分理解此代码

How to write a TSR which changes case of characters

这里最重要的事情是

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

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

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

这样的东西
char * far p = 0xB8000000;

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

循环前进到屏幕的其余部分。

有一本由yashwant kanetkar撰写的c书,其中有很多参考资料。我记得多年前在我的本科生中使用它。

其余的只是在dos.h中索引api。如果你不理解,为什么不通过他们的描述并回到这里?