Сборка х86 - хронометраж событий

Я использую ассемблерный код x86 на эмуляторе DosBox (в Windows7), скомпилированный с использованием TASM. До сих пор в моем коде я использовал только вложенные циклы для задержек в коде, но теперь, когда я выполняю свой код на разных частотах цикла, я вижу, что это не лучшее решение. Поиск в Интернете примеров кода или прерываний о том, как создать таймер и использовать его вместо вложенных циклов, был бесполезен, и я видел только несколько неясных примеров в википедии о чем-то, называемом PIT, которое я не понимал.

Может ли кто-нибудь предоставить пример с допустимым кодом, как это можно сделать? Спасибо!

РЕДАКТИРОВАТЬ

Я пытался использовать этот код для задержки с использованием прерывания int 21h, но по какой-то причине он оказался намного медленнее, чем предполагалось в 20 1/100 секунд. Может быть, это можно исправить?

redo:   mov ah, 2ch
        int 21h     ;MILIS IN DL            ;BUG HERE -> FIX TIMER
        cmp dl, 79
        jnc redo
        mov milis, dl
loop1:  mov ah, 2ch
        int 21h
        sub dl, milis
        cmp dl, 20
        jc loop1

1 ответ

В мире DOS есть много способов добиться задержки. Биос поддерживает счетчик времени, который увеличивается в 18,2 раза в секунду или каждые 55 мс, чтобы вы могли опрашивать его и циклически повторять, пока не пройдут соответствующие такты, исходя из того, как долго вы хотите задержать. Вы можете прочитать значение счетчика 4 байта из области данных BIOS по адресу 40:6C.

Но более простой подход - использовать функцию 15h прерывания 15h, которая представляет собой задержку, реализованную в BIOS. Я не уверен, что это работает в DosBOX, но технически это должно.

Вот ссылка

http://www.ctyme.com/intr/rb-1525.htm

Другие вопросы по тегам