自上次启动C以来获取系统正常运行时间

时间:2017-06-23 08:46:13

标签: c dos

我需要在上次启动后使用C。

获得系统正常运行时间

目标操作系统是MS DOS。

我尝试time()ftime(),但他们相对于1月1日1970年00:00:00。

有人可以提出一些解决方案吗?

提前致谢。

1 个答案:

答案 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