将纪元以来的秒数转换为日期

时间:2010-11-28 18:43:09

标签: algorithm assembly

如何在装配中将EPOCH的秒数转换为日期格式?

这是我的尝试:

    ;get the system date
    mov     dword eax, [ebx+0]
    push    eax
    xor     edx, edx
    mov     edi, 86400
    div     edi             ;1day=86400secs, remainder in edx
    add     edx, 4          ;day 0 was Thursday
    mov     eax, edx
    xor     edx, edx
    mov     edi, 7
    div     edi             ;find the day of the week
    mov     [wday], edx

顺便说一句,我是否正确划分(为了得到edx中的余数)? 基本上,这段代码产生了当天的正确数字(星期日为1)。那么我如何计算月份的数量呢?

1 个答案:

答案 0 :(得分:3)

我强烈建议在组装之前尝试使用更高级别的语言。日期数学过于复杂和不规则,无法直接在汇编中设计算法。

你已经获得了自大纪元以来的天数除以86400.由于一年中的天数不同,你需要弄清楚你在哪一年(以及一年中的天数) 。概念上最简单的方法是逐年采取 - 如果闰年减去366,否则减去365,直到你有不到一年的价值。然后你可以逐月做同样的事情(减去31,或30,或29,或28!)。当然,还有潜在的优化,但这些可以在以后进行。

至于你当前的代码......我认为你不小心使用了当天午夜的秒数,而不是试图计算一周中某天的天数。 (换句话说,你应该在第一个div之后使用eax而不是edx。)还要记住,余数的范围是0到6,所以如果你想要[1..7]范围,你之后应该加1。