Я хочу остановить выполнение примерно 0,1 секунды, независимо от тактовой частоты процессора. Код должен запускаться непосредственно с загрузочного устройства, поэтому он не должен использовать прерывания DOS.Как спать в сборе 16 бит x86?
В настоящее время я использую int 15h
, но это, похоже, противоречит звуковым сигналам. Я модулирую канал 2 PIT. Я слышал о канале 0, но я не знаю, как это настроить.
Точность не так важна, однако она должна работать на старых и современных компьютерах с одинаковой скоростью. Так что просто инструкции по циклу не являются опцией.
Звуковой сигнал и сон - это всего лишь куча макросов для изменения частоты и включения и выключения динамика. Звуковой сигнал, кажется, не останавливается, если я вызываю сон прямо перед beepoff
.
Вот гудок макросы:
%macro beepinit 0
mov al, 182
out 43h, al
%endmacro
%macro beepfreq 0
out 42h, al
mov al, ah
out 42h, al
%endmacro
%macro beepon 0
in al, 61h
or al, 00000011b
out 61h, al
%endmacro
%macro beepoff 0
in al, 61h
and al, 11111100b
out 61h, al
%endmacro
и сон один:
%macro sleep 2
push dx
mov ah, 86h
mov cx, %1
mov dx, %2
int 15h
pop dx
%endmacro
Я использую ассемблер NASM.
Это не дубликат How can I create a sleep function in 16bit MASM Assembly x86?, потому что этот вариант предназначен для сборки без сбоев вне Windows или DOS.
Я бы предложил сделать заголовок «Как спать в 16-битной сборке x86 с шестью металлами», чтобы отличить вопросы от OS-зависимого. Возможно, указывая в вопросе о том, как вы пытались использовать int 15h, этот вопрос не будет слишком широким (это граница в его текущей форме). –
@PascalCuoq Хорошо, я немного его отредактировал. –
Связанный: http://stackoverflow.com/a/1862232/509868 – anatolyg