在研究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); // <<<<<
}
答案 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。如果你不理解,为什么不通过他们的描述并回到这里?