Преобразовать секунды с эпохи до даты - PullRequest
2 голосов
/ 28 ноября 2010

Как я могу преобразовать секунды из 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 Ответ

3 голосов
/ 28 ноября 2010

Я бы настоятельно рекомендовал проработать это на языке более высокого уровня, прежде чем пробовать это на ассемблере. Математика даты слишком сложна и нерегулярна, чтобы разрабатывать ваш алгоритм непосредственно в сборке.

У вас уже есть количество дней, прошедших с начала эпохи, путем деления на 86400. Поскольку число дней в году меняется, вам необходимо выяснить, в каком году вы находитесь (и сколько дней в году) , Концептуально самый простой способ сделать это состоит в том, чтобы брать это из года в год - вычитать 366, если високосный год, 365 в противном случае, пока у вас не будет дней меньше года. Затем вы можете делать один и тот же месяц за месяцем (отнимите 31, или 30, или 29, или 28!). Конечно, есть потенциальные оптимизации, но они могут прийти позже.

Что касается вашего текущего кода ... Я думаю, что вы случайно используете число секунд после полуночи текущего дня вместо количества дней, когда пытаетесь вычислить день недели. (Другими словами, вы должны работать с eax после того первого div, а не edx.) Также имейте в виду, что остаток будет в диапазоне от 0 до 6, поэтому, если вы хотите диапазон [1..7], Вы должны добавить 1 впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...