我需要在上次启动后使用C。
获得系统正常运行时间目标操作系统是MS DOS。
我尝试time()
,ftime()
,但他们相对于1月1日1970年00:00:00。
有人可以提出一些解决方案吗?
提前致谢。
答案 0 :(得分:4)
要在MS-DOS上阅读系统时间,您可以拨打INT 1a,0
,例如像这样(GNU语法):
unsigned short cx, dx;
__asm__ (
"mov $0, %%ah \n\t"
"int $0x1a \n\t"
: "=c" (cx), "=d" (dx)
:
: "ax"
);
time_t time = cx;
time <<= 16;
time |= dx;
time = (time_t) ((double)time / 18.2065);
这可能是你最好的选择。如果此时没有人使用INT 1a,1
设置,您将获得启动后的秒数。
请注意,这最多只能计算24小时,如果您需要更长的时间,则必须定期拨打此电话并注意al
中的“午夜标志”。
在这种情况下添加另一个输出变量,只要您看到al
非零,只需将日期计数器递增,只需将days * 86400
添加到最终结果中,粗略轮廓:
unsigned short ax, cx, dx;
static unsigned days = 0;
__asm__ (
"mov $0, %%ah \n\t"
"int $0x1a \n\t"
: "=a" (ax), "=c" (cx), "=d" (dx)
);
if (ax & 0xff) ++days;
time_t time = cx;
time <<= 16;
time |= dx;
time = (time_t) ((double)time / 18.2065);
time += days * 86400;
我发现some additional info可能对此有用:
第二个问题是因为BIOS int 0x1A的运行方式。无论何时调用此函数来检索系统时间(当前计时器刻度值),它还会返回当前的MIDNIGHT标志并重置标记。但由于BIOS功能不会更新DOS日期,下次请求日期时,它将无法正确更新。 DOS知道该行为,因此当您调用任何DOS函数时,MIDNIGHT标志将被正确维护。如果您自己调用BIOS int 0x1A,则必须检查MIDNIGHT标志值并在设置时将其重新打开。
因此,简而言之,如果在程序运行时需要MS-DOS来维护正确的日期,则必须执行其他工作(例如手动恢复标记并在每次找到时调用INT 21,2A
)