Сборка х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, но технически это должно.
Вот ссылка