Voglio interrompere l'esecuzione di circa 0,1 secondi, indipendentemente dalla velocità di clock della CPU. Il codice dovrebbe essere eseguito direttamente da un dispositivo di avvio, pertanto non dovrebbe utilizzare gli interrupt DOS.Come dormire nell'assemblaggio x86 a 16 bit in metallo nudo?
Attualmente sto usando int 15h
, ma questo sembra essere in conflitto con i segnali acustici che sto modulando con il canale 2 del PIT. Ho sentito parlare del canale 0, ma non ho idea di come impostarlo.
L'accuratezza non è così importante, tuttavia, dovrebbe funzionare su computer vecchi e moderni alla stessa velocità. Quindi le istruzioni di looping non sono un'opzione.
Il codice bip e il sonno sono solo un mucchio di macro per cambiare la frequenza e accendere e spegnere l'altoparlante. Il segnale acustico sembra non fermarsi se chiamo sleep prima dello beepoff
.
Qui ci sono le macro colpo di clacson:
%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
e il sonno uno:
%macro sleep 2
push dx
mov ah, 86h
mov cx, %1
mov dx, %2
int 15h
pop dx
%endmacro
sto usando l'assembler NASM.
Questo non è un duplicato di How can I create a sleep function in 16bit MASM Assembly x86?, perché questo è per l'assemblaggio bare metal all'esterno di Windows o DOS.
Vorrei suggerire di rendere il titolo "Come dormire nell'assemblaggio x86 a 16 bit in metallo nudo" per distinguere le domande da quella dipendente dal sistema operativo. Forse indicando nella domanda come si è tentato di usare int 15h si potrebbe aiutare la domanda a non essere troppo ampia (è borderline nella sua forma attuale). –
@PascalCuoq Ok, l'ho modificato un po '. –
Correlati: http://stackoverflow.com/a/1862232/509868 – anatolyg