2011-11-15 71 views
1

我已閱讀有關使計算機發出嗶聲的代碼,但無法使其工作。以下代碼要求用戶輸入數字。數字顯示在屏幕上,但如果用戶鍵入非數字字符,則應該發出嘟嘟聲。當我運行程序並鍵入一個非數字字符時,它只是崩潰。MASM - 爲什麼此代碼不會導致計算機發出嗶聲?

INCLUDE Irvine32.inc 

.data 

enterDigits  BYTE  'Please type some digits: ', 0 

.code 

main PROC 

    mov EDX, OFFSET enterDigits 
    call WriteString 

L1:</b> 

    call ReadChar 
    cmp AL, 0Dh 
    je FINISHED 
    cmp AL, 30h 
    jl BEEP 
    cmp AL, 39h 
    jg BEEP 
    call WriteChar 
    loop L1 

BEEP:</b> 

    mov AH, 02h 
    mov DL, 07h 
    int 21h 
    jmp L1 

FINISHED:</b> 

    call CRLF 
    call CRLF 

exit</b> 

main ENDP</b> 

END main 


If I replace BEEP with: 

BEEP:</b> 

    mov AL, 33h 
    call WriteChar 
    jmp L1 

當您鍵入非數字字符時,它將打印3。不知道這是否有所作爲。

+0

你在使用什麼操作系統? – zdan

+0

試圖清理一下格式。 –

回答

1

如果查看WriteChar here的源代碼,可以看到它調用Windows API WriteConsole方法,而不是使用MSDOS API。我相信你不能調用DOS API方法,因爲你運行的模式與管理硬件和I/O功能的內核不兼容。

您可以嘗試調整您的exe的兼容模式以使用Windows 95(右鍵單擊EXE,轉到兼容性選項卡)。

+0

感謝您的快速回復。然而,你所說的話讓我頭暈目眩。我在一個彙編語言課上,我從課本中學到的代碼中寫下了其餘的代碼,但沒有提到蜂鳴聲,所以代碼的一部分就是我搜索後發現的網頁。有沒有其他的方法來發出嘟嘟聲?我們所有的教練都說,提示嘀聲的ascii代碼是7. – pkearse

+1

當教師說嗶嗶聲的ASCII碼是7時,這意味着打算將代碼輸出到控制檯。使用33h的WriteChar打印ASCII'3'字符。所以,在你的第二個嘟嘟聲中,把07h放在AL中,讓它叫做WriteChar。我打賭它然後發出嗶嗶聲。 Int 21h在很久以前可能在MS-DOS下做了同樣的事情,但現在你必須使用Windows API。 WriteChar使用Windows API。 – Nathan

+0

再一次,非常感謝你的回覆。我最初嘗試了你的建議。該程序沒有崩潰,但它也沒有發出嗶嗶聲。那時我正在網上查看。我將它改爲33h,看看這是否有助於診斷問題。我沒有添加原始的蜂鳴聲代碼,並用07h代替33h。仍然沒有嘟嘟聲,但也沒有崩潰。也許我應該在另一臺電腦上運行它。但在你問明顯之前,我的電腦聲音很好:) – pkearse

相關問題