Давайте прокомментируем каждую строчку...
И даже попытался добавить строки выше и ниже...
[code lang=asm]
;добавлю, что, по идее, было раньше...
push ax ;сохраним ax
xor ax, ax ;обнулим ax
push ds ;сохраним сегментный регистр сегмента данных
;--------------
push si ;сохраним используемый регистр
mov si, 40h ;зададим адрес сегмента данных ДОСа
mov ds, si
mov si, 6ch ;по смещению 6ch находится двойное слово - счетчик тиков таймера
;считаем тики, которые примерно раз в 0.055 мс (0,054925494583735950770482632355185 мс)
add word ptr [si], 1 ;инкремент младшего слова,
adc word ptr [si+2], 0 ; затем сложение с переносом старшего
;дальше самое интересное
;чтобы отсчитать сутки, надо насчитать 1800b0h тиков
;вот и получается:
cmp [si+2], 18h ;сначала сравниваем старшее слово
jnz L_B853 ;не равно - уходим куда-то
cmp [si], 0b0h ;потом младшее
;--------------
;напишу, что по идее дальше
jnz L_B853 ;не равно - уходим туда же
mov word ptr[si], 0 ;досчитали - обнуляем счетчик
mov word ptr[si+2], 0
mov word ptr[si+4], 1 ; и взводим флаг переполнения по адресу 70h (в сегменте 40h)
or al, 8 ;пометим, что у нас переполнение!
L_B853:
push ax ;в ax признак переполнения (или 0, или 8), сохраняется в стеке,
; ; чтобы не испортить
;... ;что-то там делаем...
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен