Проверка на lastv
для предотвращения зацикливания в одну и ту же секунду несколько раз неверна.
Он должен использовать je PollClock
(обратите внимание на отсутствие n
), чтобы вернуться к циклу, если текущая секунда все еще равна последней сохраненной.
Более того, вы не обрабатываете lastv
правильно:
- Вы инициализируете его с 0, который является действительным кратным 5. Это заставит вашу программу пропустить первый удар, если он окажется на втором
0
(то есть на минутной границе). - Вы не сохраните его после теста делимости.Если вы не увеличивали его после печати (соблюдайте вышеприведенное условие
jne
), ваша программа будет печатать каждую минуту, но с этим шагом она будет печататься только один раз (когда наступит минута), поскольку будущие итерации потребуютсекунда, которая будет кратна 5 и равна 1.
Вы должны:
- Инициализировать
lastv
переменную с невозможным значением (например, не кратным5 или просто 0ffh, который находится вне диапазона в течение секунд) - Преобразование
jne
в je
- Сохраните значение
al
в lastv
перед печатью - Удалите
inc lastv
lastv db 0ffh ;Changed and moved
...
mov al, saver
cmp lastv, al
je PollClock ;Changed
mov lastv, al ;Added
...
;inc lastv ;Commented
Но перед этим необходимо переместить переменные в сегмент данных, в противном случае доступ к ним осуществляется через ds
(неявный сегментный регистр) не даст вам правильных значений.
Это особенно важно для строки msg
.
Extra
CMOS немного сложнее, чем , формат даты может быть двоичным или BCD.
Для этого приложения это не имеет значения, хотя.
Также имеется бит обновления даты, который необходимо проверить перед считыванием полное дата-время.
Опять же, в этом простом приложении (где считываются только секунды) это не имеет значения.
Наконец, если у вас есть желание экспериментировать с программированием на основе прерываний, вы можете перехватить int 1ch
, который вызывается обработчиком IRQ0 (int 08h
) или используйте периодическое прерывание CMOS на линии IRQ8 (int 70h
) после программирования условий запуска.
Существует также служба ожидания (int 15h/ah=86h
), хотя обычно это бесполезно, поскольку DOS не является многозадачной.