2010-11-28 6 views
2

Как я могу преобразовать секунды из 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 для воскресенья). Так как я могу вычислить номер месяца?

+0

Домашнее задание, если это возможно? – aefxx 2010-11-28 18:49:49

+2

Если это не домашнее задание, это мазохизм. – 2010-11-28 18:51:46

ответ

3

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

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

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

Смежные вопросы