Функция 26, подфункция 9 - получить значение счётчика времени.
Параметры:
eax = 26 - номер функции
ebx = 9 - номер подфункции
Возвращаемое значение:
eax = число сотых долей секунды, прошедших с момента запуска системы
Замечания:
Счётчик берётся по модулю 2^32, что соответствует немногим более 497 суток.
Системное время можно получить функцией 3.
Соответственно в идеальных условиях перезагружать придется раз в год, если брать грубые значения. Поскольку работы над сетевым стеком хоть и медленно, но ведутся. Да и по другим направлениям развиваемся, то имеет смысл задуматься над расширением счетчика с 2^32 до 2^64.
Spoiler:Это позволит увеличить время до жалких 2135039823346 дней или не менее жалких 5849424173, еще более жалких 58494241 столетий, совсем уж жалких 5849424 тысячелетий, и смехотворных 5,8 миллиардов лет. Я в расчетах не ошибся?
В очередной раз любой может выразить свое веское мнение и убедить всех, что перезагружать девайсы раз в год это нормально и приемлемо. Spoiler:Ведь время, когда высоконагруженные серверы бороздящие просторы больших театров работающие на "идеальном исходном коде" время аптайма которого десятки минут и дублируемого вторичными процедурами отслеживающими смерть первых и перезапускающих их - уже наступило. А ведь писатели-фантасты описывали трехконтурные системы с абсолютной надежностью еще в начале XX века. Добро пожаловать в XXI век - век "жира" и говнокода, где ассемблеру почти нет места.
CleverMouse wrote:Ничего не делать, переполнение ничему не мешает. Зачем отлавливать?
Приложение с длительным временем работы может некорректно функционировать.
Пример некорректного функционирования?
То что в данный момент у меня нет под рукой рабочего приложения (счетчик еще надо умудриться накрутить), то это не значит что вероятности возникновения проблемы нет. Чисто логически рассуждая она может возникнуть.
Чисто логически, обработка такой ситуации на совести автора программы. Но сам по себе длинный счётчик вещь полезная и не требует больших изменений в ядре.
Абсолютные значения счётчика не имеют особого смысла сами по себе, важна только разность двух моментов времени для определения событий типа "с момента, как мы засекли, прошла минута".
; testing for timeout
mov ecx, [timer_ticks]
sub ecx, [ebx+APPDATA.wait_begin]
cmp ecx, [ebx+APPDATA.wait_timeout]
jb .loop
Переполнение здесь ничему не мешает: если ожидание началось в момент wait_begin = 0xFFFFFFFF, а timer_ticks = 1, то после вычитания получится корректная разница ecx = 2 тика таймера, с которой можно поступать как обычно.