关于DOS下的驻留内存,TC编写,很急!!

zylfarzero 2002-01-10 03:47:40
下面一段驻留内存的程序
为什么我一对文件进行操作,在DOS下就死机。
如果我把对文件操作去掉,一切正常。
请哪位大侠帮忙?
我一定给分的。
源程序如下:
#include <stdio.h>
#include <dos.h>
#include <stddef.h>
#include <stdlib.h>
#define INTR 0x1C
#define ATTR 0x7900
unsigned intsp,intss;
extern unsigned _heaplen = 1024;
extern unsigned _stklen = 512;
unsigned sp,ss;
unsigned char stack[0x1000];

void interrupt ( *oldhandler)(void);

void interrupt handler(void)
{
char line[80], far *save_dta;
struct time t;
int th1,th2,th3;
int tm1,tm2,tm3;
int ts1,ts2,ts3;
int temp=0;
char buffer[256] = "登录者:中国上海 开始时间:10:30:45 离开时间:";
struct fcb blk;
unsigned int (far *screen)[80];
static long count;
disable();
ss=_SS;
sp=_SP;
_SS=_DS;
_SP=(unsigned)&stack[0x1000-2];
enable();
screen = MK_FP(0xB800,0);
count++;
count %= 900;
temp=count%10;
screen[0][79] = temp + '0' +ATTR;
if(count==890)
{
strcpy(buffer,"登录者:中国上海 开始时间:10:30:45 离开时间:");
gettime(&t);
th1=t.ti_hour;
tm1=t.ti_min;
ts1=t.ti_sec;
th2=th1/10;
th3=th1%10;
tm2=tm1/10;
tm3=tm1%10;
ts2=ts1/10;
ts3=ts1%10;
buffer[48]='0'+th2;
buffer[49]='0'+th3;
buffer[50]=':';
buffer[51]='0'+tm2;
buffer[52]='0'+tm3;
buffer[53]=':';
buffer[54]='0'+ts2;
buffer[55]='0'+ts3;
buffer[56]='\0';
strcpy(line,"memotext.txt");
parsfnm(line, &blk, 1);
bdosptr(0x16,&blk,0);
save_dta = getdta();
setdta(buffer);
blk.fcb_recsize = 64;
blk.fcb_filsize = 0;
blk.fcb_curblk = 0;
blk.fcb_date = 0;
blk.fcb_currec = 0;
blk.fcb_random = 0L;
randbwr(&blk, 1);
bdosptr(0x10,&blk,0);
setdta(save_dta);
}
oldhandler();
disable();
_SS=ss;
_SP=sp;
enable();
}

main()
{
oldhandler = getvect(INTR);
setvect(INTR, handler);
keep(0, (_SS + (_SP/16) - _psp));
return 0;
}
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zylfarzero 2002-01-11
  • 打赏
  • 举报
回复
谢谢虽然没有完全解决。
ppkk 2002-01-11
  • 打赏
  • 举报
回复
补充几点:
  请注意gettime(&t),也调用了DOS功能,你可以用BIOS调用来获取时间
  如BIOSTIME函数,其可在TSR中安全使用。
  你贴出的程序可能省略了在中断中要做的其它重要事情,否则在中断中仅
  获取时间没用必要。如果每次时间到后,将获取的信息(如IO口中输入数据)
  写在文件中的第一行,下次中断时,重写第一行(你贴出的程序正是这样),
  这样的话,没有必要用文件,可将其写入全程字符串变量中,在TSR驻留时,
  将其地址写入中断向量INT80H(DOS不用的即可),这样你的另一个非TSR程序
  就可随时通过获取INT80的地址,而访问TSR所采集到的数据。这样由于不使
  用任可文件系统,不发生DOS重入,而使TSR能良好工作。我以前就是用这种方
  法编了很多TSR程序,工作正常。

题外话: 这位先生标题有"很急"字样,而且在听到“DOS过时"的言论也不争辩,
  很有可能有丰厚的回报在等着他。也许你还在这里说其过时,他已在那里
  笑逐颜开了。在工控领域,正是靠这样短小"过时"的程序赚着大把大把钞票。
不用谈过不过时,能赚钱就是本事。
ppkk 2002-01-10
  • 打赏
  • 举报
回复
关键的你的程序发生了DOS重入问题.
检测当前是否可调用DOS int21h:
ah=34h
int 21h
返回:es:bx indos标志字节的地址
其为1表示处在DOS内核中,不可调用。
但是,你的程序用的是时钟中断,而
DOS在等待用户输入时是处在内核中的
(其使用内核第一栈),与你的FCB方式
文件功能调用使用同一栈,发生了真正
的重入,所以你应该不用FCB方式操作
文件,而应该用3F 40等功能调用,
因为其使用内核第二栈,不会发生真正
的重入。祝你成功!

另: DOS在很多场合仍在发挥重要作用,
如实时控制,数据采集,工业仪器,
这些场合使用WINDOWS,不但毫无优势,成本也大大
增加。
就是应用领域,比如我所在的单位仍有很多
员工在用80年代的AUTOCAD 10.0,并不是
不会用AUTOCAD 2000,而是根本没必要,
10.0用户早已通过键盘打入命令完成了任务,
新手还在2000的一大堆用不上的菜单上找来找去。
根本没用提高效率,在此情况下,2000对其
毫无吸引力。
microsoft等不断的升级,不但花了我们很多钱,
而且白费了我们很多时间。

781014 2002-01-10
  • 打赏
  • 举报
回复
学习
Bird1945 2002-01-10
  • 打赏
  • 举报
回复
DOS一次只能执行一个进程,
如果你的TSR执行起来要很长时间的话,
那其它程序就停止.
还有,21号中断是不可重入的.
不知道你的程序是做什么用的,
不妨用shell试试,
BCB 2002-01-10
  • 打赏
  • 举报
回复
你的问题就是DOS被淘汰的原因之一
过客猫2022 2002-01-10
  • 打赏
  • 举报
回复
补充:因为是单任务,所以DOS只有一块数据区!如两个程序都使用这个数据区,就会死机了!那个标志叫可重入标志
过客猫2022 2002-01-10
  • 打赏
  • 举报
回复
哎!DOS是单任务系统,如果写TSR程序,如果没有用DOS的调用,就不会死机!如果使用int21h,那就要注意了,特别是文件操作等,要检查DOS下安全标志,表示现在调用DOS这些功能是没有问题的!具体的标志你去找相关书籍了,最好找用ASM写TSR的!祝你成功
glyc 2002-01-10
  • 打赏
  • 举报
回复
老兄,学这个已经没有什么用处了。改提些其他问提吧!

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧