2017-06-02 148 views
2

我正在爲程序集8086中的學校(使用DOSBox)工作,並且我試圖將程序延遲0.5秒。延遲程序使用int 21h與ah = 2Ch

我試圖創建一個循環的當前時間比較初始時間,使用INT 21H,功能代下與DL的百分之價值,但它似乎是太慢了......

mov ah, 2Ch 
int 21h 
mov al, dl ;hundredths 
mov bx, 0 
wait_loop: 
    one_hun: 
     int 21h 
     cmp al, dl 
     je one_hun 
    mov al, dl 
    inc bx 
    cmp bx, 50 
    jne wait_loop 

回答

4

我寧願使用BIOS int 1Ah,它以任何方式用作int 21h服務的來源,這可能會更簡單一些。 (除非你打算重新編程定時器芯片),這是每秒18.2次,所以要等待半秒鐘,你可以等待9(cca.440至494.51ms)或10(cca) 。495到549.45ms)的刻度,精度將被限制在默認的+/- 50ms)。如果你要重新編程定時器芯片,你可能會得到更高的精度,但不要期望在DOS下(可能在現代操作系統下模擬)可以完全可靠地工作[10萬秒]。


關於當前的代碼:在dl的百分之不是由一個遞增,所以你在bx那些18.2Hz週期數計數,而不是百分之一(即你的代碼等待〜的2.7s , 對?)。

也不要在類似的代碼做je,總是使病情<=>=,因爲如果出於某種原因(OS沒有運行了一段時間碼)錯過確切100分之50差異,您將創建循環它將幾乎無限地運行(直到它在一次溢出後會意外達到50)。

要做到這一點你的方式,你算算三角洲:

mov ah, 2Ch 
    int 21h 
    mov al, dl ;hundredths 
wait_loop: 
     nop  ; burn the CPU a bit less 
     int 21h 
     sub dl,al ; calculate delta of hundredths (-99..+99) 
     jnc delta_positive 
     add dl,100 ; adjust the delta to be positive 1-99 
delta_positive: 
     cmp dl,50 
     jb wait_loop 
+0

謝謝,問題解決了! – Shelly

+0

他們是如何決定每秒18.2次的?看起來很奇怪。 – fuz

+4

@fuz基本上會爲完整的16/32位溢出(65536/18.2 =〜3600 = 1小時)加上初始晶振頻率:https://blogs.msdn.microsoft.com/oldnewthing/20041202-00/?p = 37153 – Ped7g